【嵌入式面试】SPI 高频面试题
【嵌入式面试】SPI 高频面试题
SPI(Serial Peripheral Interface)以高速、全双工、时序简单著称,是嵌入式面试中与 I2C 并列的必考通信协议。本文整理了 SPI 从四线构成、四种模式到片选管理、Flash 读写、环形缓冲收发的高频面试题与参考答案。
时序图

一、总线结构与全双工
SPI 总线由哪几根线组成?各自作用是什么?
SPI 由 SCLK(时钟线)、MOSI(主机输出从机输入)、MISO(主机输入从机输出)、CS/SS(片选,低有效) 四根线组成。SCLK 由主机产生,决定数据传输节奏;MOSI 上数据由主机发出、从机接收;MISO 相反;CS 拉低选中某个从机,保证同一时刻只有一个从机响应。
为什么说 SPI 是全双工?
因为 MOSI 和 MISO 是两条独立的数据线,主机发数据的同时可以接收从机数据,发送和接收同时进行。SPI 本质上是一个环形移位寄存器:每个时钟周期,主机通过 MOSI 移出一位、同时从 MISO 移入一位,所以一帧交换完成后主机既发出了 8 位也收到了 8 位。
SPI 的主从模式如何区分?数据怎么流动?
主机负责产生 SCLK 时钟并控制 CS,主动发起传输;从机在 CS 有效后跟随主机时钟收发数据,自己不产生时钟。典型场景:主机写寄存器时从 MOSI 发送地址/数据;主机读寄存器时,从机把数据放到 MISO 上,主机用"假写"(发送任意字节)提供时钟来读取从机数据。
SPI 总线空闲时 SCK 是什么电平?由谁决定?
由 CPOL 决定:CPOL=0 时空闲为低电平,CPOL=1 时空闲为高电平。CPHA 决定采样边沿:CPHA=0 时数据在第一个边沿被采样、另一个边沿变化;CPHA=1 时在第二个边沿采样。两者组合出 4 种模式,主从必须完全一致,否则数据会在错误的边沿被采样而错位。
SPI 有哪 4 种模式?CPOL 和 CPHA 分别代表什么?
CPOL(时钟极性) 决定 SCLK 空闲电平:CPOL=0 空闲低,CPOL=1 空闲高;CPHA(时钟相位) 决定采样边沿:CPHA=0 在第一个边沿采样,CPHA=1 在第二个边沿采样。组合为:模式0(CPOL=0, CPHA=0)、模式1(0,1)、模式2(1,0)、模式3(1,1)。模式 0 和模式 3 最常用,多数 SPI 器件默认支持。
如何确定与从机匹配的 SPI 模式?
查从机 datasheet 的时序图/时序参数表:看 SCLK 空闲电平(高还是低)确定 CPOL,看数据在 SCLK 哪个边沿被采样(第一个还是第二个边沿)确定 CPHA。配置不匹配会导致采样错位、数据移位错乱;模式 0 和模式 3 只是极性与采样边沿互为镜像,很多器件两种都支持(如 W25Q 系列 Flash 支持模式 0 和 3)。
二、片选与通信管理
片选 CS 的作用是什么?软件上如何管理?
CS(低有效)用于选中从机:CS 拉低后从机才响应时钟并驱动 MISO,CS 拉高后从机释放总线、忽略后续时钟。管理要点:① 每个从机独立 CS(一主多从时用多个 GPIO);② 传输期间保持 CS 稳定为低,不可中途拉高;③ 部分器件要求帧与帧之间 CS 有高电平间隔(如 W25Q 需要 tSHSL);④ 多从机时保证同一时刻只有一个 CS 有效。
为什么有些 SPI 从机要求 CS 在整个传输期间一直保持低?
CS 除了选通,还起到帧同步作用:很多器件以 CS 的下降沿作为命令/帧的起点、以上升沿作为结束(如 Flash 以 CS 上升沿锁存命令并结束本次操作;SPI 协议多数帧没有长度字段,靠 CS 界定一帧)。若中途拉高 CS,从机会丢弃当前帧甚至进入错误状态,所以一帧传输内 CS 必须连续保持低。
SPI 数据的 MSB 还是 LSB 先传?
取决于器件配置,SPI 规范未强制。大多数器件默认 MSB 先传(如 W25Q Flash、SD 卡),但部分器件支持 MSB/LSB 可配(STM32 SPI 外设有 LSBFIRST 位)。主从双方必须一致,否则数据高低位错乱;使用前务必查 datasheet 确认。
SPI 的速率上限由什么决定?
上限取决于:① 从机支持的最大时钟频率(datasheet 的 fSCK 最大值,如 W25Q 可到 104MHz,普通传感器几 MHz~十几 MHz);② 主机的时钟分频能力;③ PCB 走线长度与信号完整性(速率越高对布线、负载电容要求越严)。工程上要留裕量,并实测波形确认采样正确。
三、可靠性、对比与选型
SPI 没有应答机制,如何判断通信是否成功?
SPI 本身没有 ACK,可靠性靠:① 回读校验:写完寄存器后读回比较(如 Flash 读状态寄存器);② 利用全双工回传:主机发命令字节的同时,从机回发状态/前一次数据;③ 使用带 CRC 校验的器件或上层协议;④ 用示波器/逻辑分析仪抓 SCLK、MOSI、MISO 波形核对。这也是 SPI 在强干扰环境下可靠性不如带应答总线的原因。
SPI 相比 I2C 有哪些优缺点?如何选型?
优点:速率高(几十 MHz)、全双工、时序简单、无应答/地址开销、实现容易;缺点:线多(4 根,一主多从时每从机加一根 CS)、无应答机制、无标准多主机仲裁(一般一主多从)。高速、大数据量(Flash、显示、ADC)选 SPI;低速、多设备、少引脚选 I2C;设备少且简单可选 UART。
SPI 支持多主机吗?实际怎么处理?
标准 SPI 是一主多从结构,没有内建的仲裁机制;多主机需要外部仲裁(如互斥 CS、总线判决逻辑),不常用。工程上多主机场景一般改用其他总线(如 I2C 的多主机仲裁、CAN)或分时占用。面试常考:SPI 的仲裁能力不如 I2C。
SPI 从机模式下 MISO 和 MOSI 的方向是怎样的?
MOSI 始终是主机→从机方向:主机侧是输出、从机侧是输入;MISO 始终是从机→主机方向:从机侧是输出、主机侧是输入。配置从机时 MOSI 引脚为输入、MISO 引脚为输出,方向不能颠倒;另外从机的 MISO 通常是三态输出,仅在 CS 选中时驱动,避免多个从机同时驱动 MISO 冲突。
四、工程实践:Flash、环形缓冲与 DMA
SPI Flash(如 W25Q128)的读写流程是怎样的?
以 W25Q 为例:① 写使能:发 0x06 命令 → 读状态寄存器确认 WEL 置位;② 写数据:CS 拉低 → 发 页编程命令 0x02 + 24 位地址 + 数据 → 拉高 CS → 轮询状态寄存器忙位(BUSY) 直到写完(页编程最多 256 字节/页,跨页需拆分);③ 读数据:CS 拉低 → 发 0x03 + 24 位地址 → 主机提供时钟连续读回 → 拉高 CS;④ 写前若扇区非空需先擦除(0x20 扇区擦除 / 0x60 整片擦除),因为 Flash 只能把 1 写成 0,擦除才能恢复为 0xFF。
环形缓冲区在 SPI 收发中怎么用?
环形缓冲区(Ring Buffer)配合读/写指针实现 FIFO:发送时把要发的数据写入缓冲区,中断/DMA 逐个取出放到 SPI 数据寄存器;接收时中断把收到的字节放入缓冲区,主循环按需取出解析。读写指针相等表示空(常空一格区分满),注意指针回绕(取模)与临界区保护(中断与主循环共享时关中断或原子操作)。环形缓冲把收发与处理解耦,避免阻塞和丢数据。
SPI 如何用 DMA 收发?有什么好处?
主机把发送数组和接收缓冲区地址配置给 DMA,触发一次后 CPU 不再参与逐字节搬运,DMA 在 SCLK 节拍下自动填/取数据寄存器,完成时产生中断。好处是大幅降低 CPU 占用,适合大数据块传输(如刷屏、读 Flash 大块数据);要点:发送和接收同时进行(全双工),接收缓冲区要与发送长度匹配,注意 DMA 与 SPI 的缓冲大小(BSY 标志)配合,避免提前结束。
SPI 和 I2C 面试对比常考哪些点?一句话总结怎么答?
常考:线数(SPI 4 线 vs I2C 2 线)、速率(SPI 高 vs I2C 低)、双工(SPI 全双工 vs I2C 半双工)、寻址(SPI 片选 vs I2C 地址)、应答(SPI 无 vs I2C 有)、仲裁(SPI 无 vs I2C 有)。一句话:SPI 快而简单、I2C 省线有应答,按速率、设备数、引脚预算选型。

