打印
[STM32F1]

[学习笔记]SPI接收数据移位及解决措施

[复制链接]
3284|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
goodbaiy|  楼主 | 2018-12-26 09:53 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 goodbaiy 于 2018-12-26 22:48 编辑

STM32串口通信是大家的常用功能,尤其是UART、SPI等。但是我在使用SPI1模块时,在不使用NSS的情况下,由于在发送/接收空闲期间在时钟线上发生外部干扰,发生了数据错位的情况(比如要接收的数据应该是0x01,但是实际接收的数据编程了0x02或0x04等等),而且该问题一旦发生即一直持续。
本人尝试了很多方法,比如关闭SPI模块在重新使能、或者给SPI模块重新初始化等等,结果都无济于事。这下可头痛了,因为电子产品在运行时难免受到外接电磁兼容的干扰,发生干扰不可怕,可怕的是无法修正。
当然本人也查阅了很多资料,也在网络上搜索解决方法,可以说这个问题有不少人遇到,但是都没有看到很好的解决方案。比如在stmcu中文网,有一篇《SPI 接收数据移位分析一例》,发现的问题与我的相同,但是解决方法对我而已并不有效。
如前文所述,当问题发生后会一直持续,CRC校验虽然可以发现数据有错误,但是却无法解决问题发生的根源。虽然可以知道每次接收都是存在错误的,却再也无法接收正确的数据。
我们来看一下STM32的SPI模块,所有的控制寄存器都无法控制移位寄存器清除数据,也就是说无论我如何操作这些控制寄存器,移位寄存器已经记录了一位错误数据,这位错误数据会一直存在下去。这样通过SPI模块的寄存器似乎是无法解决问题了,那么其他的寄存器呢?
在STM32中,有一种专用的外设复位寄存器,比如APB2外设复位寄存器(RCC_APB2RSTR),其中有一个SPI1RST位,改为可复位SPI1外设模块。
通过使用该位,在SPI外设发生数据错位时复位整个模块,然后再启动SPI外设,可以解决该问题。

以上是本人在实际使用时发现的问题及解决方法,也欢迎论坛大牛指导,看看有没有更加简单有效的解决方案。

沙发
mmuuss586| | 2018-12-27 13:34 | 只看该作者
感谢分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

75

帖子

1

粉丝