关于STM32的硬件IIC使用问题解决方案

最近公司上STM32,对新的东西不太熟悉。直接上手,平台配置啥的都还算顺利,毕竟八位机平台的东西在。到硬件IIC的时候就出大问题了,刚刚上板子的PCF8563(RTC),我也懒,直接就用ST官方给的库。刚刚开始几次可以读写PCF8563,后来直接就杯具。查了两天,发现连STAR信号都发不出来,直接卡在IIC时钟使能那个地方。总线永远是忙!实在没办法。。。

求助 几个朋友,其中一种说法是:STM32的抗干扰问题,导致IIC总线有动作,让IIC器件认为忙。要在VDD和VSS,接近管脚的地方加104的电容。有可能是这种原因,不过我手头板子限制,我没办法加电容,我没有试,要不谁试一下。

然后到网上一搜,乖乖,原来不只是我碰到这个问题,N多人都碰到这个问题,官方也出了一个修定基本承认这是一个硬件BUG。杯具了,很多人都直接用IO直接模拟了。我的日程安排也打算,再弄一个早止,如果不成我也直接用IO模拟了。

继续调,继续搜。在一个BLOG(实在对不起,由于大量的查看网页,我实不记得那博客是哪的了)里看到有这么一个说法:首先是,应用时序不完全标准。其次是,IIC自动ACK的问题。受这个启发我从新整理IIC的时序。

由于是总线一开始就是忙,那我在配置IO的时候,就先更改IO状态,让IO先全部拉高。想当于强制释放总线,然后再配置IO和IIC。一看,嘿嘿,IIC不忙了。大喜!!!理所当然,接下来的写函数也正确了,至少没有出现STAR发不出的情况。到读数据,杯具又出现了!又当在了发STAR的时候,我都无语了。郁闷过后,仔细跟踪进去发现:第一次读数据是正确的,而第二次读数据的时候才出现了STAR不能发的情况。我又从新组织一个读的IO配置程序,无果。又陷入无语。能读出第一个数据,那么我的读时序肯定是没有问题的,可为啥第二次读的时候就杯具呢?我单步进入函数,更惊奇的发现竟然单步读数据能读出来!!会不会真的是传说中的自动ACK设置的问题呢?我测试了一下,无解。然后,想想单步和全速的区别,难道还真是速度?加了一个延时函数在每一次读的后面,OK,世界就这么清净了!

我承认,期间我问候了ST很多工程师的家人,实在不好意思。

总结(其实我硬件电路基础很垃圾,我就YY一下,不对的欢迎指正):

1.总线总是忙的问题,这个我觉得可能和IO结构和IIC状态机有关。不知道ST怎么弄的,感觉这个IO像是能“记忆”一样,把过去的值和干扰都记住了,死活不忘掉。

2.至于后面的ACK,这个可能与它的IIC状态机有关。状态机刚刚应ACK,就直接置标志,而实际上ACK远没有结束,而用户直接就进行下一步操作,这当然杯具。同样的地况在MSP430里的UART一德行。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页