You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32H747 SPI+DMA传输仅完成8字节后停止的问题排查

STM32H747 SPI5 DMA传输异常排查建议

核心矛盾梳理

  • 预期传输50字节,仅完成前8字节后时钟停止
  • TX DMA(Stream3)显示传输完成(NDTR=0、EN=0),但RX DMA(Stream2)仍在运行(NDTR=42、EN=1)
  • SPI保持使能(SPE=1),TXFIFO空(TXP=1),剩余传输计数CTSIZE=42

排查步骤

1. 校验DMA数据宽度与NDTR配置匹配性

STM32 DMA的NDTR寄存器值是数据项数量,而非字节数,需与SPI/DMA的数据宽度严格对应:

  • 若SPI配置为8位数据宽度(CR1.DFF=0),DMA需同步设为8位(DMA_SxCR.PSIZE=00、MSIZE=00),此时NDTR应设为50
  • 若SPI配置为16/32位数据宽度,NDTR需按对应字节数换算(如32位时,50字节需设为13,因13×4=52字节,需处理剩余2字节的截断)
  • 检查代码中DMA_Stream3->NDTR的初始赋值是否与实际待传字节数、数据宽度匹配

2. 检查SPI TXFIFO阈值与DMA触发逻辑

STM32H7 SPI的TXFIFO深度为16字节,CFG1.TXFTH寄存器控制DMA触发的FIFO空阈值:

  • 若TXFTH设为3(对应FIFO空至8字节时触发DMA),第一次DMA会填充8字节至TXFIFO,若后续DMA未继续触发,需排查:
    • SPI是否进入错误状态(如SR.OVR/CRCERR/MODF位是否置位),错误状态会暂停传输
    • 主模式下未接从设备,是否开启了硬件NSS控制(CR1.SSM=0),无从设备应答会导致传输挂起

3. 排查DMA传输的地址配置

  • SPI的DR寄存器地址固定,DMA外设地址需设为非增量模式(DMA_SxCR.PINC=0),内存地址设为增量模式(MINC=1)
  • 若TX DMA外设地址错误设为增量模式,传输8字节后会偏离SPI DR地址,导致DMA无意义传输,最终触发TCIF但SPI未接收到后续数据

4. 检查DMA中断处理逻辑

  • LISR.TCIF3和HTIF3同时置位,需确认中断服务程序(ISR)的处理:
    • 是否在半传输中断(HTIF3)中错误关闭了DMA Stream3?若初始NDTR设为16(8位宽度),HTIF会在传输8字节时触发,误关DMA会导致传输停止
    • 中断标志清除是否正确:需通过DMA_LIFCR寄存器清除对应标志,而非直接写0,避免标志未清除导致异常

5. 验证SPI传输序列模式配置

  • SR.CTSIZE=42表示当前传输序列剩余42字节,说明SPI开启了传输序列模式(如CR2.NSSP=1或硬件NSS自动序列)
  • 未接从设备时,序列模式下NSS信号无法正确握手,会导致传输在部分字节后挂起,可尝试关闭序列模式(CR2.NSSP=0、CR1.SSM=1、CR1.SSI=1)后测试

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 19:13:09