请问SPI接收中断溢出后如何处理?

2019-07-14 14:17发布


STM32F103的SPI2作为SPI从设备接收主设备发送过来的固定长度的数据。
主设备每秒发送一次。切有个类似片选信号给了从设备的PC6引脚。
那么我在PC6上升沿中断里,开启SPI中断接收函数。

现在主设备先启动后,从设备再启动,接收没问题。
如果主从设备同时启动,则从设备只接收了一次数据就不再接收了,且接收的数据是错误的。(也许主设备启动时发送的数据就是错的)
现在发现出错时是SPI接收溢出了。

我在溢出判断部分那里,加了个printf语句,如果printf语句里有 ,则接收错误出现两次后就变正常了。而是其他的字符的话,则一直是溢出错误。
请教,为什么会一直是溢出错误呢?这里明明是判断溢出错误后就把溢出标志清楚了,然后调用了错误处理回调函数(没有处理,也就是空的吧)。那么为什么下次接收数据时还是溢出错误呢?

SPI中断处理函数为:

下图为溢出错误判断部分,加入了printf(" ")语句后的接收数据。是利用串口发送上来的。


下图为将printf语句中的 去掉后的情况。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
谦谦三君子
1楼-- · 2019-07-14 22:46
谦谦三君子
2楼-- · 2019-07-15 02:33
本帖最后由 any012 于 2017-5-18 09:47 编辑

找到问题了。
接收的时候,出现异常时,接收数据溢出,中断处理函数里,判断溢出错误后,就清掉溢出错误标志,然后转到错误处理部分。
错误处理部分里关闭了接收中断,但是在关闭接收中断之前,又有新的数据到来,结果又溢出错误了。
最后的结果就是下次开启接收中断时,直接就溢出错误了。以上,周而复始。

在错误处理部分,关闭接收中断后,再清一次溢出错误标志即可。
或者,开启SPI接收的时候,是否应该先把各标志位清一遍?
谦谦三君子
3楼-- · 2019-07-15 07:30
 精彩回答 2  元偷偷看……
谦谦三君子
4楼-- · 2019-07-15 11:04
额,用万用表表笔反复碰触,结果接收数据仍发生位移,且位移会一直保持。和DMA方式接收的现象基本一致。
uskd
5楼-- · 2019-07-15 12:29
你可以试试用模拟的SPI,stm32自带的spi确实有数据位移的现象。

一周热门 更多>