最近在调试200G板卡的时候遇到了一个问题,在同时访问多个I2C的时候,I2C死掉了,这个问题出现也有两个星期了,下面分享一下跟它的爱恨情仇。
一、现象描述
我们现在的电路板搭配的是一款型号为pca9548的复用器,可以分八路去访问每一个I2C。在分是打开去访问的过程中,其实复用器的打开和切换通道是没有任何问题的,但是在访问外部器件的时候,突然就卡死了,或者在光模块给光的过程中,就卡死了,这里所说的卡死是指通讯受到了干扰。在受到干扰之后,接收的数据就不正常,因为程序里面有很多等待。但很奇怪的是,同时访问四个不行,访问三个就行,两个甚至一个都是没有什么问题的。
二、排查过程
在接入光的时候,尝试过多种调试手段,单独打开其中的某个通道没有任何问题,但是发现不了问题,排查主要还是从两个方面入手,软件和硬件。
1、硬件方面,用万用表和示波器都测量过硬件的指标,电压都没有任何问题,这个“锅”似乎就要掉到软件头上了。
2、软件方面的排查,其实对于I2C也好还是外部访问的器件也好,各方面的配置都是一样的,之前也有一个版本是好的,只不过没有这么多外部器件。所以一开始也以为不是软件的问题。但是还是例行检查,从时钟、频率、波形再到复用器的打开、关闭和切换,每一点都去排查,加入延时也还是不行。真的没有办法了吗?
3、从功能上去排查,但各功能启用和关闭看对整个系统的影响,排查有一点很微妙,首先是开启芯片内部的输出会有影响,然后进一步下去是开启los检测功能会影响,然后又是loss启用禁用输出也会有影响,在接下来又是启用自适应也会有影响,接入光和不接入光也有不一样的现象,这咋整呢,好像所有的一切都影响了。把所有输入CPU的引脚都断开,排除干扰,也无济于事。
4、问题的解决最后是把I2C的上拉电阻由1K改为4.7K,最终才解决了这个问题。(经验可能并不适用,因为之前的板子用的都是1K)
三、整体分析
整体下来,并不是一直都在口这个问题,中间也去做了其他,所以才会搞这么久。但是从现象上去看,其实就是因为去访问完每一个CDR的过程中,对数据的传输造成了影响。一刚开始觉得是因为电压,但经测量后电压指标一直是正常的,而且都是共用电压。所以一直也不敢下定论,现在看来,改变了电阻,相应的电流会有些许变化。这可能才是最终的原因。
这是网上一些网友的经验分享,
看来解决事情还是要看本质,当然没有通过现象怎么去解决本质的问题呢。