SPI通信分三线(SCLK、CS、DIO)和四线(SCLK、CS、MOSI、MISO),常见的四线居多,如下表所示为信号定义:
表1 4线SPI信号定义
名称 | 接口方向(主设备方向) | 描述 |
SCLK | out | 时钟信号,由主设备产生 |
CS | out | 从设备片选信号,由主设备控制,通常低电平有效 |
MOSI | out | 主设备输出的数据 |
MISO | in | 向主设备输入的数据 |
标准4线SPI有4种工作模式,如下表所示:
表2 SPI模式
SPI模式 | CPOL | CPHA | 采样时刻 |
0 | 0 | 0 | SCLK默认低电平,第一个上升沿 |
1 | 0 | 1 | SCLK默认低电平,第一个下降沿 |
2 | 1 | 0 | SCLK默认高电平,第一个下降沿 |
3 | 1 | 1 | SCLK默认高电平,第一个上升沿 |
如下图所示为SPI时序图:
图1 SPI时序图
从上图可以总结如下:
1、SCLK如果上升沿采集数据,那么下降沿新数据输出,相反下降沿采集数据,那么上升沿触发新数据输出。
2、CS下降沿之前可以准备好第一个bit数据;
3、传输完数据后时钟SCLK返回默认状态。
需要注意的是SPI协议DATA的内容可以是大端传输,也可以是小端传输,没有指定必须用大端。另外SPI有标准模式,但是协议格式内容和传输数据长度等可自由定义。
例如以BMP581传感器为主,如下图所示为SPI写的时序图:
图2 BMP581 SPI写时序图
从图中可以看出该传感器可用模式0和模式3,第一个bit位写0代表写寄存器操作,2~8bit代表寄存器地址,9~16代表寄存器地址的值。
如下图所示代表SPI读时许图:
图3 BMP581 SPI读时序图
如上图所示第一个bit位写1代表写寄存器操作,2~8bit代表要读的寄存器地址,从设备(BMP581)MISO输出寄存器值D7~D0位。
SPI3线和SPI4线类似,不同的是共用一根数据线,这里数据线在编写代码时要设置为三态门电路即inout接口,主设备写数据时设置为输出状态,写完毕后释放数据总线(设置为高阻态)然后从端会通过该总线输出数据给主设备。
设计中为了节省接口,SPI通常有两种接法分别是多从机模式和菊花链模式。
多从机接法如下图所示:
图4 SPI 多从机模式
该模式很好理解,一个主机多个从机,优点是减少IO接口资源。但需要注意以下几点:
1、因为主模块一个引脚需要同时驱动多个从机模块,工作时间长之后容易把芯片引脚烧坏,解决办法是硬件需要添加BUFFER芯片作为驱动使用,防止芯片IO烧坏;
2、此接法MISO是inout接口,默认状态下主机和从机的MISO都作为高阻态输入,只有从端需要返回数据的时候做输出,输出完毕后切换回高阻态。只有这样才可以防止一条总线(MISO)上同时有多个设备在输出。
菊花链接法模式以ADC芯片为例(型号LTC2376 16位ADC),如下图所示:
图5 SPI菊花链数据传输
大多传感器SPI协议使用菊花链传输,该方法优点依然是可以有效节省IO接口,如下图所示为该ADC菊花链接法时序图:
图6 ADC芯片LTC2376菊花链接法时序图
从上图可以看出CNV作为CS片选信号,SCK作为时钟,SDOB作为MISO输出数据给主设备,输出的数据内容D15B~D0B代表设备B的ADC数据,D15A~D0A代表设备A的ADC采集数据。
busy信号是芯片忙碌状态标志,该状态为1时,主设备不允许输出时钟。
SPI协议篇讲到这里,如有疑问可留言。
以上SPI驱动代码后面实战篇会提供,尽情期待。