This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] BQ76942:通信/复位问题

Guru**** 2350610 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1480423/bq76942-communication-reset-issue

器件型号:BQ76942

工具与软件:

如果 MCU 和 I2C 上拉电阻在 BQ 之前上电、则一切都正常运行。
但在我们的当前设计中、通常首先唤醒 BQ、并且为 MCU 和 I2C 上拉电阻供电的电压域仅提供~20ms 的延迟、与此同时、总线线路没有上拉电阻。
显然、这会导致 BQ 的 I2C 接口锁定、因为它不会再次确认任何命令、但我可以看到 REG1V8和 REG1 (3V3)在线、因此 BQ 必须处于活动状态。
这一理论是否合理?如果可行、那么发生这种情况的确切条件是什么?

对于下一个 PCB 修订版、我们打算更改上拉电阻的提供方式、但对于当前修订版、我们仍需要以某种方式使其正常工作。
我的权变措施思路是在 MCU 启动后通过将 RST_SHUT 引脚设置10ms 来复位 BQ。
这确实解决了 I2C 问题、但会产生新的问题、然后累积的电荷会复位为某个垃圾值。
因此、我也尝试向它发送 RESET_PASSQ 子命令、但没有效果、除非我在 RST_SHUT 再次变为低电平并发送子命令之间插入300ms 的延迟。
这里发生了什么、为什么需要这种延迟、它记录在哪里?

此外:
为什么 OTP_WR_CHECK 子命令需要长达200ms 的时间来执行?
如果我向器件发送 RESET 子命令、我需要等待20ms 才能接受下一条命令、为什么没有记录这一点?
如果我尝试从0x0084读取、它似乎永远不会完成、0x3e 和0x3f 始终返回0xff、为什么会这样?
为什么要在每个字节中附加一个"CRC"? 这违反了 CRC 的逻辑、为什么不正确实现它并删除0x60处的校验和呢?

到目前为止、为该 IC 实施驱动程序一直是一个彻底的挫折。

BR

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Nicolai、

    通常这会导致 BQ 的 I2C 接口锁定、因为它永远不会再确认任何命令

    您认为该器件会锁定什么? AFE 是否会将 SCL 保持在低电平? 您是否尝试发送8+1时钟脉冲? 上一篇论坛帖子可能能够帮助您: 如何通知 I2C 目标器件释放总线

    [报价 userid="644211" url="~/support/power-management-group/power-management/f/power-management-forum/1480423/bq76942-communication-reset-issue ]因此我也尝试向它发送 RESET_PASSQ 子命令、但这是无效的、除非我在 RST_SHUT 再次变为低电平与正在发送的子命令之间插入一个300ms 的延迟。
    此处发生了什么情况、为什么需要此延迟以及它记录在哪里?[/QUOT]

    完全复位信号最多可能需要~500ms、而部分复位最多可能需要~200-300ms。 目前还没有记录这一点。

    [报价 userid="644211" url="~/support/power-management-group/power-management/f/power-management-forum/1480423/bq76942-communication-reset-issue "]为什么执行 OTP_WR_CHECK 子命令最多需要200ms?[/QUOT]

    子命令的时序可能会因当时的系统操作而异。 我看到用户等待10ms 到100ms、这样可以为 AFE 提供足够的时间来处理命令并使用正确的值更新其寄存器。  

    [报价 userid="644211" url="~/support/power-management-group/power-management/f/power-management-forum/1480423/bq76942-communication-reset-issue "]、0x3e 和0x3f 总是返回0xff、原因是什么?[/QUOT]

    通常0xFF 表示子命令尚未完成操作。 当您读取数据的速度过快(尤其是在写入数据后)时、通常会发生这种情况。 尝试在两次测量之间添加2ms 等待时间/延迟。 第2节子命令 BQ769x2软件开发指南 和/或中提供的说明 第3.1节直接命令和子命令 都可以提供更多相关信息。

    [报价 USERID="644211" URL"~"crc"/support/power-management-group/power-management/f/power-management-forum/1480423/bq76942-communication-reset-issue、为什么会在每个字节后附加一个"crc"? [报价]

    CRC 对于我们的器件是可选的、因为有些用户不需要 CRC。 第9.1节串行通信概述 技术参考手册中 提供了有关器件不同通信类型设置的更多信息。

    此致、
    Alexis

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。


    感谢您的答复!

    您认为设备会锁定什么? AFE 是否会将 SCL 保持在低电平? 您是否尝试发送8+1时钟脉冲? 上一篇论坛帖子可能能够帮助您: 如何通知 I2C 目标器件释放总线[/QUOT]

    此器件根本不响应任何命令、它在 MCU 发送其地址后不会使用 ACK 进行响应。 我尝试发送时钟脉冲、9甚至更多、但没有任何效果。

    子命令的时序可能因当时的系统操作而异。 我看到用户等待10ms 到100ms、这样可以为 AFE 提供足够的时间来处理命令并使用正确的值更新其寄存器。  [报价]

    是否无法检查写入子命令是否已完成执行?

    通常为0xFF 表示子命令尚未完成操作。 当您读取数据的速度过快(尤其是在写入数据后)时、通常会发生这种情况。 尝试在测量之间添加2ms 等待时间/延迟。[/QUOT]

    由于某些 命令所需的时间超过文档记录、具有2ms 恒定延迟 的简单方法对我来说不够可靠、因此我 实施了在读取剩余数据之前检查0x3e 和0x3f 的方法。 但是、子命令 0x0084只会返回0xff 且持续至少1秒、因此对于我的应用来说、较长的等待时间是不可接受的、因为存在看门狗。 TRM 没有提到需要在读取0x3e-0x3f 循环中出现延迟?

    CRC 对于我们的器件是可选的、因为某些用户不需要 crc。
    [/quote]
    [/quote][/quote]

    我知道"CRC"是可选的、但用处不大。 CRC 的目的是使用类似哈希的单个校验和检测数据块中的损坏。 此处的实现方式是、为每个数据字节发送一个 CRC 字节、使总线上的必要带宽加倍、这与每字节发送两次相比没有什么用处。 而是可以通过一个正确实现的单个 CRC 字节来实现。

    此致
    Nico

    [/quote][/quote][/quote]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Nico、

    器件根本不响应任何命令、它在 MCU 发送地址后不使用 ACK 进行响应。 我尝试发送时钟脉冲、9个甚至更多、没有任何效果。[/报价]

    BQ769x2系列常见问题解答中的 I2C 器件地址是多少 、这可能会有所帮助。

    是否无法检查 write-subcommand 是否已完成执行?

    等待时间是最简单的方法。 描述了另一种子命令方法 第3.1节直接命令和子命令 技术参考手册 的说明、该说明检查子命令是否已完成操作。 您可以继续读取0x3E/0x3F、直到它返回最初写入的内容或包含重试方案。  

    本 软件开发指南 也可能有用。

    但是子命令 0x0084在至少1秒内只返回0xff

    写入子命令 0x0084  CB_SET_LVL()不需要延迟、因为没有任何数据要获取。 仅在读取以获取数据时才应需要时序/延迟。

    您是否遵循子命令并使用校验和/长度写入0x60/0x61、以及在 CONFIG_UPDATE 模式下执行此操作?  第3节读取和写入 RAM 寄存器  软件开发指南中的 解释更加详细。  

    CRC 的目的是使用单个类似哈希的校验和检测数据块中的损坏

    使用某些命令可以进行块读取、而不是读取每个单独的字节。 电压测量命令按升序排列、因此您可以使用直接命令从 Cell 1电压(0x14)开始进行读取、并从该命令读取32个字节来读取全部16个电芯电压(如果只想具有这些值)。

    使用更少的命令读取所有电芯电压测量值的另一个示例/方法是使用 TRM 中简要介绍的块子命令。 第4.4节后面的各节提供了有关该节的更多详细信息。

    此致、
    Alexis

    [/quote]