【概述】
SPI(Serial Peripheral Interface)总线是主要应用于嵌入式系统内部通信的串行同步传输总线协议。通常为四线制的SPI总线支持全双工通信。SPI总线定义两个及以上设备间的数据传输,提供时钟的设备为主设备(Master),接收时钟的设备为从设备(Slave)。SPI协议特点包括主从模式、全双工通信、片选功能、模式错误标识及CPU中断、缓冲数据寄存器和可配置时钟相位极性等。SPI允许数据一位一位的传送,甚至允许暂停,因为SCK时钟线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据。也就是说,主设备通过对SCK时钟线的控制可以完成对通讯的控制。
【优点和缺点】 优点缺点相比I2C两根线,SPI四根线更多
没有寻址机制,只能靠设备片选(chip select)选择不同从设备
没有数据流控制(但主设备可以通过延缓时钟边缘降低传输速度)
没有从设备接收数据ACK应答机制,主设备对于发送成功与否不得而知
只支持单主控
没有定义数据校验机制
相比于RS232和CAN,SPI传输距离短
不支持热插拔
【信号定义】SPI协议定义四根信号线,分别为:
SCK : Serial Clock 串行时钟
MOSI : Master Output, Slave Input 主发从收信号
MISO : Master Input, Slave Output 主收从发信号
SS : Slave Select 片选信号
其中MISO方向为从设备到主设备,其余三个信号均为主设备到从设备。
【电路连接】
片选信号SS通常低电平有效。SPI数据传输原理是基于主从设备内部移位寄存器的数据交换。在主设备SCK的控制下,待传数据由各自设备的数据寄存器(Data Register)传输到移位寄存器(Shift Register),再通过MOSI和MISO信号线完成主从设备间的数据交换。两个移位寄存器中的内容被交换。外设的写操作和读操作是同步完成的。按位传输,高位MSB在前,低位LSB在后。
SPI主从模式传输示意图
单个主设备和单个从设备的SPI连接比较简单,以上图的表示的就是这种拓扑结构。对于单个主设备同时控制多个不同从设备,可以通过多个片选信号(SS)或菊花链方式(Daisy Chain Configuration)。
【传输模式】
CPOL,即时钟极性Clock Polarity,决定时钟空闲时的电平为高或低。对于SPI数据传输格式没有显著影响。
CPHA,即时钟相位Clock Phase,定义SPI数据传输的两种基本模式:
CPHA = 0在片选后数据立即出现在MOSI/MISO管脚,数据锁存于第一个时钟边沿
片选SS先于SCK半个时钟有效
在SCK的第二个时钟边沿,上一个时钟边沿锁存的数据写入移位寄存器
以此类推,数据在奇数边沿锁存(采样数据),在偶数边沿写入移位寄存器(输出数据,同时改变I/O管脚数据)
经过16个时钟边沿后,串行传输的数据全部写入(并行的)移位寄存器,完成主从设备的数据交换
CPHA = 1有些设备要求数据输出在SCK第一个时钟边沿之后,数据锁存于第二个时钟边沿
片选SS先于SCK半个时钟有效
在SCK的第三个时钟边沿,上个时钟边沿锁存的数据写入移位寄存器(MSB或LSB)
以此类推,数据在偶数边沿锁存,在奇数边沿写入移位寄存器
经过16个时钟边沿后,串行传输的数据全部写入(并行的)移位寄存器,完成主从设备的数据交换
Notes:
1. 主机和从机的发送数据是同时完成的,两者的接收数据也是同时完成的。所以为了保证主从机正确通信,应使得它们的SPI具有相同的时钟极性和时钟相位。
2. 在主设备这边配置SPI接口时钟的时候一定要弄清楚从设备的时钟要求,因为主设备这边的时钟极性和相位都是以从设备为基准的。一般来说,从设备都会支持模式00和11(CPOL | CPHA),具体应用时应查看设备SPI的传输模式说明。
3. 如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节(Dummy Byte)来引发从机的传输。当主机发送一个连续的数据流时,有些外设能够进行多字节传输。多数具有SPI接口的存储芯片就以这种方式工作。在这种传输方式下,从机的片选端必须在整个传输过程中保持低电平。此时,一次传输可能会涉及到成千上万字节的信息,而不必在每个字节的数据发送的前后都去检测其起始位和结束位,这正是同步传输方式优于异步传输方式的原因所在。虽然SPI有以上优点,然而在图像传输中却很少用到,原因主要是其抗干扰能力差