概念
本文引用地址:(Serial Peripheral interface, 串行外设接口)是微处理控制单元(MCU)和外围IC(如传感器、ADC、DAC、驱动芯片和外部存储设备等)之间进行通信的同步串行端口,其通信速率一般可以从几千bps到几百Mbps甚至更高, 具体的通信速率取决于主设备和从设备的规格和性能,以及他们之间的协商和支持能力。
Source:An Introduction to SPI Communications Protocol
SPI是一种全双工,同步,主从式接口,涉及两个主要角色:主设备(Master)和从设备(Slave)。SPI接口可以是3线式或4线式,这里重点介绍常用的4线SPI接口。4线SPI接口有四个信号:时钟信号(SCLK),片选信号(SS/CS),主设备输出从设备输入信号(MOSI)和主设备输入从设备输出信号(MISO),如下所示:

Source: SPI Protocol - Serial Peripheral Interface - javatpoint
其中,
SCLK(Serial Clock):时钟信号线,由主设备提供,用于同步数据传输。
MOSI(Master Out, Slave In):主设备输出,从设备输入,用于主设备向从设备发送数据。
MISO(Master In, Slave Out):主设备输入,从设备输出,用于从设备向主设备发送数据。
SS(Slave Select):从设备选择信号线,由主设备控制,用于选择要与主设备通信的从设备。
SPI原理
利用四线SPI接口可以构建不同SPI模式(拓扑方式),比如单主单从,单主多从和菊花链等模式,接下来就结合不同SPI模式来分别介绍SPI工作原理。
1)单主单从模式
单主单从模式,即主设备的SCLK、MOSI和MISO连接到从设备的相应引脚。从设备与主设备之间只有一组SCLK、MOSI和MISO线连接,如下所示:

Source: Basics of the SPI Communication Protocol (circuitbasics.com)
其基本原理是:
首先是时钟同步,主设备产生SCLK,控制数据传输的时序。时钟信号由主设备提供,并在主设备和从设备之间同步传输。

Source: Basics of the SPI Communication Protocol
然后是片选信号,主设备将SS/CS引脚切换到低电压状态,从而激活了从设备。

Source: Basics of the SPI Communication Protocol
最后是数据传输过程,主设备通过MOSI线向从设备发送数据。从设备接收到数据后,将其通过MISO线传输给主设备。主设备和从设备之间的数据传输是同时进行的。

Source: Introduction to SPI Interface | Analog Devices
2)单主多从模式
单主多从模式,即主设备的SCLK和MOSI连接到每个从设备的相应引脚,从设备的MISO连接到主设备的MISO引脚,每个从设备有独立的SS引脚与主设备连接,主设备通过选择SS来选择要与之通信的从设备。

Source: Basics of the SPI Communication Protocol
其基本原理与单主单从模式的几乎相同,唯一区别是当某个从设备的SS处于低电平时,该从设备与主设备进行通信,其他从设备的SS处于高电平状态。
3)菊花链模式
菊花链模式,即主设备的MOSI和SCLK连接到第一个从设备的MOSI和SCLK。从第一个从设备的MISO连接到第二个从设备的MOSI,以此类推,直到最后一个从设备的MISO。

Source: Basics of the SPI Communication Protocol
其工作原理是:
首先,主设备提供SCLK,控制数据传输的时序。时钟信号由主设备产生,并在整个菊花链中进行传递,从设备根据时钟信号的边沿进行数据的传输和接收。
然后,主设备通过MOSI线将数据发送到第一个从设备,第一个从设备接收到数据后,将其通过MISO线传输给第二个从设备,这样,数据从一个从设备级联传输到下一个从设备,直到传输到最后一个从设备。
每个从设备都需要有一个独立的SS,主设备通过控制相应的SS选择要与之通信的从设备,只有被选中的从设备才会响应主设备的数据传输。
在菊花链模式下,当数据从一个从设备传播到下一个从设备时,传输数据所需的时钟周期数量与从设备在菊花链中的位置成正比。在一个8位系统中,第3个从设备上的数据需要24个时钟脉冲,而在常规的SPI模式中只需要8个时钟脉冲,下图显示了通过菊花链传播的时钟周期和数据。

Source: Introduction to SPI Interface | Analog Devices
SPI核心思想
SPI的核心思想是,每个设备都有一个移位寄存器,它可以用来发送或接收一个字节的数据。这两个移位寄存器以环形方式连接在一起,一个寄存器的输出到另一个寄存器的输入,反之亦然。主设备控制共同的时钟信号,确保每个寄存器在另一个寄存器移出一个比特时,正好移入一个比特。

Source: What Could Go Wrong: SPI | Hackaday
SPI数据传输
4.1采样和移位
根据上面内容可知SPI通信,主设备必须发送SCLK信号,并通过使能SS信号(低电平)选择从设备。然后主设备和从设备可以分别通过MOSI和MISO线路同时发送数据。在SPI通信期间,数据的发送(串行移出到MOSI/SDO总线上,即移位)和接收(采样或读入总线(MISO/SDI)上的数据,即采样)同时进行。
> Sample(采样)
采样是指主设备或从设备在时钟的上升沿或下降沿时读取数据位的操作。采样的目的是在合适的时机获取正确的数据位,以确保数据的准确传输。
> Shift(移位)
移位是指数据位从发送器移动到接收器的过程,以实现数据的传输。移位是SPI通信中的关键步骤之一,确保数据的逐位传输和同步。
4.2时钟极性和时钟相位
具体何时进行采样和移位操作,可以通过设置时钟极性和时钟相位来实现。
> 时钟极性(Clock Polarity,CPOL)
在空闲状态期间,CPOL位设置时钟信号的极性。
CPOL = 1:表示空闲时是高电平;
CPOL = 0:表示空闲时是低电平。
空闲状态是指传输开始时CS为高电平且在向低电平转变的期间,以及传输结束时CS为低电平且在向高电平转变的期间,如下所示:
> 时钟相位(Clock Phase,CPHA)
CPHA位选择时钟相位。根据CPHA位的状态,使用时钟上升沿或下降沿来采样和/或移位数据。
CPHA = 0:表示从第一个跳变沿开始采样;
CPHA = 1:表示从第二个跳变沿开始采样。
主设备必须根据从设备的要求选择时钟极性和时钟相位,根据上述CPOL和CPHA位的选择,有四种SPI模式可用,如下所示:
SPI模式 |
CPOL |
CPHA |
空闲状态 |
采样,移位 |
0 |
0 |
0 |
低电平 |
采样上升沿,移位下降沿 |
1 |
0 |
1 |
低电平 |
采样下降沿,移位上升沿 |
2 |
1 |
0 |
高电平 |
采样下降沿,移位上升沿 |
3 |
1 |
1 |
高电平 |
采样上升沿,移位下降沿 |

对应到数据位,以CPOL = 0,CPHA = 0为例,绿色虚线表示片选使能,橙色虚线表示采样,蓝色虚线表示移位,如下所示:

Source: Introduction to SPI Interface | Analog Devices
4.3传输位序
先发送高bit(MSB),还是先发送低bit(LSB)。如下图所示,若采用MSB first,那么MOSI发送的数据为01000011, 即0x43。

Source: Basics of the SPI Communication Protocol
若采用LSB first,那么MISO接收到0x43后,发送形式如下所示:

Source: Basics of the SPI Communication Protocol
4.4 数据长度
注意上面的各图演示的都是传输8位数据,实际上SPI可以根据设备所支持的情况传输不同位数的数据,比如Aurix TC2xx系列最高支持32位数据传输。

总的来说,SPI数据传输取决于具体配置,选取哪种模式,何时采样,数据有多少位,是MSB还是LSB first,当然除此之外,实际实现这个功能还需要考虑更多因素。