个人中心 - GD32 MCU 开发者社区

ChangHong Li
LV.1
ChangHong Li LV.1
2026年7月16日
4 评论
活跃 时间:2026-07-16
151 次浏览
0
0
4
已采纳
Johnson
时间:2026-07-16

1.针对GD32H7xx SPI0-2外设,标准多次发送SPI+DMA的操作流程为,DMA配置并使能->SPI配置->SPI 传输量设置->SPI使能->MSTART置1->软件等待ET置1->SPI disable->下一次的SPI传输量设置(若和上一次传输量相同,则可以不用重新配置)->SPI 使能->MSART置1->软件等待ET置1。

2.GD32H7xx SPI3和4使用DMA传输中dma和dma通道失能设计存在问题,推荐软件解决方案为:每次失能配置DMATEN寄存器位后,往SPI3/4 TDATA寄存器中写入一次数据(此时SPI3/4并不会实际发送数据),再执行使能操作即可正常执行SPI DMA发送

3.后续可以关注和尝试更换GD32H77x系列,上述SPI问题均已得到修复。

ChangHong Li LV.1
2026年7月15日
2 评论
活跃 时间:2026-07-16
134 次浏览
0
0
2
已采纳
Johnson
时间:2026-07-16

1.高速全双工SPI通讯且使用DMA,对时钟同步和时序要求较为严格,一般SPI分频不宜过低(建议>=16分频)

2.当前SPI配置下的优化建议:

如果SPI TX DMA已经进DMA FTF中断却没有发送指定数量字节的数据,需要关注未发送成功字节的位置,如在帧尾,需关注当前是否SPI配置的是NSS HARD模式(即硬件自动发送CS片选信号),如是可尝试切回NSS SOFT模式并在进入FTF中断后添加适当延时再拉起片选,或可解决当前分频下的初次发送字节丢失问题。参考代码:

void DMA0_Channel0_IRQHandler() {
if (RESET != dma_interrupt_flag_get(DMA0, DMA_CH0, DMA_INT_FLAG_FTF)) {
dma_interrupt_flag_clear(DMA0, DMA_CH0, DMA_INT_FLAG_FTF);
for(__IO int i=0; i<100; i++);
spi_nss_internal_high(SPI0);
}

ChangHong Li LV.1
2026年7月6日
3 评论
活跃 时间:2026-07-08
165 次浏览
1
1
3
Johnson
时间:2026-07-08

观察您所述的现象非常像Cache缓存一致性问题引发的总线死锁,建议参照附件的demo配置下MPU,

原理是把ARM分配给GD MCU的4GB地址保护起来,再逐个打开MCU当前已经用到的存储区域,以达到保护总线及内存的目的

1783501592363_4036.7z

GD32H7的SPI+DMA收发bug
ChangHong Li
时间:2026-07-16

很感谢,请问您这边是gd官方吗

GD32H7的SPI+DMA收发bug
ChangHong Li
时间:2026-07-16

感谢

暂无内容

相关内容会显示在这里,期待您的分享与发现。

暂无内容

相关内容会显示在这里,期待您的分享与发现。

暂无内容

相关内容会显示在这里,期待您的分享与发现。

确定删除吗?
删除后无法恢复,请确认后操作!
编辑