扫码加入

  • 正文
  • 相关推荐
申请入驻 产业图谱

STM32H7 SPI 从机回显功能优化实现:巧用下溢事件突破数据同步瓶颈

2025/12/22
1328
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

在 STM32H7 系列 MCUSPI 通讯应用中,从机回显是常见需求 —— 即从机需将接收到的主机数据实时反馈给主机。传统实现方案多依赖 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] 字段 —— 该字段专门用于配置下溢发生时从机发送器的行为,提供三种可选配置:

  1. UDRCFG = 0:从机发送 SPI_UDRDR 寄存器中用户定义的常量数据;
  2. UDRCFG = 1:从机重复发送上一次从主机接收到的数据帧(回显核心配置);
  3. UDRCFG = 2:从机重复发送自身上一次传输的数据帧;
  4. 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 配置,步骤如下:

if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
  Error_Handler();
}
/* USER CODE BEGIN SPI1_Init 2 */
__HAL_SPI_DISABLE(&hspi1);  // 禁用SPI外设,避免配置过程中通讯异常
// 修改UDRCFG为1:下溢时重复发送上一次接收的主机数据
MODIFY_REG(hspi1.Instance->CFG1, SPI_CFG1_UDRCFG, SPI_CFG1_UDRCFG_0);
__HAL_SPI_ENABLE(&hspi1);   // 重新启用SPI外设,使配置生效
/* USER CODE END SPI1_Init 2 */

 

核心说明:MODIFY_REG函数用于修改寄存器特定字段,SPI_CFG1_UDRCFG_0对应 UDRCFG=1 的配置值,通过禁用 - 修改 - 启用的流程,确保配置变更安全生效。

2.3 核心优化点:无需填充 TXFIFO

与传统方案不同,该实现无需向 TXFIFO 中手动填充任何数据。保持 TXFIFO 为空是触发下溢事件的关键,而下溢发生时,SPI 外设会自动执行回显逻辑,全程无需 CPU 干预,从根源上解决了数据延迟问题。

3. 执行效果验证:回显功能的时序特性

通过实际通讯测试,该方案的执行效果如下:

  1. 第一帧数据:从机发送 Dummy(无效)数据。原因是初始化后 TXFIFO 为空,且尚未接收到主机数据,下溢触发时无历史接收数据可重复发送,因此输出默认无效数据;
  2. 第二帧及后续数据:从机稳定发送上一帧接收的主机数据,完全实现实时回显。此时下溢事件持续触发,UDRCFG=1 的配置确保数据同步无延迟,且 TXFIFO 始终为空,无需 CPU 参与数据填充。

时序逻辑示意图如下(核心节点):

信号线 第一帧 第二帧 第三帧 ...
SCK 有效 有效 有效 ...
MOSI(主机→从机) 数据 D1 数据 D2 数据 D3 ...
MISO(从机→主机) Dummy D1 D2 ...

4. 开发经验小结:化 “弊” 为利的外设配置思维

SPI 下溢事件通常被视为通讯异常,但在本场景中,通过合理利用 STM32H7 的外设配置灵活性,将 “异常事件” 转化为功能实现的核心驱动力,既简化了代码逻辑(无需中断服务函数),又提升了通讯效率(无数据延迟、低 CPU 负载)。

关键注意事项

  1. 配置前需确保 SPI 从机模式已正确初始化,且HAL_SPI_Init()执行完成;
  2. 修改寄存器时必须先禁用 SPI 外设,避免配置过程中出现通讯错乱;
  3. 若需切换回传统方案,需重新配置 UDRCFG=2 并恢复 TXFIFO 数据填充逻辑;
  4. 本文方案仅适用于 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 回显解决方案。

相关推荐