STM32作为SPI从设备中断接收5个数据,有时会出错

2019-07-14 16:20发布

STM32的SPI2口,主设备不停的发送0x3a05,0x010a,0x0100,0x0000,0x9d76;
以上5个16位数据为一帧,每帧间有一段时间间隔。

从设备我是这么处理的,利用SPI2的中断接收。
中断程序里,定义个spi2Num作为存放接收数据的位置,如果spi2Num == 0,先判断接收到的数据是不是帧首,如果是帧首的话,spi2Num = 1,且将接收到的这个数据放到接收数组的第一个位置;
然后再次接受中断时,依次根据spi2Num的值放到数组的相应位置,每次接收数据后,spi2Num++;
如果spi2Num > 4,说明已经接收到5个数据了,将spi2Num清零,并置个标志位,主程序里查询这个标志位,再做相应处理(串口将接收数组发送出来)。

现在的问题是,通过串口发送过来的数据,有时候是正确的。
有时候,上电前两次接收到的是正确的,然后都是错误帧。错误帧的第一二个数据都是0x3a05,其他数据依次往后推,最后一个没了。
接收错误时观察SCL和MOSI管脚波形,主机发送的数据是正确的。

以下为产生错误时的MSOI波形图,串口发送的数据,以及工程文件。



1s定时到。
spirecive[0]: 3a05
spirecive[1]: 10a
spirecive[2]: 100
spirecive[3]: 0
spirecive[4]: 9d76
1s定时到。
spirecive[0]: 3a05
spirecive[1]: 3a05
spirecive[2]: 100
spirecive[3]: 0
spirecive[4]: 9d76
1s定时到。
spirecive[0]: 3a05
spirecive[1]: 10a
spirecive[2]: 100
spirecive[3]: 0
spirecive[4]: 9d76
1s定时到。
spirecive[0]: 3a05
spirecive[1]: 10a
spirecive[2]: 100
spirecive[3]: 0
spirecive[4]: 9d76
1s定时到。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。