我已经按照先前相关问题的提示(e2e.ti.com/.../bq25180-bq25180-not-exit-shipmode-with-button-press 、然后我移除二极管、在按下按钮时将 TSMR 引脚直接接地。
现在、电路如下面的屏幕截图所示:

这是我当前的初始化函数:
/**
*
*/
static void BQ25180_SetDefaultConfiguration(void)
{
BQ25180_Register_VBAT_CTRL registerVBAT_CTRL;
BQ25180_Register_ICHG_CTRL registerICHG_CTRL;
BQ25180_Register_CHARGECTRL0 registerCHARGECTRL0;
BQ25180_Register_CHARGECTRL1 registerCHARGECTRL1;
BQ25180_Register_IC_CTRL registerIC_CTRL;
BQ25180_Register_TMR_ILIM registerTMR_ILIM;
BQ25180_Register_SHIP_RST registerSHIP_RST;
BQ25180_Register_SYS_REG registerSYS_REG;
BQ25180_Register_TS_CONTROL registerTS_CONTROL;
BQ25180_Register_MASK_ID registerMASK_ID;
/* VBAT_CTRL Register */
registerVBAT_CTRL.VBATREG = 0x46; //regulation in 4.2V | Battery Regulation Voltage VBATREG= 3.5V + VBATREG_CODE * 10mV
BQ25180_WriteRegister(BQ25180_REGISTER_VBAT_CTRL, (uint8_t *)®isterVBAT_CTRL, sizeof(registerVBAT_CTRL));
/* ICHG_CTRL Register */
registerICHG_CTRL.CHG_DIS = 0b0; // Battery Charging Enabled
registerICHG_CTRL.ICHG = 0b1111111; // Battery Charging programmable current = 1000mA
BQ25180_WriteRegister(BQ25180_REGISTER_ICHG_CTRL, (uint8_t *)®isterICHG_CTRL, sizeof(registerICHG_CTRL));
/* CHARGECTRL0 Register */
registerCHARGECTRL0.IPRECHG = 0b1; // Precharge is Term
registerCHARGECTRL0.ITERM = 0b10; // Termination current = disable
registerCHARGECTRL0.VINDPM = 0b11; // VINDPM Level Selection = Disable
registerCHARGECTRL0.THERM_REG = 0b11; // Thermal Regulation Threshold = Disable
BQ25180_WriteRegister(BQ25180_REGISTER_CHARGECTRL0, (uint8_t *)®isterCHARGECTRL0, sizeof(registerCHARGECTRL0));
/* CHARGECTRL1 Register */
registerCHARGECTRL1.IBAT_OCP = 0b11; // Battery Discharge Current Limit = Disable
registerCHARGECTRL1.BUVLO = 0b011; // Battery Undervoltage LockOut Falling Threshold = 2.8V
registerCHARGECTRL1.CHG_STATUS_INT_MASK = 0b1; // Disable Charging Status Interrupt
registerCHARGECTRL1.ILIM_INT_MASK = 0b1; // Disable ILIM Fault Interrupt
registerCHARGECTRL1.VDPM_INT_MASK = 0b1; // Disable VINDPM and VDPPM Interrupt
BQ25180_WriteRegister(BQ25180_REGISTER_CHARGECTRL1, (uint8_t *)®isterCHARGECTRL1, sizeof(registerCHARGECTRL1));
/* IC_CTRL Register */
registerIC_CTRL.TS_EN = 0b0; // TS Auto Function = Disable
registerIC_CTRL.VLOWV_SEL = 0b0; // Precharge Voltage Threshold (VLOWV) = 3V
registerIC_CTRL.VRCH_0 = 0b0; // Recharge Voltage Threshold = 100mV
registerIC_CTRL.TMRSLW_EN = 0b0; // Timer Slow = The timer is not slowed at any time
registerIC_CTRL.SAFETY_TIMER = 0b11; // Disable safety timer
registerIC_CTRL.WATCHDOG_SEL = 0b11; // Disable watchdog function
BQ25180_WriteRegister(BQ25180_REGISTER_IC_CTRL, (uint8_t *)®isterIC_CTRL, sizeof(registerIC_CTRL));
/* TMR_ILIM Register */
registerTMR_ILIM.MR_LPRESS = 0b00; // Push button Long Press duration timer 5s
registerTMR_ILIM.MR_RESET_VIN = 0b0; // Hardware reset condition = Reset sent when long press duration is met
registerTMR_ILIM.AUTOWAKE = 0b01; // Auto Wake Up Timer Restart = 1s
registerTMR_ILIM.ILIM = 0b111; // Input Current Limit Setting = 1100mA
BQ25180_WriteRegister(BQ25180_REGISTER_TMR_ILIM, (uint8_t *)®isterTMR_ILIM, sizeof(registerTMR_ILIM));
/* SHIP_RST Register */
registerSHIP_RST.REG_RST = 0b0; // Software Reset = Do nothing
registerSHIP_RST.EN_RST_SHIP = 0b00; // Shipmode Enable and Hardware Reset = Do nothing
registerSHIP_RST.PB_LPRESS_ACTION = 0b00; // Pushbutton long press action = Do nothing
registerSHIP_RST.WAKE1_TMR = 0b00; // Wake 1 Timer Set = 300ms
registerSHIP_RST.WAKE2_TMR = 0b00; // Wake 2 Timer Set = 2s
registerSHIP_RST.EN_PUSH = 0b1; // ERRATA: e2e.ti.com/.../bq25180-en_push-register-doesn-t-seem-to-work-as-described Enable Push Button and Reset Function on Battery Only
BQ25180_WriteRegister(BQ25180_REGISTER_SHIP_RST, (uint8_t *)®isterSHIP_RST, sizeof(registerSHIP_RST));
BQ25180_ReadRegister(BQ25180_REGISTER_SHIP_RST, (uint8_t *)®isterSHIP_RST, sizeof(registerSHIP_RST));
ESP_LOGW(TAG, "registerSHIP_RST.EN_PUSH = %d", registerSHIP_RST.EN_PUSH);
/* SYS_REG Register */
registerSYS_REG.SYS_REG_CTRL = 0b111; // SYS Regulation Voltgage = Pass-Through (VSYS is VIN)
registerSYS_REG.SYS_MODE = 0b00; // SYS powered from VIN if present or VBAT
registerSYS_REG.WATCHDOG_15S_ENABLE = 0b00; // I2C Watchdog = Disable
registerSYS_REG.VDPPM_DIS = 0b0; // Enable VDPPM
BQ25180_WriteRegister(BQ25180_REGISTER_SYS_REG, (uint8_t *)®isterSYS_REG, sizeof(registerSYS_REG));
/* TS_CONTROL Register */
registerTS_CONTROL.TS_HOT = 0b00; // TS Hot threshold register = 60°C
registerTS_CONTROL.TS_COLD = 0b00; // TS Cold threshold register = 0°C
registerTS_CONTROL.TS_WARM = 0b1; // TS Warm threshold = Disabled
registerTS_CONTROL.TS_COOL = 0b1; // TS Cool threshold register = Disabled
registerTS_CONTROL.TS_ICHG = 0b0; // Fast charge current when decreased by TS function = 0.5*ICHG
registerTS_CONTROL.TS_VRCG = 0b0; // Reduced target battery voltage during Warm = VBATREG -100mV
BQ25180_WriteRegister(BQ25180_REGISTER_TS_CONTROL, (uint8_t *)®isterTS_CONTROL, sizeof(registerTS_CONTROL));
/* MASK_ID Register */
registerMASK_ID.TS_INT_MASK = 0b1; // Mask TS Interrupt
registerMASK_ID.TREG_INT_MASK = 0b1; // Mask TREG Interrupt
registerMASK_ID.BAT_INT_MASK = 0b1; // Mask BOCP and BUVLO Interrupt
registerMASK_ID.PG_INT_MASK = 0b1; // Mask PG and VINOVP Interrupt
BQ25180_WriteRegister(BQ25180_REGISTER_MASK_ID, (uint8_t *)®isterMASK_ID, sizeof(registerMASK_ID));
ESP_LOGI(TAG, "Registers defined to custom configuration!");
}
我使用以下函数读取 TSMR 引脚状态:
/**
*
*/
bool BQ25180_GetTSMR(void) {
BQ25180_Register_STAT0 registerSTAT0;
BQ25180_ReadRegister(BQ25180_REGISTER_STAT0, (uint8_t *)®isterSTAT0, sizeof(registerSTAT0));
ESP_LOGW(TAG, "TSMR Status %d", !registerSTAT0.TS_OPEN_STAT);
return !registerSTAT0.TS_OPEN_STAT;
}
预期的行为是按下函数 RETURN 1 (TRUE)时。
我在连接 VBUS 并且按预期正常运行时读取 TSMR 的状态(未按下按钮时返回0、按下按钮时返回1)、但仅由电池供电时、TSMR 的状态始终返回1。
为什么 会出现这种行为?
