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.

[参考译文] BQ28Z610:FULL ACCESS 模式进入问题

Guru**** 2457760 points
Other Parts Discussed in Thread: BQ28Z610

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1545786/bq28z610-full-access-mode-entering-issue

器件型号:BQ28Z610


工具/软件:

我有一个定制板。 我通过 i2c 将电量监测计与 STM32 MCU 进行通信。 我将 I2C 与 DMA 搭配使用。 实际上、我已成功连接、可以解封 电量计、但我无法 以任何方式进入完全访问模式。 我的步骤  在文档中是相同的。

//宏

#define BQ28Z610_UNSEAL_KEY_1 0x0414
#define BQ28Z610_UNSEAL_KEY_2 0x3672

#define BQ28Z610_FULL_ACCESS_KEY_1 0xFFFF
#define BQ28Z610_FULL_ACCESS_KEY_2 0xFFFF

#define BQ28Z610_SEAL_COMMAND 0x0030


//枚举:

_BQ28Z610_REG_CMD_CONTROL = 0x00、
_BQ28Z610_REG_CMD_SELECT_SUBCLASS = 0x3E、// ALT_MANUFACTURER_ACCESS_2​_

//我在 init 中调用方法

bq28z610_drv_control_status_t _status;
memset (&_status、0、sizeof (_status));

IF (bq28z610_drv_ReadControlStatus (self、&_status))

uint8_t _sec_0_1_val =(_status.raw >> 13)& 0x3;// 14.1.1 0x00/01 ManufacturerAccess () 和 ControlStatus () 表
if(!_sec_0_1_val)

bq28z610_Seal (self);
vTaskDelay (PDMs_to_ticks (5000));
}
}

//解封
IF (bq28z610_unseal (self))

vTaskDelay (PDMs_to_ticks (100));
IF (bq28z610_CheckSecurityMode (self、_BQ28Z610_SECURITY_MODE_UNSEALED、1000))

//完全访问
IF (bq28z610_FullAccess (self))

vTaskDelay (PDMs_to_ticks (100));
IF (bq28z610_CheckSecurityMode (self、_BQ28Z610_SECURITY_MODE_FULL_ACCESS、1000))

 //操作
}
}

//密封
IF (bq28z610_Seal (self))

vTaskDelay (PDMs_to_ticks (100));
IF (bq28z610_CheckSecurityMode (self、_BQ28Z610_SECURITY_MODE_SEALED、1000))

 //操作
}
}
}
}



//我称之为方法

bool bq28z610_unseal (bq28z610_drv_t *self)

IF (NULL =self)
返回 false;

if(!bq28z610_drv_WriteWordLE (self、_BQ28Z610_REG_CMD_CONTROL、BQ28Z610_UNSEAL_KEY_1))
返回 false;

vTaskDelay (PDMs_to_ticks (30));
if(!bq28z610_drv_WriteWordLE (self、_BQ28Z610_REG_CMD_CONTROL、BQ28Z610_UNSEAL_KEY_2))
返回 false;
vTaskDelay (PDMs_to_ticks (10));
返回 true;
}

bool bq28z610_Seal (bq28z610_drv_t *self)

IF (NULL =self)
返回 false;

if(!bq28z610_drv_WriteWordLE (self、_BQ28Z610_REG_CMD_SELECT_SUBCLASS、BQ28Z610_SEAL_COMMAND))
返回 false;

vTaskDelay (PDMs_to_ticks (10));
返回 true;
}

bool bq28z610_FullAccess (bq28z610_drv_t *self)

IF (NULL =self)
返回 false;

if(!bq28z610_drv_WriteWordLE (self、_BQ28Z610_REG_CMD_SELECT_SUBCLASS、BQ28Z610_UNSEAL_KEY_1))
返回 false;

vTaskDelay (PDMs_to_ticks (30));
if(!bq28z610_drv_WriteWordLE (self、_BQ28Z610_REG_CMD_SELECT_SUBCLASS、BQ28Z610_UNSEAL_KEY_2))
返回 false;
vTaskDelay (PDMs_to_ticks (10));
返回 true;
}

bool bq28z610_CheckSecurityMode (bq28z610_drv_t *self、bq28z610_security_mode_t req、uint32_t to)

IF (NULL =self)
返回 false;

bq28z610_drv_control_status_t _status;
memset (&_status、0、sizeof (_status));

uint32_t _starting_time = xTaskGetTickCount ();
while (xTaskGetTickCount ()-_starting_time)< to)

IF (bq28z610_drv_ReadControlStatus (self、&_status))

uint8_t _sec_0_1_val =_status.raw >> 13;// 14.1.1 0x00/01 ManufacturerAccess () 和 ControlStatus () 表
if (((_sec_0_1_val == 0b01)&&(_BQ28Z610_security_mode_full_access == req)//完全访问
返回 true;
否则 if ((_sec_0_1_val == 0b10)&&(_BQ28Z610_security_MODE_UNSEALED == req)// UNSEALED
返回 true;
否则 if ((_sec_0_1_val == 0b11)&&(_BQ28Z610_security_mode_sealed == req)// SEALED
返回 true;
}
vTaskDelay (PDMs_to_ticks (20));
}
返回 false;
}


bool bq28z610_drv_ReadControlStatus (bq28z610_drv_t *self、bq28z610_drv_control_status_t *status)

uint16_t _tmp = 0;
if(!bq28z610_drv_ReadWord (self、_BQ28Z610_REG_CMD_CONTROL、&_tmp))
返回 false;
if(!_tmp)//错误状态
返回 false;
*(uint16_t*) status =_tmp;
返回 true;
}

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

    您好、

    密封命令之间的延迟是多少?

    两个命令需要在 4s 内彼此发送。

    第 9.5 节: BQ28Z610 技术参考手册(修订版 E)

    此致、

    Diego

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

    我正在调试、但当我发送完全访问命令时 、我收到 sec0 和 sec1 位 为 0 0、但在文档中定义为此位;

    因此,我不明白,为什么比特进入保留状态?  

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

    您好、

    并确认您正在使用 AltManufacturerAccess () 解封?

    当您从 OperationStatus 读取时、它是否仍为 0、0?

    此致、

    Diego

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

    您好、
    不、我找到了解决方案。 控制状态寄存器无法 在完全访问模式下返回状态、sec0 和 sec1 位会变为低电平。 但是、当我从 操作状态寄存器(0x0054 地址)读取时、秒位的 值是正确的。

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

    您好、

    很好、我们解决了这个问题。

    此致、

    Diego

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

    您好、  
    谢谢你  

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

    没问题