/** * BQ25756 AI-4 初始化序列 * * 硬件参数:7S Li-ion, 2A CC, NTC (103AT), FB 默认分压, 24V 输入 * * 与调试版 InitForCharging 的区别: * - NTC 不关闭,启用并配置 JEITA 温度分区 * - 看门狗开启(40s),安全定时器设 12hr * - 预充 200mA / 终止 200mA * - 输入限 3A / 24V DPM */ #include "bq25756_regs.h" #include "bq_i2c_opt.h" /*=========================================================================== * AI-4 初始化 — NTC 使能 + 安全参数 * 返回 0=成功, <0=失败 *===========================================================================*/ int BQ25756_AI4_Init(void) { int ret; /*======================================================= * 第 1 步:看门狗 40s + 安全定时器 12hr * REG0x15 = 0b00_01_1_10_1 = 0x1D(POR 默认) * bit7:6=TOPOFF 禁用, bit5:4=WD 40s, * bit3=安全定时器使能, bit2:1=12hr, bit0=DPM 减速 *=======================================================*/ ret = BQ_I2C_WriteByte(BQ25756_I2C_ADDR, 0x15, 0x1D); if (ret) return -1; /*======================================================= * 第 2 步:NTC 温度阈值 (REG0x1B) * 103AT NTC, 默认:T1=0°C, T2=10°C, T3=45°C, T5=60°C * 写入 0x96(POR 值,不变) *=======================================================*/ ret = BQ_I2C_WriteByte(BQ25756_I2C_ADDR, 0x1B, 0x96); if (ret) return -2; /*======================================================= * 第 3 步:JEITA 行为 (REG0x1C) * POR=0x57 * bit6:5=10 = VSET 97.6%(Warm 区降电压) * bit4=1 = ISETH 100%(Warm 区不降电流) * bit3:2=01 = ISETC 20%(Cool 区降电流到 20%) * bit1=1 = EN_JEITA * bit0=1 = EN_TS(使能 TS 引脚,NTC 接入) *=======================================================*/ ret = BQ_I2C_WriteByte(BQ25756_I2C_ADDR, 0x1C, 0x57); if (ret) return -3; /*======================================================= * 第 4 步:充电电流 2A → REG0x02 * 2000mA / 50mA/LSB = 40, 40 << 2 = 0x00A0 * 低字节 0x02 = 0xA0, 高字节 0x03 = 0x00 *=======================================================*/ { uint8_t buf[3] = {0x02, 0xA0, 0x00}; ret = BQ_I2C_WriteRetry(BQ25756_I2C_ADDR, buf, 3); } if (ret) return -4; /*======================================================= * 第 5 步:预充电流 200mA → REG0x10 * 200 / 50 = 4, 4 << 2 = 0x10 *=======================================================*/ { uint8_t buf[3] = {0x10, 0x10, 0x00}; ret = BQ_I2C_WriteRetry(BQ25756_I2C_ADDR, buf, 3); } if (ret) return -5; /*======================================================= * 第 6 步:终止电流 200mA → REG0x12 * 200 / 50 = 4, 4 << 2 = 0x10 *=======================================================*/ { uint8_t buf[3] = {0x12, 0x10, 0x00}; ret = BQ_I2C_WriteRetry(BQ25756_I2C_ADDR, buf, 3); } if (ret) return -6; /*======================================================= * 第 7 步:输入电流 DPM 5A → REG0x06(留余量) * 5000 / 50 = 100, 100 << 2 = 0x0190 * 低字节 0x90, 高字节 0x01 *=======================================================*/ { uint8_t buf[3] = {0x06, 0x90, 0x01}; ret = BQ_I2C_WriteRetry(BQ25756_I2C_ADDR, buf, 3); } if (ret) return -7; /*======================================================= * 第 8 步:输入电压 DPM 24V → REG0x08 * 24000 / 20 = 1200 = 0x04B0 * 低字节 0xB0, 高字节 0x04 *=======================================================*/ { uint8_t buf[3] = {0x08, 0xB0, 0x04}; ret = BQ_I2C_WriteRetry(BQ25756_I2C_ADDR, buf, 3); } if (ret) return -8; /*======================================================= * 第 9 步:预充/终止控制 REG0x14 * bit3=1 EN_TERM 使能 * bit2:1=11 VBAT_LOWV 71.4%(预充→CC 阈值) * bit0=1 EN_PRECHG 使能 * POR=0x0F, 保持 *=======================================================*/ ret = BQ_I2C_WriteByte(BQ25756_I2C_ADDR, 0x14, 0x0F); if (ret) return -9; /*======================================================= * 第 10 步:启动 ADC 连续转换 * REG0x2B = 0xA0(EN=1, one-shot=0→连续, sample=13bit) *=======================================================*/ ret = BQ_I2C_WriteByte(BQ25756_I2C_ADDR, 0x2B, 0xA0); if (ret) return -10; return 0; /* 成功 */ } /*=========================================================================== * AI-4 充电启动 — init + 拉低 CE *===========================================================================*/ int BQ25756_AI4_StartCharging(void) { uint8_t val; /* 第 1 步:确保 HIZ 关闭 */ if (BQ_I2C_ReadByte(BQ25756_I2C_ADDR, 0x17, &val) != 0) return -1; val &= ~0x04; /* 清除 EN_HIZ */ if (BQ_I2C_WriteByte(BQ25756_I2C_ADDR, 0x17, val) != 0) return -1; /* 第 2 步:EN_CHG = 1 */ val |= 0x01; /* 置位 EN_CHG */ if (BQ_I2C_WriteByte(BQ25756_I2C_ADDR, 0x17, val) != 0) return -1; /* 第 3 步:CE 拉低(硬件) — 调用者处理 GPIO */ return 0; } /*=========================================================================== * AI-4 充电停止 *===========================================================================*/ int BQ25756_AI4_StopCharging(void) { uint8_t val; if (BQ_I2C_ReadByte(BQ25756_I2C_ADDR, 0x17, &val) != 0) return -1; val &= ~0x01; /* EN_CHG = 0 */ return BQ_I2C_WriteByte(BQ25756_I2C_ADDR, 0x17, val); }