工具与软件:
我有一个微控制器(AMD MicroBlaze SoC)在监控环路中轮询 INA237 DIAG_ALERT 寄存器(地址0x0B)。 当 CNVRF 位为高电平(表明转换已就绪)时、启动对转换寄存器的读取。
非常间歇性(大约每小时一次)在读取操作期间、INA237似乎将在地址字节的位8 (R/W 位)而不是位9 (ACK 位)期间确认读取命令。 当控制器尝试将 SDA 驱动为高电平以设置 READ 位时、这会将 SDA 线拉低。
这个运行方式的结果是 I2C 控制器在 SCL 空闲时挂起和停止。 然后、INA237将在 SDA 有效(ACK)状态下停止、等待 SCL 转换为低电平、表示 ACK 周期结束。 28ms 后、INA237释放 SDA 线路、从而有效创建停止条件并将总线释放回空闲状态。
早期 ACK 信号仅在与 INA237通信期间出现。 它始终出现在写入命令之后的第一个读取事务期间、用于设置读取寄存器指针。 在系统中的任何其他 I2C 器件上都不会出现此模式、这导致我们怀疑导致 INA237错误。 有关详细信息、请参阅从 I2C 总线的逻辑分析仪获取的以下图像:
图1:三个正常的完整读取事务、后跟下一个读取寄存器指针的正常写入、然后在读取操作的地址字节末尾挂起。
图2:误差的放大视图。 您可以看到 SDA 线路上的短暂高电平脉冲、就像 INA237正在尝试在位8而不是位9期间执行 ACK 应答一样。
图3:错误的缩小视图、其中在使总线返回到空闲状态的错误之后28ms 释放 SDA。