linux SPI通信超时,提高SPI时钟时通信异常的案例分享

有人采用STM32H743ZI芯片的SPI外设跟ADC器件通信,发现一旦SPI的SCK时钟超过25MHz时,比如50Mhz,就会发生读取数据失败,并提示Busy忙信息或ERR错误信息。反正只要串行时钟不超过25Mhz,收发都很正常。

但是STM32H743芯片手册上明白地说了SPI时钟最高可达150MHz,这会是什么原因呢?

根据他所提到的异常现象初步判断,不论他的硬件方面还是软件配置方面都应该没有很大的问题,不然根本没法通信。像这种情况有可能是下面几种原因之一或组合原因【当然不仅限于这些】:

第一种情况就是通信速率明显提高时,由于通信速率加快,而接收处理的相关代码本身所用时间相对固定,这样可能导致不能及时读走数据而发生溢出,尤其是基于查询方式或中断方式接收处理时。这时我们可以考虑对接收代码做进一步的精简优化,压缩接收处理时间,或者改用DMA方式进行数据的收发。

第二种情况就是当通信速率明显提高时,跟外设复用的GPIO输出速率档位的配置没有跟上来。以本案例来说,当我们将SPI的时钟上到50MHz甚至更高时,若相应的GPIO的输出速率配置还维持在相对低速水平,与实际输出需求不相匹配时往往就会出现异常。

851f1456299fc7e6d0742f2ae7c162b4.gif

11.jpg (24.79 KB, 下载次数: 0)

2020-7-6 12:35 上传

关于这个配置,如果使用STM32CubeMx配置的话就非常简单,通过菜单选择即可完成。如下图所示:

851f1456299fc7e6d0742f2ae7c162b4.gif

22.jpg (19.79 KB, 下载次数: 1)

2020-7-6 12:35 上传

第三种情况就是当通信速率明显提高时,即使相应的GPIO输出能力配置也匹配了,但有些情况下还是有可能出通信异常的问题。我们知道,当GPIO输出速率越来越高的时候,GPIO模块带来的噪声也越大,作为通信口时其信号质量也会随着通信速率的提升而变差,当然,此时芯片所需的功耗也随之增大。对于很多STM32系列芯片,当GPIO输出速率达到一定程度时,建议开启片内GPIO补偿单元。【下面截图是两个STM32系列关于GPIO补偿单元的介绍文字】

851f1456299fc7e6d0742f2ae7c162b4.gif

33.jpg (67.96 KB, 下载次数: 0)

2020-7-6 12:36 上传

该GPIO补偿单元的作用就是通过控制IO口的输出斜率,降低GPIO的噪声对整个电源的影响并尽力改善信号质量,所以当我们基于STM32芯片实现较高速率的通信时,比方50Mhz甚至上百兆的SPI或USB通信时,如果芯片有GPIO补偿单元的话,建议将其开启。顺便提醒下,使用GPIO补偿单元的话,往往对电源电压有相应要求,具体依手册而定。

下面是分别基于STM32F4和STM32F7系列的HAL库相关开启GPIO补偿单元的函数。

851f1456299fc7e6d0742f2ae7c162b4.gif

44.jpg (52.12 KB, 下载次数: 0)

2020-7-6 12:36 上传

至于本案例异常的真正原因是什么呢?后来经确认属于上面提到的第二种情况,GPIO输出速率挡位选择与实际输出需求不匹配,稍加调整配置就好。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: BMP280是一种高精度、低功耗的数字气压计,其通信有I2C和SPI两种方式。在使用SPI通信,需要设置通信接口和传输格式,然后读取传感器的数据。 首先,需要通过SPI接口初始化传感器,设置传输格式和工作模式,其中包括传输的位数、字节序、传输速率和传输模式等参数。设置完成后,可以通过读取数据寄存器的方式获取传感器的测量数据。 具体操作可以通过专业的软件和硬件工具实现,如使用Arduino或树莓派等开发板,借助相应的库函数实现SPI通信的打印显示。也可以在Linux系统中,使用命令行或C语言进行通信的编程和打印输出。 在打印输出数据,需要注意单位转换和精度处理,以保证获取到准确的气压、温度等数据。此外,还需要注意传感器的校准和偏差修正,以获得更高的测量精度和可靠性。 ### 回答2: BMP280是一款高精度数字式压力传感器,采用SPI通信协议与MCU进行通信。为了在程序中调试BMP280的SPI通信,需要进行一定的打印输出。 SPI通信是一种串行通信协议,通过一根时钟线(SCK)和两条数据线(MISO和MOSI)实现数据的传输。在MCU中,一般使用SPI硬件模块来实现SPI通信,这简化了编程的难度。通常情况下,SPI通信速率可调节,可以根据实际需求进行设置。 在使用BMP280进行SPI通信,需要先对其进行初始化,然后开启SPI通信模式,并按照通信协议进行数据传输。在程序中,可以通过调用相应的函数来实现这些操作。接着,我们可以在程序中添加一些打印输出,以便在调试过程中定位错误。 对于BMP280的SPI通信打印,我们可以输出接收到的数据,判断其是否符合通信协议。同,还可以打印SPI通信的相关参数,如通信速率、数据位数等等。除此之外,还可以输出一些调试信息,如初始化成功/失败、通信超时、及响应等等。 总之,在使用BMP280进行SPI通信,合理的打印输出可以帮助我们更好地了解通信情况,及发现并修复问题,提高开发效率。 ### 回答3: BMP280是一种高精度、小尺寸的数字压力传感器,常用于气压、高度、温度等测量。该传感器支持SPI通信协议,通过该协议可以将测量数据传输至控制器或单片机等设备。 在SPI通信中,BMP280是从设备,需要连接至主设备(控制器或单片机)的SCK、MOSI、MISO、CS等引脚。用户需要按照BMP280的SPI通信规范和主设备的SPI模式进行配置和连接。 SPI通信可以通过程序代码实现。在使用C或C++等高级语言编写程序,可以引用BMP280的SPI库,并通过调用库函数来实现SPI通信打印。例如,在Arduino平台上,使用Wire和SPI库函数,可以实现对BMP280的数据读取和打印。 要进行BMP280的SPI通信打印,需要在主设备上打开SPI总线、进行初始化,然后发送读取命令数据至BMP280,获取BMP280返回的测量数据,最后将数据打印在终端或串口输出窗口中。需要注意的是,SPI通信速率、传输模式和命令协议等都需要按照BMP280的规范进行配置和设置,否则将影响数据的准确性和可读性。 总的来说,BMP280的SPI通信打印需要用户对SPI协议、BMP280数据格式和相关库函数有一定的了解和经验,以确保数据的正确输出和解读。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值