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.

[参考译文] BQ25180:BQ25180在由电池供电时始终报告1

Guru**** 2513185 points
Other Parts Discussed in Thread: BQ25180

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1324486/bq25180-bq25180-always-report-1-when-powered-by-battery

器件型号:BQ25180

我已经按照先前相关问题的提示(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 *)&registerVBAT_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 *)&registerICHG_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 *)&registerCHARGECTRL0, 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 *)&registerCHARGECTRL1, 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 *)&registerIC_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 *)&registerTMR_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 *)&registerSHIP_RST, sizeof(registerSHIP_RST));
    
    BQ25180_ReadRegister(BQ25180_REGISTER_SHIP_RST, (uint8_t *)&registerSHIP_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 *)&registerSYS_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 *)&registerTS_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 *)&registerMASK_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 *)&registerSTAT0, 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。

为什么 会出现这种行为?

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

    您好、Gustavo、

    您能否说明如何读取 TSMR 的状态? 是否有一个 MCU 引脚连接到 TSMR 以读取该引脚的电压电平?

    如果是、可能的解释可能与 TS/MR 行为在充电模式与仅电池模式下的差异有关。 当存在 VIN 时、该引脚始终偏置以监控 TS 电压、因此该电压通常较高。 在仅 BAT 模式下、仅在脉冲中偏置 TSMR 以尽可能减少电流消耗、这些脉冲用于确定何时按下 MR。 这意味着平均电压非常低、因此采样很可能表明此时引脚上的电压较低。

    下面的显示了 BAT 的 VIN 存在(充电模式)和仅电池模式之间的差异。

    此致、

    胡安·奥斯皮纳

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

    否则会将一个来自 VSYS 的上拉电阻器用于偏置 TSMR 吗? 我使用 GPIO 读取此信号。

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

    从电池供电时、读取 TSMR 引脚状态的建议是什么?

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

    对 SYS 进行上拉可能有助于提高平均电压、但我要记住、在 BAT 模式和充电器模式下、它可能会增加电流消耗。 此外、它肯定会影响充电时的 TS 行为。根据您的原理图、我假设未使用它、因此我 建议通过 I2C 禁用它。

    另一种方法是使 TS/MR 读取函数为中断驱动。 由于该脉冲没有直流高电压、因此您可以尝试通过使 GPIO 引脚生成边沿触发中断来检测 GPIO 引脚上的电压边沿。 不过、在这种情况下、您会寻找缺少的边沿、因为 MR press 会导致未显示脉冲。

    或者、您可以使用 twake1中断向您指示按钮已被按下、并使用检测到的脉冲指示按钮已被释放。

    此致。

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

    我弄错了。 我通过 STAT0寄存器(TS 开路)使用 I2C 总线读取信号。

    我将尝试使用上拉电阻来解决这个问题。

    如果可以、我在这里回答。

    谢谢!  

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

    不工作。  电池供电时、读取 STAT0寄存器(TS 开路)的另一种替代方案?

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

    您好、Gustavo、

    您能解释一下您的意思吗?

    此致、

    胡安·奥斯皮纳

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

    我想我不清楚自己的需求。

    我正在使用 TSMR 引脚作为数字输入、以读取我在上面提供的电路的按钮状态。 按钮短接至0V。

    我想通过 STAT0寄存器(TS 开路)读取 TSMR 引脚的状态。

    当连接到外部源时、BQ25180运行良好、但当仅由电池供电的 BQ25180始终报告相同的值时、无论按钮按下与否都没有区别。

    显然、TSMR 引脚逻辑中发生了变化、该变化不允许以这种方式使用。

    您能否确认是否可以像我在上面建议的那样使用它、或者是否存在任何限制?

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

    谢谢您的澄清。 将它用于您描述的方式(利用 TS 监控功能来报告按钮被按下的情况)将在 VIN 连接时工作正常、但 TS 感应在 VIN 断开后会被禁用。 这是因为 TS 仅用于控制在没有 VIN 的情况下不会发生的充电、因此为了最大程度地减少电流消耗、它被禁用。

    这意味着、在 VIN 不存在时、TS_OPEN 状态位将不能准确反映存在的电压、因此您将无法使用它来检测 MR 按压操作。

    此致。