Hi,
we have severe problems while refreshing the registers of the BQ78Z100 via I2C. We observed that the BQ frequently stops charging/discharging by deactivating both of its FETs. The effect first seems to be randomly happening, but we managed to produce an environment which can reproduce the error:
System Configuration
- BQ78Z100EVM (alternative our own Battery Module based on the BQ78Z100EVM)
- MCU connected to the BQ I2C interface (I2C running at 100 kHz)
- 2x 450 mAh LiPo cells connected to the BQ78Z100EVM
- 8.5 V power supply connected to PACK+ / PACK - on EVM board for charging
- Test SW on the MCU which runs only a single test applicatoion:
const uint32_t TestDly = 250; void getGaugeStatus () { int16_t voltage = 0; int16_t current=0; int16_t remaining=0; int16_t full=0; int16_t soc=0; I2CRegRead (BQ_I2C_SLAVEADDRESS, VOLT, 2, (uint8_t *) &voltage); delayUs(TestDly); I2CRegRead (BQ_I2C_SLAVEADDRESS, INSTCURR, 2, (uint8_t *) ¤t); delayUs(TestDly); I2CRegRead (BQ_I2C_SLAVEADDRESS, RM, 2, (uint8_t *) &remaining); delayUs(TestDly); I2CRegRead (BQ_I2C_SLAVEADDRESS, FCC, 2, (uint8_t *) &full); delayUs(TestDly); I2CRegRead (BQ_I2C_SLAVEADDRESS, SOC, 2, (uint8_t *) &soc); delayUs(TestDly); return; } void chargeBatteryTest () { deactivateDsgFET (); deactivateChgFET (); for (int i=0; i< 100; i++) { getGaugeStatus (); } activateDsgFET (); activateChgFET (); for (int i=0; i< 100; i++) { getGaugeStatus (); } while (1) { getGaugeStatus (); delayUs(TestDly); uint32_t safetyStatus = readStatusReg(SAFETY_STATUS); delayUs(TestDly); uint32_t safetyAlert = readStatusReg(SAFETY_ALERT); delayUs(TestDly); uint32_t pfStatus = readStatusReg(PF_STATUS); delayUs(TestDly); uint32_t pfAlert = readStatusReg(PF_ALERT); delayUs(TestDly); while( (safetyStatus != 0) && (safetyAlert != 0) && (pfStatus != 0) && (pfAlert != 0) ) { getGaugeStatus(); } } }
Test Procedure
- Power supply off
- Start MCU
- read BQ status registers
- activate charge/discharge FETs
- continuously read the BQ status registers via I2C
- Wait ~ 30 seconds ==> OK
- no errors occured
- read status registers works fine
- battery voltage present @ PACK+/PACK- contacts due to active FETs --> OK
- Activate Power supply providing 8.5 V 200 mA charge supply
- Wait 1 - 10 seconds ==> ERROR
Error Behavior
- After the above testing procedure the BQ does not respond on the I2C bus anymore
- no action on SDA lane (neither ACK nor data transfer): SDA lane stays high due to pull-up whenever BQ has SDA control
- no attempt to hold SCL lane low to throttle bus speed
- non responding BQ may appear at any stage
- within transfering a read byte from BQ to MCU
- after a successful completion of a read/write bus transfer
- while writing the register address to the BQ
- BQ deactivates the charge & discharge FETs
- After a certain time (not further evaluated at this point) the BQ continous to respond normally to any I2C requests
- The charge & discharge FETs stay disabled
- The FETs can be re-activated via I2C again
Error Analysis
- Increasing the delay (TestDly) between 2 consecutive I2C register reads reduces the probability of this error
- When I run the Test with the Battery Management Studio & the EV2300 adapter I could not reproduce the error (but I noticed a delay of ~14ms between 2 reads)
- However I have not found any hint in any datasheet about any delay requirements except the "bus free time between stop and start" of 1.3 us (which we do meet of course)
- The error was never observed when no charging current was provided
- I have captured the activity on the I2C bus during the error:
- I personally have the following theory:
My collegue Philipp Schmidbauer already has asked for a service request at your stand at the Electronica in Munich 2 weeks ago, but never received any answer.
I would highly appreciate any help on this topic as it is a absolut kill criteria for our application, i.e. you can't build a UPS which accidently resets itself and thus turning the full system off. That's not what I would commonly call a "uninterruptable power supply"!