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.

[参考译文] BQ27421EVM-G1A:BQ27421EVM-G1A。 数据闪存校验和错误?

Guru**** 2546670 points
Other Parts Discussed in Thread: BQ27421-G1

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/743856/bq27421evm-g1a-bq27421evm-g1a-data-flash-checksum-error

器件型号:BQ27421EVM-G1A
主题中讨论的其他器件:BQ27421-G1

验证我的校验和时遇到问题。 首先、我想说、根据使用的基准、执行校验和计算似乎有四种不同的方法。 到目前为止、我参考了以下文档并对每种方法执行了错误测试、但我被一个总体问题所阻止(校验和寄存器读取为零、除非我连续读取两次、在这种情况下我得到0xAC)。

所有这些都同意、您需要独立计算校验和、然后将其写入校验和寄存器、然后再将块存储器数据推送到 ROM (我认为)。 但是、第一个参考似乎认为这个计算可以独立于之前的校验和寄存器值。 根据第一个参考、您可以简单地将块数据地址、写入的数据字节相加、反转和并将其写入寄存器。 我已经尝试过这种方法、但它不起作用。 这样我就可以尝试其他方法,这些方法包括获取先前的校验和寄存器值,将其反转,有时减去旧的数据字节值,然后对结果执行 mod(),然后... 等等。 另一种方法不涉及除法或余数。 它只是要求您反转旧的校验和寄存器值、减去旧的数据值字节、添加新的数据值字节、再次反转该数字、并将 LSB 写入校验和寄存器。  

我将尝试这两种方法、但正如我所说的、我的校验和寄存器始终读为零、除非我连续两次读取(而一行两次并不意味着在同一 I2C 命令中读取两个数据库、 我的意思是在最后一个完成后立即对同一个寄存器执行 I2C 写入命令)、在这种情况下、我第二次获得0xAC。 根据我的理解、我应该期望接近0xE8的值、因为这是您对-G1B 的预期值。

还有人遇到过这种情况吗? 我可以确认我写入数据的速度不会太快或数据丢失、因为我的循环会根据我的监听器读取数据并正确发送数百次数据。

我还可以确认我的0x06标志为我提供了10011000、所以我在 CFGUPMODE 中、检测到电池、并且设置了 OCVTAKEN。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们将对此进行研究、并将很快返回给您-最迟在明天
    谢谢
    Onyx
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    写入校验和会触发一个块从临时32字节块缓冲区(从地址0x40开始)到实际内部数据存储器位置的传输。

    量表仅在校验和正确的情况下才会执行此转移。 监测计始终在内部计算整个32字节块的校验和、因此从驱动器的角度来看、最简单的方法是将 从地址 0x40开始的整个块读取 到32字节缓冲器、  将  该缓冲区中的数据替换为要更改的参数、将整个块写回0x40+、然后通过将 该缓冲区中的每个字节相加来计算校验和、 用0xFF 将其屏蔽并从0xFF 中减去。 然后将该数字写入 0x60、这将触发内部 日期传输过程。

    另一种更"复杂"的方法仅将先前的校验和与新旧数据一起用于要更改的参数、以计算新的校验和。 最终结果与您为整个32字节块计算的校验和完全相同。

     中有示例代码

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

    我已经听过您的建议、并尝试将32字节的编辑参数写回地址0x40、但我在32的第四个字节上遇到问题。 我感觉这可能是因为我读取了所有数据并立即尝试写回它、而不是先发送0x61、0x00、然后发送0x3E、0x52、然后发送0x3F、0x00…… 但是、有几个参考文献表明这是不必要的。 我将检查我的代码并查找错误。 如果您认识到在第四个字节上被 NACK 的问题、请告诉我。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    以下是一个已确认的工作示例(我今天自己测试了该示例):

    将 bq27421G1A 的设计容量设置为2000mAh (以下两 位寄存器和地址均为十六进制):

    1、复位(默认值)

    2、SET_CFGUPDATE:将13 00写入寄存器00和01

    3.选择类别"状态"、块#0:向寄存器3E 和3F 写入52 00

    4.读取块:从寄存器40+读取32 (十进制)字节:40 00 00 00 81 0E DB 0E A8 05 3C 13 60 05 3C 0C 80 00 C8 00 32 00 14 03 E8 01 00 64 10 04 00
       05 3C = 1340mAh。 这将更改为07 D0 = 2000mAh

    5.选择类别"状态"、块#0:向寄存器3E 和3F 写入52 00

    6.写入块:向寄存器40+写入32 (十进制)字节:40 00 00 00 81 0E DB 0E A8 07 D0 13 60 05 3C 0C 80 00 C8 00 32 00 14 03 E8 01 00 64 10 04 00

    7。计算校验和:将步骤6中的所有32 (十进制)字节相加:= 0x06E9。 校验和= 0xFF -(0x06E9 & 0x00FF)= 0xFF - 0xE9 = 0x16

    8.将校验和写入寄存器60

    9.选择类别"状态"、块#0:向寄存器3E 和3F 写入52 00

    10.从寄存器60中读取校验和。 这必须(并且将)返回16

    11。问题 SOFT_RESET:将42 00写入寄存器00和01

    12.完成了!

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

    Dominik、

    我的读取内容与您的读取内容非常相似、但您显示的是正在读取的31个字节而不是32个字节。 我的第32个字节是0xAC (与我尝试连续读取校验和寄存器两次时获得的结果非常相似)。

    0x40是否是校验和的一部分?  根据我的理解、您写入0x40、然后读取接下来的31个字节。 然后、您应该在校验和中将0x40作为字节1吗?

    此外、当我尝试一次写入超过4个字节时、我会继续被 NACK。 我认为 这可能与 我以~115kHz 而不是100kHz 的频率运行相关、但我在占空比中添加了一些上/下时钟周期、我仍然遇到这个问题。   

    我刚尝试在开始时校验0x40、在结束时将0xAC 留空 这不奏效。  我 还尝试只对我想要编辑的寄存 器进行写入、这样我就不必一次写入超过三个字节。  这也不起作用。 这可能不起作用的一个原因是我这样做了

    WR 0x3E、0x52

    WR 0x3F、0x00

    WR 0x4A、字节1、字节2 (我在此处被封装)

    WR 0x4C、字节1、字节2 (在此处获取)

    WR 0x50、字节1、字节2 (在此处采集)

    WR 0x5B、字节1、字节2 (在此处确认)

    目前我最主要的怀疑是我不正确地写回数据。 有关增量写入命令的内容必须是错误的、因为它会使我的第四个字节变小。

    以下问题是否有问题?

    读取32个字节、

    WR 0x3E、0x52

    WR 0x3F、0x00

    WR 0x40、0x00、0x00、0x00、0x00、(我在这里被 NACK) 0x81...等等

    再次感谢!  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    另外、请记住、我早就放弃了查看校验和寄存器。 我刚才计算了我的旧校验和以查看它应该是什么、如果我在校验和中包含0x40而不进行反转、它应该是0x53。 它不是给我这个值、而是始终为我提供零值。

    (我不是检查我的校验和是否相等、而是一直将我想要更改的变量存储到静态变量中、然后更改它们、然后比较旧值和新值。 如果它们不相等、我重复一下。 在重复尝试时、变量应相等。)

    有人能解释为什么我的校验和寄存器只提供0吗?

    谢谢!