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问题均已得到修复。
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);
}
观察您所述的现象非常像Cache缓存一致性问题引发的总线死锁,建议参照附件的demo配置下MPU,
原理是把ARM分配给GD MCU的4GB地址保护起来,再逐个打开MCU当前已经用到的存储区域,以达到保护总线及内存的目的
暂无内容
相关内容会显示在这里,期待您的分享与发现。
暂无内容
相关内容会显示在这里,期待您的分享与发现。

