I2C总线是我们常用的IC之间的通信总线之一,虽然速率有一定的限制(标准的I2C速率才100kbps, Fast I2C速率为400kbps),但是有利有弊,存在即有理,其简单的两线接口(只需要时钟和数据两根线),支持多主机冲突检测和多节点挂载(节点数不受限制,只要总线电容别超过400pF)还是颇受很多人的欢迎的,所以目前市场上大多数需要配置的专用IC都留有I2C接口(有些芯片为了高速通信会使用SPI接口)用来跟主机通信,包括我们常用到的EEPROM,数字量Sensor,电源管理芯片,电量计之类的种种IC,多不胜数,而且I2C接口都是开漏的,所以大多数情况下(不排除有些设备是伪开漏)可以避免主从机IC电平匹配的问题。
不过我们在实际应用中肯定会遇到过有时I2C总线被挂起的情况(即时钟线和数据线都被强制拉到高电平),当然有些人可能用了N年都没有遇到过(尤其是对搞Linux的人,Linux底层驱动已经做的很完善了,底层驱动在遇到这种情况它会自动去解除这种挂起现象,具体方法我下面介绍),所以我们需要分析一下,到底在那种情况下会出现I2C总线挂起的现象呢,然后给出相应的解决办法:
1. 出现I2C总线挂起的原因,这里我只列出最有可能的几点:
(1)芯片不正确的上电或者复位时序;
(2)在通信过程中主机或者从机突然掉电中断了通信过程;
(3)在通信过程中出现较大的噪声干扰造成了错误的时钟或数据信号,这种情况是最常见的; |