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.

[参考译文] BQ27441-G1:数据存储器与数据块读取不匹配

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/592924/bq27441-g1-data-memory-do-not-match-with-data-block-read

器件型号:BQ27441-G1

您好!

我将从零开始使用 BQ27441-G1、以便了解它并将其用于未来的电量监测。 我使用 PIC 作为 BQ 的主机来设计自己的电路板、并使用以100KHz 运行的 I2C 总线编写自己的代码。

可以读取所有基本变量(最大电流、av. 电流、电压、温度、SoC 等)、没有问题、 但是 、当我想计算块校验和时、读取的字节与 SLUUAC9A-December 2013-Rev 2015年5月上的表6-3:数据存储器摘要不匹配。

我是说、如表6.3 PAG 31中所示; 子类是状态、子类 ID 是82、我必须从数据块中读取的第一个值是默认的 Qmax Cell 0、16384 (0x4000)、然后是更新状态的单个字节(默认为0x00)、等等。

但是、当我执行数据块读取时、我只能从 Reserve Cap-mAh (偏移3)开始获取数据。 块中数据的第一个树字节丢失。

执行数据块读取时、我捕获了解码后的 I2C 总线的屏幕截图。 它被划分为三个具有相同读取周期的图像。

 如您所见、数据的前两个字节为0x00、而 不是默认值16384 (0x4000)。 第三个字节为0x81、它与负载选择/模式的预期默认值相匹配。 通过查看表6-3、我可以观察到前两个0x00字节可能是 Reserve Cap-mAh 的预期默认值整数。 那么、前三个字节在哪里?

由于数据块中的这种偏移、在读取结束时还增加了三个字节的数据。 这些额外的字节包括块(0xAC)的校验和

为了更新监测计参数、我遵循了 BQ27441-G1快速入门指南中提供的流程图。

我的汇总代码为:

1.-是 BQ 密封、然后解封。

2--是配置模式下的 BQ,然后进入配置模式

3.-写入 I2C (0x61、0x00)

4.-写入 I2C (0x3E、0x52)

5.-写入 I2C (0x3F、0x00)

之后、我的代码是:

chksum=0;
bytes=32;
I2C1_Start ();
res=I2C1_Putchar (BQ27441_adress <1);//写入命令
if (res=0){ //如果 res!=0->error,则退出。
RES=I2C1_Putchar (0x40); //块数据地址
if (res=0){
I2C_Stop ();
Delay10KTCYx (240);//延迟100ms
I2C1_Start ();
res=I2C1_Putchar (BQ27441_adress << 1|0x01);//读取
if (res=0){
while (bytes!=0) //读取周期
chksum=I2C1_Getchar ()+chksum;
I2C1_Ack ();
bytes--;
}
I2C_Stop ();
return 255-chksum;
}
else{
I2C_Stop();
return 0;
}
else
{
I2C_Stop();
return 0;
}

else{
I2C_Stop();
return 0;
}

你们能给这方面的建议吗?

提前感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的基本序列看起来是正确的。 我不确定您的实际代码。 我建议将 I2C 代码抽象为以下两个函数:

    int gauch_read (void *pHandle、unsigned char nRegister、unsigned char *pData、unsigned char nLength);
    int gauch_write (void *pHandle、unsigned char nRegister、unsigned char *pData、unsigned char nLength);

    如果您不想区分多个接口、pHandle 可以为 NULL。 这两个函数向测量仪表读取和写入"nLength "字节数。

    一旦这两个函数在您的 UC 上正常工作、您就可以 直接使用 www.ti.com/.../slua801.pdf 中的示例代码(复制粘贴)。

    如果由于您的 PIC 上的存储器限制、这是不可行的、那么您仍然可以使用本应用手册中的代码作为指导如何使用监测计正确实施块 IO 的指南。