原创 硬件改版引起的I2C异常

2014-5-6 00:06 4758 13 36 分类: 消费电子
最近公司有一款新版硬件,在测试时发现原有的I2C通信测试程序运行失败,从I2C从设备RX8025中无法读取到数据。使用示波器的时候,也无法在时钟线SCL上看到时钟信号。但是在测试数据线SDA的时候,偶尔能看到一些数据。如果使用示波器表笔点在测试的信号线上,有时能读到正确的数据;如果不这样做,几乎看不到正确的数据。开始怀疑是否是因为测试程序本身可靠性有问题,因为在一段时间测试后发现,这种现象随机性比较大。如果程序,没有初始化好硬件,或延时没做好,很容易造成这种随机性的问题。
于是,将软件可能的延时及初始化检查了一遍。找到了一处延时疑似有问题的地方。将这个地方的延迟增大2us后,测试竟然运行都通过了。在接下来的测试中,I2C读写正常。此时,找到I2C通信失败的原因了:I2C信号从写入结束发送STOP,到下一次开始读取从设备的Start时间间隔约为在3.7us,此时间偏小,导致通信不稳定,增加延迟可以解决问题。
在写完,上边的结论后,认为事情到此结束。
之后,分析了STM32的I2C主机通信时钟信号的参数,同时检查了程序中I2C的参数配置。发现不应该出现这样的情况。因为程序配置的I2C参数,使其运行在Fast mode此种模式下,Stop:Start的时间间隔最小为1.3us,而实际的3.7us是满足要求的。也就是说在此处增加延时,并不能真正解决问题。
 
在第二天的测试中,发现原来的解决方法确实存在问题。还是会有I2C通信失败的情况。再将原有测试程序中I2C的超时处理部分用#if注释掉(因为STM32库自带的I2C示例程序存在致使程序陷入while死循环的情况,而其优化解决方案使用了DMA+中断,感觉有些杀鸡用牛刀,不太合适。于是在其原有程序中做了超时处理,避免I2C通信失败陷入while死循环)。发现,程序运行正常。但是,如果加上超时处理,程序就无法正常运行。由此说明,并不是什么Stop:Start的时间问题。
于是将原有I2C测试程序(参数不变,带超时处理)在旧的硬件上运行,通信正常。
这里问题出来了,同样的程序,在旧的硬件中可以运行,在新的硬件上运行异常,这里边应该哪里有问题。于是,将原有的I2C通信速率400KHz的时钟降低到200KHZ,保留超时处理,在新的硬件版本上运行。发现运行正常,读取数据正常。
至此,于新版硬件的I2C通信问题,自认为是找到了:I2C的400KHz时钟速率在新版硬件上运行存在异常,调低时钟速率在新版硬件上运行(硬件优化后,或许继续使用原有的参数)。
 
由此问题解决过程中,发现:很容易将问题Q消失时,采用的方式M认为是问题出现的地方。可是往往,问题的真正原因R却躲在某个角落,为M替其顶罪感到开心,也为躲过了一场搜捕感到窃喜。下一次,他还会出来继续作乱。只有当真正将R绳之以法,才能根据解决问题Q。而这,需要的不只只是眼睛,还有思考。
头痛医头脚痛医脚,只治得了疼,却治不了病。
i2c

文章评论23条评论)

登录后参与讨论

用户1406868 2014-10-16 09:58

硬件有亚稳态吗?I2C这种电路,硬件就怕亚稳态

用户1623276 2014-5-17 19:50

nop_wang的解释非常专业,学习了。但是从信号完整性的角度超过20M才会有si的问题吧,负载电容是对示波器接入后信号正常的一个很好的解释

用户1623276 2014-5-17 19:49

nop_wang的解释非常专业,学习了。但是从信号完整性的角度超过20M才会有si的问题吧,负载电容是对示波器接入后信号正常的一个很好的解释

用户1406868 2014-5-16 23:35

好像没有找到根本原因!

用户874192 2014-5-13 09:35

这个问题很正常,改动硬件后,走线可能变长,干扰会变大。所以以前的400K要降低到200K。对于通讯,频率越高对布线的要求就越高。解决办法通常是降低通讯速率,在通讯速率不呢降低的情况下,要请有经验的工程师进行改版布线。

用户1406868 2014-5-8 13:23

I2C的线路没那么容易受影响

1989tie_959541171 2014-5-8 09:31

如果要求400KHz,肯定要继续找原因。这里I2C读取的数据量较小,相对于速度更要求系统工作的可靠型,保证系统长期稳定工作是重点。现在的做法,只是一个速度与稳定的balance。/*----*/实现简单,达到高标准就要付出更多的努力。

1989tie_959541171 2014-5-8 09:27

问题只是从软件上暂时规避,问题已经反馈给硬件工程师,等待解决中。如果能找到本因,再更新到这里。

1989tie_959541171 2014-5-8 09:23

博客所描述的工作,就是将问题确认到是硬件还是软件。之后具体再分析。

1989tie_959541171 2014-5-8 09:21

使用示波器观察过波形,不存在明显的过冲,信号正常。降频确实不是很好地方案,问题已经反馈给硬件工程师,等待结果中。
相关推荐阅读
catch2000 2015-07-19 11:44
信号线小电阻的作用
在一块新的PCB上,测试系统能否正常运行的时候,发现系统上电后没有正常启动。  系统框图如下:   在上电的时刻,CPU A(GPIO电平2.6V)会向串口发送启动日志数据,CPU A启动后,...
catch2000 2015-07-05 17:04
协议设计中ACK机制的影响
在TCP/IP中,延时ACK和Nagle算法。  TCP为了同时处理成块数据(通常为512字节的用户数据)和交互数据(通常用户数据比较少,例如不大于10个字节),采用了延时ACK和Nagle算法...
catch2000 2015-05-23 15:48
话说物联网操作系统
最近好多家都宣布推出自己的物联网操作系统。   1. Google将要在Google I/O大会发布的Brillo; 2. 三星推出的Artik芯片搭载Mentor Graphics的...
catch2000 2015-03-31 23:52
不要采用异或来交换两个变量
在进行两个变量的时候,经常会看到有些书误人子弟的推荐使用异或的方式: 方式一 {   x = x ^ y;   y = x ^ y;   x = x ^ y; } 而不是...
catch2000 2014-10-09 07:28
为什么要测试先行
在产品的研发过程中,测试一项至关重要。不论是软件还是硬件。   软件的测试先行,在研发过程中,就做到质量的保证,因为在出现Bug的时候,容易定位Bug,而且即使是在客户端出现Bug,也能够...
catch2000 2014-10-09 07:26
C语言的面向对象编程(一)
一、前言 对于编程而言,重要的是解决问题的方式,而不是语言本身。面向对象与面向过程是解决问题和思考问题的方式。C语言常说是面向过程开发的语言,因为其缺少很多对于面向对象特性的支持。但,这并不影...
我要评论
23
13
关闭 站长推荐上一条 /2 下一条