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.

[参考译文] BQ35100:未进入 UNSEALED 模式

Guru**** 2391025 points


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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1461446/bq35100-not-getting-unsealed-mode

器件型号:BQ35100

工具与软件:

*我编辑是因为我在代码中发现了一个错误,但仍然无法工作。*

您好!

我正在对电量监测计进行编程、并且通过访问 UNSEALED 模式进入校准模式。 不过、当我读取 CONTROL_STATUS 寄存器(通过发送{0x00、0x01、0x00、0x00})时、我始终得到0x0000。 我是这样做的:

以下是启用校准模式的函数:  

void gau_enable_calib(void)
{
uint8_t u8OperationConfALowW[2];
uint8_t u8OperationConfAHighW[2];
uint8_t u8AccumW[2];
// uint8_t u8OpConfAR;
uint8_t u8AccMode = 0xA5;
uint8_t u8LenW[2];
uint8_t u8ChecksumW[2];
uint8_t u8GauStartW[3];
uint8_t u8EnableCalW[3];

bool boolStatusAccumW = false;
bool boolStatusEnableCal = false;
bool boolStatusGauStartW = false;

/*Enable DF write*/
gau_flash_write_enable();

/*Manufacturer access control Operation Config A decomposition addresses*/
gau_MAC_decomp(u8OperationConfALowW, u8OperationConfAHighW, u16OperationConfigA);

/*Gauge start address decomposition*/
gau_address_decomp(u8GauStartW, u16GauStart);

/*Enable calibration address decomposition*/
gau_address_decomp(u8EnableCalW, u16EnableCal);

/*Access Operation Config A in little endian format*/
gau_flash_access(u8OperationConfALowW, u8OperationConfAHighW);

/*MAC data to change to ACCUMULATOR mode*/
u8AccumW[0] = 0x40;
u8AccumW[1] = u8AccMode;

/*Change to ACCUMULATOR mode*/
boolStatusAccumW = SERCOM4_I2C_Write(u8GaugeAddrW, u8AccumW, sizeof(u8AccumW));
while(SERCOM4_I2C_IsBusy());

uint8_t u8Checksum = ~(u8OperationConfALowW[1] + u8OperationConfAHighW[1] + u8AccMode) & 0xFF;

/*Write Operation Config A checksum*/
gau_checksum_get_write(u8Checksum, u8ChecksumW);

/*Write Operation Config A length*/
gau_length_get_write(u8LenW, u8OperationConfALowW[1], u8OperationConfAHighW[1], u8AccMode, u8Checksum, 0, 0, 0);

/*Enable calibration*/
boolStatusEnableCal = SERCOM4_I2C_Write(u8GaugeAddrW, u8EnableCalW, sizeof(u8EnableCalW));
while (SERCOM4_I2C_IsBusy());

/*Gauge enable (PA18 in final product and demo) HIGH*/
PORT_PinSet(PORT_PIN_PA18);
boolStatusGauStartW = SERCOM4_I2C_Write(u8GaugeAddrW, u8GauStartW, sizeof(u8GauStartW));
while(SERCOM4_I2C_IsBusy());
}

我尝试访问 UNSEALED 模式的函数是这样的:

void gau_flash_write_enable(void)
{
uint8_t u8Unsealed1W[3];
uint8_t u8Unsealed2W[3];
uint8_t u8BlockDataW[2];

bool boolStatusUnsealed1W = false;
bool boolStatusUnsealed2W = false;
bool boolStatusBlockDataW = false;

/*Control and UNSEALED mode step 1 decomposition addresses*/
gau_MAC_decomp(u8Unsealed1LowW, u8Unsealed1HighW, u16UnsealedMode1);

/*Control and UNSEALED mode step 2 decomposition addresses*/
gau_MAC_decomp(u8Unsealed2LowW, u8Unsealed2HighW, u16UnsealedMode2);

/*Block Data control addresses*/
u8BlockDataW[0] = BLK_DATA_CTRL;
u8BlockDataW[1] = 0x00;

/*Enter UNSEALED mode*/
gau_flash_access(u8Unsealed1LowW, u8Unsealed1HighW);
gau_flash_access(u8Unsealed2LowW, u8Unsealed2HighW);

/*Enable writing in DF*/
boolStatusBlockDataW = SERCOM4_I2C_Write(u8GaugeAddrW, &u8BlockDataW[0], sizeof(u8BlockDataW));
while(SERCOM4_I2C_IsBusy());

}

Gau_MAC_decomp ()函数用于解封步骤1/2中的值0x0414和0x3672并通过0x3E 和0x3F 以小端字节序发送该值。 顺便说一下、FullUnseal 步骤1/2的目的是什么?  

卡洛斯

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

    尊敬的 Carlos:

    当器件处于 SEALED 模式时、有某些 CMD 可用、在 UNSEAL 模式下有更多 CMD、而所有 CMD 在 UNSEAL FULL ACCESS 模式下可用。

    是否在任何时候更改了解封密钥?

    此致、

    Diego

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

    尊敬的 Diego:

    您是说我是否已从存储器中对其进行了覆盖? 如果是、答案是否、因为  上面直接声明了 u16UnsealedMode1和 u16UnsealedMode2值、所以我不按地址访问、因此它们是"0x0414"和"0x3672"。

    事实是、有一次、我在这些变量中错误地显式传递地址、而不是默认值。 但这可能是一个问题吗?

    我在每次 gau_flash_access ()调用后增加了5毫秒的延迟,如果这样做有帮助的话。 此外,我 在启用 BlockDataControl ()的 DF 写入后,验证了函数 gau_flash_write_enable ()内的 CONTROL_STATUS 寄存器。 我得到的是0x0000 (不是\NUL \NUL)、这正是我遇到的问题;我想这个值应该不同于0x0000 (对于 UNSEALED 模式、位14中至少有1)。

    我应该期望值是大端字节序还是小端字节序? 技术参考手册(sluubh1c.pdf)未指定它。 命令 Voltage()、StateOffHealth()和所有这些都是相同的。

    谢谢。

    此致、

    卡洛斯

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

    卡洛斯、您好!

    从电量监测计返回的数据将采用小端字节序格式。  

    事实是、有一次、我误认为是显式传递地址、而不是那些变量中的默认值。 但这可能是个问题吗?

    是的、这可能已经更改了密钥。

    此致、

    Adrian

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

    尊敬的 Adrian:

    它崩溃了吗? 现在、它对电量监测计来说是无用的? 我的意思是,我没有重写解封密钥,我把地址作为 BlockDataControl()的值而不是默认值,就像我写入任何其他值而不是正确的值。 此处:  

    谢谢。

    此致、

    卡洛斯

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

    卡洛斯、您好!

    您是否能够在一个新单元上测试您的代码的功能?

    此致、

    Adrian

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

    您好、Adrian、

    到目前为止、我无法在新的单元中对其进行测试。 我尝试从 SLUUBH1C 文档中获取 TI 的反馈、因为有很多方面让人困惑。 我仍然不知道要发送什么来读取 CONTROL_STATUS 寄存器。 我还在读取它之前尝试了复位和 GAUGE_START、但我得到0x0000、这没有意义。

    然后、如下图所示、我将 BlockDataControl ()发送为0x62 0x00、然后以小端字节序模式访问 UNSEALED 模式。

    之后、我再次读取 CONTROL_STATUS 寄存器、并且如前所述、它提供的值为0x0000。 为什么我不对该注册进行任何更改? 由于技术参考手册很容易解释,我尝试了不同的东西,但我总是读相同的。  

    如果您能看一下屏幕截图、将会非常有帮助。  

    请注意、我为我的 PCB 提供的是 Nordic 的功率分析器套件 II、而不是真正的电池。 这是写入/读取问题吗?

    谢谢。

    卡洛斯