BQ7690x2 Arduino I2C Communication CRC Issue Fix (BQ7697202PFBR)
🔺 Issue Description
If you're using BQ7697202BMS AFE in your project you might face the problem when using any library.
The answer if CRC, because it's enabled by default for this particular part number ( (BQ7697202PFBR )) for all commands, but typical library doesn't support it:
I connected logic analyzer and here is how it looks when
![]() |
![]() |
When using library without CRC you will see incorrect data because second byte is CRC when it's enabled:
![]() |
🔧 Issue Fix
So, to fix this you can add CRC support for each command or change communication type to Fast I2C Mode (without CRC). I'll show the simplest way (second):
The host can write the 0x29e7 SWAP_TO_I2C() subcommand to change the communications interface to I2C fast mode (Settings:Configuration:Comm Type = 8) immediately, without needing to enter CONFIG_UPDATE mode:
Add this code before library initialization:
/* Set I2C Fast Mode without CRC */ Wire.beginTransmission(0x08); // Begin with the device I2C address Wire.write(0x3E); // Set the device's address pointer (ie 3E) Wire.write(0xE7); // Send LSB (0xE7) of command SWAP_TO_I2C() 0x29E7 Wire.write(0x36); // crc8 of {0x10, 0x3E, 0xE7} Wire.write(0x29); // Send MSB (0x29) of command SWAP_TO_I2C() 0x29E7 Wire.write(0xDF); // crc8 of {0x29} Wire.endTransmission(true); // End I2C transmit
Here how it should looks on logic analyzer:
✔ Fixed
Now when reading cell's voltage and internal temperature values are correct:
Note 1: when IC not powered it wouldn't be able to communicate.
Note 2: disabling CRC should be performed after AFE power connection.
🗓 Note about CRC
For calculation CRC for this IC you can you follow cpp function:
uint8_t crc = 0; for (size_t ptr = 0; ptr < len; ptr++) { for (int k = 0; k < 8; k++) { uint8_t i = 0x80 >> k; // bit mask: 128, 64, 32 … 1 if (crc & 0x80) { } else { crc = crc << 1; } if (data[ptr] & i) { } } } return crc; }
Here is what you should get:
const uint8_t testData[] = {0x10, 0x14, 0x11, 0x67}; const uint16_t crcKey = 0x107; // CRC-8/SMBUS polynomial
Library
🟦 GitHub: https://github.com/fotherja/BQ76952/tree/main
💿 Source (copy): BQ76952-main_20260403.zip
Add changing AFTER reset function:
- Comments






