前言
SPI 是嵌入式开发使用频率最高、速度最快的短距离串行通信总线。
Flash、LCD、OLED、SD卡、传感器全部依赖 SPI 通信。
很多同学只会 HAL 库调用,不懂底层移位原理、不懂四种时钟模式本质、不懂寄存器分工、不懂主从真实数据流向。
本篇文章一次性讲透 SPI 所有必考底层知识 + 工程细节 + 面试考点。
一、SPI 核心通信特性(面试必背)
- 同步通信

SPI 属于同步串行通信。
同步含义:
收发双方共用同一个时钟信号 SCLK,所有数据采样、移位全部跟随时钟边沿。
对比:
- USART 异步:双方各自时钟,不需要时钟线
- SPI 同步:主机提供时钟,从机严格跟随主机时钟
- 全双工通信(SPI 最大特点)

SPI 天然全双工,收发同时进行,互不冲突。
底层本质:
主机移位寄存器 和 从机移位寄存器,在每个时钟边沿互相交换 1bit 数据。
每一个 SCLK 脉冲同时完成两件事:
- 自己移出一位数据发出去
- 对方移入一位数据收进来
这就是 SPI 为什么速度快、为什么天生全双工 的根本原因。
- 串行通信

数据逐比特移位传输,不是并行一次性传输。
二、SPI 四线硬件结构(标准 SPI)

标准 SPI 一共 4 根线,功能完全固定:
- SCLK 时钟线
- 由主机产生
- 从机完全被动跟随时钟
- 决定通信速率、采样边沿
- MOSI 主机输出、从机输入
- Master Out Slave In
- 主机 → 从机 数据通道
- MISO 主机输入、从机输出
- Master In Slave Out
- 从机 → 主机 数据通道
- CS / NSS 片选线
- 低电平选中对应从机
- 一从机一CS线
- 未选中时,从机 MISO 为高阻态,不占用总线
补充:三线 SPI 是省略 CS / NSS ,工程基本不用。
三、SPI 主从架构(一主多从)

- 拓扑结构
- 唯一主机:STM32 单片机
- 多个从机:Flash、OLED、传感器、其他MCU
- 总线特点
- SCLK、MOSI、MISO 所有从机共用
- CS 独立独占,每个从机单独一根片选
-
工作逻辑
-
主机拉低某个从机的 CS
-
主机输出 SCLK 时钟
-
对应被选中的从机开始通信
-
未选中从机保持高阻,不响应总线
-
优缺点
✅ 优点:
- 扩展从机极其简单,只需多加一根 CS
- 通信速度极快
❌ 缺点:
- 无应答机制
- 无设备地址,纯靠片选区分设备
四、SPI 数据传输细节
- 数据宽度

标准支持:8bit / 16bit
工程 99% 场景使用 8bit 传输
- 数据位序:MSB / LSB
SPI 支持两种移位顺序:
- MSB 先行(高位先出)

- 绝大多数外设默认:Flash、OLED、传感器
- LSB 先行(低位先出)

- 极少设备使用,需要手册确认
位序配置错误,数据全部错乱,无法通信
五、SPI 四种工作模式(面试最高频)
SPI 模式由两个寄存器位决定:
- CPOL 时钟极性
- CPHA 时钟相位
- 时钟极性(Clock Polarity - CPOL)定义了时钟信号在空闲状态(无数据传输时)的电平:
CPOL = 0:时钟空闲时为低电平,如下图所示。
CPOL = 1:时钟空闲时为高电平,如下图所示。

- 在理解时钟相位之前,我们先来理解两个概念:第一边沿和第二边沿:
-
第一边沿:一个有效时钟周期开始时的第一个电平跳变边沿
-
第二边沿:紧跟第一边沿发生的、方向相反的第二个电平跳变边沿
比如:
时钟相位(Clock Phase - CPHA)定义了数据在时钟信号的哪个边沿被采样(读取、捕获),哪个边沿允许数据变化(发送),决定了数据位保持稳定和切换的精确时刻。
时钟相位的含义如下:
CPHA = 0:数据在时钟的第一边沿被采样(读取),在第二边沿改变数据位(发送)

CPHA = 1:数据在时钟的第一边沿改变数据位(发送),在第二边沿被采样(读取)

- 四种模式对照表

重点工程结论
市面上 80% 的 SPI 设备默认都是 Mode0
六、SPI 底层寄存器架构(核心吃透)

SPI 外设内部真正工作的寄存器分为 三层结构
- TX-DR 发送数据缓冲区
- 软件写入数据的寄存器
- CPU 把要发送的数据写入 TX-DR
- 无独立地址,写 DR 自动写入 TX-DR
- RX-DR 接收数据缓冲区
- 存放从机传回的数据
- 无独立地址,读 DR 自动读取 RX-DR
- 移位寄存器(核心工作单元)
真正实现全双工比特交换的硬件
- 不占用总线地址,软件不可直接操作
- 每一个时钟完成一次 bit 互换
- 对外统一寄存器 DR
手册上只有一个 DR 寄存器:
- 写 DR → 写入内部 TX-DR
- 读 DR → 读取内部 RX-DR
-
常用关键寄存器
-
SPI_CR1 控制寄存器1
- CPOL、CPHA 模式配置
- 波特率分频
- MSB/LSB 位序
- 软件从机管理位
- SPI_SR 状态寄存器
- TXE:发送空
- RXNE:接收非空
- OVR:接收溢出(高频错误)
- SPI_DR 数据寄存器
- 唯一数据交互端口
七、SPI 完整一次通信流程(主从全流程)
- 主机拉低从机 CS,选中设备
- 主机 CPU 写数据到 TX-DR
- 数据加载进主机移位寄存器
- 主机输出 SCLK 时钟
- 主从移位寄存器逐比特互换数据
- 8 个时钟结束,收发完成
- 移位数据存入各自 RX-DR
- CPU 读取 DR 获取从机数据
- 主机拉高 CS,结束通信

关键真相:
SPI 读数据必须发数据!
八、SPI 高频面试题(必背)
- SPI 是什么通信?
同步、串行、全双工总线。
- SPI 为什么是全双工?
主从各有移位寄存器,时钟边沿同时移出、移入,天然收发并行。
- 四根线分别作用?
SCLK:主机时钟
MOSI:主发从收
MISO:从发主收
CS:片选选通设备
- SPI 四种模式怎么区分?
CPOL 决定空闲电平,CPHA 决定采样边沿,组合四种模式。
- SPI 能不能一主多从?
可以,共用三根总线,独立 CS 片选。
- SPI 读数据为什么必须发数据?
SPI 时钟由主机提供,没有时钟就不会有移位,不会收到数据,读操作必须靠主机发字节产生时钟。
- SPI 溢出错误 OVR 是什么原因?
RX-DR 数据未读取,新数据覆盖旧数据,常见于读取不及时。
- SPI 和 I2C 区别?
- SPI 更快、全双工、无应答、靠片选
- I2C 较慢、半双工、有应答、靠设备地址
九、总结
- SPI 是同步全双工串行总线,核心是双移位寄存器比特互换
- 四线架构:SCLK/MOSI/MISO/CS
- 四种模式由 CPOL、CPHA 组合,工程默认 Mode0
- 内部三大数据单元:TX-DR、RX-DR、移位寄存器
- 对外只有 DR 一个数据端口,读写内部自动路由
- 读必发、时钟主机说了算、一主多从是常态
十、SPI通信本质建模

结语
如果本篇SPI底层讲解对你有帮助,欢迎点赞👍、收藏⭐,方便以后复习查阅。
内容聚焦嵌入式硬件底层原理,持续更新STM32、通信协议、RTOS、面试相关干货。
欢迎关注+转发给身边一起学嵌入式的小伙伴,一起吃透底层,少走弯路。
有疑问可以评论区留言,一起交流探讨!