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:如何在密封/非密封/完全访问模式之间切换?

Guru**** 2603085 points
Other Parts Discussed in Thread: BQ35100

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/759462/bq35100-how-to-switch-between-sealed-unsealed-full-access-modes

器件型号:BQ35100

您好!

我正在使用 BQ35100来获取电池电量。
我将 bq35100板上的 stm32l071集成。 我没有使用 BQ Studio 校准 bq35100
为了获得电池电量、我需要校准器件、为了进行校准、我必须在非密封模式下写入命令
这是我尝试的代码-(Ref - slua640b)

void enterCalibrationMode (void){
printf ("进入校准模式。\n");
SEND_子 命令(0x00、0x2D);//启用校准模式
SEND_子 命令(0x00、0x81);//输入校准模式
SEND_子 命令(0x00、0x00);
SEND_Command (0x00);
unsigned char buffer[2]={0x00、
0x10000 (
I2C);read _delay);}_cycles
执行{
printf ("%x\n"、buffer[1]);
printf ("测量仪表未处于校准模式。\n");
}while ((buffer[1]和0x10)!= 0x10);
printf ("测量仪表处于校准模式。\n");
} 

这些步骤总是返回"量表未处于校准模式"。

我不确定器件是否处于非密封模式。

所以、我想知道-
如何检查 BQ35100当前处于哪种模式、即密封/非密封/完全访问?
2.如何在不同模式之间切换? 是否有一些键可以在它们之间切换? 如果是、那么我如何获取它们?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当设置为01时、控制寄存器位 sec1、sec0表示监测计处于非密封模式。 如果您没有更改 df 上的任何内容、则默认的 unseal 密钥为0x0414 0x3672、默认的完全访问密钥为0xFFFF 0xFFFF、两个命令中的两个字节都发送回原来的位置。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Batt、

    感谢您的回答。 读取控制寄存器位 sec1、sec0返回01、表示监测计处于完全访问模式(根据参考手册)。 此外、INITCOMP 位被置位、表示初始化完成。

    但是、当我尝试写入寄存器时(根据我在上面的代码中提到的)、它始终显示错误、即即使我尝试写入 DF、监测计也不会确认、它也会显示相同的错误。 我尝试写入时长不同、但每次都有相同的错误。  

    此外、我应该在哪个寄存器中写入0xFFFF 0xFFFF?

    如果我 分别在0x41D0、0x41D2地址(完全解锁 Step1、完全解锁 Step2)上写入0xFFFF、0xFFFF、则会显示错误。  

    因此、基本上我无法写入。 请帮助解决这些问题。

    此致、

    Sakshi

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

    您好、Batt、  

    感谢你的答复。

    已尝试写入此内容...

    HAL_I2C_Mem_Write (&hi2c2、0xAA、0x00、I2C_MEMADD_SIZE、(uint8_t *)键、 4、200); //键[2]={0x0414、0x3672}

    不起作用。

    然后尝试写入..

    HAL_I2C_Mem_Write (&hi2c2、0xAA、0x00、I2C_MEMADD_SIZE _16BIT、(uint8_t *) key1、 2、200);//key1 = 0x0414

    HAL_I2C_Mem_Write (&hi2c2、0xAA、0x00、I2C_MEMADD_SIZE _16BIT、(uint8_t *) key2、 2、200);//key2 = 0x3672

    在不同的持续时间内尝试。

    但每次它返回错误。

    可以帮我解决这个问题吗?

    注- HAL_I2C_MEM_Write 格式-:HAL_I2C_MEM_Write (I2C_HandleTypeDef * h2c、uint16_t DevAddress、uint16_t MemAddress、uint16_t AddMemSize、uint8_t *数据、 uint16_t 大小、uint32_t 超时)

    此致、

    Sakshi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您需要以小端字节序对其进行连续写入。 要解封、您需要立即将0x1404写入0x00、然后将0x7236写入0x00。 然后将0xFFFF 写入0x00两次以进入完全访问模式。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Batt、

    正如您在上一次答复中所说的那样尝试了、但仍然无法解决我的问题。

    我是否遗漏了任何内容?

    这是我的非密封模式代码-

    void gauge 未密封()
    {
    HAL_delay (1000);
    HAL_I2C_Mem_Write (&hi2c2、0xAA、0x00、I2C_MEMADD_SIZE_8BIT、 (uint8_t *)&key1、2、300);//key1 = 0x1404
    HAL_delay (10);
    HAL_I2C_Mem_Write (&hi2c2、0xAA、0x00、I2C_MEMADD_SIZE_8BIT、 (uint8_t *)&key2、2、300);//key2 = 0x7236
    HAL_delay (10);
    }
    
    void read_status ()
    {
    HAL_I2C_Mem_read (&hi2c2、0xAB、0x00、I2C_MEMADD_SIZE_8BIT、&buf[1]、 1、200);
    HAL_DELAY (10);
    HAL_I2C_Mem_Read (&hi2c2、0xAB、0x01、I2C_MEMADD_SIZE_8BIT、&buf[0]、 1、200);
    } 

    读取0x00和0x01将返回0x2080。

    尝试读数-  

    HAL_I2C_MEM_READ (&hi2c2、0xAB、0x0000、I2C_MEMADD_SIZE 16BIT、buf、 2、200); 

    这将返回0x2000。

    因此、基本上什么都不起作用。
    现在、您能帮我解决这个问题吗? 我仍然无法在解封模式下切换。
    您能告诉我哪里出了问题吗?

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

    1:您可以检查 CONTRAL_STATUS 中的 SEC1和 SEC0位。

    sec1、SEC0 (位14、13):指示器件处于哪种安全模式
    0、0 =保留
    0、1 =完全访问
    1、0 =未密封
    1、1 =密封

    #2:请按照12.2-1中的说明进行操作。 默认密钥为0x0414和0x3672 (unseal)、0xFFFF 和0xFFFF (完全访问)

    您的代码看起来是正确的、因此从您提供的抽象级别来看、您似乎正在执行正确的步骤。

    如果监测计未切换到非密封状态、则会干扰按键的实际数据传输。 密钥是唯一被传输的数据、并且它们按照 TRM 中描述的那样被连续写入、这一点很重要。

    为了进一步调试、我建议使用 I2C 协议分析器并检查物理总线上的实际数据。 由于序列相当短、捕获 SCL 和 SDA 的 DSCOPE 可能会用作替代方案。