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.

[参考译文] BQ27426:OPConfig 寄存器读取和写入不起作用

Guru**** 2540720 points
Other Parts Discussed in Thread: BQ27426, BQSTUDIO

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/922880/bq27426-opconfig-register-read-and-write-not-working

器件型号:BQ27426
主题中讨论的其他器件: BQSTUDIO

您好!  

我正在尝试禁用 BQ27426芯片上的"电池插入启用"。  

我已经按照技术参考指南(SLUUBB0 - 2015年12月)编写了扩展数据闪存寄存器。 我直接通过 I2C 从 MCU 连接芯片、而不是通过 BQStudio 软件连接。 我的方法如下:

  1. 解开设备的密封圈  
  2. 查询状态寄存器中的密封位以检查它是否已被清零
  3. 进入配置更新模式
  4. 查询标志寄存器中的 CFGMODE 位以检查其是否已置位。
  5. 启用块存储器控制
    1. (将0x00写入 BlockDataControl()命令寄存器  
  6. 将子类 ID 偏移设置为64以访问存储 OpConfig  OpConfigB OpConfigC OpConfigD 的(类)配置(子类)寄存器
    1. 将0x40写入 DataBlockClass()寄存器
  7. 将寄存器读入32字节长的数组
    1. 注意:在这个阶段、我不能正确读取第一个字节的复位默认值。 本参考指南说明了 OPConfig 的默认值为0x6578、其中我读取了0x0078。 我还将 OpConfig B C 和 D 的默认值读取为与参考手册中引用的值相同。
  8. 将新值写入读取数组的前两个字节、以更改 OpConfigCalculate 的新校验和位(与应用示例中所述的相同过程)
    1. 注意:我未能成功写入高字节并读回写入的相同值。 我能够写入低字节并读回写入的值。 我只想清除 OpConfig 高字节中的 BIE 位。 根据参考手册中的默认值、我计算出我需要将0x44写回高字节。
  9. 将新校验和写入 BlockDataChecksum ()寄存器- 注意:这是成功的,我没有收到 NACT 返回
  10. 通过发送软复位命令退出 CFG 更新。

按照相同的过程、我能够访问状态子类中的字节并重写它们。 我无法对 OpConfig 寄存器执行相同的操作。 我也无法复位器件并读回 OpConfig 高字节的参考手册值、但我可以读回寄存器子类中的所有其他字节。

我已经尝试在命令之间添加计时延迟、但没有成功的结果。

我是否缺少写入 OpConfig 寄存器的先决条件? 在为该芯片配置 OpConfig 寄存器的文档中、我找不到许多示例或参考。

谢谢、

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

    您好、Michael、

    看起来可能存在一些偏移误差、您会得到部分默认值0x6578、并且只能写入和读取寄存器的一半。 检查以确保您要读取的起始位置正确。

    我会参考 TRM 和应用手册 slua801中的示例。

    slua801: https://www.ti.com/lit/an/slua801/slua801.pdf?ts=1594760885169&ref_url=https%253A%252F%252Fwww.ti.com%252Fproduct%252FBQ27426

    此致、

    Wyatt Keller

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

    您好!

    感谢您的快速响应。

    偏移位置:

    抱歉、在我之前的帖子中、我未包含设置块偏移位置的步骤(数据存储器参数更新示例应用示例示例的步骤6)。

    上述内容应为:

    (笑声)

    5.启用块存储器控制
    a.(将0x00写入 BlockDataControl()命令寄存器)

    6.将子类 ID 偏移量设置为64以访问存储 OpConfig OpConfigB OpConfigC OpConfigD 的(类)配置(子类)寄存器
    a.将0x40写入 DataBlockClass()寄存器

    7.使用 DataBlock()命令(0x3F)写入块偏移位置注意:要访问偏移量0至31处的数据,请使用偏移量0x00。 若要访问偏移量32至41的数据、请使用偏移量0x01。
    答:在这里、我将0x00写入0x40、因为数据子类小于32字节、我只对字节0和1感兴趣。

    将寄存器读入32字节长的数组  

    我注意到、现在我在读取 ID 64上的状态子类时遇到了相同的问题。 我再次不读取子类82引用的默认第一个字节值、但缓冲区中的其他31个字节与参考默认值对齐。

    我还尝试使用与 slua801 P6中引用的示例相同的过程。 我同样遇到了不使用 gauch_read_data_class()将第一个字节读取到字节缓冲区的问题。 我的流程如下:

    1.在量表 TRM 中找到参数。 对于子类"寄存器"、这是 ID 64或0x40。

    2.使用测量仪表数据存储器访问函数 gauch_read_data_class()将此参数的子类数据复制到本地字节缓冲区中。

    在这里、我使用 gauge 读取数据类(NULL、0x40、pData、32)将32个字节写入名为 pData 的缓冲区。 这将不返回 nack 并填充字节缓冲区。  

    0索引字节读取0x78、索引1读取0x0F、索引2读取0x9f 等、就好像它刚刚由于偏移误差而错过了第一个字节一样。

    然后、我可以更改缓冲区中的值并成功地写回校验和、而没有 NACT 响应、这会导致我认为我只是没有读取我尝试的正确字节对齐。  

    我看不到字节对齐在这两个过程中的哪一个发生了错误。

    过程1 (遵循技术参考文档 SLUUBB0 - 2015年12月中的数据存储器参数更新示例)

    • 使用 DataBlock()命令手动写入块偏移位置

    流程2 (遵循 Gaugage 通信 SLUA801中的示例- 2017年1月)

    • 使用 gauch_read_data_class()读取数据到一个字节 c黄 油。

    在使用 gauch_read_data_class ()的过程2中(第11页)有一个名为 nOffset = 0的无符号整数变量、未使用。 应该是吗? 我只能想象在读取数据类的第二个32字节块时需要使用它-在这里读取字节0不是一个问题。

    谢谢、

    Michael

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

    您好、Michael、

    我们将在论坛之外与您讨论此问题。

    此致、

    Wyatt Keller

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

    对于正确的读取序列、块中的第一个字节没有任何独特之处。

    但是、块中的第一个字节从0x40开始、就在数据块寄存器0x3F 之后。 如果您从0x40读回0x00、很可能是读取序列之前的 I2C 写入序列将0x00写入0x40、这就是您读回的内容。

    对于调试、请使用示波器(或更好的是 I2C 分析仪)检查 SCL 和 SDA、以了解总线上的内容。

    若要读取 OpConfig、最小序列(假设监测计处于非密封状态(默认))为:

    将0x40写入 I2C 寄存器0x3E
    将0x00写入 I2C 寄存器0x3F

    从 I2C 寄存器0x40开始读取32个字节。

    您可以使用 bqStudio 中已知工作正常的 I2C 接口来尝试此操作:

    *禁用自动刷新(只需单击仪表板中的绿色自动刷新行(bqStudio 的右上角))。 它应该变为红色。
    *切换到"高级通信"
    * I2C 地址(十六进制)= AA
    *起始寄存器(十六进制)= 3E
    *要写入的字节(十六进制)= 40 00
    *单击 Write
    *起始寄存器(十六进制)= 40
    *要读取的字节数(十进制)= 32
    *单击"读取"

    这将为您提供事务日志中的寄存器数据类块0。 OpConfig 不会以零第一个字节回读(除非这确实是 OpConfig 的值)。