SPI 协议(Serial Peripheral Interface,串行外设接口)
一、SPI 概述
SPI 是一种 全双工、同步、主从式 的串行通信协议。 常用于 MCU ↔ 外设 的高速数据传输,例如:
- MCU 与 Flash (W25Qxx)
- MCU 与 LCD/OLED
- MCU 与 AD/DA 芯片
- MCU 与无线模块
它的主要特点:
- 接口简单,只有 4 根基本线
- 速度高(MHz 级别,远快于 I²C)
- 不支持多主机(一般只有一个主机 MCU,多个从机)
二、SPI 硬件连接
基本的 4 根线:
- SCLK(Serial Clock)串行时钟 → 主机输出给从机
- MOSI(Master Out Slave In)主输出,从输入
- MISO(Master In Slave Out)主输入,从输出
- CS/SS(Chip Select / Slave Select)片选信号,低电平有效
当有多个从机时:
- SCLK、MOSI、MISO 共用
- 每个从机有独立的 CS
三、SPI 工作原理
SPI 传输过程中,主机产生 时钟信号 SCLK。
- 在时钟的边沿,数据在 MOSI / MISO 上传输。
- 每个时钟传输 1 bit 数据,全双工:
- 主机通过 MOSI 发数据给从机
- 从机通过 MISO 发数据给主机
- 一边发送,一边接收(像两条流水线)
一个字节传输过程:
- 主机发送 8 bit → 同时接收 8 bit
- 从机也发送 8 bit → 同时接收 8 bit
四、SPI 的时序模式
SPI 有 四种模式,由 时钟极性 (CPOL) 和 时钟相位 (CPHA) 决定:
| 模式 | CPOL | CPHA | 空闲时钟 | 采样时机 |
|---|---|---|---|---|
| 0 | 0 | 0 | 低电平 | 上升沿采样 |
| 1 | 0 | 1 | 低电平 | 下降沿采样 |
| 2 | 1 | 0 | 高电平 | 下降沿采样 |
| 3 | 1 | 1 | 高电平 | 上升沿采样 |
- CPOL = 0 → SCLK 空闲为低
- CPOL = 1 → SCLK 空闲为高
- CPHA = 0 → 第一个边沿采样
- CPHA = 1 → 第二个边沿采样
常见外设通常用 模式 0 或 3。
五、SPI 特点
- 速度高:通常可到几 MHz ~ 数十 MHz
- 硬件简单:比 I²C 少复杂性,不需要地址,只用片选
- 全双工:比 I²C、UART 快
- 缺点:
- 线多(4 根,比 I²C 的 2 根多)
- 不支持多主机
- 没有应答机制(不像 I²C 的 ACK/NACK),只能依靠协议层
六、举例(W25Q128 SPI Flash)
比如 MCU 要读 Flash:
- CS 拉低(选中芯片)
- MOSI 发送指令(如 0x03 = Read Data)
- MOSI 发送地址(24 位)
- MISO 输出数据流(每个 SCLK 一个 bit)
- 读完数据后,CS 拉高(释放芯片)
👉 总结一句: SPI 就是主机时钟驱动下,主机和从机通过 MOSI/MISO 同时收发数据的高速总线协议