如何debug通信协议 I2C 子系统

      最后更新:2022-07-01 15:31:23 手机定位技术交流文章

      当接收ACK信号时,不应接收ACK信号。i2c控制器会引起ACK错误中断,告诉i2c驱动程序发生ACK错误。通常是奴隶本身。

      有两种常见的I2C错误:I2C ACK错误和I2C时断

      I2C ACK错误

      当接收ACK信号时,不应接收ACK信号。i2c控制器会引起ACK错误中断,告诉i2c驱动程序发生ACK错误。通常是奴隶本身。

      1.检查设备是否存在,以及i2c总线号码和设备地址是否正确。

      检查设备是否启动并正确启动.

      3.检查i2c的速度是否兼容。 如果速度超过设备所支持的最大速度,ACK错误会发生。

      4.检查i2c设备信号级别是否符合AP。

      5.GPIO检查下列部分:

      • GPIO当前驱动能力。
      • 是否GPIO工作模式是I2C模式。
      • GPIO具有内部过载阻力。
      • GPIO默认的电平衡状态。

      根据i2c规范,NACK在下列条件下是正常。

      I2C 写

      当主机向主机发送数据时,主机可能或不能对最后的字节数据作出响应,但无论如何,主机可以生成一个停止条件,如果主机发现当它发送数据给主机时(包括主机地址)主机不作出响应,则会及时停止传输。

      I2C 读

      当主机从接收机接收数据时,主机不应返回接收机的最后一个字节数据,即NACK。

      I2C停机

      当I2C传输有时间过剩时,内核日志通常以下列方式打印:

      1.GPIO检查下列部分。

      • GPIO当前驱动能力。
      • 是否GPIO工作模式是I2C模式。
      • GPIO具有内部过载阻力。
      • GPIO默认的电平衡状态。

      奴隶的序列。

      • 第一个タイムアウト奴隶出现在日志中。
      • 一个拥有功率控制和重置控制的奴隶.
      • other slave。

      问题解决后,您可以手动删除相应的外部性,确认哪些外部性将拉动i2c总线,然后与供应商沟通,调试IC状态,并解决拉动i2c总线的原因。

      i2c-工具

      i2c-tools也是非常有用的,这个工具工具博客上写的,请参阅下面的文章:

      手动教你如何使用i2c-tools..

      四、常见问题

      同一i2c总线上的所有外部i2c添加器都不同

      同一地址在登记时发生冲突。

      相应的错误代码为-16。

      您可以运行 ls /sys/bus/i2c/devices,以查看同一个地址的外部设备是否已经在相应的i2c-1下注册。

      若返回 -11,-EAGAIN。代表总线正忙,或无法申请巴士锁。如果总线正忙,请再试一下,等一下,或者检查哪些设备已经发送。如果你不能申请巴士锁,请检查是否在中断函数或原子上下文中调用i2c_transfer。

      (2)隐藏的i2c地址,即导致i2c通信异常的外部多重i2c添加器或外部HW错误。

      例如: eeprom在i2c-1上注册0x50地址,而 type c则注册0x60地址,同时对0x50响应。

      debug 方法:

      • 软件确认数据和相应的驱动器是正确的。
      • 逐一删除硬件上的外部设备,确认哪些外部设备造成了问题。

      发射器的ACK上有斑点

      在第9 clk 生成 ACK 响应后,奴隶被母端替换来控制生成的 effervescence 。 这个剪切不影响I2C 总线的读写序列,不需要处理。

      也就是说,奴隶和主人控制了总线开关间隔,没有人控制总线,从而导致了阻塞。

      3、半高电平

      在外部阻力的情况下,有一个能使内部阻力下降的阻力,导致总线的半高电压水平。

      电线与地面没有连接

      当在主端传输数据时,电源不同时拉动,因此可以增加驱动电流或增加阻力。

      在没有载入奴隶端子的情况下,你可以咨询供应商,看看是否可以增加奴隶端子驱动电流或增加拖动阻力。

      RK平台I2C调试

      它起源于火花。

      I2C通信失败,日志显示:"时限,IPD:0x00,状态:1"

      请检查硬件是否有电源.

      调用i2c_transfer返回-6?

      -6的返回值显示了一个NACK错误,即其他设备不正确响应。这通常是一个外部问题,还有几个常见情况:

      • 通过测量I2C波形并确认I2C设备地址误差,解决I2C地址误差;
      • I2C奴隶设备不处于正常工作状态,例如没有电源、不正确的调用时间序列等;
      • 时间序列不符合I2C奴隶设备的要求也产生Nack信号。

      当外部请求读时序列在停止信号和不重复启动信号之间时,如何处理?

      此时,您需要两次调用i2c_transfer,I2C read被分成两个部分,并修改如下:

      相信上述I2C调试方法已经解决了所有问题,如果没有解决,通常是芯片问题或工厂基本代码错误,你可以找到芯片工厂支持。

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/28886.html

          热门文章

          文章分类