一、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 命名对照表(换芯片不迷路)

通用名可能叫法
SCKCLK、SCLK
MOSISDI、DI
MISOSDO、DO
NSSSS、CS、CS#

2.6 记忆口诀汇总

  1. 接线口诀:同线相接 —— SCK 接 SCK、MOSI 接 MOSI、MISO 接 MISO(两个 SPI 接口对接)
  2. 名字看一半:
    • Master 看前两个字母:MOSI=输出线、MISO=输入线
    • Slave 看后两个字母:MOSI=输入线、MISO=输出线
  3. 这样"同名相接"自然建立双向链路

三、为什么需要 SPI —— 对比与取舍

 U(S)ART / I2C / SPI 三接口对比表得出核心结论:

        SPI 最突出的优势是速度快,这是工程选型用 SPI 的最核心原因。

优势:

        高速、全双工、协议简单可靠、时钟同步容错率高。

五大局限性(面试常问"SPI 的缺点"):

  1. 无流控 —— 主设备无法感知从设备是否准备好(需软件或额外信号线)
  2. 无应答机制 —— 无法确认从设备是否正确接收(需高层协议:读回比对、CRC 等)
  3. 无错误检测 —— 协议本身不含校验(需高层实现)
  4. 占用引脚多 —— 每从机一根 SS,从机一多 GPIO 吃紧、布线复杂
  5. 无多主支持 —— 标准 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 决定)
  • 三大结论(必背):
    1. SPI 是基于 SCK 边沿驱动的同步通信
    2. 一个时钟周期内双方"同时发 + 同时收" → 全双工
    3. 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 四种工作模式(必背表格)

CPOLCPHA模式第一边沿第二边沿空闲电平
00Mode 0上升沿·采样(读)下降沿·改变(写)低
01Mode 1上升沿·改变(写)下降沿·采样(读)低
10Mode 2下降沿·采样(读)上升沿·改变(写)高
11Mode 3下降沿·改变(写)上升沿·采样(读)高

易错点:

  • 主从双方配置的模式必须一致 → 收发必然同频
  • 配好 CPOL/CPHA 后,NSS/SCK/MOSI/MISO 的时序关系由硬件自动完成,用户感知不到
  • 常用默认:Mode 0(CPOL=0, CPHA=0),绝大多数 SPI 芯片默认模式

6.7 通信本质口诀

        一个边沿,一种动作;

        两个边沿,一对读写;

        两个边沿,一个周期;

        一个周期,一次交换。

  • 交换 = 自己的给别人 + 别人的给自己(一对读写 = 一次交换)

6.8 如何看懂时序图(方法论)

  • 站在"线"的视角,不要站在 Master 或 Slave 单一视角
  • 原因:任何一个时钟沿上,Master 和 Slave 只能做同一种动作(要么都发、要么都收),单机视角看不到同步过程
  • 以 Mode 0 为例看一个周期:
    1. 片选后,主从先把数据放到各自 MOSI/MISO 线上(Mode0 第一边沿要采集,所以数据要提前就位)
    2. 第一边沿(上升沿):主从都采集(主机读 MISO、从机读 MOSI)
    3. 第二边沿(下降沿):主从都改变(主机写 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 一次完整全双工通信过程(五步)

  1. 产生时钟:主机波特率发生器产生 SCK,从机直接使用;双方移位都由主机时钟驱动
  2. 写数据:向 DR 写数据 → 自动入发送缓冲区 → 自动传入移位寄存器
  3. 发送:按 LSB/MSB First 配置,移位寄存器逐位输出(主机经 MOSI、从机经 MISO)
  4. 接收:逐位读入移位寄存器,收满 8/16 位后自动传入接收缓冲区
  5. 读数据:读 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。


Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐