ZHCAE64 July 2024 TCA4307
总线阻塞问题可能由多种不同原因导致,在大多数情况下,主要都是产生了错误的时钟边沿。I2C 总线上出现错误的时钟边沿会带来危险,因为错误的时钟边沿会使 I2C 目标器件的时钟与负责产生时钟边沿的 I2C 控制器不同步。I2C 目标器件的纳秒级抗尖峰脉冲滤波器和 I2C 控制器的抗尖峰脉冲滤波器之间的差异可能导致一个器件会发现错误边沿,而另一个器件不会发现错误边沿。例如,如果 I2C 目标器件具有 70ns 抗尖峰脉冲滤波器,而控制器具有 50ns 抗尖峰脉冲滤波器,则会在 60ns 时间窗口内发生错误边沿,导致控制器会发现错误边沿,而目标器件会忽略错误边沿。另一种可能的情况是,目标器件和控制器之间存在一个 I2C 转接驱动器(也称为缓冲器)。如果一侧出现错误边沿,该边沿无法通过转接驱动器传播,因此控制器和目标器件两者只有一侧可以发现边沿,另一侧不会。
图 2-1 显示了一个示例。本示例中的第一个事务显示了应该发生的情况。控制器使用 0x0Ah 数据包向目标器件发送数据,在第 9 个时钟脉冲上,目标器件通过确认告知控制器其接收到数据,然后控制器生成停止条件。第二个事务与第一个事务相同,但在第 5 个时钟脉冲期间生成了错误边沿。此时,控制器会发现该错误边沿,而 I2C 目标器件不会发现。这意味着控制器在 I2C 事务中超前一个时钟,而 I2C 目标器件落后一个时钟。目标器件发现的数据随后向左移动 1,因此其接收到错误数据 (0x05h),而不是发现 0x0Ah。当出现第 8 个 SCL 下降沿时(从目标器件的角度),I2C 目标器件会将 SDA 线路驱动为低电平,但始终不会发现第 9 个 SCL 下降沿。这会导致 SDA 线路无限期处于低电平。控制器无法发出停止条件,但可以将 SCL 保持为低电平或释放 SCL(具体取决于控制器的硬件和软件)。
总线阻塞的根本原因可能是串扰、电磁干扰、热插入事件或不良的上电复位情况。