在 STM32H7 系列 MCU 的 SPI 通讯应用中,从机回显是常见需求 —— 即从机需将接收到的主机数据实时反馈给主机。传统实现方案多依赖 SPI RXP 中断,在中断服务函数中向 TXFIFO 填充接收数据,但该方案存在明显弊端:不仅可能导致数据发送延迟一帧,还容易出现 TXFIFO 为空的异常情况,影响通讯稳定性。本文基于 ST 官方技术文档 LAT1526(Rev 1.0),详解如何利用 SPI 下溢事件(underrun)及 UDRCFG 配置,实现更高效、稳定的 SPI 回显功能。
资料获取:开发经验 | LAT1526 利用SPI的下溢实现回显功能
1. 核心原理:SPI 下溢事件与 UDRCFG 配置解析
STM32H7 的 SPI 外设具备灵活的下溢处理机制,其核心在于 SPI_CFG1 寄存器中的 UDRCFG [1:0] 字段 —— 该字段专门用于配置下溢发生时从机发送器的行为,提供三种可选配置:
- UDRCFG = 0:从机发送 SPI_UDRDR 寄存器中用户定义的常量数据;
- UDRCFG = 1:从机重复发送上一次从主机接收到的数据帧(回显核心配置);
- UDRCFG = 2:从机重复发送自身上一次传输的数据帧;
- UDRCFG = 3:保留配置,暂未启用。
关键前提:下溢事件的触发条件
下溢事件是实现该方案的核心触发点。在 SPI 从机模式下,当主机的时钟信号(SCK)已到来,但从机 TXFIFO 中无待发送数据(未提前填充数据)时,下溢事件会自动触发。这意味着:若我们保持 TXFIFO 为空,通讯过程中会持续触发下溢,此时通过 UDRCFG=1 的配置,从机将自动重复发送上一帧接收的主机数据,无需 CPU 介入即可完成回显 —— 既降低了 CPU 负载,又避免了中断填充导致的延迟问题。
2. 实操实现步骤:从配置到代码落地
STM32CubeMX 生成的 SPI 初始化代码中,默认配置与回显需求存在差异,需通过针对性修改实现功能。具体步骤如下:
2.1 明确默认配置的局限性
使用 HAL 库函数HAL_SPI_Init()初始化 SPI 从机时,库函数会默认配置:
- SPI_CFG1_UDRDET = 1(启用下溢检测);
- SPI_CFG1_UDRCFG = 2(下溢时重复发送自身上一次传输数据)。
该默认配置无法满足回显需求,需手动修改 UDRCFG 字段为 1。
2.2 关键代码修改:重配置 UDRCFG 字段
在MX_SPI1_Init()函数中,需在HAL_SPI_Init()执行后,通过寄存器操作修改 UDRCFG 配置,步骤如下:
核心说明:MODIFY_REG函数用于修改寄存器特定字段,SPI_CFG1_UDRCFG_0对应 UDRCFG=1 的配置值,通过禁用 - 修改 - 启用的流程,确保配置变更安全生效。
2.3 核心优化点:无需填充 TXFIFO
与传统方案不同,该实现无需向 TXFIFO 中手动填充任何数据。保持 TXFIFO 为空是触发下溢事件的关键,而下溢发生时,SPI 外设会自动执行回显逻辑,全程无需 CPU 干预,从根源上解决了数据延迟问题。
3. 执行效果验证:回显功能的时序特性
通过实际通讯测试,该方案的执行效果如下:
- 第一帧数据:从机发送 Dummy(无效)数据。原因是初始化后 TXFIFO 为空,且尚未接收到主机数据,下溢触发时无历史接收数据可重复发送,因此输出默认无效数据;
- 第二帧及后续数据:从机稳定发送上一帧接收的主机数据,完全实现实时回显。此时下溢事件持续触发,UDRCFG=1 的配置确保数据同步无延迟,且 TXFIFO 始终为空,无需 CPU 参与数据填充。
时序逻辑示意图如下(核心节点):
| 信号线 | 第一帧 | 第二帧 | 第三帧 | ... |
|---|---|---|---|---|
| SCK | 有效 | 有效 | 有效 | ... |
| MOSI(主机→从机) | 数据 D1 | 数据 D2 | 数据 D3 | ... |
| MISO(从机→主机) | Dummy | D1 | D2 | ... |
4. 开发经验小结:化 “弊” 为利的外设配置思维
SPI 下溢事件通常被视为通讯异常,但在本场景中,通过合理利用 STM32H7 的外设配置灵活性,将 “异常事件” 转化为功能实现的核心驱动力,既简化了代码逻辑(无需中断服务函数),又提升了通讯效率(无数据延迟、低 CPU 负载)。
关键注意事项
- 配置前需确保 SPI 从机模式已正确初始化,且
HAL_SPI_Init()执行完成; - 修改寄存器时必须先禁用 SPI 外设,避免配置过程中出现通讯错乱;
- 若需切换回传统方案,需重新配置 UDRCFG=2 并恢复 TXFIFO 数据填充逻辑;
- 本文方案仅适用于 STM32H723/733、STM32H725/735 及 STM32H730 系列 MCU,其他型号需参考对应参考手册(如 RM0468 Rev 3)确认外设特性。
参考文献
- ST 官方参考手册 RM0468(Rev 3):《STM32H723/733, STM32H725/735 and STM32H730 Value line advanced Arm®-based 32-bit MCUs》
该实现方案已通过 ST 官方验证,适用于对 SPI 通讯实时性、稳定性要求较高的场景(如工业控制、数据采集等),为 STM32H7 用户提供了更优的 SPI 回显解决方案。
1328