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.

[参考译文] BQ21061:BQ21061's 状态寄存器和标志寄存器的值

Guru**** 2503395 points
Other Parts Discussed in Thread: BQ21061

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1453251/bq21061-bq21061-s-value-of-status-registers-and-flag-registers

器件型号:BQ21061

工具与软件:

您好!

现在、我尝试使用 Charge IC BQ21061观看电池充电状态。
我使用 MCU 通过 I2C 获取每个寄存器的值。
我感到奇怪的是、在 STAT0寄存器中设置了充电 CV 状态和 PGOOD 状态、但未设置 FLAG0寄存器中的充电 CV 标志。
我预计状态寄存器设置/清除和标志寄存器设置/清除都与充电事件相一致、但事实并非如此。
实际充电状态所反映的哪些条件标志寄存器?
只是为了参考,我会发布我的源码手表 BQ210's registers。

谢谢

void get_DBQ21061() State_Reg_

#define BQ21061_SLAVE_ADDRESS 0xD6U
I2C_HandleTypeDef hi2c1;
int16_t i、rec_val、ret = 0;
uint8_t received_reg_val[7];
uint8_t buf[4];
for (I = 0;I < 7;I++)

receive_reg_val[i]= HAL_I2C_BQ2c1、Mem_Read 21061_SLAVE_ADDRESS、i、I2C_MEMADD_SIZE_8bit、buf、 11000);
}
// STAT0
uint8_t CHRG_CV_STAT =(RECEIVED_reg_val[0]和 CHRG_CV_STAT_MASK)>> CHRG_CV_STAT_SHIFT;
uint8_t charg_done_stat =(receive_reg_val[0]和 charge_done_STAT_mask)>> charge_done_STAT_shift;
uint8_t iinlim_active_stat =(RECEIVED_reg_val[0]和 IINLIM_ACTIVE_STAT_MASK)>> IINLIM_ACTIVE_STAT_SHIFT;
uint8_t vdppm_active_stat =(received_reg_val[0]和 VDPPM_active_STAT_MASK)>> VDPPM_active_STAT_SHIFT;
uint8_t vindpm_active_stat =(received_reg_val[0]& VINDPM_ACTIVE_STAT_MASK)>> VINDPM_ACTIVE_STAT_SHIFT;
uint8_t thermreg_active_stat =(RECEIVED_reg_val[0]& THERMREG_ACTIVE_STAT_MASK)>> THERMREG_ACTIVE_STAT_SHIFT;
uint8_t VIN_PGOOD_STAT =(Received_reg_val[0]和 VIN_PGOOD_STAT_MASK);
// STAT1
uint8_t VIN_OVP_FAULT_STAT =(RECEIVED_reg_val[1]和 VIN_OVP_FAULT_STAT_MASK)>> VIN_OVP_FAULT_STAT_SHIFT;
uint8_t BAT_OCP_FAULT_STAT =(RECEIVED_reg_val[1]和 BAT_OCP_FAULT_STAT_MASK)>> BAT_OCP_FAULT_STAT_SHIFT;
uint8_t BAT_UVLO_FAULT_STAT =(RECEIVED_reg_val[1]和 BAT_UVLO_FAULT_STAT_MASK)>> BAT_UVLO_FAULT_STAT_SHIFT;
uint8_t ts_cold_stat =(received_reg_val[1]& TS_COLD_STAT_MASK)>> TS_COLD_STAT_SHIFT;
uint8_t ts_cool_stat =(received_reg_val[1]& TS_COOL_STAT_MASK)>> TS_COOL_STAT_SHIFT;
uint8_t ts_warm_stat =(received_reg_val[1]& TS_WARM STAT_MASK)>> TS_WARM STAT_SHIFT;
uint8_t ts_hot_stat =(receive_reg_val[1]和 TS_HOT_STAT_MASK);
// STAT2
uint8_t ts_open_stat =(received_reg_val[2]& TS_OPEN_STAT_MASK);
// FLAG0
uint8_t CHRG_CV_FLAG =(received_reg_val[3]& CHRG_CV_FLAG_MASK)>> CHRG_CV_FLAG_SHIFT;
uint8_t charge_done_flag =(receive_reg_val[3]和 charge_done_flag_mask)>> charge_done_flag_shift;
uint8_t iinlim_active_flag =(RECEIVED_reg_val[3]和 IINLIM_ACTIVE_FLAG_MASK)>> IINLIM_ACTIVE_FLAG_SHIFT;
uint8_t vdppm_active_flag =(received_reg_val[3]& vdppm_active_flag_mask)>> VDPPM_active_flag_shift;
uint8_t vindpm_active_flag =(received_reg_val[3]& VINDPM_active_flag_mask)>> VINDPM_active_flag_shift;
uint8_t thermreg_active_flag =(RECEIVED_reg_val[3]& THERMREG_ACTIVE_FLAG_MASK)>> THERMREG_ACTIVE_FLAG_SHIFT;
uint8_t VIN_PGOOD_FLAG =(received_reg_val[3]和 VIN_PGOOD_FLAG_MASK);
// FLAG1
uint8_t VIN_OVP_FAULT_FLAG =(received_reg_val[4]和 VIN_OVP_FAULT_FLAG_MASK)>> VIN_OVP_FAULT_FLAG_SHIFT;
uint8_t BAT_OCP_FAULT_FLAG =(RECEIVED_reg_val[4]和 BAT_OCP_FAULT_FLAG_MASK)>> BAT_OCP_FAULT_FLAG_SHIFT;
uint8_t BAT_UVLO_FAULT_FLAG =(RECEIVED_reg_val[4]和 BAT_UVLO_FAULT_FLAG_MASK)>> BAT_UVLO_FAULT_FLAG_SHIFT;
uint8_t ts_cold_flag =(received_reg_val[4]和 TS_COLD_FLAG_MASK)>> TS_COLD_FLAG_SHIFT;
uint8_t ts_coul_flag =(received_reg_val[4]和 TS_COOL_FLAG_MASK)>> TS_COOL_FLAG_SHIFT;
uint8_t ts_warm_FLAG =(received_reg_val[4]和 TS_WARM 标志掩码)>> TS_WARM 标志移位;
uint8_t ts_hot_FLAG =(received_reg_val[4]和 TS_HOT_flag_mask);
// FLAG2
uint8_t ts_open_FLAG =(received_reg_val[5]& TS_open_FLAG_MASK);
// FLAG3
uint8_t wd_fault_FLAG =(received_reg_val[6]& WD_FAULT_FLAG_MASK)>> WD_FAULT_FLAG_SHIFT;
uint8_t safty_tmr_fault_FLAG =(received_reg_val[6]& safety_tmr_fault_FLAG_mask)>> safety_tmr_fault_FLAG_shift;
uint8_t LDO_OCP_FAULT_FLAG =(received_reg_val[6]和 LDO_OCP_FAULT_FLAG_MASK)>> LDO_OCP_FAULT_FLAG_SHIFT;
uint8_t mrwake1_timout_FLAG =(received_reg_val[6]和 MRWAKE1_TIMEOUT_FLAG_MASK)>> MRWAKE1_TIMEOUT_FLAG_SHIFT;
uint8_t mrwake2_timout_FLAG =(receive_reg_val[6]和 MRWAKE2_TIMEOUT_FLAG_MASK)>> MRWAKE2_TIMEOUT_FLAG_SHIFT;
uint8_t mrreset_warn_FLAG =(received_reg_val[6]和 MRRESET_WARN_flag_mask);
}

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

    您好!

    通常、看到 STAT 位寄存器将与看到设置了 FLAG 位寄存器配对、但这两个位的行为有所不同。

    - STAT 位寄存器将实时告诉您器件的当前状态。

    标志位告诉您自上次读取寄存器后是否发生了事件。

    如果读取标志寄存器、则这些位会自动清除、即使它仍处于指示状态。 这意味着、如果再次读取标志寄存器、并且两次 CV 标志都为高电平、则在此期间器件处于 CV 状态、退出 CV 状态并再次进入 CV 状态。 如果标志寄存器读取一个、然后再次读取、并且第二次 CV 标志为低电平、则 CV 状态仅进入一次、可能仍为 CV、或可能已退出 CV。

    在您的情形中、标志寄存器是否被多次读取? 如果是这样、这就解释了为什么 STAT 寄存器可能显示 CV 状态、但 CV 标志可能处于低电平、CV 已进入一次、但自上次读取 FLAG 寄存器以来未退出。

    此致、

    Juan Ospina

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

    感谢您的回答。

    我了解这些标志在读取后被清除。

    但我的问题仍然存在。

    如果标志位显示状态转换、则必须至少设置一次标志、但在我的软件中、即使是第一个循环也未检测到这些标志的设置。

    我该如何解释这一事实?

    谢谢!

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

    你好、Naoya、

    您能介绍一下读取该位的测试程序吗?

    在读取寄存器之前、器件是否已在充电或正在启动充电? 自上次测试以来、器件是否停止充电并再次开始充电?

    此致、

    Juan Ospina