STM32U5 系列(如 U575/U585/U595)的 SPI3 外设在传输长度超过 1024 字节时,会出现 HAL 库回调函数(如 HAL_SPI_TxRxCpltCallback)不执行的异常。核心结论是:STM32U5 的 SPI3 为受限功能版本,最大支持 1023 字节单次传输,超过该长度会导致 CR2 寄存器 TSIZE 字段设置失败,进而触发传输逻辑异常。本文结合复现测试、手册解读与驱动优化,提供完整的问题排查与解决思路。
资料获取:SPI传输长度超过1024时出现异常的问题分析
1. 问题背景与复现现象
1.1 应用场景
客户使用 STM32U595QII6Q 的 SPI3 作为主设备,通过 HAL 库 DMA 模式(全双工 / 半双工)与外部设备通信,当传输数据长度超过 1024 字节时出现异常。
1.2 关键复现结果
- 正常情况:传输长度≤1023 字节(如 512 字节),SPI3 状态寄存器正常,CR2 寄存器 TSIZE 字段正确赋值(如 512 字节对应 0x200),回调函数正常执行;
- 异常情况:传输长度 = 1024 字节时,CR2 寄存器 TSIZE 字段始终为 0,SPI 传输完成后回调函数不触发,且启用自动重传也无法恢复;
- 复现环境:使用 NUCLEO-U575ZI-Q 开发板,基于 STM32Cube FW_U5 V1.6.0 固件库,分别测试全双工(SPI_FullDuplex_ComDMA_LowPower_Master 例程)与半双工模式,均出现相同异常。
2. 问题根源:SPI3 的硬件功能限制
通过寄存器分析与参考手册(RM0456 Rev5.0)查阅,锁定异常根源为 SPI3 的硬件功能阉割,核心限制如下:
2.1 SPI3 与 SPI1/2 的功能差异
STM32U5 的 SPI 外设分为 “全功能版”(SPI1、SPI2)与 “受限功能版”(SPI3),关键差异集中在数据传输控制能力:
| SPI 功能 | SPI1、SPI2(全功能) | SPI3(受限功能) |
|---|---|---|
| 数据控制数量上限 | 最多 65536 字节 | 最多 1024 字节(无剩余数据计数器 CTSIZE) |
| 实际有效传输长度 | 0~65535 字节 | 0~1023 字节 |
| FIFO 容量 | 16×8 bits | 8×8 bits |
| 数据位宽配置 | 4~32 bits | 仅 8/16 bits |
注:SPI3 的 “1024 字节上限” 实际为硬件设计限制,单次传输长度超过 1023 字节时,TSIZE 字段无法正确写入,导致传输状态机无法识别传输完成。
2.2 寄存器层面的异常机制
SPI 传输的长度由 CR2 寄存器的 TSIZE [15:0] 字段定义,其工作逻辑为:
- 软件修改 TSIZE 前需禁用 SPI 外设;
- 当传输长度≤1023 字节时,TSIZE 字段可正常赋值,传输完成后触发 EOT(传输结束)事件,进而调用 HAL 回调函数;
- 当传输长度 = 1024 字节时,TSIZE 字段超出 SPI3 的硬件支持范围,导致
MODIFY_REG函数写入失败,TSIZE 始终为 0; - 此时 SPI 外设无法识别传输终点,EOT 事件不触发,回调函数自然不会执行。
3. 解决方案:硬件限制适配与驱动优化
针对 SPI3 的 1023 字节长度限制,需从 “传输策略” 与 “驱动防护” 两方面优化,确保传输稳定性:
3.1 核心解决方案:拆分长数据传输
将超过 1023 字节的数据拆分为多次传输,每次传输长度≤1023 字节,流程如下:
- 计算总数据量与拆分次数(如 2000 字节拆分为 2 次:1023 字节 + 977 字节);
- 循环调用
HAL_SPI_TransmitReceive_DMA(或对应传输函数),每次传入拆分后的缓冲区与长度; - 在回调函数中标记单次传输完成,累计传输长度,直至所有数据传输完毕。
3.2 驱动代码防护:增加长度判断
修改 HAL 库 SPI 驱动的传输长度配置逻辑,避免无效的 TSIZE 写入,代码优化如下:
- 作用:当 SPI3 传输长度≥1024 字节时,直接返回 HAL_ERROR,避免传输异常导致的系统卡死;
- 适配范围:STM32U575/U585/U595 等所有搭载受限功能 SPI3 的型号。
3.3 替代方案:换用全功能 SPI 外设
若项目对单次传输长度无强制要求,且硬件引脚允许,可直接换用 SPI1 或 SPI2(全功能版),其支持最大 65535 字节单次传输,无需拆分数据,简化开发流程。
4. 验证结果与注意事项
4.1 优化后验证
- 拆分传输测试:2000 字节数据拆分为 1023+977 字节,两次传输均正常完成,回调函数触发及时,数据无丢失;
- 驱动防护测试:刻意传入 1024 字节长度,驱动直接返回 HAL_ERROR,未出现传输卡死现象;
- 长期稳定性:连续 1000 次拆分传输,无异常中断或数据错误。
4.2 开发注意事项
- 前期选型:使用 STM32U5 的 SPI3 前,需查阅 RM0456 手册确认功能限制,避免盲目设计长数据传输场景;
- 硬件设计:若需频繁传输长数据,优先规划 SPI1/SPI2 引脚,预留全功能 SPI 的使用空间;
- 调试技巧:遇到 SPI 回调不执行时,可先检查 CR2 寄存器 TSIZE 字段是否正确赋值,排除长度超限问题。
STM32U5 SPI3 传输长度超 1024 字节异常的核心是硬件功能限制,而非软件配置错误。解决该问题的关键是 “适配硬件上限”:短期通过拆分数据与驱动防护快速修复,长期可换用全功能 SPI 外设优化设计。开发中需牢记:STM32 系列不同 SPI 实例的功能可能存在差异,需提前查阅参考手册确认关键参数(如传输长度、位宽、FIFO 容量),避免因功能阉割导致的异常。
302