关于stm32的iic为什么不稳定的讨论


stm32的iic不稳定这种说法源于旧版的函数库,由于iic本身是飞利浦发明的,飞利浦拆分出来的nxp具有绝对的专利优势,为了规避这种专利问题,st对iic通讯有别出一格的设计,但旧版的函数库无法很好地处理这种设计,导致多中断的时候容易出问题。但新版的hal库基本解决这种问题,可以放心使用。

没有不稳定这个说法,只是硬件I2C通信困难,因为STM32没有I2C协议的专利,一些技术细节与官方的I2C协议有所出入,因此做得很难用的样子,以防被对手控告侵权。

这个硬件的IIC是没有问题的,只是ST的标准库去操作IIC有bug导致不稳定

原来使用过硬件的IIC,非常不稳定,而且读取数据也有乱码,网上反馈是硬件的bug

这个是STM32的一bai个bug。它只在特定的一小段时间内读外设的ACK信号,一旦错过了ack信号,后面所有的shu时序都乱了。ST建议所有涉及I2C的程序都采用DMA方式。

加点针对性的bai的代码就可以了
1.比如为了防止错过Ack信号的读取,可以加入循环发送并读Ack的步骤,也可以直接关中断,如果有资源用DMA最好了,收发数据以及标志位的相关处理和判断都自动处理。
2.还有就是调试过程中,如果断点设在等待Ack前,会清除Ack信号
ADDR: Address sent (master mode)/matched (slave mode)
This bit is cleared by software reading SR1 register followed reading SR2
Ack信号会在读SR1和SR2后被清除。调试器会读取SR1和SR2,所以设断点在等待Ack前会导致程序检测不到Ack信号

一:不要用库,每一段START->ACK尽量写短,写简洁!
二:降低I2C速度!我测试在10KHZ时很稳定,20KHZ非常少,不稳定,50KHZ几乎不稳定


REF

https://zhuanlan.zhihu.com/p/338377414
https://www.icxbk.com/ask/detail/14916.html
https://blog.csdn.net/whw8007/article/details/9162779



posted @   emanlee  阅读(5193)  评论(0编辑  收藏  举报
编辑推荐:
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
阅读排行:
· Blazor Hybrid适配到HarmonyOS系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 解决跨域问题的这6种方案,真香!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库
· 分享4款.NET开源、免费、实用的商城系统
点击右上角即可分享
微信分享提示