【STM32】从软硬两角度初步了解SPI(概念 + 面试题)
一、SPI 概述
1.1 定义与定位
SPI(Serial Peripheral Interface,串行外设接口):一种高速、全双工、主从结构、同步串行通信协议,由摩托罗拉(现 NXP)在 1980 年代提出,用于短距离板级设备间通信(MCU ↔ 传感器/存储器/屏幕)。
四个关键词逐个拆解:
关键词 含义 高速 板级通信中速度优势明显(如 W25Q64 支持到 80MHz SCK) 全双工 同一时钟周期内,双方同时收发(本质是比特交换) 主从结构 一方 Master 主导(产生时钟),一方/多方 Slave 被动 同步串行 靠 SCK 时钟线逐位同步传输,谁产生 SCK 谁就是 Master
1.2 "4 线制"与"3 线制"之争
- 严格说 SPI 是 4 线:SCK + MOSI + MISO + NSS
- 参考手册写"3 线",因为 NSS 可选:片选逻辑极简单,用任意 GPIO 输出低电平即可替代 NSS,所以核心必备的只有 3 根线
- 结论记忆:对外是 4 线、核心是 3 线、NSS 可扩展
二、四根信号线
2.1 SCK(Serial Clock,时钟线)
- 方向:Master → Slave(单向)
- 作用:提供同步节拍,数据位的采样和切换严格发生在 SCK 边沿
- 本质:SCK 是"指挥棒",谁产生 SCK 谁是 Master(主从地位的本质区别)
- 与 I2C 的 SCL 类比:都有时钟线同步 → 都是同步通信;但 I2C 是电平驱动,SPI 是边沿驱动
2.2 MOSI(Master Out / Slave In,主出从入)
- 方向:Master → Slave;对主是输出,对从是输入
- 数据流:主机发数据给从机
2.3 MISO(Master In / Slave Out,从出主入)
- 方向:Slave → Master;对主是输入,对从是输出
- 关键限制:只有被选中的从机 MISO 才有效,未选中的必须高阻态
- 高阻态的意义(电气角度):高阻 ≈ 断开。若未选中从机强行输出,与选中从机同时在 MISO 上驱动相反电平 → 总线短路 / 信号干扰
2.4 NSS / SS / CS(片选线)
- 方向:Master → Slave,低电平有效
- 每从机一根独立线(这是 SPI 支持多从机的方式,非总线仲裁)
- STM32F1xx 中叫 NSS(Negative Slave Select);被拉低 = 被激活
- 原则:有多少从设备就需要多少根 NSS;SPI 有默认 NSS 引脚,但更常用的是用普通 GPIO 充当 NSS
2.5 命名对照表(换芯片不迷路)
通用名 可能叫法 SCK CLK、SCLK MOSI SDI、DI MISO SDO、DO NSS SS、CS、CS#
2.6 记忆口诀汇总
- 接线口诀:同线相接 —— SCK 接 SCK、MOSI 接 MOSI、MISO 接 MISO(两个 SPI 接口对接)
- 名字看一半:
- Master 看前两个字母:MOSI=输出线、MISO=输入线
- Slave 看后两个字母:MOSI=输入线、MISO=输出线
- 这样"同名相接"自然建立双向链路
三、为什么需要 SPI —— 对比与取舍
U(S)ART / I2C / SPI 三接口对比表得出核心结论:
SPI 最突出的优势是速度快,这是工程选型用 SPI 的最核心原因。
优势:
高速、全双工、协议简单可靠、时钟同步容错率高。
五大局限性(面试常问"SPI 的缺点"):
- 无流控 —— 主设备无法感知从设备是否准备好(需软件或额外信号线)
- 无应答机制 —— 无法确认从设备是否正确接收(需高层协议:读回比对、CRC 等)
- 无错误检测 —— 协议本身不含校验(需高层实现)
- 占用引脚多 —— 每从机一根 SS,从机一多 GPIO 吃紧、布线复杂
- 无多主支持 —— 标准 SPI 只支持单一主设备
四、应用场景(7 类)
序号 设备 意义 ① 中小尺寸 LCD(如 3.5 寸 IPS 电容触摸屏 320×480) 无 LCD 控制器的 MCU 也能显示 ② SPI 接口 Flash(如 MX25L 系列) 外置 Flash 方案非常常用 ③ SPI 以太网模块 MCU 无以太网控制器也能联网 ④ SPI WiFi 模块 MCU 实现无线连接 ⑤ OLED 模块 基本都支持 SPI 控制 ⑥ SPI ADC 模块 扩展模拟采样通道 ⑦ SPI 模式 SD 卡模块 无 SDIO 接口的 MCU 也能操作 SD 卡
五、STM32F103ZET6 与 SPI —— 深度解析
5.1 三个 SPI 外设
- SPI1 → APB2 总线(高速,最高 72MHz 时钟域)
- SPI2、SPI3 → APB1 总线(低速,最高 36MHz 时钟域)
- 数据手册:多达 3 个 SPI(18M 位/秒),其中 2 个可复用为 I²S(音频)
- SCK 的产生强依附于 PCLK(时钟树),波特率发生器本质是分频器
5.2 SPI 与 GPIO 的关系
- SCK/MOSI/MISO 最终都要通过 GPIO 物理引脚输出 → GPIO 被 SPI 复用
- 输出引脚配置为复用推挽输出,输入引脚配置为复用输入(可看作浮空输入/导线)
- CubeMX 会自动完成引脚复用配置,实操时注意即可
六、SPI 协议核心 —— 深度解析
6.1 片选机制(一主多从)
- 主机拉低哪个从机的 NSS,就选中哪个(NSS=0 选中)
- 例:NSS1=0、NSS2=1、NSS3=1 → 选中从机 1
- 易错点:
- 未选中从机的 MISO 必须高阻(防短路)
- 未选中从机的 MOSI 不用管:主机发、从机收,从机"收不收都不影响主机",没被选中就忽略数据
- 软件管理 NSS = 用普通 GPIO 拉低/拉高做片选,可挂接大量从机
6.2 极简同步收发(边沿驱动)
对比 I2C:I2C 是电平驱动(SCL 高电平采集、低电平允许改变),
SPI 是边沿驱动(SCK 边沿触发动作)
- 极简模型:上升沿 Master/Slave 都发送,下降沿都接收(真实情况由 CPOL/CPHA 决定)
- 三大结论(必背):
- SPI 是基于 SCK 边沿驱动的同步通信
- 一个时钟周期内双方"同时发 + 同时收" → 全双工
- SPI 本质 = 双方同时做数据交换,一个周期交换 1 个比特位;哪怕没数据可发,也要用"垃圾数据"交换(硬件特性),接收方忽略即可
6.3 时钟极性 CPOL(空闲电平)
- CPOL=0:空闲(无传输)时为低电平
- CPOL=1:空闲时为高电平
- 速记:高 1 低 0
6.4 第一边沿 / 第二边沿
- 第一边沿:一个有效时钟周期开始时的第一次跳变
- 第二边沿:紧跟第一边沿、方向相反的第二个跳变
- 推导:CPOL=0 → 第一边沿=上升沿、第二=下降沿;CPOL=1 → 相反
- 只有两种边沿,上升/下降不用死记,会推导即可
6.5 时钟相位 CPHA(数据在哪个边沿采样)
- CPHA=0:数据在第一边沿采样(读),第二边沿改变(写)
- CPHA=1:数据在第一边沿改变(写),第二边沿采样(读)
- 速记:CPHA=0 →"0 像嘴巴,读书用嘴巴(读)";CPHA=1 →"1 像支笔,用来写"
- 本质:CPHA 决定数据稳定和切换的精确时刻
6.6 四种工作模式(必背表格)
CPOL CPHA 模式 第一边沿 第二边沿 空闲电平 0 0 Mode 0 上升沿·采样(读) 下降沿·改变(写) 低 0 1 Mode 1 上升沿·改变(写) 下降沿·采样(读) 低 1 0 Mode 2 下降沿·采样(读) 上升沿·改变(写) 高 1 1 Mode 3 下降沿·改变(写) 上升沿·采样(读) 高 易错点:
- 主从双方配置的模式必须一致 → 收发必然同频
- 配好 CPOL/CPHA 后,NSS/SCK/MOSI/MISO 的时序关系由硬件自动完成,用户感知不到
- 常用默认:Mode 0(CPOL=0, CPHA=0),绝大多数 SPI 芯片默认模式
6.7 通信本质口诀
一个边沿,一种动作;
两个边沿,一对读写;
两个边沿,一个周期;
一个周期,一次交换。
- 交换 = 自己的给别人 + 别人的给自己(一对读写 = 一次交换)
6.8 如何看懂时序图(方法论)
- 站在"线"的视角,不要站在 Master 或 Slave 单一视角
- 原因:任何一个时钟沿上,Master 和 Slave 只能做同一种动作(要么都发、要么都收),单机视角看不到同步过程
- 以 Mode 0 为例看一个周期:
- 片选后,主从先把数据放到各自 MOSI/MISO 线上(Mode0 第一边沿要采集,所以数据要提前就位)
- 第一边沿(上升沿):主从都采集(主机读 MISO、从机读 MOSI)
- 第二边沿(下降沿):主从都改变(主机写 MOSI、从机写 MISO,供下个边沿对方读取)
- 一句总结:一根线,不同视角,不同作用
6.9 MSB / LSB First(位顺序)
- MSB = 最高有效位(8 位数据的 bit7、16 位数据的 bit15)
- LSB = 最低有效位(bit0)
- MSB First:先发最高位;LSB First:先发最低位
- 默认统一 MSB First;双方不一致会导致数据错乱(字节内位序颠倒)
6.10 数据宽度
- STM32 SPI 支持 8bit / 16bit 帧
- 默认用 8 位(16 位一般不考虑)
6.11 波特率 = SCK 频率
- SPI 中波特率 = 位速率 = 比特率 = SCK 频率(数据按时钟驱动同步传输,三者等价)
- 例:W25Q64BV 支持最高 80MHz SCK(双线/四线快速读可达 160/320MHz,但课程只学标准双线)
- 选频原则:选能长期稳定工作的最高频率;受限于:
- a. 主、从机支持的最高时钟频率
- b. 布线、工作环境(干扰)等硬件因素
6.12 收发实例(Mode 0、MSB First)
主机发 0x50、从机发 0xA0:
M→S: 0x50 = 0101 0000 (先发 bit7,MSB 在前) S→M: 0xA0 = 1010 0000视角提示:
时钟就是时间——先发出的时钟对应时间更早,收发顺序由时钟顺序决定;
站在时钟视角推测收发顺序最精准。
七、寄存器与地址空间 —— 深度解析
7.1 地址映射
- 片上外设寄存器统一编址、直接映射到 CPU 地址空间
- SPI1:0x4001 3000 – 0x4001 33FF(APB2)
- 范围大小 = 0x4001 33FF - 0x4001 3000 + 1 = 0x400 = 1024 字节 = 1KB
- SPI2、SPI3 挂在 APB1
- 易错点:1KB 空间里实际用到的只有开头很少一部分,其余是保留地址,访问可能产生不可预知行为
7.2 9 个寄存器
- 每个 SPI 模块内部有 9 个寄存器(独立一套):包括 CR1(控制)、CR2(控制)、SR(状态)、DR(数据)等
- 访问方式:基址 + 寄存器偏移(例:DR 偏移 0x0C → 0x4001 300C)
- 后续实操以源码形式逐个说明
八、SPI 片上外设内部结构
8.1 功能框图核心部件
主/从设备内部都必须具备:
- SCK:由内部波特率发生器产生(本质=分频器,强依附 PCLK 时钟树;配置位在 SPI_CR1)
- NSS:Master 模式 → 输出低电平片选;Slave 模式 → 接收低电平判断自己被选中
8.2 DR 寄存器与双缓冲(面试高频)
- 主从双方都只需读写 DR 寄存器即可完成通信
- 问题:全双工需要同时收和发,但 DR 只有一个 → 怎么实现?
- 答案:DR 对应两个不可见缓冲区(地址复用)
操作 实际访问 DR = 数据(写)写入发送缓冲区 data = DR(读)读取接收缓冲区
- 逻辑上"入口统一"(都叫 DR),物理上由读写方向(RW 控制)使能开关,选择导通发送或接收缓冲
- 类比:菜鸟驿站——收发快递都到同一个驿站(逻辑同址),但包裹放在不同架子(物理分缓冲)
- ⚠️ 注意:这是课件对实现方式的示意性理解(厂家不公开硬件实现细节),不作为真实技术实现参考
8.3 全双工为什么"同时收发"?(面试必问)
- 主从双方各只有一个移位寄存器,但移位是同步时序:
- 每个周期先移出队头数据(给别人)→ 尾部空出新位置 → 再移入对方数据
- 先出后入 → 一个寄存器在一个周期内同时完成"发+收"
- 本质建模:SPI 通信 = 一个队列,从队头移出数据、移出的数据从队尾入队,循环移位 8 次 = 完成 8 比特交换
- SCK 是指挥棒:一个周期需要两个边沿来控制"出"和"入"的步调
下面这张图把"一个周期内如何同时收发"画出来:
8.4 一次完整全双工通信过程(五步)
- 产生时钟:主机波特率发生器产生 SCK,从机直接使用;双方移位都由主机时钟驱动
- 写数据:向 DR 写数据 → 自动入发送缓冲区 → 自动传入移位寄存器
- 发送:按 LSB/MSB First 配置,移位寄存器逐位输出(主机经 MOSI、从机经 MISO)
- 接收:逐位读入移位寄存器,收满 8/16 位后自动传入接收缓冲区
- 读数据:读 DR → 返回接收缓冲区数据
九、总结(两个视角)
视角 核心概念 协议角度(黑盒) SCK、NSS、MOSI、MISO、片选、CPOL/CPHA、4 种模式、数据宽度、MSB/LSB、波特率 硬件角度(白盒) DR 双缓冲(地址复用)、移位寄存器(先出后入队列模型)、同步全双工 一句话总结:
SPI 是以 SCK 边沿为节拍、主从双方用一个移位寄存器做比特交换的同步全双工通信协议。
📌 SPI 面试题
基础题
Q1:什么是 SPI?有哪些特点?
SPI 是串行外设接口(Serial Peripheral Interface),一种高速、全双工、主从结构、同步串行通信协议。
特点:①速度快;②全双工(同时收发);③协议简单(无帧格式);
④同步通信(靠 SCK 时钟);⑤一主多从。
Q2:SPI 有几根线?分别什么作用?
标准 4 线:SCK(主机产生的同步时钟)、MOSI(主出从入数据)、
MISO(从出主入数据,仅被选中从机有效)、
NSS/CS(片选,低电平有效,每从机一根)。
NSS 可用 GPIO 替代,所以参考手册有时称 3 线。
Q3:SPI 是同步还是异步通信?为什么?
同步。
因为有一根专门的时钟线 SCK,数据的采样和切换严格跟随 SCK 边沿,双方共用同一时钟节拍。UART 无时钟线、靠双方约定波特率,才是异步。
Q4:什么是 CPOL 和 CPHA?SPI 有哪四种模式?
CPOL(时钟极性)决定空闲电平:0=低、1=高。
CPHA(时钟相位)决定数据在哪个边沿采样:0=第一边沿采样、1=第二边沿采样。
组合出 Mode0(00)、Mode1(01)、Mode2(10)、Mode3(11)。
常用默认 Mode0。
Q5:为什么说 SPI 是全双工?
因为 MOSI 和 MISO 是两条独立数据线,在同一个 SCK 周期内,主机经 MOSI 发的同时经 MISO 收,从机相反——双方同时完成一次比特交换,互不干扰。
Q6:未选中从机的 MISO 为什么必须置高阻态?
高阻态相当于断开。若未选中从机仍驱动 MISO,与选中从机同时输出相反电平会造成总线短路或信号干扰。只有选中从机能驱动 MISO。
Q7:SPI 的缺点有哪些?
①无流控(不知从机是否准备好);②无应答(不知从机是否正确接收);
③无错误检测(无校验);④占引脚多(每从机一根 SS);⑤不支持多主。
Q8:SPI 和 I2C、UART 的主要区别?
UART 异步、点对点、无时钟线;
I2C 同步、半双工、两根线(SCL/SDA)、带地址寻址和应答、速度较慢;
SPI 同步、全双工、4 线、速度快、无地址无应答、靠片选选从机。
进阶题
Q9:SPI 只有一个 DR 寄存器,怎么实现全双工?
采用地址复用 + 双缓冲设计:DR 这一个地址逻辑上对应两个物理缓冲区——发送缓冲(写 DR 时写入)和接收缓冲(读 DR 时读取),
由读写方向(RW 控制信号)使能对应开关选择导通哪个缓冲区,从而节省物理地址又能同时收发。
Q10:主从双方各只有一个移位寄存器,怎么做到"收的同时还在发"?
因为移位是同步时序:每个 SCK 周期先从队头移出一位给对端,尾部空出新位置,再把对端发来的位从队尾移入。
"先出后入"让同一个寄存器在一个周期内完成发+收。
本质是队列循环移位,8 次完成 8 比特交换。
Q11:SPI 通信时我不想接收数据,怎么办?
也照常"交换":SPI 硬件特性决定了必须发数据才能收数据,没数据可发就发垃圾数据(如 0x00/0xFF),接收方在软件层忽略收到的内容即可。
Q12:SPI 如何确认数据传对了?(无应答怎么解决)
协议层无机制,需上层实现:①读回验证(写后读比对);②在数据帧中加 CRC 校验;③加 ACK 应答引脚/握手信号;④依赖从机状态寄存器查询。
Q13:SPI 时钟频率怎么选?
原则:选能长期稳定工作的最高时钟频率。
受限于:主机/从机支持的最高频率(如 W25Q64 最高 80MHz)和布线、干扰等硬件因素。
Q14:MSB First 和 LSB First 是什么?搞错了会怎样?
MSB First 先发最高位(bit7/bit15),LSB First 先发最低位(bit0)。双方必须一致,否则字节内位序颠倒、数据错乱。
Q15:一个 SPI 主机最多能接几个从机?
标准 SPI 用独立片选选从机,数量理论上只受 GPIO 数量限制——每多一个从机只需多一根 NSS(GPIO)线。SCK/MOSI/MISO 是共享总线。
Q16:SPI 为什么不适合长距离传输?
①同步时钟在高频下受线缆电容、干扰影响大,距离越远信号完整性越差;
②无差分、无校验,抗干扰弱;
③设计定位就是短距离板级(同一 PCB 上芯片间)通信。
Q17:STM32F103ZET6 的 3 个 SPI 挂在什么总线上?
SPI1 挂在 APB2(高速总线),SPI2、SPI3 挂在 APB1(低速总线)。
SCK 频率由各自总线时钟(PCLK)经波特率发生器分频得到。
Q18:什么场景选 SPI、什么场景选 I2C?
需要高速大批量传输(刷屏、读写 Flash、采样 ADC)选 SPI;
需要少引脚、多设备挂接、有应答可靠通信(传感器采集、EEPROM、低速配置类)选 I2C。
更多推荐















所有评论(0)