简介
与 I2C 一样, SPI
也是很常用的通信协议( Motorola 公司推出),且二者都支持“一主多从”通信,很多常见的模块(芯片)都支持了该通信协议。相比 I2C 接口, SPI 接口的通信速度更快( I2C 最高 400KHz
,而 SPI 最高可达几十MHz
),且支持全双工
通信。
想了解I2C通信的可以看我之前写的这篇帖子:IIC(I2C)通信协议详解
1 电气连接
SPI通信的接线比I2C稍微复杂些,所以很需要一张图来说明。在SPI通信中,一般需要4根线。准确来说是3+N。N是从机的数量。
电气接线作用如下:
- CS/SS, Slave Select/Chip Select,这个是片选信号线,用于选择需要进行通信的从设备。 I2C 主机是通过发送从机设备地址来选择需要进行通信的从机设备的, 而SPI 主机不需要发送从机设备,直接将相应的从机设备片选信号拉低即可。所以有几个从机参与了SPI通信,就需要几根
CS/SS
信号线。 - SCK, Serial Clock,串行时钟,为通信提供时钟信号。
- MOSI/SDO, Master Out Slave In/Serial Data Output,简称主出从入信号线,这根数据线只能用于主机向从机发送数据,也就是所谓的主机输出,从机输入。
- MISO/SDI, Master In Slave Out/Serial Data Input,主入从出信号线,与
MOSI
相反,这根数据线只能从机向主机发送数据,也就是所谓的主机输入,从机输出。
记忆这4种接线的时候,只需要记住英文全称就可以反推出其简称。
2 通信过程
2.1 工作模式
SPI 有四种工作模式,通过串行时钟极性(CPOL)和相位(CPHA)来实现(CPOL和CPHA的值可通过寄存器来设置)。
- CPOL=0,串行时钟空闲状态为低电平。
- CPOL=1,串行时钟空闲状态为高电平。
- CPHA=0,串行时钟第一个跳变沿(上升沿或下降沿)采集数据。
- CPHA=1,串行时钟第二个跳变沿(上升沿或下降沿)采集数据。
四种工作模式下的数据交换如下图所示:
2.2 通信时序
SPI的通信线增多了,通信也变得简单了起来,以常见的CPOL = 0和CPHA = 0为例,其通信时序如下所示。
首先通过将CS/SS线上的电平拉低,来实现片选,选择了具体的从机(芯片)后,便可发送时钟信号,根据时钟周期进行通信了,且可同时收发数据,十分高效。
还有一个好处,由于片选线的存在,避免了多个从机通信时候的总线冲突,因此不需要I2C那样外接上拉电阻。
当然SPI通信也是有缺点的,
- SPI既没有UART通信那样的奇偶校验,也没有I2C那样的应答机制,所以并不能保证通信数据的准确性。
- 当从机较多的时候,会出现较多的通信线,这对于硬件设计师来说并不是一个好消息。在布线的过程中,不仅仅需要考虑到线路的交叉,还要考虑到信号的相互影响等等因素