SPI
目录
SPI
一、 SPI 协议简介
SPI(Serial Peripheral Interface)是由摩托罗拉公司开发的一种全双工、同步、四线制的串行通信总线。它以其简单性和高速度而闻名。
-
全双工:数据可以同时在主设备和从设备之间双向传输。
-
同步:通信双方通过统一的时钟信号(SCLK)来同步数据位(MOSI, MISO)的传输节奏。
-
四线制:通常需要四根信号线(有时可精简为三线)。
-
高速:相比 I2C,SPI 可以达到很高的速度(几十 Mbps 甚至上百 Mbps),没有标准上限。(推挽输出能力强)
-
无寻址:通过硬件片选(CS)线选择从设备,不支持软件寻址。
二、 硬件连接与信号线
SPI 通信至少需要四根线:
| 信号线名称 | 全称 | 方向 | 描述 |
|---|---|---|---|
| SCLK / SCK | Serial Clock | 主 → 从 | 主设备产生的同步时钟信号。 |
| MOSI / SDO | Master Out Slave In | 主 → 从 | 数据从主设备输出,输入到从设备。 |
| MISO / SDI | Master In Slave Out | 从 → 主 | 数据从从设备输出,输入到主设备。 |
| CS / SS | Chip Select / Slave Select | 主 → 从 | 主设备用于选择目标从设备的信号(低电平有效)。 |
Note
输出引脚配置为推挽输出,输入引脚配置为浮空或上拉输入。 当从机未被选中时,其输出引脚MISO必须为高阻态(断开)三、 核心概念
移位示意

1. 时钟极性(CPOL)与时钟相位(CPHA)
这是 SPI 最核心也最容易混淆的概念,它们共同定义了时钟的稳定电平和数据采样的边沿。有四种可能的模式。
-
时钟极性 CPOL:
-
CPOL = 0: 时钟空闲状态(当 CS 有效但无数据传输时)为低电平。
-
CPOL = 1: 时钟空闲状态为高电平。
-
-
时钟相位 CPHA:
-
CPHA = 0: 数据在时钟的第一个边沿(即 SCK 从空闲状态变化的第一个边沿)被采样。
-
CPHA = 1: 数据在时钟的第二个边沿(即 SCK 从空闲状态变化的第二个边沿)被采样。
-
四种 SPI 模式总结:
| 模式 | CPOL | CPHA | 时钟空闲状态 | 数据采样时刻 | 数据移位/变化时刻 |
|---|---|---|---|---|---|
| Mode 0 | 0 | 0 | Low | 第一个时钟边沿(上升沿) | 在下降沿(第二个边沿) |
| Mode 1 | 0 | 1 | Low | 第二个时钟边沿(下降沿) | 在上升沿(第一个边沿) |
| Mode 2 | 1 | 0 | High | 第一个时钟边沿(下降沿) | 在上升沿(第二个边沿) |
| Mode 3 | 1 | 1 | High | 第二个时钟边沿(上升沿) | 在下降沿(第一个边沿) |
关键记忆点:Mode 0 和 Mode 3 是最常用的两种模式。主设备和从设备的 CPOL 与 CPHA 设置必须完全一致,否则无法正常通信。
2. 数据顺序(Bit Order)
- 可以配置为 MSB First(最高位先行)或 LSB First(最低位先行)。MSB First 是默认和最常见的方式。
3. 数据帧大小(Frame Size)
- 通常为 8位(1个字节),但许多现代控制器支持任意长度的数据帧(如 4位, 12位, 16位等)。
四、 通信流程与帧格式
SPI 的通信流程非常简单,由主设备完全控制。
基本通信流程
- 初始化:主设备配置时钟极性(CPOL)和相位(CPHA)。
- 片选(开始):主设备将目标从设备的 CS 线拉低(有效),激活该从设备。

-
数据传输:主设备在 SCLK 线上产生时钟脉冲,同时:
-
通过 MOSI 线将数据一位一位地发送给从设备。
-
通过 MISO 线从从设备一位一位地接收数据。
-
这是一个同时进行(全双工) 的过程。
- 传输结束:主设备将 CS 线拉高(无效),结束通信。
-
帧格式波形图(以 8 位数据传输为例)
由于 SPI 有四种模式,其波形也不同。下图清晰地展示了四种模式下的数据传输时序。
通用时序概念:
- 数据采样时刻:接收端读取数据位的时机。
- 数据变化时刻:发送端改变数据位的时机。
模式0

模式1

模式2

模式3

Note
双线交叉表示传输一个Bit。 MISO为置于中间的一条线,表示高阻态,即断开。从此状态变为拉开的状态,表示从机被选中,允许开始通信。 所有数据传完后,MOSI变换电平是为了回到默认电平,如果没有默认电平也可以不变换。多字节连续传输
SPI 可以非常容易地进行多字节连续传输。主设备只需在 CS 有效期间,持续产生 SCLK 时钟周期即可。每个 SCLK 周期传输一位数据。

五、 SPI 优缺点总结
| 优点 | 缺点 |
|---|---|
| 全双工通信,效率高 | 需要4根线,比 I2C 占用更多 GPIO |
| 协议非常简单,硬件实现容易 | 无硬件应答机制,无法确认数据是否被成功接收 |
| 通信速度非常高,没有标准上限 | 无标准的寻址机制,需要大量独立的 CS 线连接多从机 |
| 通信过程由主设备完全控制,无需复杂的仲裁和同步 | 没有官方的标准协议,不同厂商设备可能有不同要求 |
| 数据传输结构灵活,没有固定的数据帧格式 |
六、 SPI 与 I2C 的快速对比
| 特性 | SPI | I2C |
|---|---|---|
| 线数 | 4 线(CS, SCLK, MOSI, MISO) | 2 线(SDA, SCL) |
| 速度 | 高(通常 >10 Mbps) | 中低速(标准模式 100kbps,快速模式 400kbps) |
| 通信方式 | 全双工 | 半双工 |
| 拓扑 | 点对点、独立CS、菊花链 | 多主从、总线型、软件寻址 |
| 协议复杂度 | 简单 | 相对复杂(有起始、停止、应答位) |
| 流控/应答 | 无 | 有(ACK/NACK 位) |
| 硬件开销 | 主设备 CS 线随从设备数量增加 | 硬件资源固定 |