You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

TI BQ76952与ESP32经I2C连接无法初始化,求解决方案

BQ76952睡眠未初始化问题的下一步处理方案

现状确认

读取0x12电池状态寄存器得到返回值1100010010000100,根据芯片手册第53页位定义,设备处于睡眠模式未完成初始化

具体处理步骤

1. 发送唤醒命令触发初始化

BQ76952需通过子命令唤醒,在setup()中添加唤醒逻辑(参考手册子命令0x01定义):

void setup() {
  Serial.begin(115200);
  Wire.begin(21, 22, 400000);
  delay(2000);

  // 发送唤醒子命令
  Wire.beginTransmission(BQ76952_I2C_ADDR);
  Wire.write(0x01); // 子命令寄存器地址
  Wire.write(0x01); // 唤醒子命令码
  Wire.write(0x00); // 子命令参数(按需填写)
  Wire.endTransmission();
  delay(100); // 等待设备完成唤醒

  // 后续原有代码不变
  uint16_t subcmdStatus = readWord(0x00);  
  Serial.print("Subcommand Status (0x00): "); 
  Serial.println(subcmdStatus, BIN);

  uint16_t batteryStatus = readWord(0x12);
  Serial.print("batteryStatus (0x12): ");
  Serial.println(batteryStatus, BIN);
}

2. 排查硬件问题

  • 确认芯片供电电压符合规格,低电压会导致初始化失败;
  • 检查I2C总线的上拉电阻是否正常,排查SDA/SCL线路的连接可靠性。

3. 验证寄存器读写顺序

当前readWord函数先读LSB再读MSB,若手册规定寄存器为MSB优先,需调整读取顺序:

uint16_t readWord(uint8_t reg) {
  Wire.beginTransmission(BQ76952_I2C_ADDR);
  Wire.write(reg);
  Wire.endTransmission(false);

  Wire.requestFrom(BQ76952_I2C_ADDR, 2);
  if (Wire.available() == 2) {
    uint8_t msb = Wire.read(); // 先读高位字节
    uint8_t lsb = Wire.read(); // 再读低位字节
    return (msb << 8) | lsb;
  }
  return 0xFFFF;
}

4. 尝试硬件复位

若唤醒无效,使用芯片复位引脚发送复位信号,再重新执行唤醒流程。

原始代码

#include <Wire.h>

// BQ76952 I2C address (7-bit)
#define BQ76952_I2C_ADDR 0x08


void setup() {
  Serial.begin(115200);
  Wire.begin(21, 22, 400000);  // Initialize I2C with default pins (SDA=21, SCL=22)

  delay(2000);

  uint16_t subcmdStatus = readWord(0x00);  
  Serial.print("Subcommand Status (0x00): "); 
  Serial.println(subcmdStatus, BIN); // 10010100000000

  uint16_t batteryStatus = readWord(0x12);
  Serial.print("batteryStatus (0x12): ");
  Serial.println(batteryStatus, BIN); // 1100010010000100
}

void loop(){
  delay(1000);
}

uint16_t readWord(uint8_t reg) {
  Wire.beginTransmission(BQ76952_I2C_ADDR);  // 7-bit address of BQ76952
  Wire.write(reg);                           // Register address
  Wire.endTransmission(false);               // Send repeated start

  Wire.requestFrom(BQ76952_I2C_ADDR, 2);  // Request 2 bytes
  if (Wire.available() == 2) {
    uint8_t lsb = Wire.read();
    uint8_t msb = Wire.read();
    return (msb << 8) | lsb;  // Correct byte order
  }
  return 0xFFFF;  // Error
}

内容的提问来源于stack exchange,提问作者Adam

火山引擎 最新活动