· SPI

SPI

2137 字
11 分钟
SPI
StarryLin/Geek · 摘要

本文介绍SPI四线同步全双工通信,说明片选寻址、四种时序模式及无应答机制,并与I2C对比,指出其高速短距、适合大数据量板内传输。

SPI 入门:四根线的高速专线#

上回聊了 I2C 如何用两根线”排队聊天”,今天看看它的”对家”——SPI。如果说 I2C 是精打细算的公交车,SPI 就是拉专线的高速跑车。


一、四根线,分工明确#

SPI(Serial Peripheral Interface,串行外设接口)由摩托罗拉在 1980 年代提出。它的物理层比 I2C 奢侈,标准配置需要 4 根线:

表格

引脚全称方向作用
SCLKSerial Clock主机→从机时钟脉冲,同步全靠它
MOSIMaster Out Slave In主机→从机主机发送数据线
MISOMaster 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 的协议层极其精简,甚至可以说是”没有协议层”:

表格

特性SPII2C
应答机制❌ 没有硬件 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 MHzHS 模式
显示屏(TFT)10~40 MHz刷新像素需要带宽
SPI Flash20~80 MHz甚至支持 Dual/Quad SPI(用 2/4 根数据线并行)

作为对比,I2C 的 Fast Mode+ 才到 1 MHz,标准模式 100 kHz。SPI 轻松甩它几十条街。


七、SPI vs I2C:全方位对比#

表格

对比项SPII2C
线数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 的微调变体,大同小异。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

SPI
https://mjzy.tech/posts/通信协议/07-spi/
作者
JIA
发布于
2026-08-21
许可协议
CC BY-NC-SA 4.0

评论区

正在加载 GitHub 评论…

Tips · 随手记
仅自己可见 · 每篇文章单独保存

文章目录