AM4378的开发板,在I2C1 总线上加了一个I2C从设备MPU6050,但是通信一段时间就会产生“Arbitration lost”仲裁丢失错误,然户系统就会一直出现 " timeout waiting for bus ready " 这个错误。
芯片手册上说出现仲裁丢失错误有两种情况,一种是真正的仲裁丢失,另一种是"when the I2C attempts to start a transfer while BB (bus busy) is 1.",我I2C总线上只有一个主设备,因此应该是第二种情况。但是I2C在传输的时候已经判断了当前总线为空闲,为什么还会出现这种现象呢? 并且 bus busy 位被置1后,软件复位和软件重启均无法清除,只有断电重启才能清除该标志位。
为什么会出现这种情况?有人之前遇到过么?
Steven Liu1:
I2C的硬件设计上做了上拉了吗?
Heng Jiang:
回复 Steven Liu1:
接了2.2K的上拉电阻
Heng Jiang:
回复 Heng Jiang:
刚刚用示波器量了一下,发现SDA线一直处于低电平,软件复位无法恢复,只有断电重启后才能变成高电平。
Shine:
回复 Heng Jiang:
请问是否是下面的情况引起的?http://processors.wiki.ti.com/index.php/I2C_Tips#Using_I2C_in_a_Multi-Threaded_Context
Heng Jiang:
回复 Shine:
谢谢,应该就是IIC文档里面所说的问题,并且也给出了解决方案。
但是文档里面说当你在传输的过程中,IIC模块复位会出现这样的问题,但是我并没有复位啊,而且IIC的一次传输是有互斥锁的保护,不会出现多线程同时使用IIC问题,那么为什么IIC模块会复位呢?
我的板卡上有两个IIC,IIC0刚刚测试是不会出现这样的现象的,IIC1会出现,难道是硬件有BUG么?
谢谢您的文档!
yongqing wang:
回复 Heng Jiang:
重现一下这个问题,看看复位信号
Heng Jiang:
回复 yongqing wang:
请问复位信号怎么查看?是否和上图有关?
Jian Zhou:
回复 Heng Jiang:
可以通过写寄存器复位,你的I2C总线上只连了这么一个设备么?其他设备有没有类似问题?