STM32 SPI怎么配置?主从模式、CPOL/CPHA、DMA收发怎么用?嵌入式面试

浏览量:19
时间: 2026-10-07 10:01:38
一句话答案

SPI 是 4 线同步串行(SCK/MOSI/MISO/CS),主设备产生时钟;CPOL 决定时钟空闲电平,CPHA 决定采样沿,4 种模式(Mode0~3),Mode0(CPOL=0,CPHA=0)最常用;STM32 配置 SPI 外设+GPIO 复用,高速用 DMA 收发,NSS 软件控制或硬件自动。

本文概述

SPI 是单片机常用高速通信,面试常考:CPOL/CPHA、主从、DMA。回答要给 4 种模式和配置步骤。

核心要点

  • SPI 4 线:SCK(时钟)、MOSI(主发从收)、MISO(主收从发)、CS/NSS(片选)

  • CPOL=0 空闲低电平,CPOL=1 空闲高电平;CPHA=0 第一个沿采样,CPHA=1 第二个沿采样

  • 4 种模式:Mode0(0,0)最常用,Mode1(0,1),Mode2(1,0),Mode3(1,1),主从必须一致

  • STM32 主模式:SPI_CR1 设 MSTR=1,BR 分频,CPOL/CPHA,DFF 数据位宽

  • DMA 收发:TX/RX 各一个 DMA 通道,SPI 必须同时收发(全双工)

STM32 开发板和 SPI 模块(Flash/传感器),逻辑分析仪测量 SPI 波形,CPOL/CPHA

面试官:SPI 的 CPOL 和 CPHA 是什么?Mode0 和 Mode3 区别?

面试官考察点

SPI 基础题。面试官看你是否理解 SPI 时序。重点听:CPOL/CPHA、4 种模式。

回答思路

讲 CPOL/CPHA 定义,4 种模式表,STM32 配置。

参考回答

SPI 信号。

信号方向说明
SCK主→从串行时钟,主设备产生
MOSI主→从主发从收数据
MISO从→主主收从发数据
CS/NSS主→从片选,低有效,选通从设备

SPI 是全双工:发的同时也在收。主设备发 1 字节,同时收到从设备发的 1 字节。

CPOL 和 CPHA。

  • CPOL(Clock Polarity):时钟空闲电平。CPOL=0 空闲低,CPOL=1 空闲高;

  • CPHA(Clock Phase):数据采样沿。CPHA=0 第一个时钟沿采样,CPHA=1 第二个时钟沿采样。

4 种模式。

模式CPOLCPHA空闲电平采样沿常用器件
Mode000低上升沿大多数(W25Q Flash、OLED)
Mode101低下降沿较少
Mode210高下降沿较少
Mode311高上升沿部分传感器(LSM6DSO)

主从设备 CPOL/CPHA 必须一致,否则采样错误。

STM32 配置步骤(HAL,主模式)。

  1. 使能 SPI 和 GPIO 时钟;

  2. GPIO 配置为复用推挽(SCK/MOSI/MISO),CS 用普通 GPIO 推挽输出;

  3. SPI_HandleTypeDef 配置:Mode(主/从)、Direction(全双工)、DataSize(8位)、CLKPolarity、CLKPhase、NSS(软件/硬件)、BaudRatePrescaler、FirstBit(MSB);

  4. HAL_SPI_Init;

  5. 收发:HAL_SPI_TransmitReceive(阻塞)或 HAL_SPI_TransmitReceive_DMA(DMA)。

DMA 收发。

  • SPI 全双工,TX 和 RX 各需要一个 DMA 通道;

  • TX DMA:内存→SPI_DR;RX DMA:SPI_DR→内存;

  • 发送前拉低 CS,发送完成中断里拉高 CS;

  • 注意:只发不收时也要读 DR(或开 RX DMA 丢到 dummy buffer),否则 RXNE 置位阻塞;

  • 高速 SPI(>10MHz)必须用 DMA,中断方式来不及。

注意。

  • SPI 速率:APB 时钟/分频,最大 fPCLK/2(主模式);

  • CS 一般软件控制(更灵活),硬件 NSS 适合单从设备;

  • 多从设备各接一个 CS,SCK/MOSI/MISO 并联;

  • SPI 没有应答机制,出错不重传,靠 CRC 或校验检测。

面试官可能追问

追问 1:SPI 和 I2C 区别?
SPI 4 线全双工,速度快(几十 MHz),无寻址,CS 选设备;I2C 2 线半双工,速度低(100k/400k),有地址寻址,多主。SPI 适合高速,I2C 适合低速多设备。
追问 2:SPI 为什么必须同时收发?
SPI 移位寄存器:时钟沿把 MOSI 位移入,同时把 MISO 位移出。发数据时移位寄存器空了就会收到数据。所以发 1 字节必收 1 字节。
追问 3:CPOL=1, CPHA=1 为什么采样沿是上升沿?
CPOL=1 空闲高电平,第一个沿是下降沿(高→低),CPHA=1 第二个沿采样,第二个沿是上升沿(低→高)。所以 Mode3 上升沿采样。
追问 4:SPI 速度上不去怎么办?
用 DMA、缩短走线、降低线长、检查 CPOL/CPHA、加串联电阻降振铃。STM32 SPI 最大 fPCLK/2,72MHz 时 36MHz。
追问 5:从设备怎么发数据?
SPI 从设备不能主动发,必须主设备提供时钟。主设备发 dummy 字节(0xFF),同时读 MISO,就收到从设备数据。

常见失分表达

✗ 主从 CPOL/CPHA 不一致 — 采样时序错,数据乱码。
✗ SPI 只发不收不读 DR — RXNE 置位,下一字节接收溢出。
✗ 高速 SPI 用中断不用 DMA — 中断来不及,丢数据。

准备动作

1
用过 SPI 接 Flash 或 OLED
2
了解 CPOL/CPHA 4 种模式
3
准备一个 SPI 通信失败最终发现 CPHA 不对的案例

核心关键词

STM32SPICPOLCPHA主从模式DMAMode0全双工


声明:本网站所收集的部分公开资料来源于互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。仅供学习交流使用,不构成商业目的。版权归原作者所有,如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时删除。侵权投诉
相关推荐HOT
开班信息