f1yh1347 发表于 2014-1-26 15:25:03

SDA和SCL同时为低

各位,我在调I2C设备时,遇到如上所示,
目前的情况是一个I2C控制器下面挂接多个I2C设备,
经常发现I2C数据不更新,然后量SDA和SCL全部为低,有时候又是SDA一直为高,SCL一直为低。
可能是嘛原因呢?求解?

mangocity 发表于 2014-1-26 16:23:43

你的 I2C Master 端挂了

f1yh1347 发表于 2014-1-27 08:38:20

I2C Master也能挂?

dl499126943 发表于 2014-1-27 08:43:28

被拉低了吧

f1yh1347 发表于 2014-1-27 09:11:03

所以请问下,这种问题肿么解?

guowanling8061 发表于 2014-1-27 09:11:59

不知道是没用好,还是没整明白!觉得不好用!!

mangocity 发表于 2014-1-27 09:20:42

I2C Master 挂了是很常见的事情,感觉你像是很奇怪的样子?
驱动是一直等待最终的完成中断才会继续执行的。 而SCL是Master发出的信号,如果它一直为低,只有下面几种情况:
1. 时序
2. I2C Master 死掉了
3. 你的代码逻辑有问题
你自己选吧,呵呵

f1yh1347 发表于 2014-1-27 09:59:46

本帖最后由 f1yh1347 于 2014-1-27 10:01 编辑

因为CPU集成了I2C控制器,这种控制器一般应该不会出问题吧?主要是I2C状态寄存器一直在显示发送数据。我也不好检测I2C控制器是否是真的挂掉了还是在发送数据。

cumtgao 发表于 2014-1-27 10:02:07

很明显,通信紊乱,估计用的模拟IIC,而时序可能有问题,只要要一次拉低总线没有释放,该总线一直处于忙状态。

f1yh1347 发表于 2014-1-27 10:03:46

cumtgao 发表于 2014-1-27 10:02
很明显,通信紊乱,估计用的模拟IIC,而时序可能有问题,只要要一次拉低总线没有释放,该总线一直处于忙状 ...

有I2C控制器,要是模拟的就好了,

cumtgao 发表于 2014-1-27 10:18:08

f1yh1347 发表于 2014-1-27 09:59
因为CPU集成了I2C控制器,这种控制器一般应该不会出问题吧?主要是I2C状态寄存器一直在显示发送数据。我也 ...

如果一直在发送数据,那总线应该应该电平一直在变化。
现在控制器一直在发,而总线又一直为低,应该很好排查啊。
一个一个从器件去掉,看哪个从设备在捣蛋!

f1yh1347 发表于 2014-1-27 10:20:35

cumtgao 发表于 2014-1-27 10:18
如果一直在发送数据,那总线应该应该电平一直在变化。
现在控制器一直在发,而总线又一直为低,应该很好 ...

状态寄存器显示在发数据,但是SDA 和SCL一直保持不变,有时候是SDA和SCL一直为低,有时候是一方一直为低,一方一直为高。

bobo89 发表于 2014-1-27 10:27:30

按i2c的时序图慢慢测吧!

f1yh1347 发表于 2014-1-27 10:33:25

如下是图:
最后应该有个数据读出来的,发现SCL和SDA都为低了。

rootxie 发表于 2014-1-27 10:48:10

你SCL SDA上拉了吗?或者设置成上拉了吗?

f1yh1347 发表于 2014-1-27 10:54:56

肯定有上拉电阻,
这个是有出现这个的概率,大概几分钟,十几分钟的样子。
并不是一直出现。

mangocity 发表于 2014-1-27 11:03:35

显然是你的代码有问题。
第二个I2C操作,读0xC9,从机ACK之后Master端没有继续发时钟,从机只能等。。。

cumtgao 发表于 2014-1-27 11:12:12

f1yh1347 发表于 2014-1-27 10:20
状态寄存器显示在发数据,但是SDA 和SCL一直保持不变,有时候是SDA和SCL一直为低,有时候是一方一直为低 ...

有时候一方一直为低,一方一直为高
你这句话是不是指:SDA一会高一会低,而SCL始终为低吧

f1yh1347 发表于 2014-1-27 11:17:39

cumtgao 发表于 2014-1-27 11:12
有时候一方一直为低,一方一直为高
你这句话是不是指:SDA一会高一会低,而SCL始终为低吧 ...

我指的是,出错的时候,有时候是SDA一直为高,SCL一直为低,或者是SDA一直为低,SCL一直为高,再或者是SDA和SCL一直为低。

f1yh1347 发表于 2014-1-27 11:24:05

mangocity 发表于 2014-1-27 11:03
显然是你的代码有问题。
第二个I2C操作,读0xC9,从机ACK之后Master端没有继续发时钟,从机只能等。。。 ...

我是采用中断的方式读写I2C,写完0xC9之后,CPU应该发一个中断通知我数据写完,然后我再继续下面的操作,比如,读数据。 当我发现SDA和SCL一直为低的时候,去查看I2C的状态寄存器,发现一直显示还在发送数据,并未完成。
所以一直hang在那里。

fengyunyu 发表于 2014-1-27 13:09:13

关注一下!

jiamingz 发表于 2014-1-27 15:12:37

1.这种情况一般都是从设备将SCL拉低了。主设备读到总线一直繁忙;2.解决办法:1.复位从设备,有复位脚使用复位脚,没有复位脚可以通过断电等办法(断电的画,注意通信接口的隔离),2.软件写个恢复机制,可以在异常时候,给SCL几个时钟,总线可以自动恢复(具体办法你可以问度娘)

f1yh1347 发表于 2014-1-27 17:14:49

jiamingz 发表于 2014-1-27 15:12
1.这种情况一般都是从设备将SCL拉低了。主设备读到总线一直繁忙;2.解决办法:1.复位从设备,有复位脚使用复 ...

问题就是这个异常不好检测啊。

jiamingz 发表于 2014-1-28 10:32:15

f1yh1347 发表于 2014-1-27 17:14
问题就是这个异常不好检测啊。

有写从设备在某些温度下会失效,你可以在温度箱里做测试。

f1yh1347 发表于 2014-2-7 16:52:53

如图所示,SDA上的毛刺可能是由于什么引起的呢?
页: [1]
查看完整版本: SDA和SCL同时为低