你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
any012 提问时间:2017-5-18 16:39 /
阅读主题, 点击返回1楼
收藏 2 评论22 发布时间:2017-5-18 16:39
22个回答
cldym 回答时间:2017-5-20 11:44:45
把SPI的通信线都接上上拉,同时加上滤波电容。能增强干扰能力。
衔胆栖冰 回答时间:2017-5-20 23:18:55
类似问题我有遇到过。目测你的SPI时钟是连续的,就是什么每个byte(假设初始化为8bit模式)之间的时钟是没有间隙。STM32的SPI时钟默认是字节于字节之间没有间隙。可以尝试,1,查阅数据手册看是否可以设置在每个byte之间的时钟插入间隙(空闲),或者在主机端采用单字节发送略加延时;2,楼上有人已经说了,硬件上加上拉电阻或滤波电容等手段加强硬件的抗干扰能力;3,看看芯片对于有没有IT模式,若有的话采用IT模式传输也是提高数据正确率的一种手段;4,直接采用硬件SPI_CS作为片选脚,而不是采用GPIO外部中断去判断,再来个中断嵌套什么的!从代码和设置模式来看,或许你对SPI从模式理解的可能不是很透彻。SPI从模式,配置中断接收或DMA接收模式,有数据来的时候会自动触发,而不需要你额外加中断去通知它。另外,你的外部中断,GPIO的响应速度或者消抖处理等都可能影响数据通信。还有,你要测SPI通信,最好用示波器,而不是万用表,万用表的原理大家都懂。

评分

参与人数 1ST金币 +5 收起 理由
zero99 + 5

查看全部评分

oujisang 回答时间:2017-5-22 17:09:17
SPI采集数据是以时钟的边沿采集数据,当你用表笔触碰时钟线后,造成了时钟脉冲的丢失,导致接收数据端收到的时钟脉冲丢失,采集数据位也就响应丢失,导致整个数据帧都对不齐了。我看你用的是HAL库,在你调用void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)函数里,用判寄存器方式将SPI缓存里的数据读空,问题应该就解决了。其实在调用HAL_SPI_RxCpltCallback函数的时候,是你自己定义的spi2RecvDate缓存数据满了才进到那个回调函数里,其实SPI接收数据缓存里还有数据。

评分

参与人数 1ST金币 +5 收起 理由
zero99 + 5

查看全部评分

any012 回答时间:2017-5-22 17:28:46
oujisang 发表于 2017-5-22 17:09
SPI采集数据是以时钟的边沿采集数据,当你用表笔触碰时钟线后,造成了时钟脉冲的丢失,导致接收数据端收到 ...

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

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

any012 回答时间:2017-5-23 09:29:26
本帖最后由 any012 于 2017-5-23 10:13 编辑
oujisang 发表于 2017-5-22 17:33
不管三七二十一 直接多读几次就可以了 变量= hspi2.Instance->DR;

QQ图片20170523092547.png
SPI接收时,应该是按sclk来8个或16个信号后,将移位寄存器的数据放到接收缓冲区,如果接收中断使能的话,会置位RXNE。
读DR,应该是读接收缓冲区吧?
疑惑,读DR,会产生哪些影响?

---------------------------------------------------------------------------

QQ图片20170523093732.png

我的理解是有个计数器,计SCLK信号为8或16时,移位寄存器数据放到接收缓冲区,置位RXNE。
读DR,RXNE复位。但这个计数器是否也会跟着复位?

------------------------------------------------------------------------------

试了下,在PC6下降沿中断里,多加了几句读SPI的DR寄存器,没有效果。


oujisang 回答时间:2017-5-24 11:46:33
看样子数据在移位寄存器里面了,可以尝试一下关闭SPI使移位寄存器,使位计数清零,控制SPI关闭的寄存器SPI_CR1的bit6位SPE!
andrewchen 回答时间:2018-6-30 22:44:36
奇怪的是总是错8位,或16位,为啥不会错 5位,7位呢?

12

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版