我正在使用 I2C 模块0 (UCB0)与两个从器件(EEPROM (24LC64)和一个温度传感器(Si7060))进行通信。 正在持续执行温度传感器的 I2C 写入和读取。 偶尔的 I2C 读取失败、因为它们不及时响应、但我认为下次读取正常。
但在10-15分钟(10000次或更多次读取)后、UCBBUSY 位会被置位。 SDA 线持续保持低电平。 我的代码在 while 循环中等待位被清除、而这种情况并未发生、因此代码会卡住。 写入操作正常。 我使用的代码与用于 I2C 模块1 (UCB1)的代码相同、没有问题。
(1)为什么会发生这种情况? 我在 CRO 上观察到 CLK 信号看起来像正弦波。 保持时间是否不足、导致从器件将数据线拉低以向 ACK 发出信号、而不会将其释放? 在本例中、更改 I2C 时钟频率可解决该问题、对吧? 当前时钟频率约为133KHz (16MHz/120)
(2)当 UCBBUSY 被置位时、我尝试通过执行来复位 I2C 模块
UCB0CTL1 = UCSWRST;
_DELAY_CYCLES (1000);
UCB0CTL1 &=~UCSWRST;
尽管这会将模块和 SDA 线重置为高电压电平、但这会导致在某些情况下连续读取 I2C 失败。 我是否已尝试更正? 如果不是、我还能如何解决这个问题?
我们在生产过程中处于关键阶段。 任何帮助都将受到衷心感谢。 请查找随附的代码。
谢谢