目录
前言
SPI协议我磕了一周,反反复复找了很多资料看QAQ,还是感觉没吃得很透,只是理论上熟悉了,还没有在实践中证实过。
一、SPI Interface
相比于直接学习SPI协议,我想以更有逻辑性的方式展开SPI。Maybe have a additional feel~
(一)串口通信
如果两个设备需要传递数据信息,最先想到的可能是用一根线,在这根线上等频率的传输"0"和"1"。但传输线会有个空闲电平,另一边设备并不知道从何处算开始,所以还需要引入起始位和结束位。就如下图所示:

等等,这里还有问题!
我作为接收方,我怎么知道多长的时间间隔算1个bit呢?
对于这个问题,走出了两个方向:UART与SPI。
UART要求通信双方提前约定好传输速率(波特率),这样就可以正常的收发数据咯。
而SPI则增加了一条数据线,用来传输同步时钟信号,这样双方依靠同一个时钟信号,就能知道在何时进行数据输出与采样,然后发送和接受分别采用一条数据线。如下图所示:

需要注意,时钟信号只需要一方发出即可,因此SPI规定发送时钟信号的一方为主设备(Master),另一方为从设备(Slave)。当从设备的数量增加后,就需要引入片选信号,用以确定需要通信的是哪个从设备。
(二)SPI Interface
SPI的信号接口:
- CS:从设备的片选信号(Chip Select)。
- SCLK:时钟信号。只由Master发出。
- MOSI:Master的数据输出口(Master Output Slave Input)。
- MISO:Master的数据输入口(Master Input Slave Output)。
不同厂商对端口的命名并不统一,因此需要在功能上理解它。
1.一主一从

2.一主多从

3.菊花链

二、SPI通信时序及简易模型
(一)SPI传输时序
在讲通信时序之前,得先说清两个概念。时钟极性(CPOL)与时钟相位(CPHA)。
- 时钟极性(Clock Polarity):定义时钟信号空闲值。"1"表示空闲时时钟信号为高电平,"0"表示空闲时时钟信号为低电平。
- 时钟相位(Clock Phase):定义通信设备在第一个沿/第二个沿进行数据采样。"1"表示设备在时钟第二个边沿进行采样,"0"表示设备在时钟第一个边沿进行采样。
这样组合出来四种情况,分别称为(0,0)、(0,1)、(1,0)、(1,1)模式。还要多嘴一句,一般SPI都是一个沿采样,一个沿输出数据(大多数情况如此,但也有看到厂商在一个边沿同时完成采样和输出)。
- (0,0)表示时钟平时为低电平,设备在第一个时钟沿采样。意味着设备在时钟的上升沿采样,因此如下图可看到时钟上升沿正好落在最佳采样点上。
- (0,1)表示时钟平时为低电平,设备在第二个时钟沿采样。意味着设备在时钟的下降沿采样,因此如下图可看到时钟下降沿正好落在最佳采样点上。
- (1,0)表示时钟平时为高电平,设备在第一个时钟沿采样。意味着设备在时钟的下降沿采样,因此如下图可看到时钟下降沿正好落在最佳采样点上。
- (1,1)表示时钟平时为高电平,设备在第二个时钟沿采样。意味着设备在时钟的上升沿采样,因此如下图可看到时钟上升沿正好落在最佳采样点上。
一般来说(0,0)与(1,1)用的最多,或许是这种记号大家都能够分辨出是哪种模式,不至于出错。对于下图中,还暗含了一些时序关系。
时钟与数据的时序要求:对于需要在第一个时钟沿采样的情况,D7(第一位有效位)需要提早半个周期输出。
时钟与片选信号的时序要求:片选信号需要提前时钟信号至少半个周期,这样保证在不同频率下都能够正常通信。

从上图能看到,SPI一般以MSB(最高有效位)进行传输。
(二)简易模型
与其说是数据传输,SPI协议通信更像是数据交换。因为设备在发送数据的同时,也在接收数据,所以可视作两个移位寄存器之间的数据交换。

三、协议变体
然而,在实际应用中,很少出现同时发送和接受的情况,一般都是Master先发送命令或是地址,然后Slave发送数据。下图是SPI读写Flash存储器的时序。具体图中如Instruction等,就是操作Flash存储器所需要的形式。简单来说,实现对Flash存储器的通信,需要发送指令码、地址码、模式码、Dummy周期、数据码五个阶段,Flash厂商的芯片手册中有指令集描述每条指令所需要的通信格式。

因此对于SPI协议,出现了许多适应性的变体。
(一)三线SPI
三线SPI仅有CS、SCLK以及IO口三条线,也就是将MOSI和MISO两线并成一条半双工数据线,所以三线SPI也可称为半双工SPI协议。其Interface如下:

这样少了一条线,也有利于PCB设计。通信时序的话与标准SPI相同,只是发送与接收分时复用一根线。
(二)Dual SPI
后来大家嫌带宽还是小啦,但是时钟频率又不能无限提升,所以就额外增加线路传输数据,如果多一根线的话,每次就能传2个bit的数据。所以Dual SPI就是将SPI的MOSI和MISO都改成双向IO口。


上面这个图就是采用Dual SPi进行Flash读写操作的例子。每次传输2bit,仅用4个周期就能传完一个字节。
(三)Quad SPI
在Dual SPI基础上,再增加两个IO口,就能实现每次4bit数据的传输。


(四)SDR与DDR模式
上面给出的时序都是SDR模式(Single Data Rate),每个时钟周期只有1bit的数据。在此基础上,如果每个时钟沿都进行数据输出,就能在一个时钟周期内实现2bit数据的传输,也就称之为DDR(Double Data Rate)。

结束语:目前理解就认为Quad SPI等只是在SPi基础上增加位宽而已,所以也还有一种八倍SPI (Octol SPI)。但这些变体已经不能称之为串口通信了hhhhhhhhhh。
本文深入解析SPI接口,从串口通信基础出发,详细阐述SPI的时序、模式以及各种协议变体,包括三线SPI、DualSPI和QuadSPI,探讨其在实践中的应用和优势。
32万+





