SPI(Serial Peripheral Interface)是一种由摩托罗拉(Motorola)公司开发的高速、全双工、同步串行通信协议。它主要用于短距离通信,常见于微控制器与传感器、存储器、显示屏等外设之间的连接。
SPI通讯协议
1. 核心特点
全双工:数据可以同时发送和接收。
同步:依靠时钟信号(SCK)来同步数据传输。
主从架构:通常有一个主设备(Master)和一个或多个从设备(Slave)。
四线制:标准 SPI 需要 4 根信号线(也有 3 线或 2 线的变体)。
高速:速度通常比 I2C 和 UART 快得多,可达数十 MHz 甚至上百 MHz。
2. 四根信号线
| 信号线 | 全称 | 方向 | 说明 |
|---|---|---|---|
| SCK | Serial Clock | 主 → 从 | 时钟信号,由主设备产生,用于同步数据。 |
| MOSI | Master Out Slave In | 主 → 从 | 主设备发送数据,从设备接收。 |
| MISO | Master In Slave Out | 从 → 主 | 从设备发送数据,主设备接收。 |
| SS/CS | Slave Select / Chip Select | 主 → 从 | 片选信号,低电平有效(通常),用于选中特定的从设备。 |
3. 工作原理
片选:主设备将目标从设备的SS/CS拉低,激活该从设备。
时钟:主设备产生SCK时钟信号。
数据交换:在时钟的驱动下,数据通过MOSI和MISO同时进行移位传输。通常采用移位寄存器机制,主从设备各有一个移位寄存器,数据在时钟边沿逐位交换。
结束:传输完成后,主设备将SS/CS拉高,释放从设备。
4. 时钟极性(CPOL)与时钟相位(CPHA)
SPI 有四种工作模式,由CPOL和CPHA决定:
| 模式 | CPOL | CPHA | 说明 |
|---|---|---|---|
| Mode 0 | 0 | 0 | 时钟空闲为低,数据在第一个边沿(上升沿)采样。 |
| Mode 1 | 0 | 1 | 时钟空闲为低,数据在第二个边沿(下降沿)采样。 |
| Mode 2 | 1 | 0 | 时钟空闲为高,数据在第一个边沿(下降沿)采样。 |
| Mode 3 | 1 | 1 | 时钟空闲为高,数据在第二个边沿(上升沿)采样。 |
注意:主从设备必须配置相同的模式才能正常通信。
5. 多从设备连接方式
7. 常见应用
STM32中的SPI外设
通常SPI通过4个引脚与外部器件相连:
● MISO:主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。
● MOSI:主设备输出/从设备输入引脚。该引脚在主模式下发送数据,在从模式下接收数据。
● SCK:串口时钟,作为主设备的输出,从设备的输入
● NSS:从设备选择。这是一个可选的引脚,用来选择主/从设备。它的功能是用来作为“片选引脚”,让主设备可以单独地与特定从设备通讯,避免数据线上的冲突。从设备的NSS引脚可以由主设备的一个标准I/O引脚来驱动。一旦被使能(SSOE位), NSS引脚也可以作为输出引脚,并在SPI处于主模式时拉低;此时,所有的SPI设备,如果它们的NSS引脚连接到主设备的NSS引脚,则会检测到低电平,如果它们被设置为NSS硬件模式,就会自动进入从设备状态。当配置为主设备、 NSS配置为输入引脚(MSTR=1, SSOE=0)时,如果NSS被拉低,则这个SPI设备进入主模式失败状态:即MSTR位被自动清除,此设备进入从模式。
波特率发生器用于生成通信的同步时钟
NSS是片选信号 可以硬件自动控制,也可以使用软件控制。
数据寄存器对应两个缓冲区
一个用于写(发送缓冲)。写操作将数据写到发送缓冲区。
一个用于读(接收缓冲)。读操作将返回接收缓冲区里的数据。
移位寄存器
写入到发送缓冲区的数据,被送入到移位寄存器
按位通过MOSI把数据发送出去
按位把通过MIS0接收的数据存入到移位寄存器
接收数据完毕,数据被送入到接收缓冲区
寄存器配置
独立片选:每个从设备有独立的 SS 线,主设备通过拉低对应 SS 来选中。这是最常用的方式。
菊花链:从设备串联,数据依次传递。节省片选线,但速度较慢。
6. 优缺点
优点:
全双工,速度快。
协议简单,无起始/停止位,无地址帧,数据流连续。
硬件实现简单,占用引脚少(相比并行总线)。
缺点:
没有硬件流控,也没有应答机制(ACK)。
没有地址机制,多从设备需要额外的片选线。
传输距离短,通常板级通信。
没有标准规范,不同厂商的 SPI 可能有细微差异。
存储器:EEPROM、Flash(如 W25Qxx)。
传感器:加速度计、陀螺仪、温度传感器。
显示器:OLED、TFT 屏。
通信模块:以太网控制器、Wi-Fi 模块。
SD 卡(SPI 模式)。