I2C总线被挂起的原因和解决办法
热1已有 1520 次阅读 2015-06-09 16:52不过我们在实际应用中肯定会遇到过有时I2C总线被挂起的情况(即时钟线和数据线都被强制拉到高电平),当然有些人可能用了N年都没有遇到过(尤其是对搞Linux的人,Linux底层驱动已经做的很完善了,底层驱动在遇到这种情况它会自动去解除这种挂起现象,具体方法我下面介绍),所以我们需要分析一下,到底在那种情况下会出现I2C总线挂起的现象呢,然后给出相应的解决办法:
1. 出现I2C总线挂起的原因,这里我只列出最有可能的几点:
(1)芯片不正确的上电或者复位时序;
(2)在通信过程中主机或者从机突然掉电中断了通信过程;
(3)在通信过程中出现较大的噪声干扰造成了错误的时钟或数据信号,这种情况是最常见的;
2. 至于真的出现这种挂起的状态怎么办呢,实际上包括在I2C协议的参考手册上已经给出了一个标准的解决挂起的方法(经测有效),如下图。主机检测到挂起的情况时(已经读取不出正常的数据来了),主机可以这样做,即主机线先将本身的I2C功能关掉,然后将I2C接口复用成GPIO模式,然后将SDA线一直拉高,然后SCK时钟线主机用GPIO翻转的方式提供至少9个Clock时钟来唤醒从机,最后主机再重新初始化自身的I2C模块将I2C接口使能成I2C功能。这样就基本可以让I2C总线恢复到正常状态了.
上一篇: 单片机程序设计的十层功力,你练到那一层了 下一篇: ARM你必须知道的事儿——为啥“PC = PC + 8”?
发表评论 评论 (0 个评论)