1 简介
SPI是一种嵌入式系统中应用广泛的同步串行通信、边沿采样、主从架构式总线接口。80年代由摩托罗拉开发。
1.1 拓扑结构
SPI一般有四根线,一根时钟线SCLK,两根数据线MOSI(主出从入)/MISO(主入从出),一根片选线。
对于SPI总线而言,有两种拓扑:
- 独立片选拓扑:总线拓扑需要更多片选引脚,但通信效率高。信息直接在主从间传递。
- 菊花链拓扑:某级从设备在第N组时钟周期用MISO发送第N-1组时钟周期接收到位给下级设备,同时把本组时钟周期期间前级设备通过MISO移位进来的数据保存按位序保存进接收寄存器中。
1.2 四种工作模式
SPI总线有四种工作模式,是由时钟极性选择(CPOL)和时钟相位选择(CPHA)决定。
CPOL = 0 ,SPI总线空闲为低电平,CPOL = 1, SPI总线空闲为高电平。
CPHA = 0, 在SCK第一个跳变沿采样,CPHA = 1, 在SCK第二个跳变沿采样。
- 当CPHA=0、CPOL=0时SPI 总线工作在模式0。MISO 引脚上的数据在第一个时钟跳变之前已经输出了,而为了保证正确传输,MOSI 引脚的MSB 位必须与SCK 的第一个边沿同步。在模式0的SPI 传输过程中,首先将数据输出,然后在同步时钟信号的上升沿时,SPI 的接收方采样位信号,在时钟信号的一个周期结束时(下降沿),下一位数据信号输出,再重复上述过程,直到规定的字节数传输结束。
- 当CPHA=0、CPOL=1时SPI 总线工作在模式1。与模式0唯一不同之处只是在同步时钟信号的下降沿时采样位信号,上升沿时下一位数据输出。
- 当CPHA=1、CPOL=0时SPI 总线工作在模式2。MISO 引脚和MOSI 引脚上的数据的MSB 位必须与SCK的第一个边沿同步,在SPI 传输过程中,在同步时钟信号周期开始时(上升沿)数据输出,然后在同步时钟信号的下降沿时,SPI 的接收方采样位信号,在时钟信号的一个周期结束时(上升沿),下一位数据信号输出,再重复上述过程,直到规定的字节数传输结束。
- 当CPHA=1、CPOL=1时SPI 总线工作在模式3。与模式2唯一不同之处只是在同步时钟信号的上升沿时采样位信号,下降沿时下一位数据输出。
其中模式0和模式3最为常用
2 SPI优劣
主要与IIC做对比,因为两者都是常用的芯片间通信方式。
-
优势:
传输速度高,SPI并未限定最高速度。有的应用甚至高达10Mbps。
全双工,但有的芯片没有MISO,则不支持。
相较于I2C而言,SPI简单一些,编程容易,控制简单
信号为单向信号,易于电隔离。尤其在工业产品中电气隔离在抗干扰方面、以及本质安全方面要求比较高。
没有复杂的总线仲裁机制,相对健壮。 -
劣势:
无寻址机制,需要额外的片选信号
SPI总线对于多从模式支持不好,两种拓扑都无法支持很多从设备
而且系统中也仅有一个主设备
没有定义错误检测机制
事实上的标准,但无正式标准
与I2C一样也只是芯片间总线,无法长距离通信
3 总结
SPI和IIC在鲁棒性方面都比较好。IIC之所以优雅,是因为它在极简的基础架构(两线SDA/SCL)上提供了非常先进的功能,例如自动多主机冲突处理和内置地址管理。但是它相对却非常复杂,在性能上或许有所欠缺。
另一方面,SPI非常易于理解和实施,并且为扩展提供了很大的灵活性。SPI的优雅之处在于简单性。SPI应该被视为构建用于IC之间通信的自定义协议栈的良好接口。因此,尽管使用SPI可能需要做更多的工作,但可以提供更高的数据传输性能和灵活的自由度。
如果一定要比较,则SPI和I2C都为低速设备的通信提供了良好的接口支持,但是SPI更适合点对点传输数据流的应用,而I²C则更适合于多主机“寄存器访问”应用。