文档库 最新最全的文档下载
当前位置:文档库 › I2C总线SCL信号无法正常拉高的问题

I2C总线SCL信号无法正常拉高的问题

I2C总线SCL信号无法正常拉高的问题
I2C总线SCL信号无法正常拉高的问题

I2C总线SCL信号无法正常拉高的问题

标签:c工作测试网络io

2012-08-30 00:06 1603人阅读评论(0) 收藏举报分类:

linux开发(4)

版权声明:本文为博主原创文章,未经博主允许不得转载。

昨天板子起来以后,发现I2C总线不能正常工作。挂载到I2C总线上的设备出去RTC可以正常工作外,其他都“完蛋”了。于是抓波,发现SCL高电平无法达到3.3V的幅值。起初以为是上拉电阻太大了,于是更换为阻值更小的,但发挥的作用微乎其微,只能勉强上拉到2.3V左右。

紧接着去查电路和PCB设计,这次PCB走线有些绕,整板看上去类似一个“几”字,3.3V的上拉靠近源端一侧。由于各种原因,此次使用GPIO模拟的I2C的时序来对I2C设备进行控制。因此,目标再一次转移到GPIO的问题上来。首先,这些IO口为复用管脚,在配置上作为输出,那么SOC内部应该有弱上拉。按照这个思路,我将外部上拉电阻全部干掉。在kennel当中,把这个两个PIN当作IO口在操作。进行简单的拉高和拉低操作,结果问题依然存在。模拟SCL的GPIO口的高电平还是上不去。于是就去网络寻求帮助,在网络上找到了一篇关于I2C总线的博客

(https://www.wendangku.net/doc/1315750117.html,/user1/1721/archives/2005/5753.html),这篇博文中描述到:上拉电阻Rp的值由三个参数决定:电源电压、总线电容和连接器件的数量(输入电流+漏电流)。此处再援引另外一篇博文

(https://www.wendangku.net/doc/1315750117.html,/979066/226504)中提到的关于上拉电阻的计算公式:

Rmin={Vdd(min)-o.4V}/3mA

Rmax=(T/0.874) *c, T=1us 100KHz, T=0.3us 400KHz C是Bus capacitance

这里提到的两个公司,在原版的I2C协议当中,我找到了如下依据:

结合引用博文的一些数据,我确定我的上拉电阻选型还是合适的。事实证明,当我拿掉这两个上拉电阻之后,信号也没有任何改善,从而也证明了问题并非是由上拉电阻选择不当造成的。

由于这块单板与以前单板相比,I2C总线上多增加了一颗AD芯片,其余原理图均保持了原有的设计。因此,我们又把这颗AD也拆了。但是问题依然没有得到解决。考虑到I2C走线较长,可能存在压降的问题以及上拉电阻应该靠近源端的原则。我将在板的I2C器件的SCL就近上拉,然后继续进行测试。当板子重新掉电重启之后,高电平上去了。但是同时发现低电平又下不来了,有大概0.8V左右的压差。这点让我感到非常的费解。仔细排查原理图发现,在一颗音频芯片的I2C管脚上,对地接了50PF的滤波电容。由于容值很小,无论如何充电也一定就是造成低电平无法到0V的原因。为了保险,我又把这两个电容也拆了。结果,问题依然没有解决。电容的嫌疑排除了。

此时继续核查原理图,发现I2C总线上的一个音频芯片的复位管脚所接的GPIO口发生了变化,与上次版本不一致,且在这个复位线上只有一个3.3V的上拉。对于大多数芯片来说,当芯片上电时要对ASIC内部的专用寄存器进行初始化,因此在芯片

上电以后,复位管脚还需要保持一段时间内有效,否者该芯片的寄存处初始化可能失败。因此,顺着这样的逻辑,我们将该音频芯片拆除后又进行了一次测试,一切正常。同时,我们也排除了AD的I2C控制器出问题的情况。

继续,返回仔细看看这个颗芯片的datasheet,果然在“硬件复位”一章中到了官方的说明。这颗芯片需要在上电以后,reset管脚必须要保持10ns以上的保持时间。这样这颗芯片的寄存器才能正常初始化。接口才能正常工作。

经过相关负责人烧写之后,I2C总线成功启动。

相关文档