有人采用stm32h743zi芯片的spi外设跟adc器件通信,发现一旦spi的sck时钟超过25mhz时,比如50mhz,就会发生读取数据失败,并提示busy忙信息或err错误信息。反正只要串行时钟不超过25mhz,收发都很正常。
但是stm32h743芯片手册上明白地说了spi时钟最高可达150mhz,这会是什么原因呢?
根据他所提到的异常现象初步判断,不论他的硬件方面还是软件配置方面都应该没有很大的问题,不然根本没法通信。像这种情况有可能是下面几种原因之一或组合原因【当然不仅限于这些】:
第一种情况就是通信速率明显提高时,由于通信速率加快,而接收处理的相关代码本身所用时间相对固定,这样可能导致不能及时读走数据而发生溢出,尤其是基于查询方式或中断方式接收处理时。这时我们可以考虑对接收代码做进一步的精简优化,压缩接收处理时间,或者改用dma方式进行数据的收发。
第二种情况就是当通信速率明显提高时,跟外设复用的gpio输出速率档位的配置没有跟上来。以本案例来说,当我们将spi的时钟上到50mhz甚至更高时,若相应的gpio的输出速率配置还维持在相对低速水平,与实际输出需求不相匹配时往往就会出现异常。
关于这个配置,如果使用stm32cubemx配置的话就非常简单,通过菜单选择即可完成。如下图所示:
第三种情况就是当通信速率明显提高时,即使相应的gpio输出能力配置也匹配了,但有些情况下还是有可能出通信异常的问题。我们知道,当gpio输出速率越来越高的时候,gpio模块带来的噪声也越大,作为通信口时其信号质量也会随着通信速率的提升而变差,当然,此时芯片所需的功耗也随之增大。对于很多stm32系列芯片,当gpio输出速率达到一定程度时,建议开启片内gpio补偿单元。【下面截图是两个stm32系列关于gpio补偿单元的介绍文字】
该gpio补偿单元的作用就是通过控制io口的输出斜率,降低gpio的噪声对整个电源的影响并尽力改善信号质量,所以当我们基于stm32芯片实现较高速率的通信时,比方50mhz甚至上百兆的spi或usb通信时,如果芯片有gpio补偿单元的话,建议将其开启。顺便提醒下,使用gpio补偿单元的话,往往对电源电压有相应要求,具体依手册而定。
下面是分别基于stm32f4和stm32f7系列的hal库相关开启gpio补偿单元的函数。
至于本案例异常的真正原因是什么呢?后来经确认属于上面提到的第二种情况,gpio输出速率挡位选择与实际输出需求不匹配,稍加调整配置就好。
“智能安防”提升城市管理水平
未来iPhone可能会使用的功能:苹果开发手势识别系统曝光
C++编程中带#条件语句的用法和作用详解
!销售/回收HP4285A HP 4285A信号源HP428
什么是氮化镓合封芯片科普,氮化镓合封芯片的应用范围和优点
提高SPI时钟时通信异常的案例分享
电感器常见种类有哪些:阻流电感器
杉岩数据与北斗智能的合作迈向新征程
华为郭平:数字经济是经济增长的主旋律
未来机器人可以更加智能的学习
基于TCP/IP通信服务的网络门禁系统的安装及方法
苹果搞事情_MacOS弹窗提醒抛弃32位应用
各种透明玻璃厚度测量
唯创知音WT2605C-A001音频蓝牙语音芯片:小巧体积,高品质音频播放的创新
串行端口在工业单板计算机中的应用
互联网医疗的发展趋势如何?其中存在哪些问题?
配置相同的两部手机努比亚Z17和360N5你选谁?努比亚Z17和360N5谁更性价比
2021是德科技EDA设计论坛回顾
一种利用反射Wi-Fi信号的新型智能标签可以让这些非触控物品具备触控功能
地板清洁小管家,扫地机器人什么牌子好?