TI BQ27220 I2C based, battery State of Charge and Coulomb Counter

Fork of bq27210 by Kevin Braun

Revision:
2:d52fb7ef7429
Parent:
1:ab433d7c3e30
Child:
3:1b12fa9dc673
--- /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);
+}
+
+
+