关于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 @ 2021-01-11 22:48  emanlee  阅读(4761)  评论(0编辑  收藏  举报