SPI协议简介

 

上次局哥给大家介绍了UART协议,这次给大家详细介绍一下SPI协议的相关知识(PS:本文介绍十分详细,篇幅较长,建议收藏阅读)。

 

SPI(serial peripheral interface)是一种同步串行通信协议,由一个主设备和一个或多个从设备组成,主设备启动与从设备的同步通信,从而完成数据的交换。SPI是一种高速全双工同步通信总线,标准的SPI仅仅使用4个引脚,主要应用在 EEPROM, Flash, 实时时钟(RTC), 数模转换器(ADC), 数字信号处理器DSP) 以及数字信号解码器之间。

 

如下图所示,在物理层次上,SPI协议只需要用四根管脚 (Pin) 用来控制以及数据传输, 节约了芯片的 pin 数目, 同时为 PCB 在布局上节省了空间。正是出于这种简单易用的特性, 现在越来越多的芯片上都集成了 SPI协议。 

 

 

SPI协议分类

 

4线制SPI

 

当我们谈到SPI时,默认情况下都是指标准的4线制Motorola SPI协议,即SCLK,MOSI,MISO和CS共4根数据线,标准4线制的好处是可以实现数据的全双工传输。当只有一个主机和一个从机设备时,只需要一个CS,多个从机需要多个CS,各数据线的介绍:

 

SCLK:  时钟信号,时钟频率即SPI速率,和SPI模式有关。

MOSI:主机输出,从机输入,主机数据。

MISO:主机输入,从机输出。

CS/SS:从机设备选择,低电平有效。

 

3线制SPI

 

对于3线制SPI,根据不同的应用场景,主要有以下2种类型:

只有3根线:SCLK,MOSI和CS,没有MISO数据线,适用于单工通讯。

只有3根线:SCLK,SDIO和CS,SDIO作为双向端口,适用于半双工通讯。

 

SPI特点

 

1. 主从模式

 

与IIC类似,SPI也是采用主从方式工作,主机通常为FPGA、MCU或DSP等可编程控制器,从机通常为EPROM、Flash,AD/DA,音视频处理芯片等设备。一般由SCLK、CS、MOSI,MISO四根线组成,有的地方可能是:SCK、SS、SDI、SDO等名称,都是一样的含义,当有多个从机存在时,通过CS来选择要控制的从机设备。

 

 

2.  同步模式

 

在这里介绍两个概念:CPOL和CPHA。CPOL:clock polarity 时钟的极性;表示 SPI 在空闲时, 时钟信号是高电平还是低电平。CPHA:clock phase 时钟的相位;表示 SPI 设备是在 SCK 管脚上的时钟信号变为上升沿时触发数据采样, 还是在时钟信号变为下降沿时触发数据采样。

 

Master 设备会根据将要交换的数据来产生相应的时钟脉冲(Clock Pulse), 时钟脉冲组成了时钟信号(Clock Signal) , 时钟信号通过时钟极性 (CPOL) 和 时钟相位 (CPHA) 控制着两个 SPI 设备间何时数据交换以及何时对接收到的数据进行采样, 来保证数据在两个设备之间是同步传输的。

 

3.  数据交换

 

SPI 设备间的数据传输之所以又被称为数据交换, 是因为 SPI 协议规定一个 SPI 设备不能在数据通信过程中仅仅只充当一个 "发送者(Transmitter)" 或者 "接收者(Receiver)"。 在每个 Clock 周期内,SPI 设备都会发送并接收一个 bit 大小的数据, 相当于该设备有一个 bit 大小的数据被交换了。

 

SPI总线上的主机必须在通信开始时候配置并生成相应的时钟信号。在每个SPI时钟周期内,都会发生全双工数据传输。主机在MOSI线上发送一位数据,从机读取它,而从机在MISO线上发送一位数据,主机读取它。就算只进行单向的数据传输,也要保持这样的顺序。这就意味着无论接收任何数据,必须实际发送一些东西!在这种情况下,我们称其为虚拟数据。

 

 

SPI工作模式

 

既然是进行数据传输,双方就要明确从机在什么时刻去采样主机发出的数据,主机在什么时刻去读取从机发来的数据。对于STM32等MCU自带的硬件SPI外设来说,可能没有那么重要,只需要配置一下模式就行了,但是对于使用使用GPIO模拟或者FPGA来实现SPI的时序,这一点是非常非常重要的,这就涉及到SPI标准协议的工作模式了,通过CPOL(Clock Polarity)时钟极性和CPHA(Clock Phase)时钟相位的不同组合,可以分为4种模式。

 

 

四种模式的描述如下:

 

 

更进一步的具体描述如下:

 

CPHA=0:

 

 

CPHA=1:

 

 

 

多slave模式

 

在实际应用中,往往存在需要一个master控制多个slave的情况,这时候就需要发挥广大程序员同志们的聪明才智了。

 

方法一:用SS/CS端控制多slave选通

 

通常,每个从机都需要一条单独的SS线。如果要和特定的从机进行通讯,可以将相应的NSS信号线拉低,并保持其他NSS信号线的状态为高电平;如果同时将两个NSS信号线拉低,则可能会出现乱码,因为从机可能都试图在同一条MISO线上传输数据,最终导致接收数据乱码。

 

 

方法二:采用菊花链的形式

 

菊花链作为SPI通信中较为“高端”的应用方式,在设备信号(总线信号或中断信号)以串行的方式从一 个设备依次传到下一个设备,不断循环直到数据到达目标设备。

 

 

菊花链的最大缺点是因为是信号串行传输,所以一旦数据链路中的某设备发生故障的时候,它下面优先级较低的设备就不可能得到服务了;另一方面,距离主机越远的从机,获得服务的优先级越低,所以需要安排好从机的优先级,并且设置总线检测器

 

 

所以最终的数据流向图可以表示为:

 

 

总结

 

又到了例行的总结时间。SPI作为应用最为广泛的通信协议之一,其有着众多的优点,当然也不乏缺点。

 

优点

 

全双工串行通信;

高速数据传输速率;

简单的软件配置;

极其灵活的数据传输,不限于8位,它可以是任意大小的字;

非常简单的硬件结构。从站不需要唯一地址(与I2C不同)。从机使用主机时钟,不需要精密时钟振荡器/晶振(与UART不同)。不需要收发器(与CAN不同)。

 

缺点

 

没有硬件从机应答信号(主机可能在不知情的情况下无处发送);

通常仅支持一个主设备;

需要更多的引脚(与I2C不同);

没有定义硬件级别的错误检查协议;

与RS-232和CAN总线相比,只能支持非常短的距离。

 

参考文献:

https://blog.csdn.net/u010632165/SPI协议详解(图文并茂+超详细)

https://blog.csdn.net/whik1194/article/一文看懂SPI协议