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.

[参考译文] BQ20Z90:通过 SMBus 将 DFI 数据刷写到电量监测计

Guru**** 2510395 points
Other Parts Discussed in Thread: BQ29330, BQSTUDIO

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1104425/bq20z90-flashing-dfi-data-over-smbus-to-fuel-gauge

器件型号:BQ20Z90
主题中讨论的其他器件: bq29330BQSTUDIO

您好、TI、

我们正在为最终产品使用 BQ20Z90+bq29330、其中需要两个热敏电阻电压输入来从位于不同位置的两个电池组读取温度。

现在、我们需要从主机设备将 DFI 映像刷写到 BQ20Z90、在本例中是运行 Linux 内核4.19的处理器。

因此、我们正在寻找 C 源实现方案、我们仅找到了用于读取和写入 Dataflash 的 VB6代码。

现在、通过遵循文档"SLUA379E"、我们可以使我们的逻辑用于读取、但不确定它是否正确。

我们发现人们在使用 VB6代码编写 DFI 文件时面临损坏电量监测计的问题。

因此、我们首先尝试读取闪存、然后尝试写入 DataFlash。

由于我们只尝试使用以下逻辑读取 BQ20Z90、BQ20Z90 FG 损坏、我们只获得0x0B 的从器件地址

希望我们能够通过"TI bq 电量监测计评估软件"恢复 BQ20Z90

这是我们 使用的逻辑。

在内核模块中使用以下代码、因为通过对 smbus 器件使用 userspace 应用程序、它在非密封和完全访问模式下也没有响应。

有 ROM 命令0x09和0xC0被使用、有没有任何文档可以获得 ROM 命令的详细信息。它看起来就像一个魔法数字、没有任何详细信息。

===================================================================================================

char * gauch_flash_read (void * pHandle、char * pfs)

tI2C * tmpHandle =(tI2C *) pHandle;
Int iNumberOfRows;
long lError;
Int iRow;
Int iIndex;
int iLen=32;
//int iFileNumber;
unsigned char yRowData[32]={0};
unsigned char yDataFlashImage[0x700]={0};

//为清晰起见,不使用常量
// 0x700是数据闪存大小。
iNumberOfRows = 0x700/32;

//将器件置于 ROM 模式
// lError = WriteSMBusInteger (0x0、0xF00);
lError = gauge _cmd_write (pHandle、0x00、BootROM);
udelay (90);
// DoDelay (0.01);


//逐行读取数据闪存
  对于(iRow = 0;iRow <= iNumberOfRows - 1;iRow++)
  {
     //设置行的地址。 H9 (0x09)是 ROM 模式命令。
     // 0x200是数据闪存开始的行号。
     //乘以32得到每行开始的实际物理地址
     // lError = WriteSMBusInteger (0x9、(0x200 + iRow)* 32);
     lError = gauge _cmd_write (tmpHandle、0x09、(0x200 + iRow)* 32);
     udelay (90);
     //阅读行。 &HC (0x0c)是 ROM 模式命令。
     // lError = ReadSMBusByteArray (&H、yRowData、iLen);
     lError = gauge 读取(tmpHandle、0x0C、yRowData、iLen);
     udelay (90);


             //将此行复制到大字节数组中的位置
             对于(iIndex = 0;iIndex <= 32 - 1;iIndex++){
             yDataFlashImage[(iRow * 32)+ iIndex]= yRowData[iIndex];
             printk (Kern_alert "0x%02x、"、iIndex、yRowData[iIndex]);
    

////将数据闪存映像写入文件
// iFileNumber = FileSystem.FreeFile;
// Open(sFileName);// Put #iFileNumber ,, yDataFlashImage
//关闭();//执行电量监测计程序
// lError = WriteSMBusCommand (0x8);
// lError = gauge _cmd_write (pHandle、0x00、BootROM);
PFS = yDataFlashImage;
lError = gauge _control (tmpHandle、0x08);
//udelay (90);
返回 PFS;

export_symbol (gauge 闪存读取);

===========================================================================================================================================

谢谢

Girish

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

    Girish、您好!

    TI 提供 了 https://www.ti.com/tool/BQMTESTER 来对 DFI 映像(存储为 ROM 文件)进行编程。 我们无法查看代码、因为每个系统具有不同的实现方式、并且有太多变量会影响总线上的实际通信。

    我建议您执行 bq 评估软件 Pro screen 中的所有步骤。 在那里成功完成后、检查代码是否实现了完全相同的命令。

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

    您好 Shrish、

    感谢您的指导、是的、在使用 Pro 屏幕后、我有信心了解如何对数据闪存进行编程。

    现在,我处于一个非常罕见的情况,我不确定这一问题是否仍然存在,或者只有我面临这一问题。

    我实现相同的代码。

    我正在使用 SMBus 调用读取和写入数据。

    一切都正常、就像我可以写入 MAC 和读取2个字节一样、我有正确的值。

    但是、当我初始化 BootROM 模式以在解锁之后进行数据闪存时。

    从器件刚刚从 I2C 总线消失。 这意味着 SMBus 线路上没有显示从器件。

    因此、在将器件发送到 BootROM 模式后、器件消失、我无法刷写任何数据。

    要恢复 SMBus 上的 bq20z90从器件、我必须断开 PACK+和 PACK-的电源并将其连接、从而快速启动 EVM

    现在、除了在将 BootROM 命令0x0F00发送到 MAC 0x00后器件刚刚断开连接外、所有东西都在代码中实现

    您对此问题有什么看法。

    谢谢

    Girish

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

    Girish、您好!

    您可能会看到 bqStudio 的仪表板显示没有从器件。 这是预期的。 在使用高级通信时、应关闭仪表板刷新以防止干扰。

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

    您好 Shirish、

    我一侧已确认器件无法在引导 ROM 模式下引导。

    可能是在通过 Pro 屏幕进行测试期间、我只是意外地擦除了 Rom 代码。

    因此、在电量监测计模式下、器件始终在0x0B 地址处可见、当我尝试以引导 ROM 模式发送时、器件会断开连接。

    我使用 bqEval SW 和 i2c 命令进行了检查、在这两种情况下都是这样。

    那么、我是否有机会将.senc 文件刷写到 BQ 器件而不以 ROM 模式发送它?

    如果有任何文档对此有所帮助、请告知我。

    请看一下

    谢谢

    Girish

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

    Girish、您好!

    在引导 ROM 模式下可能不支持该命令。 尝试使用命令0x0D 读取字

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

    您好、Shirish、

    如您所建议

    我在 UI 上尝试过

    写入成功

    该读数0x0D 之后

    错误消息

    谢谢

    Girish

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

    Girish、您好!

    这不是正常现象。 它可能与您的电路有关。 您能否检查 bq20z90在没有响应时是否通电?

    我建议您尝试使用 bq20z90 EVM 来排除其他因素。