STM32的SPI通信怎么配置?嵌入式面试SPI四种工作模式与数据收发实现

浏览量:76
时间: 2026-08-25 10:13:35

STM32开发板与逻辑分析仪测量SPI通信波形

本文概述

STM32的SPI通信配置是嵌入式面试中的基础必考题,考察点涵盖SPI协议原理、四种工作模式、主从机配置流程和实际调试经验。SPI是全双工同步串行接口,由时钟极性CPOL和时钟相位CPHA的组合决定四种工作模式,其中模式0和模式3最常用。STM32配置SPI需要依次完成时钟使能、GPIO复用配置、SPI参数初始化、数据收发等步骤,HAL库提供了HAL_SPI_Transmit、HAL_SPI_Receive等标准函数。

STM32的SPI通信怎么配置?嵌入式面试SPI四种工作模式与数据收发实现

分类:嵌入式单片机经验级别:0-2年难度:中等题型:外设配置题

核心要点速览

  • 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接口的传感器,写出大概的配置步骤和代码思路。

面试官考察点

  1. 对SPI协议原理和工作模式的理解

  2. STM32 SPI外设的配置流程是否熟悉

  3. 是否实际用过HAL库或标准库操作SPI

  4. 主从机通信的时序概念是否清晰

  5. 常见问题的排查能力

回答思路

第一、SPI协议基础与四种工作模式

SPI是串行外设接口的缩写,是一种全双工、同步的串行通信协议,主机主动发起通信。通信线路有四根:

  • SCK:串行时钟,由主机产生,控制通信节拍

  • MOSI:主机输出从机输入,主机发数据给从机

  • MISO:主机输入从机输出,从机发数据给主机

  • CS/NSS:片选信号,主机选择要通信的从机

SPI的四种工作模式由时钟极性CPOL和时钟相位CPHA两个参数组合而成:

模式CPOLCPHA空闲电平采样边沿
模式000低电平第一个时钟沿(上升沿)
模式101低电平第二个时钟沿(下降沿)
模式210高电平第一个时钟沿(下降沿)
模式311高电平第二个时钟沿(上升沿)

实际应用中模式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主模式的主要代码结构如下:

  1. 定义SPI_HandleTypeDef hspi1 全局句柄

  2. MX_SPI1_Init函数中配置hspi1.Init的各个参数:Mode设为主模式,Direction设为全双工,DataSize设为8位,ClockPolarity设为低,ClockPhase设为第一边沿,NSS设为软件管理,BaudRatePrescaler设为256分频,FirstBit设为MSB

  3. 调用HAL_SPI_Init(&hspi1)初始化

  4. 发送数据:HAL_GPIO_WritePin(GPIOx, GPIO_PIN_x, GPIO_PIN_RESET)拉低片选 → HAL_SPI_Transmit(&hspi1, data, len, timeout) → 拉高片选

  5. 接收数据:先发一个dummy字节,同时接收从机返回的数据

第四、SPI常见问题与排查

问题现象可能原因排查方法
完全收不到数据接线错误、模式不匹配用示波器检查SCK和MOSI是否有信号,确认CPOL/CPHA
数据错位或乱码采样边沿不对、速率太快降低速率试试,检查是否模式0/3选反了
时好时坏接触不良、干扰、时序问题检查接线,加去耦电容,确认片选时序
DMA方式卡住DMA配置错误、标志位未清检查DMA通道和优先级,看回调函数是否触发

常见追问

追问1:SPI的片选信号为什么通常是低电平有效?
低电平有效是历史惯例和电气特性共同决定的。一方面,大多数数字器件内部用NMOS管做开关,低电平触发更方便;另一方面,上电时很多IO默认是高阻或高电平,用低电平有效可以避免上电误触发。另外从抗干扰角度,把默认状态设为高、有效状态设为低,也有利于判断通信是否在进行中。实际使用中要看从机器件的要求,有的器件是高电平有效,但比较少。
追问2:SPI为什么比I2C速度快?
SPI比I2C快主要有几个原因:一是SPI是全双工,收发同时进行,I2C是半双工,同一时间只能单向传输;二是SPI没有应答机制和地址寻址的额外开销,时钟节拍里每一位都是有效数据;三是SPI没有上拉电阻限制速度,推挽输出驱动能力强;四是SPI没有仲裁机制,主机完全控制时钟。SPI速率常见几MHz到几十MHz,高速SPI甚至上百MHz,而I2C高速模式也只有3.4MHz。
追问3:多个SPI从设备怎么连接?
多个SPI从设备有两种接法:一是独立片选方式,所有从机的SCK、MOSI、MISO并联在一起,每个从机有自己独立的CS线,主机通过不同的CS来选择和哪个从机通信,这是最常用的方式;二是级联方式(菊花链),前一个从机的输出接后一个从机的输入,形成一个移位寄存器链,适合多个相同器件的同步操作,比如多片DAC同步输出。独立片选的好处是可以单独访问每个器件,但需要更多IO口;级联节省IO但访问效率低。
追问4:SPI和USART有什么区别?
SPI是同步通信,有时钟线,主机提供时钟节拍,速度快;USART是异步通信,没有时钟线,靠双方约定波特率,需要起始位和停止位来同步。SPI是全双工但需要四根线,USART一般两线(TX/RX)就能实现全双工。SPI适合板内芯片之间的高速数据传输,USART适合板间或设备之间的中低速通信,传输距离更远。另外SPI没有统一的标准协议(每家用法不完全一样),USART的协议更统一。

失分表达

  • "SPI四种模式记不清了,差不多都能用"——基础概念不扎实

  • "MISO和MOSI随便接,反了也能通信"——对SPI信号线方向理解错误

  • "配置SPI就调用一个库函数完事"——对底层初始化流程不清楚

  • "SPI速度随便设,越快越好"——缺乏对从机速率限制的认识

准备动作

  1. 亲手在STM32上配置过SPI,至少驱动过一个SPI器件(如W25Qxx、OLED、传感器)

  2. 把CPOL和CPHA的四种组合理解清楚,不要死记硬背

  3. 熟悉HAL库SPI的三种收发方式(阻塞、中断、DMA)的区别

  4. 用逻辑分析仪或示波器抓过SPI波形,理解时序

  5. 准备一个实际项目中SPI通信调试的经验案例

核心关键词

STM32 SPI SPI工作模式 CPOL CPHA SPI主模式 HAL库 嵌入式面试 单片机通信 SPI调试


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

硬件设计中高级技术基础题本文概述以太网接口是工业、物联网和嵌入式产品最常见的网络硬件,PHY+变压器+RJ45的链路设计是硬件面试高频题。面试官想听的不是“接个... 详情>>

2026-09-12 15:15:01
PCB上晶振的EMC防护布局怎么做?硬件面试要从频域干扰讲到接地屏蔽

分类:硬件工程师面试题经验要求:中高级难度:中高级题型:EMC防护设计📖 本文概述晶振是PCB上常见的高辐射源之一,也是硬件工程师面试中EMC防护的高频考点。... 详情>>

2026-08-04 15:58:40
分类:硬件工程师面试题经验级别:中级难度:中级题型:电源设计/选型 Buck电源输出电容怎么选?硬件工程师面试不能只看容值

分类:硬件工程师面试题经验级别:中级难度:中级题型:电源设计/选型📖 本文概述Buck电源输出电容选型是硬件工程师面试中的经典问题。很多人只回答"看容值大小"... 详情>>

2026-08-06 17:02:35
EMC测试前,PCB布局阶段的分区和接地策略能提前避免多少辐射问题?面试要从能量路径讲起

题库分类:EMC电磁兼容适合经验:1—5年难度:中高级题型:工程取舍题 + 预防设计题面试题项目从设计到EMC测试才发现辐射超标,PCB布局阶段的哪些决策能提前... 详情>>

2026-08-01 21:54:57
Buck电感怎么选型?纹波电流与饱和电流怎么算?电源工程师面试

一句话答案Buck 电感选型看两个参数:电感量 L 决定纹波电流 ΔIL(通常取最大输出电流的 20~40%),饱和电流 Isat 要大于峰值电流(Iout+Δ... 详情>>

2026-09-16 10:12:22
开班信息