TI BQ27220 I2C based, battery State of Charge and Coulomb Counter
Fork of bq27210 by
Diff: bq27210.cpp
- Revision:
- 0:96d5698a376f
- Child:
- 1:ab433d7c3e30
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bq27210.cpp Tue Jun 13 16:21:47 2017 +0000 @@ -0,0 +1,69 @@ +#include "mbed.h" +#include "bq27210.h" +#define i2c_Buf dataSTR.i2c_Bufx + +BQ27210::BQ27210 (PinName p_sda, PinName p_scl) : + _i2c(p_sda, p_scl) +{ + _i2c.frequency(100000); +} + +int BQ27210::read_registers(BQ27210_TypeDef& dataSTR) +{ + i2c_Buf[0] = BQ_CRTL; + int result = _i2c.write((int)BQ27210_ADDR, i2c_Buf, 1, true); + if(result) return(result); + _i2c.read((int)BQ27210_ADDR +1, i2c_Buf, 45, false); + + dataSTR.cntlReg = i2c_Buf[BQ_CRTL]; + dataSTR.modeReg = i2c_Buf[BQ_MODE]; + dataSTR.arReg = (i2c_Buf[BQ_AR_HI] << 8) | i2c_Buf[BQ_AR_LO]; + dataSTR.artteReg = (i2c_Buf[BQ_ARTTE_HI] << 8) | i2c_Buf[BQ_ARTTE_LO]; + dataSTR.tempReg = (i2c_Buf[BQ_TEMP_HI] << 8) | i2c_Buf[BQ_TEMP_LO]; + dataSTR.voltReg = (i2c_Buf[BQ_VOLT_HI] << 8) | i2c_Buf[BQ_VOLT_LO]; + dataSTR.flagsReg = i2c_Buf[BQ_FLAGS]; + dataSTR.rsocReg = i2c_Buf[BQ_RSOC]; + dataSTR.nacReg = (i2c_Buf[BQ_NAC_HI] << 8) | i2c_Buf[BQ_NAC_LO]; + dataSTR.lmdReg = (i2c_Buf[BQ_LMD_HI] << 8) | i2c_Buf[BQ_LMD_LO]; + dataSTR.cacReg = (i2c_Buf[BQ_CAC_HI] << 8) | i2c_Buf[BQ_CAC_LO]; + dataSTR.fcacReg = (i2c_Buf[BQ_FCAC_HI] << 8) | i2c_Buf[BQ_FCAC_LO]; + dataSTR.aiReg = (i2c_Buf[BQ_AI_HI] << 8) | i2c_Buf[BQ_AI_LO]; + dataSTR.tteReg = (i2c_Buf[BQ_TTE_HI] << 8) | i2c_Buf[BQ_TTE_LO]; + dataSTR.ttfReg = (i2c_Buf[BQ_TTF_HI] << 8) | i2c_Buf[BQ_TTF_LO]; + dataSTR.siReg = (i2c_Buf[BQ_SI_HI] << 8) | i2c_Buf[BQ_SI_LO]; + dataSTR.stteReg = (i2c_Buf[BQ_STTE_HI] << 8) | i2c_Buf[BQ_STTE_LO]; + dataSTR.junk1 = (i2c_Buf[BQ_STTE_HI +2] << 8) | i2c_Buf[BQ_STTE_LO +2]; + dataSTR.cedvReg = (i2c_Buf[BQ_CEDV_HI] << 8) | i2c_Buf[BQ_CEDV_LO]; + dataSTR.junk2 = (i2c_Buf[BQ_CEDV_HI +2] << 8) | i2c_Buf[BQ_CEDV_LO +2]; + dataSTR.junk3 = (i2c_Buf[BQ_CEDV_HI +4] << 8) | i2c_Buf[BQ_CEDV_LO +4]; + dataSTR.ttecpReg = (i2c_Buf[BQ_TTECP_HI] << 8) | i2c_Buf[BQ_TTECP_LO]; + dataSTR.cyclReg = (i2c_Buf[BQ_CYCL_HI] << 8) | i2c_Buf[BQ_CYCL_LO]; + dataSTR.cyctReg = (i2c_Buf[BQ_CYCT_HI] << 8) | i2c_Buf[BQ_CYCT_LO]; + dataSTR.csocReg = i2c_Buf[BQ_CSOC]; + dataSTR.shunt_res = BQ_SHUNT_RESISTOR; + return(0); +} + +int BQ27210::read_eep_registers(BQ27210_TypeDef& dataSTR) +{ + i2c_Buf[0] = BQ_EE_EN; + int result = _i2c.write((int)BQ27210_ADDR, i2c_Buf, 1, true); + if(result) return(result); + _i2c.read((int)BQ27210_ADDR +1, i2c_Buf, 1, false); + dataSTR.eeEnReg = i2c_Buf[0]; + + i2c_Buf[0] = BQ_ILMD; + result = _i2c.write((int)BQ27210_ADDR, i2c_Buf, 1, true); + _i2c.read((int)BQ27210_ADDR +1, i2c_Buf, 10, false); + dataSTR.ilmdReg = i2c_Buf[0]; + dataSTR.sedvfReg = i2c_Buf[1]; + dataSTR.sedv1Reg = i2c_Buf[2]; + dataSTR.islcEdvtReg = i2c_Buf[3]; + dataSTR.dmfsdReg = i2c_Buf[4]; + dataSTR.taperReg = i2c_Buf[5]; + dataSTR.pkcfgReg = i2c_Buf[6]; + dataSTR.gafDedvReg = i2c_Buf[7]; + dataSTR.dcompReg = i2c_Buf[8]; + dataSTR.tcompReg = i2c_Buf[9]; + return(0); +} \ No newline at end of file