TI BQ27220 I2C based, battery State of Charge and Coulomb Counter
Fork of bq27210 by
Diff: bq27220.cpp
- Revision:
- 2:d52fb7ef7429
- Parent:
- 1:ab433d7c3e30
- Child:
- 3:1b12fa9dc673
diff -r ab433d7c3e30 -r d52fb7ef7429 bq27220.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bq27220.cpp Wed Jun 21 19:56:02 2017 +0000 @@ -0,0 +1,99 @@ +#include "mbed.h" +#include "bq27220.h" + +#define i2c_Buf dataSTR.i2c_Bufx + +BQ27220::BQ27220(PinName p_sda, PinName p_scl) : + _i2c(p_sda, p_scl) +{ + _i2c.frequency(400000); +} + +void BQ27220::default_init(BQ27220_TypeDef& dataSTR) +{ + dataSTR.shunt_res = BQ_SHUNT_RESISTOR; +} + +int BQ27220::new_battery_init(BQ27220_TypeDef& dataSTR) +{ + return(0); +} + +int BQ27220::read_registers(BQ27220_TypeDef& dataSTR) +{ + i2c_Buf[0] = BQ_CNTL; + int result = _i2c.write((int)BQ27220_ADDR, i2c_Buf, 1, true); + if(result) return(result + 0x10); + _i2c.read((int)BQ27220_ADDR + 1, i2c_Buf, 32, false); + wait_us(66); + if(result) return(result + 0x18); + + dataSTR.cntlReg = (i2c_Buf[BQ_CNTL - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_CNTL - BQ_CNTL]; + dataSTR.arReg = (i2c_Buf[BQ_AR - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_AR - BQ_CNTL]; + dataSTR.artteReg = (i2c_Buf[BQ_ARTTE - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_ARTTE - BQ_CNTL]; + dataSTR.tempReg = (i2c_Buf[BQ_TEMP - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_TEMP - BQ_CNTL]; + dataSTR.voltReg = (i2c_Buf[BQ_VOLT - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_VOLT - BQ_CNTL]; + dataSTR.flagsReg = (i2c_Buf[BQ_FLAGS - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_FLAGS - BQ_CNTL]; + dataSTR.currentReg = (i2c_Buf[BQ_CURRENT - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_CURRENT - BQ_CNTL]; + + dataSTR.rmReg = (i2c_Buf[BQ_RM - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_RM - BQ_CNTL]; + dataSTR.fccReg = (i2c_Buf[BQ_FCC - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_FCC - BQ_CNTL]; + dataSTR.aiReg = (i2c_Buf[BQ_AI - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_AI - BQ_CNTL]; + dataSTR.tteReg = (i2c_Buf[BQ_TTE - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_TTE - BQ_CNTL]; + dataSTR.ttfReg = (i2c_Buf[BQ_TTF - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_TTF - BQ_CNTL]; + dataSTR.siReg = (i2c_Buf[BQ_SI - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_SI - BQ_CNTL]; + dataSTR.stteReg = (i2c_Buf[BQ_STTE - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_STTE - BQ_CNTL]; + dataSTR.mliReg = (i2c_Buf[BQ_MLI - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_MLI - BQ_CNTL]; + + i2c_Buf[0] = BQ_MLTTE; + result = _i2c.write((int)BQ27220_ADDR, i2c_Buf, 1, true); + if(result) return(result + 0x20); + result =_i2c.read((int)BQ27220_ADDR + 1, i2c_Buf, 32, false); + wait_us(66); + if(result) return(result + 0x28); + + dataSTR.mltteReg = (i2c_Buf[BQ_MLTTE - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_MLTTE - BQ_MLTTE]; + dataSTR.rawccReg = (i2c_Buf[BQ_RCC - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_RCC - BQ_MLTTE]; + dataSTR.apReg = (i2c_Buf[BQ_AP - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_AP - BQ_MLTTE]; + dataSTR.intTempReg = (i2c_Buf[BQ_INTTEMP - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_INTTEMP - BQ_MLTTE]; + dataSTR.cycReg = (i2c_Buf[BQ_CYC - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_CYC - BQ_MLTTE]; + dataSTR.socReg = (i2c_Buf[BQ_SOC - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_SOC - BQ_MLTTE]; + dataSTR.sohReg = (i2c_Buf[BQ_SOH - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_SOH - BQ_MLTTE]; + + dataSTR.cvReg = (i2c_Buf[BQ_CV - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_CV - BQ_MLTTE]; + dataSTR.ccReg = (i2c_Buf[BQ_CC - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_CC - BQ_MLTTE]; + dataSTR.btpdReg = (i2c_Buf[BQ_BTPD - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_BTPD - BQ_MLTTE]; + dataSTR.btpcReg = (i2c_Buf[BQ_BTPC - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_BTPC - BQ_MLTTE]; + dataSTR.osReg = (i2c_Buf[BQ_OS - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_OS - BQ_MLTTE]; + dataSTR.dcReg = (i2c_Buf[BQ_DC - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_DC - BQ_MLTTE]; + + i2c_Buf[0] = BQ_MACDATA; + result = _i2c.write((int)BQ27220_ADDR, i2c_Buf, 1, true); + if(result) return(result + 0x30); + result =_i2c.read((int)BQ27220_ADDR + 1, i2c_Buf, 32, false); + wait_us(66); + if(result) return(result + 0x38); + + for(int i = 0; i < 32; i++) { + dataSTR.macData[i] = i2c_Buf[i]; + } + + i2c_Buf[0] = BQ_MACDATASUM; + result = _i2c.write((int)BQ27220_ADDR, i2c_Buf, 1, true); + if(result) return(result + 0x40); + result =_i2c.read((int)BQ27220_ADDR + 1, i2c_Buf, 32, false); + wait_us(66); + if(result) return(result + 0x48); + + dataSTR.macSumReg = (i2c_Buf[BQ_MACDATASUM - BQ_MACDATASUM + 1] << 8) | i2c_Buf[BQ_MACDATASUM - BQ_MACDATASUM]; + dataSTR.macLenReg = (i2c_Buf[BQ_MACDATALEN - BQ_MACDATASUM + 1] << 8) | i2c_Buf[BQ_MACDATALEN - BQ_MACDATASUM]; + dataSTR.anacReg = i2c_Buf[BQ_ANACNT - BQ_MACDATASUM]; + dataSTR.rawcReg = (i2c_Buf[BQ_RAWC - BQ_MACDATASUM + 1] << 8) | i2c_Buf[BQ_RAWC - BQ_MACDATASUM]; + dataSTR.rawvReg = (i2c_Buf[BQ_RAWV - BQ_MACDATASUM + 1] << 8) | i2c_Buf[BQ_RAWV - BQ_MACDATASUM]; + dataSTR.rawtReg = (i2c_Buf[BQ_RAWT - BQ_MACDATASUM + 1] << 8) | i2c_Buf[BQ_RAWT - BQ_MACDATASUM]; + + return(0); +} + + +