SDA和SCL同时为低
各位,我在调I2C设备时,遇到如上所示,目前的情况是一个I2C控制器下面挂接多个I2C设备,
经常发现I2C数据不更新,然后量SDA和SCL全部为低,有时候又是SDA一直为高,SCL一直为低。
可能是嘛原因呢?求解? 你的 I2C Master 端挂了 I2C Master也能挂?
被拉低了吧 所以请问下,这种问题肿么解? 不知道是没用好,还是没整明白!觉得不好用!! I2C Master 挂了是很常见的事情,感觉你像是很奇怪的样子?
驱动是一直等待最终的完成中断才会继续执行的。 而SCL是Master发出的信号,如果它一直为低,只有下面几种情况:
1. 时序
2. I2C Master 死掉了
3. 你的代码逻辑有问题
你自己选吧,呵呵 本帖最后由 f1yh1347 于 2014-1-27 10:01 编辑
因为CPU集成了I2C控制器,这种控制器一般应该不会出问题吧?主要是I2C状态寄存器一直在显示发送数据。我也不好检测I2C控制器是否是真的挂掉了还是在发送数据。 很明显,通信紊乱,估计用的模拟IIC,而时序可能有问题,只要要一次拉低总线没有释放,该总线一直处于忙状态。 cumtgao 发表于 2014-1-27 10:02
很明显,通信紊乱,估计用的模拟IIC,而时序可能有问题,只要要一次拉低总线没有释放,该总线一直处于忙状 ...
有I2C控制器,要是模拟的就好了, f1yh1347 发表于 2014-1-27 09:59
因为CPU集成了I2C控制器,这种控制器一般应该不会出问题吧?主要是I2C状态寄存器一直在显示发送数据。我也 ...
如果一直在发送数据,那总线应该应该电平一直在变化。
现在控制器一直在发,而总线又一直为低,应该很好排查啊。
一个一个从器件去掉,看哪个从设备在捣蛋! cumtgao 发表于 2014-1-27 10:18
如果一直在发送数据,那总线应该应该电平一直在变化。
现在控制器一直在发,而总线又一直为低,应该很好 ...
状态寄存器显示在发数据,但是SDA 和SCL一直保持不变,有时候是SDA和SCL一直为低,有时候是一方一直为低,一方一直为高。
按i2c的时序图慢慢测吧! 如下是图:
最后应该有个数据读出来的,发现SCL和SDA都为低了。 你SCL SDA上拉了吗?或者设置成上拉了吗? 肯定有上拉电阻,
这个是有出现这个的概率,大概几分钟,十几分钟的样子。
并不是一直出现。
显然是你的代码有问题。
第二个I2C操作,读0xC9,从机ACK之后Master端没有继续发时钟,从机只能等。。。 f1yh1347 发表于 2014-1-27 10:20
状态寄存器显示在发数据,但是SDA 和SCL一直保持不变,有时候是SDA和SCL一直为低,有时候是一方一直为低 ...
有时候一方一直为低,一方一直为高
你这句话是不是指:SDA一会高一会低,而SCL始终为低吧 cumtgao 发表于 2014-1-27 11:12
有时候一方一直为低,一方一直为高
你这句话是不是指:SDA一会高一会低,而SCL始终为低吧 ...
我指的是,出错的时候,有时候是SDA一直为高,SCL一直为低,或者是SDA一直为低,SCL一直为高,再或者是SDA和SCL一直为低。 mangocity 发表于 2014-1-27 11:03
显然是你的代码有问题。
第二个I2C操作,读0xC9,从机ACK之后Master端没有继续发时钟,从机只能等。。。 ...
我是采用中断的方式读写I2C,写完0xC9之后,CPU应该发一个中断通知我数据写完,然后我再继续下面的操作,比如,读数据。 当我发现SDA和SCL一直为低的时候,去查看I2C的状态寄存器,发现一直显示还在发送数据,并未完成。
所以一直hang在那里。 关注一下! 1.这种情况一般都是从设备将SCL拉低了。主设备读到总线一直繁忙;2.解决办法:1.复位从设备,有复位脚使用复位脚,没有复位脚可以通过断电等办法(断电的画,注意通信接口的隔离),2.软件写个恢复机制,可以在异常时候,给SCL几个时钟,总线可以自动恢复(具体办法你可以问度娘) jiamingz 发表于 2014-1-27 15:12
1.这种情况一般都是从设备将SCL拉低了。主设备读到总线一直繁忙;2.解决办法:1.复位从设备,有复位脚使用复 ...
问题就是这个异常不好检测啊。 f1yh1347 发表于 2014-1-27 17:14
问题就是这个异常不好检测啊。
有写从设备在某些温度下会失效,你可以在温度箱里做测试。 如图所示,SDA上的毛刺可能是由于什么引起的呢?
页:
[1]