问题: 原本是MCU用STM32F103VCT6跟DSP通过SPI进行双向通信传输数据,用GD32F103VCT6直接替换,代码没有修改,还是STM32的标准库,出现与DSP通讯失败。
解决问题过程: 上网搜索相关问题 发现一篇比较有用的文章。 GD32中SPI部分需要特别注意的部分 以及STM32移植到GD32SPI需要修改的部分 我按照这位博主说的去改,发现原来配置的SPI部分 MOSI和MISO确实没有明确设置引脚的输入输出模式,但是我重新配置了之后还是不行,通讯不了。
用逻辑分析仪去分别检测STM32F103VCT6和GD32F103VCT6的SPI波形和数据。 发现1:逻辑分析仪能抓到GD的spi波形,证明是能工作的 发现2:两者的数据对比起来也是一样的。 发现3:STM32发送的每个字节之间都有延时的,而GD32的是没有的,两个字节之间的间隔时间跟时钟翻转持续时间是一样的。
根据发现3,我去修改了代码里面的 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128; 一个一个去测试,发现单单修改这个波特率分频系数也不能达到STM32的两个字节之间的间隔时间。
然后我修改了工作的主频,从72MHz修改为48MHz,(因为用到了USB,所以顺便把USB的时钟分频系数从1.5分频改为1分频,否则USB工作也不正常。)
回到正题,这时候当我改成48MHz,spi的波特率分频系数改为64之后,发送的两个字节之间的延时时间会达到跟STM32的差不多,比它慢2us左右,这时候通讯也正常了,MCU跟DSP能够正常收发数据。
正当我以为所有都弄好之后,我把逻辑分析仪的线跟测试板拔开,发现后面工作偶尔又不正常了,这时候我想起来之前单板测试的时候,如果MCU端接了排线,但是没有接其他设备,在逻辑分析仪上看到MISO端竟然有几个毛刺出现,难道是因为排线导致出现了干扰吗?
后面找到了GD32的技术支持,他说排线不能太长,5cm左右就好,我之前测试的时候排线都24cm的,因为在STM32的板子上是正常的。
后面找了一条6CM的排线去测试,果然正常了。
这次出现的问题总结: 1.上网找资料,看看别人踩的坑,不管行不行填了再说。 2.善用工具帮助自己分析问题,要敢于假设并且付诸于实践证明。 3.有技术支持一定要找技术支持,别人解决问题经验丰富。
|