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),无从设备应答会导致传输挂起
- SPI是否进入错误状态(如
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,避免标志未清除导致异常
- 是否在半传输中断(HTIF3)中错误关闭了DMA Stream3?若初始
5. 验证SPI传输序列模式配置
SR.CTSIZE=42表示当前传输序列剩余42字节,说明SPI开启了传输序列模式(如CR2.NSSP=1或硬件NSS自动序列)- 未接从设备时,序列模式下NSS信号无法正确握手,会导致传输在部分字节后挂起,可尝试关闭序列模式(
CR2.NSSP=0、CR1.SSM=1、CR1.SSI=1)后测试
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

