
I2C总线SCL信号无法正常拉高的问题.docx
2页I2C 总线 SCL 信号无法正常拉高的问题标签: c 工作测试网络 io2012-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 总线的博客( Rp 的值由三个参数决定:电源电压、总线电容和连接器件的数量(输入电流+漏电流)此处再援引另外一篇博文( *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 总线成功启动。
