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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版