本帖最后由 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外设,可以解决该问题。
以上是本人在实际使用时发现的问题及解决方法,也欢迎论坛大牛指导,看看有没有更加简单有效的解决方案。
|