【SPI+DMA】H745单片机TIM12触发SPI2+DMA1给F407单片机传输数据,20kHz帧数时,出现漏帧现象,大约会连续性的漏100帧!

大家好!
问题概述:我最近在调试H745单片机的SPI,其目的是与片外DAC(TLV5630)通讯,目前测试阶段先用F407单片机作为从机接收H745单片机发来的数据,但是出现了漏帧现象(连续性漏100帧)。
详情:H745单片机配置为SPI2+DMA1的方式,数据的传输由TIM12同步触发,触发频率为20kHz,DMA配置为Circular模式、设置的数据传输数量为4(16bit的数据)。当DMA将数组中的4个数据发送到SPI2的TXDR寄存器后会进入DMA1的传输完成中断,在中断中,我会将数组中的数据更新,然后退出中断。这些都配置完成后,在F407接收端接收到的数据一直漏帧,大约每漏100帧数据才能接收到1帧数据,如下图所示。注意!每次均会发送4个数据,第1个数据为进入DMA传输完成中断的次数,第2、3和4个数据分别为0、1和2。我用万用表测试NSS、CLK和MOSI引脚的频率,结果为NSS—20kHz、CLK—1.28MHz以及MOSI—约110kHz。
最后,在TIM12的同步触发频率设置为20kHz时就会出现上述现象,当TIM12的同步触发频率设置为200Hz时就能正确的接收数据,如果TIM12的同步触发频率比200Hz高,例如1kHz时也会出现漏帧现象!
希望大家能关注一下我的问题,并提出建议,感谢!感谢!

img

这个问题可能是由于DMA和SPI的配置问题导致的。在您的配置中,DMA的传输模式设置为了Circular模式,这意味着DMA会不断循环传输数据。而且,如果DMA在传输数据时还没有完成,那么TIM12就会继续触发DMA传输,这可能会导致DMA传输数据的缓存填满,从而导致漏帧现象

DMA发送要求速度较高时,可以采用2倍大小大环形缓冲区:

  1. 缓冲区大小为单次发送的2倍,你的例子一次发送4,缓冲区大小设置为8,两个发送单元分别命名为A、B.
  2. 初始化给A、B缓冲区分别填第1批、第2批数据。
  3. DMA中断除了发送完成,增加DMA半空中断。
  4. 启动DMA
  5. A发完后,触发半空中断,中断服务程序填第3批数据到A
  6. B发完后,触发DMA完成中断,中断服务程序填第4批数据到B
    如此循环,知道所有数据发完。
    关键:DMA发送缓冲区里一直保持有数据待发。