标准硬件spi访问非标spi外设

1.写在前面

  最近有收到坛友发帖提问或者私信,关于硬件spi总线访问非标spi器件问题,根据以往使用经验归纳总结。

  spi(Serial Peripheral Interface)串行外设接口,嵌入式开发中最常用的接口之一,MCU、MPU都会提供硬件spi总线,甚至低端MCU都集成。对于无硬件spi总线,或者spi总线不够用时,也可以根据spi标准时序,使用普通GPIO模拟spi总线。

  一般CPU提供的spi接口,支持的是整字节访问,如8bit、16bit等。而非整字节的spi外设(芯片)也是很常见,哪怕是整字节的,很多厂家也是做得与标准spi外设有差别,估计是避开专利问题。而芯片原厂提供的Demo也大多是采用GPIO模拟spi。一般情况下,根据芯片手册说明及访问时序图,可以使用CPU集成的标准硬件spi访问,以提高速度和节约CPU资源。

2.常用非标spi外设

常见的非标spi外设是DAC、ADC,ADI的器件最常见。

【1】ADC,常用12bit、14bit、24bit,如AD7684、MCP3202。
【2】DAC,常用12bit、14bit、24bit。
【3】其他,电机芯片、IO扩展芯片、LED驱动芯片,如TMC2660。

3.硬件spi访问非标spi外设

  关于使用硬件spi总线访问非标spi外设,首先需要确认是否支持,然后下一步再是考虑如何实现;如果不确定,最好的方式就是尝试了。

【1】查看芯片手册
  一般芯片手册会有详细说明,如提到“兼容摩托罗拉spi标准”,则基本可以使用硬件spi访问。

【2】查看芯片特殊说明
   MCP3202使用标准spi访问说明。
MCP3202使用详细描述
   TMC2660使用标准spi访问说明,有明确描述,无效位可以自动忽略。
在这里插入图片描述

【3】分析芯片时序图
  如前面两步都没有明确说明,则分析时序图是最直接可靠的方法,可以根据时序图得出结论。以16bit ADC AD7684为例,虽然是整数字节,但从时序图分析得知也属于非标spi范畴。
AD7684时序图

【4】确定spi模式
  根据时序图确认spi控制模式,spi控制模式分为四类。
· send_then_recv,标准spi,常规操作,发送完一帧再接收,如读取某芯片寄存器的值;

· send_then_send,标准spi,常规操作,发送完一帧再发送,如向某芯片寄存器(地址)写入数据;

· send_recv,非标spi,具体看芯片时序图,产生时钟信号,发送完成的同时,也接收完成;第二种情况是,只接收,发送动作只是用来产生时钟信号,如一些AD芯片;

· spi_send,标准或非标spi都使用,只发送无返回值或者无须理会返回值,如spi LCD屏。

AD7684、MCP3202、TMC2660都属于第三种方式。

【4】忽略无效位
  使用硬件spi访问时,一般是整数字节,无效位手动忽略即可。如MCP3202为12bit ADC,我们以“三字节”时钟访问,需把高4bit忽略掉。

uint16_t  mcp3202_read(uint8_t mode)
{
	uint8_t send_buff[3],recv_buff[3];
	
	send_buff[0] = 0x01;
	send_buff[1] = mode;
	send_buff[2] = 0x00;
	spi_send_recv(&mcp3202_spi_dev,send_buff,recv_buff,3);
	
	return (((recv_buff[1] << 8) | recv_buff[2])&0x0fff);
}

【5】其他
  不排除一些CPU存在非整数字节配置的spi,如果有,则使用相关配置会来得更容易。

4.相关应用

[1] ADC AD7684
https://blog.csdn.net/qq_20553613/article/details/79043934

[2] ADC MCP3202
https://blog.csdn.net/qq_20553613/article/details/79132821

[3] 电机驱动TMC2660
https://blog.csdn.net/qq_20553613/article/details/80210813

posted @ 2019-01-25 00:09  Acuity  阅读(256)  评论(0编辑  收藏  举报