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访问说明。
TMC2660使用标准spi访问说明,有明确描述,无效位可以自动忽略。
【3】分析芯片时序图
如前面两步都没有明确说明,则分析时序图是最直接可靠的方法,可以根据时序图得出结论。以16bit ADC AD7684为例,虽然是整数字节,但从时序图分析得知也属于非标spi范畴。
【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
---------------------
作者:Acuity-
来源:CSDN
原文:https://blog.csdn.net/qq_20553613/article/details/86619218
版权声明:本文为博主原创文章,转载请附上博文链接!