SPI
本文介绍SPI四线同步全双工通信,说明片选寻址、四种时序模式及无应答机制,并与I2C对比,指出其高速短距、适合大数据量板内传输。
SPI 入门:四根线的高速专线
上回聊了 I2C 如何用两根线”排队聊天”,今天看看它的”对家”——SPI。如果说 I2C 是精打细算的公交车,SPI 就是拉专线的高速跑车。
一、四根线,分工明确
SPI(Serial Peripheral Interface,串行外设接口)由摩托罗拉在 1980 年代提出。它的物理层比 I2C 奢侈,标准配置需要 4 根线:
表格
| 引脚 | 全称 | 方向 | 作用 |
|---|---|---|---|
| SCLK | Serial Clock | 主机→从机 | 时钟脉冲,同步全靠它 |
| MOSI | Master Out Slave In | 主机→从机 | 主机发送数据线 |
| MISO | Master In Slave Out | 从机→主机 | 从机发送数据线 |
| CS(或 SS) | Chip Select | 主机→从机 | 片选线,低电平有效 |
看到 MOSI/MISO 的名字就知道方向:主机出、从机进;主机进、从机出。比 I2C 一根 SDA 来回倒腾直观得多。
每增加一个从机,就要多一根 CS 线。所以 SPI 的”票价”是 3+N 根线(N 为从机数)。
二、全双工同步:边发边收
SPI 是同步、全双工通信。主机在 SCLK 的每个边沿(通常是上升沿或下降沿,可配置)同时做两件事:
-
通过 MOSI 发送 1 位给从机
-
通过 MISO 接收 1 位从从机
plain
┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐ ┌─┐SCLK ──┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ └─┘ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ D7 D6 D5 D4 D3 D2 D1 D0
MOSI ───┐ ┌───┐ ┌───────┐ └───┘ └───────┘ └──── 主机→从机 (发送)
MISO ─────┐ ┌───┐ ┌───────┐ └───────┘ └───┘ └─ 从机→主机 (接收)这意味着每发送 1 字节,必然同时收到 1 字节。即使主机只想读不想写,也得往 MOSI 上”扔”点垃圾数据(通常是 0x00 或 0xFF),才能把时钟”转”起来,把 MISO 上的数据”换”回来。
三、片选机制:一主多从的”点名制”
SPI 没有 I2C 那种”广播地址”的概念。主机想跟谁说话,就把谁的 CS 线拉低,其他从机的 CS 保持高电平,它们就乖乖闭嘴。
plain
主机 │ ├── CS0 ──┬── 从机 A (Flash) ├── CS1 ──┼── 从机 B (OLED) ├── CS2 ──┼── 从机 C (ADC) │ │SCLK ───────┼────── 所有从机共享MOSI ───────┼────── 所有从机共享MISO ◄──────┴────── 所有从机共享(开漏/三态输出,避免冲突)因为 MISO 是多从机共享的,所以每个从机的 MISO 引脚必须是三态输出(高阻态)——没被选中时,它得变成”透明人”,不能强行拉高或拉低总线,否则会和被选中的从机打架。
四、四种工作模式:CPOL 和 CPHA
SPI 不像 I2C 那样协议固定,它把时序的灵活性交给了开发者。通过两个配置位决定采样时机:
表格
| 参数 | 含义 | 取值 |
|---|---|---|
| CPOL | 时钟极性 | 0:空闲时 SCLK 为低;1:空闲时 SCLK 为高 |
| CPHA | 时钟相位 | 0:第一个边沿采样;1:第二个边沿采样 |
组合出 4 种模式(Mode 0~3):
plain
Mode 0 (CPOL=0, CPHA=0): 空闲低,上升沿采样,下降沿输出 ┌─┐ ┌─┐ ┌─┐SCLK ──┘ └─┘ └─┘ ↑采样 ↑采样
Mode 3 (CPOL=1, CPHA=1): 空闲高,下降沿采样,上升沿输出 ──┐ ┌─┐ ┌─┐ ┌──SCLK └─┘ └─┘ └─ ↑采样 ↑采样主机和从机必须约定好同一种模式,否则一个在第 1 个边沿读,一个在第 2 个边沿读,数据就对不上了。这也是 SPI 比 I2C 麻烦的地方——I2C 协议是死的,接上就能聊;SPI 得先对表。
五、没有 ACK,没有地址,没有废话
SPI 的协议层极其精简,甚至可以说是”没有协议层”:
表格
| 特性 | SPI | I2C |
|---|---|---|
| 应答机制 | ❌ 没有硬件 ACK | ✅ 每字节都有 ACK/NACK |
| 设备地址 | ❌ 靠 CS 线硬选择 | ✅ 7/10 位软件地址 |
| 起始/停止 | ❌ CS 拉低/拉高就是开始/结束 | ✅ 特殊的 SDA 跳变 |
| 广播能力 | ❌ 只能单点对话 | ✅ 支持广播(地址 0x00) |
| 多主仲裁 | ❌ 标准 SPI 不支持 | ✅ 支持多主机仲裁 |
| 时钟拉伸 | ❌ 从机不能暂停主机 | ✅ 从机可拉低 SCL 喊停 |
SPI 的设计哲学是**“极简、高速、主控全权负责”**。主机发什么、收什么、什么时候选谁,全部由主机软件掌控。从机就是个听话的移位寄存器。
六、速度:SPI 的杀手锏
SPI 没有 I2C 那种”标准模式”的上限束缚,它的速度只取决于主从双方的硬件能力和 PCB 走线质量:
表格
| 场景 | 典型速率 | 备注 |
|---|---|---|
| 普通外设 | 1~8 MHz | 大多数传感器、小 Flash |
| SD 卡(标准) | 25 MHz | 早期 SD 协议 |
| SD 卡(高速) | 50 MHz | HS 模式 |
| 显示屏(TFT) | 10~40 MHz | 刷新像素需要带宽 |
| SPI Flash | 20~80 MHz | 甚至支持 Dual/Quad SPI(用 2/4 根数据线并行) |
作为对比,I2C 的 Fast Mode+ 才到 1 MHz,标准模式 100 kHz。SPI 轻松甩它几十条街。
七、SPI vs I2C:全方位对比
表格
| 对比项 | SPI | I2C |
|---|---|---|
| 线数 | 4+N(N 为从机数) | 永远 2 根 |
| 双工方式 | 全双工(同时收发) | 半双工(分时收发) |
| 寻址方式 | 硬件片选 CS | 软件地址(7/10 位) |
| 最高速率 | 几十 MHz 甚至更高 | 最高 3.4 MHz(高速模式极少见) |
| 应答确认 | 无 | 每字节硬件 ACK |
| 多主机支持 | 不支持(需外加逻辑) | 原生支持总线仲裁 |
| 从机控制能力 | 弱(不能暂停主机) | 强(时钟拉伸) |
| 引脚占用 | 随从机数增加 | 固定不变 |
| 协议复杂度 | 低(时序灵活但简单) | 较高(地址、ACK、重复起始等) |
| 传输距离 | 极短(板内,<30cm 高速时) | 短(板内/板间,<1m) |
| 功耗 | 较高(持续时钟+全速驱动) | 较低(开漏+时钟可慢可停) |
八、作用域:什么时候选谁?
选 SPI,如果:
-
数据量大、速度要求高:刷显示屏、读 TF 卡、高速 ADC 采样、SPI Flash 固件升级
-
需要同时收发:某些传感器协议要求”发命令的同时收上一帧结果”
-
引脚充裕:不在乎多几根线,追求极致吞吐
-
协议简单可控:不想处理 I2C 的地址冲突、ACK 丢失、时钟拉伸等烦心事
-
板级高速互联:同一块 PCB 上,走线短、干扰可控
典型器件:W25Qxx Flash、ILI9341 TFT 屏、ADXL355 高速加速度计、NRF24L01 无线模块、SD 卡。
选 I2C,如果:
-
引脚极度紧张:尤其是 8 引脚单片机,能省一根是一根
-
设备数量多:总线上挂七八个传感器,不想被 CS 线淹没
-
需要”确认收到”:每字节的 ACK 机制让可靠性更有保障
-
多主场景:多个 MCU 需要轮流控制总线
-
低速控制类外设:读个温度、设个 RTC、配置个电源管理芯片
-
标准化地址:外设地址由厂商分配,软件扫描即可发现设备
典型器件:MPU6050 陀螺仪、AT24Cxx EEPROM、DS3231 RTC、SSD1306 OLED(小屏)、各类温度/气压传感器。
九、实际接线示例
SPI 接 Flash(W25Q128)
plain
MCU (主机) │ ├── PA0 ─── CS ───┐ ├── PA1 ─── SCLK ───┼── SCLK ├── PA2 ─── MOSI ───┼── DI (Flash 的 Data In) ├── PA3 ─── MISO ───┼── DO (Flash 的 Data Out) │ │ │ W25Q128 (从机) └── VCC/GND ────────┴── 电源多从机接线
plain
MCU │ ├── CS0 ─── 从机 A ├── CS1 ─── 从机 B ├── CS2 ─── 从机 C │SCLK ─────── 所有从机MOSI ─────── 所有从机MISO ◄────── 所有从机(各从机 MISO 需为三态/开漏)注意:如果某个从机的 MISO 不是三态输出(比如某些廉价模块),挂多个从机时 MISO 会冲突。这时需要加三态缓冲器或逻辑门隔离。
十、总结
表格
| 概念 | 一句话理解 |
|---|---|
| SCLK | 主机带的节拍器,所有人跟着它跳舞 |
| MOSI / MISO | 两条单向高速车道,同时跑不堵车 |
| CS | 主机的”点名册”,点到谁谁说话 |
| CPOL / CPHA | 对表用的,主机从机必须调到一个频道 |
| 全双工 | 边发边收,发 1 字节必收 1 字节 |
| 无 ACK | 主机自己负责,发出去就默认对方收到了 |
十一、一点延伸
现代 SPI 已经演化出不少增强版:
-
Dual SPI / Quad SPI:用 2 根或 4 根 IO 线同时传数据,速率成倍提升。W25Q 系列 Flash 常支持 Quad SPI,读速可达 80~133 MHz × 4 位。
-
QSPI 控制器:MCU 内置的 Quad SPI 外设,可以直接内存映射(XIP),像访问 RAM 一样执行 Flash 里的代码。
-
Microwire / SSP / TI SSP:各家厂商对 SPI 的微调变体,大同小异。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
评论区
正在加载 GitHub 评论…