
本文概述
STM32的SPI通信配置是嵌入式面试中的基础必考题,考察点涵盖SPI协议原理、四种工作模式、主从机配置流程和实际调试经验。SPI是全双工同步串行接口,由时钟极性CPOL和时钟相位CPHA的组合决定四种工作模式,其中模式0和模式3最常用。STM32配置SPI需要依次完成时钟使能、GPIO复用配置、SPI参数初始化、数据收发等步骤,HAL库提供了HAL_SPI_Transmit、HAL_SPI_Receive等标准函数。
STM32的SPI通信怎么配置?嵌入式面试SPI四种工作模式与数据收发实现
核心要点速览
SPI是全双工同步串行通信,四根线:SCK、MOSI、MISO、CS
四种模式由CPOL和CPHA组合决定,模式0和模式3最常用
STM32配置步骤:时钟使能→GPIO复用→SPI参数初始化→收发数据
HAL库收发函数:HAL_SPI_Transmit / HAL_SPI_Receive / HAL_SPI_TransmitReceive
SPI常见问题:模式不匹配、接线错误、速率过高、片选时序不对
面试题
请介绍SPI的四种工作模式,以及在STM32上怎么配置SPI主模式来驱动一个SPI接口的传感器,写出大概的配置步骤和代码思路。
面试官考察点
对SPI协议原理和工作模式的理解
STM32 SPI外设的配置流程是否熟悉
是否实际用过HAL库或标准库操作SPI
主从机通信的时序概念是否清晰
常见问题的排查能力
回答思路
第一、SPI协议基础与四种工作模式
SPI是串行外设接口的缩写,是一种全双工、同步的串行通信协议,主机主动发起通信。通信线路有四根:
SCK:串行时钟,由主机产生,控制通信节拍
MOSI:主机输出从机输入,主机发数据给从机
MISO:主机输入从机输出,从机发数据给主机
CS/NSS:片选信号,主机选择要通信的从机
SPI的四种工作模式由时钟极性CPOL和时钟相位CPHA两个参数组合而成:
| 模式 | CPOL | CPHA | 空闲电平 | 采样边沿 |
|---|---|---|---|---|
| 模式0 | 0 | 0 | 低电平 | 第一个时钟沿(上升沿) |
| 模式1 | 0 | 1 | 低电平 | 第二个时钟沿(下降沿) |
| 模式2 | 1 | 0 | 高电平 | 第一个时钟沿(下降沿) |
| 模式3 | 1 | 1 | 高电平 | 第二个时钟沿(上升沿) |
实际应用中模式0和模式3最常见。模式选择必须主机从机一致,否则通信会出错。
步骤一:使能时钟
首先使能SPI外设时钟和对应GPIO端口的时钟。SPI1在APB2总线上,SPI2/SPI3在APB1总线上。用HAL库的话直接调用__HAL_RCC_SPI1_CLK_ENABLE()和__HAL_RCC_GPIOA_CLK_ENABLE()之类的宏。
步骤二:配置GPIO引脚
将SCK、MOSI、MISO三个引脚配置为复用推挽输出模式,速度选高速。CS片选引脚可以配置为普通推挽输出,由软件控制高低电平。引脚复用功能需要查数据手册对应正确的AF编号,比如STM32F1的SPI1是AF5,STM32F4的SPI1是AF5或AF6。
步骤三:初始化SPI参数
配置SPI工作模式(主/从)、数据方向(全双工/半双工/单工)、数据大小(8位或16位)、时钟极性、时钟相位、NSS管理方式(硬件或软件)、波特率分频、MSB还是LSB先行。HAL库中就是填充SPI_InitTypeDef结构体,然后调用HAL_SPI_Init。
步骤四:数据收发
全双工模式下发送和接收是同时进行的。HAL库提供三种方式:阻塞式(HAL_SPI_Transmit/Receive)、中断式(HAL_SPI_Transmit_IT等)、DMA式(HAL_SPI_Transmit_DMA等)。发送数据时拉低CS片选,发送完成后拉高CS。
步骤五:验证和调优
通信成功后,根据实际情况优化:如果速率不够可以提高波特率分频;如果通信不稳定可以适当降低速率、加信号完整性处理;批量数据传输可以改用DMA方式释放CPU。
第三、HAL库关键代码示例(文字描述)
用STM32 HAL库配置SPI1主模式的主要代码结构如下:
定义SPI_HandleTypeDef hspi1 全局句柄
MX_SPI1_Init函数中配置hspi1.Init的各个参数:Mode设为主模式,Direction设为全双工,DataSize设为8位,ClockPolarity设为低,ClockPhase设为第一边沿,NSS设为软件管理,BaudRatePrescaler设为256分频,FirstBit设为MSB
调用HAL_SPI_Init(&hspi1)初始化
发送数据:HAL_GPIO_WritePin(GPIOx, GPIO_PIN_x, GPIO_PIN_RESET)拉低片选 → HAL_SPI_Transmit(&hspi1, data, len, timeout) → 拉高片选
接收数据:先发一个dummy字节,同时接收从机返回的数据
第四、SPI常见问题与排查
| 问题现象 | 可能原因 | 排查方法 |
|---|---|---|
| 完全收不到数据 | 接线错误、模式不匹配 | 用示波器检查SCK和MOSI是否有信号,确认CPOL/CPHA |
| 数据错位或乱码 | 采样边沿不对、速率太快 | 降低速率试试,检查是否模式0/3选反了 |
| 时好时坏 | 接触不良、干扰、时序问题 | 检查接线,加去耦电容,确认片选时序 |
| DMA方式卡住 | DMA配置错误、标志位未清 | 检查DMA通道和优先级,看回调函数是否触发 |
常见追问
失分表达
"SPI四种模式记不清了,差不多都能用"——基础概念不扎实
"MISO和MOSI随便接,反了也能通信"——对SPI信号线方向理解错误
"配置SPI就调用一个库函数完事"——对底层初始化流程不清楚
"SPI速度随便设,越快越好"——缺乏对从机速率限制的认识
准备动作
亲手在STM32上配置过SPI,至少驱动过一个SPI器件(如W25Qxx、OLED、传感器)
把CPOL和CPHA的四种组合理解清楚,不要死记硬背
熟悉HAL库SPI的三种收发方式(阻塞、中断、DMA)的区别
用逻辑分析仪或示波器抓过SPI波形,理解时序
准备一个实际项目中SPI通信调试的经验案例
核心关键词
STM32 SPI SPI工作模式 CPOL CPHA SPI主模式 HAL库 嵌入式面试 单片机通信 SPI调试

扫码关注




























