BQ7693003 BMS逆向工程中两款适配库无法运行的技术求助
解决BQ7693003搭配STM32F103C8时第三方库运行卡顿问题
问题背景
- 硬件配置:搭载STM32F103C8与带CRC校验的BQ7693003的BMS,已完成硬件连接
- 库1(10s_Ti_BQ76930_BMS):取消
bq769x0.cpp中BootPin代码注释后芯片可启动,但串口停留在“Address and CRC detection successful”;编译需将abs替换为fabs才能通过,添加延迟无效 - 库2(LibreSolar bq769x0-arduino-library):可执行到清除XR、Alert、UV、OV等错误步骤,但卡在清除XR错误之后
排查与解决步骤
一、先确认I2C硬件通信有效性
- 抓波形查时序:用示波器或逻辑分析仪抓取SDA/SCL总线波形,确认电平(需为3.3V)、速率(最高400kHz,STM32端配置要匹配)符合BQ7693003手册要求
- 检查上拉电阻:SDA/SCL引脚必须外接4.7k~10k上拉电阻到3.3V,无拉电阻会导致I2C通信不稳定
- BootPin接线验证:BQ7693003的BOOT引脚启动模式需与代码配置一致(手册中BOOT引脚拉低为工厂模式,拉高为正常模式,确认硬件接线和代码里的电平设置匹配)
二、针对10s_Ti_BQ76930_BMS库的问题
abs替换为fabs的后续检查:替换后确认相关变量类型为浮点型,避免隐式转换导致逻辑错误,比如原代码中用abs处理的变量是否确实是浮点值- 卡在地址CRC检测后的调试:在检测成功后的代码段添加I2C读写返回值打印,比如每次调用
read_register或write_register时,输出函数返回的成功/失败状态,定位具体哪一步通信中断 - CRC功能配置检查:BQ7693003默认可能启用CRC校验,需确认库代码中是否正确设置了
CONFIG2寄存器的CRC_EN位(置1启用),未开启CRC会导致后续寄存器读写失败
三、针对LibreSolar库卡在清除XR错误的问题
- XR错误触发原因排查:查BQ7693003手册,XR错误关联芯片复位、欠压、过热、通信故障等,清除错误前先读取
FAULT寄存器(地址0x02),确认具体错误源 - 添加调试输出:在清除XR错误的代码后,添加读取
STATUS(0x01)、FAULT寄存器的代码并打印值,看是否仍有未清除的错误,或是后续I2C读取操作失败 - 芯片型号适配检查:确认LibreSolar库是否支持BQ7693003,部分库默认适配BQ76920/30等型号,需修改代码中的寄存器定义、I2C地址(BQ7693003默认7位地址为0x08)匹配目标芯片
四、新手友好的基础I2C调试方法
先跳过第三方库,用底层I2C代码验证通信是否正常:
#include <Wire.h> void setup() { Serial.begin(115200); Wire.begin(); // 初始化I2C,注意STM32引脚映射是否正确(如PB6=SCL,PB7=SDA) } void loop() { // 读取BQ7693003的DEVICE_ID寄存器(地址0x00,固定值0x30) Wire.beginTransmission(0x08); // 7位I2C地址 Wire.write(0x00); // 寄存器地址 if (Wire.endTransmission(false) != 0) { // 发送后不释放总线 Serial.println("I2C write failed"); delay(1000); return; } if (Wire.requestFrom(0x08, 1) != 1) { // 请求读取1字节 Serial.println("I2C read failed"); delay(1000); return; } byte dev_id = Wire.read(); Serial.print("DEVICE_ID: 0x"); Serial.println(dev_id, HEX); // 正常应输出0x30 delay(1000); }
- 若此代码能正常输出
0x30,说明硬件I2C通信正常,问题出在库的逻辑或配置;若失败,继续排查硬件接线、引脚映射
内容的提问来源于stack exchange,提问作者ManeGote
相关产品推荐
相关产品推荐

