[STM32H7] STM32H7RS SPI+GPDMA 全双工收发:DMA 计数报传输完成,但示波器观测数据缺失

[复制链接]
27|11
WHALEE 发表于 2026-6-24 21:29 | 显示全部楼层 |阅读模式
在NUCLEO-H7S3L8(配置 SPI 主机全双工 GPDMA 模式传输。
SPI 有时钟波形从 MOSI 引脚输出,但存在问题是数据并未完整发送。
传输总长度 504 字节,SPI 时钟 50MHz。
示波器实测总传输时长约 20us × 3.1 = 62us
理论完整传输耗时:(504 × 8) / 50e6 = 80.64us
时间差换算下来大约丢失 116 字节数据。
但 DMA 传输完成中断触发后,读取GPDMA_CxBR1.BNDT寄存器值为 0,
DMA 硬件判定全部 504 字节传输完毕;示波器波形抓取波形却显示发送字节不足。
请教大神是否是 LLI 链表配置遗漏导致?

heisexingqisi 发表于 2026-6-26 10:38 | 显示全部楼层
STM32H7RS 特有:GPDMA v3 架构,和旧版 DMA2 区别极大;SPI 有独立 Tx/Rx DR,全双工必须双 GPDMA 流(Rx 流 + Tx 流独立),不能单 DMA 轮询。
probedog 发表于 2026-6-26 16:40 | 显示全部楼层
问题大概率在数据宽度和FIFO阈值没对上,STM32H7RS的SPI和DMA做数据打包时,如果SPI数据宽度和DMA访问宽度设置不匹配,DMA会提前报完成
classroom 发表于 2026-6-26 17:12 | 显示全部楼层
有开发者遇到过完全一样的问题,504字节只发出去386字节,最终查到是SPI的DSIZE和DMA的PSIZE没配对导致
cr315 发表于 2026-6-26 17:46 | 显示全部楼层
DMA的BNDT寄存器读回0不代表真发完了,它只表示DMA侧搬运完成,不等同于SPI侧把数据全部移出移位寄存器
duo点 发表于 2026-6-26 18:20 | 显示全部楼层
别在DMA的传输完成中断里直接停SPI,应该等SPI的EOT中断触发后再做停止操作
flycamelaaa 发表于 2026-6-26 18:56 | 显示全部楼层
查一下SPI的FIFO阈值配置,STM32H7RS手册里明确说过,阈值配不对会导致RxFIFO读不完,最后一帧数据就丢了
jcky001 发表于 2026-6-26 19:27 | 显示全部楼层
试试把SPI数据宽度从8位改成16位,DMA外设访问设成WORD,有实测案例这样改完就正常了
onlycook 发表于 2026-6-26 20:10 | 显示全部楼层
全双工模式下只开Tx DMA时传输时长减半,这个现象本身就有问题,说明接收通道的DMA也在影响SPI的总线占用
powerantone 发表于 2026-6-26 20:43 | 显示全部楼层
LLI链表先别急着怀疑,如果只用单次传输不用链表也出现同样问题,说明根因不在链表配置而在基础参数上
solty 发表于 2026-6-26 21:25 | 显示全部楼层
检查DMA链表缓冲区的存放地址,STM32的GPDMA要求缓冲区4字节对齐且不能跨64KB边界,踩了这个坑DMA会加载错误数据
spicy 发表于 2026-6-26 22:09 | 显示全部楼层
既然示波器能抓到时钟和MOSI,说明SPI硬件配置没问题,在SPI使能前把DMA和SPI的所有相关寄存器值打出来,和手册逐个对照排查配置偏移
您需要登录后才可以回帖 登录 | 注册

本版积分规则

158

主题

159

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0