DSP

tgcopter v3.x开发记录---stm32f4与arduino通过SPI的DMA通信

2019-07-13 20:58发布

        一直用SPI作为arduino(Master)和STM32(Slave)的通信介质,已获得较为高速稳定的通信链路。之前STM32F103非常轻松的就搞定了这个部分,这次考虑到F4xx芯片有FPU和DSP能力就打算迁移固件中的BSP程序。没想到整个过程异常的诡异,足足花了我半个月的时间才搞定。特记录分享一下!          F4xx相比F1xx在总线系统和DMA通道管理上有非常大的变化,虽然官方提供的外设库接口基本不变,弄出SPI普通的中断通信方式还是很容易的,但要使用DMA进行数据接收问题就来了。明明能在直接中断方式下双向正常通信了,加入DMA后就变成STM32输出正确,接收错误。反复切换直接中断方式和DMA方式怎么都搞不明白为何出现这个问题。调试期间我把F4xx的DMA的一些高级模式(FIFO、Double Buffer、Circle Mode)禁用或打开,仍然无法改善。弄得我几乎要绝望了,打算放弃了。         周四晚上去俱乐部打球回来已经快22点了,洗澡后不死心的又坐到工作台上,听着“艾宝良的鬼吹灯”,冥思!!突然,我想到还有一组参数没有修改对比测试过(SPI的CPOL和CPHA的模式设置),但这个在SPI直接中断模式下已经测试通过了呀,它是SPI的特性,怎么会和DMA有关系呢?虽有疑惑,但还是打算折腾一下这块,结果却让人意外的,四种SPI模式中居然只有2组能适应DMA模式,问题搞定了。应该说是“粽子”被我扔的“黑驴蹄子”摆平了。         CPOL=0,CPHA=0,MISO正常,MOSI异常         CPOL=0,CPHA=1,MISO异常,MOSI正常         CPOL=1,CPHA=0,MISO正常,MOSI正常         CPOL=1,CPHA=1,MISO正常,MOSI正常
       采用正常配置后,连F4xx的高级DMA模式都可以正常使用了!