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 必须同时收发(全双工)

面试官考察点
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 种模式。
| 模式 | CPOL | CPHA | 空闲电平 | 采样沿 | 常用器件 |
|---|---|---|---|---|---|
| Mode0 | 0 | 0 | 低 | 上升沿 | 大多数(W25Q Flash、OLED) |
| Mode1 | 0 | 1 | 低 | 下降沿 | 较少 |
| Mode2 | 1 | 0 | 高 | 下降沿 | 较少 |
| Mode3 | 1 | 1 | 高 | 上升沿 | 部分传感器(LSM6DSO) |
主从设备 CPOL/CPHA 必须一致,否则采样错误。
STM32 配置步骤(HAL,主模式)。
使能 SPI 和 GPIO 时钟;
GPIO 配置为复用推挽(SCK/MOSI/MISO),CS 用普通 GPIO 推挽输出;
SPI_HandleTypeDef 配置:Mode(主/从)、Direction(全双工)、DataSize(8位)、CLKPolarity、CLKPhase、NSS(软件/硬件)、BaudRatePrescaler、FirstBit(MSB);
HAL_SPI_Init;
收发: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 或校验检测。

扫码关注





























