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.

[参考译文] BQ28Z620:无法对数据闪存进行编程以进行配置

Guru**** 2529870 points
Other Parts Discussed in Thread: BQ28Z620, BQSTUDIO

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1334661/bq28z620-unable-to-program-data-flash-for-configuration

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

我正在尝试在定制 PCB 上配置 BQ28Z620器件... 尽管该 原理图 与器件 TRM 和评估模块的原理图大致相同。
通过 I2C 从 RPi 计算模块4连接。  
代码是用 Python 3编写的。

我能够读取所有寄存器并对其进行检测、因此可以收集电池电压/电流/温度等参数。 这一切似乎都能按预期工作。

我遇到的问题是写入数据闪存以便我按用途配置器件...

我可以按照《技术参考手册》中给出的默认值读回 DF 和值。
但是、到目前为止、对 DF 写入的所有尝试都未能更改其中存储的数据。

我尝试了各种方法、包括完全按照 TRM 中的说明进行编写。 寄存器0x3E +块[起始地址+数据]~小端字节序。
我还尝试了计算校验和以及长度并将其写入寄存器0x60 0x61的适当位置
还尝试在单个 I2C 事务中写入所有地址/数据/csum/length。
不同的电路板、均为未使用状态、显示出完全相同的行为。

没有任何变化、当我读回时、DF 数据仍保持为默认值。
[供参考-我正在读取控制状态寄存器中的0x0204和操作状态寄存器中的0x6100 ]-似乎有多个 SEC 位,如 TRM 中所示,这些位都不同????

默认情况下,我的电池与输出端子断开连接..... 我有一个充电电路、但它也与电池断开。
似乎 CHG-FET 已导通、但 DSG-FET 仍被禁用。
我认为这是因为配置设置还不正确。

问题--写闪存时我缺少什么?  
在这种情况下,Flash 存储器是否可以进行写保护?如何禁用?

如果合适、欢迎分享任何代码和原理图!

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

    Steve、您好!  

    您能否向我提供您的原理图以及您写入电量监测计以尝试更改 DF 的命令示例? 我怀疑您如何尝试写入 DF 存在问题、因为您会在多个器件上看到这种行为。  

    此致、  

    Jonny.  

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

    您好、Jonny。
    我回复了原始邮件、但电子邮件已退回、因此我想您没有收到。
    您能否提供另一个电子邮件地址、因为我不确定在此处发布原理图和代码是否合适。

    不过、我最初尝试更新数据闪存的尝试遵循 TRM 中的建议。
    [在寄存器0x3E 处、发送 DF 地址、后跟小端字节序格式的数据]
    代码如下所示...

    DEF WRITE_FLASH (addr、data):
      WR_DATA =[(addr & 0x00FF)、(addr >> 8)]
      WR_DATA[2]= DATA
      使用 SMBus (1)作为总线:
        bus.write_i2c_block_data (i2Caddr、regAddr、wr_data)

    [已定义: 2Caddr = 0x55 // regAddr = 0x3E]

    这不起作用,所以我更改了函数,同时计算 csum 和数据长度... 这些值随后写入寄存器0x60/61
    最后一次尝试是在单个 I2C 事务中始终写入完整的数据块[32字节]+ checkSoM +大小。

    仍然不工作!!

    DEF MAC_WRITE_DATA (addr、DATA):
       大小= len (data)
       如果大小> 32:
         print ("数据大小必须为32字节或更少")
         返回
       OData =[0]* 37
       #填充数据缓冲区
       OData [1]= addr & 0x00FF
       OData [2]= addr >> 8
       对于枚举(data)中的 c、d:
         OData [c+3]= d
       #计算校验和
       CSUM =大小
       对于 OData 中的 d:
         CSUM +=d
       OData [35]=(~csum & 0x000000FF)
       OData[36]=大小
       #将命令寄存器地址添加到缓冲区的前面
       OData [0]= 0x3E

       Print ("闪存数据 WR:"、END="")
       Print_list (OData)

    #需要克服 smbus 限制32字节最大数据长度
       使用 SMBus (1)作为总线:
         msg1 = i2c_msg.write (i2Caddr、OData[:32])
         msg2 = i2c_msg.write (i2Caddr、OData[32:])
         bus.i2c_rdwr (msg1、msg2)

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

    请注意、在上面的代码中、数据是按两个块写入的、因为 smbus 理论上最大数据大小为32字节。 [I2C 不过是- smbus 是常用的 python 库]
    我还尝试将 msg1设置为使用完整的 OData 缓冲区大小、并将其写入一个简单的事务。
    根据我的逻辑分析仪、总线上的数据没有区别、并且在两种情况下、所有数据都是单次传输的、没有重复的停止/启动位等。

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

    Steve、您好!  

    请向我发送朋友请求、以便您可以通过直接发送消息分享原理图。  

    此致、  

    Jonny.  

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

    所以 Jonny。 我链接到你的朋友的请求,然后发送链接到 schemartic 和代码。
    没听到你的声音...
    现在问题显示为已解决,但它肯定不是?????

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

    Steve、您好!  

    我已查看您的原理图、并注意到您在 SDA 和 SCL 线路上使用100k Ω 上拉电阻器、这些上拉至5V 电源。 这不是典型情况、我们通常会看到使用10k Ω 上拉电阻器并上拉至3.3V 稳定源。 如果您尝试正确写入 DF、这种差异可能会导致出现问题。 为了确保您正确写入 DF、我建议参考此 E2E 主题、 因为我认为它对本例很有帮助。  

    此致、  

    Jonny.  

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

    你好,Jonny
    这些100k 上拉电阻不适合我工作的电路板--我已正确配置 I2C,有5k1上拉电阻至3.3V 上拉电阻。
    我已经说明了、从 I2C 回读的操作正常、因此不要怀疑总线上有任何函数。

    {仅供参考、这些额外上拉电阻的用途是因为我们针对此电路板有一个没有可用 MCU 的应用。 我们的想法是、我们会在生产中对电池管理器进行编程、然后电路板应该自主运行。 我不确定是否存在让 I2C 总线悬空的问题,因此为电阻器添加了一个位置,以便将信号切断。}  

    在我看来、问题仍然在软件中、虽然我看不出自己做错了什么...我将尝试在 C 中构建代码、这让我能够更好地控制 I2C 总线... 但我从来没有过一个问题提出新的 项目与 python 代码,它是更快的方式来尝试东西!

    这个问题未能解决...... 为什么线程被标记为"完成"???

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

    Steve、您好!  

    {FYI 这些额外的上拉电阻的目的是因为我们针对此电路板有一个应用程序,其中没有可用的 MCU。 我们的想法是、我们会在生产中对电池管理器进行编程、然后电路板应该自主运行。 我不确定是否存在让 I2C 总线悬空的问题,因此为电阻器添加了一个位置,以便将信号切断。}  [/报价]

    感谢您的讲解。  

    关于您的第二条意见、您可以参考 监测计通信 文档、因为我认为它在这里可能会有所帮助。  

    此致、  

    Jonny.  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉、是一个持续性的麻烦。
    我最终通过切换到不同的 python I2C 库来使 I2C 通信正确运行。
    现在、我能够正确读取和写入数据闪存、并且已验证这些更改是否在电源完全关断期间保持不变。

    不幸的是,虽然我仍然被困在……

    似乎无论我做什么、电池组都与输出端子和充电器相隔离。
    读回 I2C 数据显示电池组的电压[8.2V]正确、但电流为零。
    看看两个 FET……
    未施加充电器电压时、放电 FET (在我的原理图中为 QF1)在栅极和源极上均具有0V 电压。
    当充电器通电时、G 和 S 上的电压都为8.2V、  
    我认为在这两种情况下、该 FET 都关闭。
    当充电器打开/关闭时、充电 FET [QF2]不变。 栅极上4.1V 拉电流上8.1 ~ 8.2V。
    两个 FET 的漏极电压始终约为8.1V。


    注意:我运行时使用的是两节串联的18650电池。
    我目前安装了几乎充满电的电池,大约100mA 虚拟负载[仅在外部电源和充电器运行时供电]

    我按照数据表中的详细设置信息进行了操作、并尝试将值放入各种寄存器中、包括尝试手动将两个 FET 的状态设置为 ON、但到目前为止、我没有找到任何以任何方式改变电路行为的东西。
    很明显我做了一些根本错误的事情,但现在我完全失去了。
    感谢任何帮助或建议。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Steve、您好!  

    我很高兴听到 您设法使 I2C 通信正常运行。 对于 FET、是否设置了 FET_EN 位?

    此致、  

    Jonny.  

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

    如果我使用 MacSubCmd 读取寄存器0x0057上的生产状态、值是0x0000、显然 FET 没有启用。
    {如果我设置校准模式、那么此寄存器的位15会变为高电平、因此我非常确信这是正确的寄存器和数据]。

    下一个问题是、如何设置 FET_EN 位(大概我还需要启用监测和数据收集–在同一个位置???????]

    在 TRM [SLUUC09-DEC 2022]第15.3.6节中、数据闪存中有一个"Manufacturing Status"寄存器-默认 设置为0x0000、因此我需要更改此设置。
    不过,这个寄存器的地址并不清楚...... 在 DF 表中、地址0x43C0处有一个"Mfg Status Init"值、但我找不到"制造商状态"的精确匹配值。。。 更改0x43C0处的值没有任何效果[这是一个奇怪的地址、距离大多数其他设置的地址范围有很长的距离]。

    我还尝试了使用 MACsubCommand 来启用和禁用 FET [例如在寄存器0x0022处] 、但这会导致 I2C 总线上出现总线错误。
    其他子命令使用相同的软件函数工作正常、因此我还不知道这一点。 进行调试。

    因此仍然不知道=如何更改 FET_EN 值并使该部件能够执行一些有用的操作?!?

    不得不说,这部分的文件是可怕的。 描述很晦涩、有许多错误和误区。
    请帮助我提供多个行答案。


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

    Steve、您好!  

    要设置 FET_EN 位、您可以将0x22写入起始寄存器0x00和 I2C 地址0xAA。 我已使用 EVM 和 bqStudio 进行过这方面的尝试以进行确认。 请查看下图。  

    此致、  

    Jonny.