spi中断接收模式被干扰后数据会一直错位

2019-07-14 14:58发布



硬件是这样设计的:
芯片STM32f103vb,作为从设备接收SPI主设备发送过来的固定长度的数据,现定为每秒发送一次,数据为9个16位数据。
从机的PC6引脚检测到有上升沿,表明主设备将要发送数据过来。发送完数据后,过一段时间PC6被拉低。

一开始是想用DMA方式接收的,PC6上升沿中断的回调函数里调用DMA接收函数,接收9个数据。
结果发现,用万用表表笔或示波器表笔碰触SCLK引脚,会产生数据错位。且,一旦错位,以后接收的数据会始终保持错位。

后来就想先改成SPI中断方式接收。同样再PC6上升沿中断回调函数里调用SPI中断接收函数,接收9个数据,并在PC6下降沿时关闭SPI中断。
结果可能是主设备开机时发送的数据不正常,如果主从设备同时开机的话,从设备就总是接收溢出错误。
后来在溢出错误处理部分的关闭SPI中断后,又清了一次溢出错误标志,开机问题算是解决了。
但,同样存在,用表笔碰触SCLK引脚,会造成接收数据移位的问题。


请大家帮忙分析下为何错位会一直存在?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
谦谦三君子
1楼-- · 2019-07-16 00:30
echo_her 发表于 1970-1-1 08:00

用的HAL库,SPI初始化时有清寄存器。
在程序中是反复调用
HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
这个函数来实现中断接收的。这个函数里只有是能SPI接收中断及是能SPI,没有清中断标志。
andyfly7
2楼-- · 2019-07-16 06:28
把SPI的通信线都接上上拉,同时加上滤波电容。能增强干扰能力。
易元空灭
3楼-- · 2019-07-16 10:39
 精彩回答 2  元偷偷看……
fstdftwew
4楼-- · 2019-07-16 13:29
SPI采集数据是以时钟的边沿采集数据,当你用表笔触碰时钟线后,造成了时钟脉冲的丢失,导致接收数据端收到的时钟脉冲丢失,采集数据位也就响应丢失,导致整个数据帧都对不齐了。我看你用的是HAL库,在你调用void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)函数里,用判寄存器方式将SPI缓存里的数据读空,问题应该就解决了。其实在调用HAL_SPI_RxCpltCallback函数的时候,是你自己定义的spi2RecvDate缓存数据满了才进到那个回调函数里,其实SPI接收数据缓存里还有数据。
谦谦三君子
5楼-- · 2019-07-16 15:54
feipu67015 发表于 1970-1-1 08:00

应该就是SCLK多了脉冲或少了脉冲而使数据帧对不起了。
请教,如何清掉SPI缓存里的数据?
我现在使在每次PC6下降沿重新初始化下SPI2,虽然不再出现这个问题了,但感觉多了太多的操作了。
HAL_SPI_DeInit(&hspi2);        HAL_SPI_Init(&hspi2);  这两个函数也行,但是仍感觉操作太多了。
fstdftwew
6楼-- · 2019-07-16 20:11
不管三七二十一 直接多读几次就可以了 变量= hspi2.Instance->DR;

一周热门 更多>