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

Fork of bq27210 by Kevin Braun

Committer:
loopsva
Date:
Wed Jun 21 19:56:02 2017 +0000
Revision:
2:d52fb7ef7429
Parent:
bq27210.cpp@1:ab433d7c3e30
Child:
3:1b12fa9dc673
So far, only register reading function written

Who changed what in which revision?

UserRevisionLine numberNew contents of line
loopsva 0:96d5698a376f 1 #include "mbed.h"
loopsva 2:d52fb7ef7429 2 #include "bq27220.h"
loopsva 2:d52fb7ef7429 3
loopsva 0:96d5698a376f 4 #define i2c_Buf dataSTR.i2c_Bufx
loopsva 2:d52fb7ef7429 5
loopsva 2:d52fb7ef7429 6 BQ27220::BQ27220(PinName p_sda, PinName p_scl) :
loopsva 0:96d5698a376f 7 _i2c(p_sda, p_scl)
loopsva 0:96d5698a376f 8 {
loopsva 2:d52fb7ef7429 9 _i2c.frequency(400000);
loopsva 1:ab433d7c3e30 10 }
loopsva 1:ab433d7c3e30 11
loopsva 2:d52fb7ef7429 12 void BQ27220::default_init(BQ27220_TypeDef& dataSTR)
loopsva 2:d52fb7ef7429 13 {
loopsva 2:d52fb7ef7429 14 dataSTR.shunt_res = BQ_SHUNT_RESISTOR;
loopsva 2:d52fb7ef7429 15 }
loopsva 2:d52fb7ef7429 16
loopsva 2:d52fb7ef7429 17 int BQ27220::new_battery_init(BQ27220_TypeDef& dataSTR)
loopsva 1:ab433d7c3e30 18 {
loopsva 1:ab433d7c3e30 19 return(0);
loopsva 1:ab433d7c3e30 20 }
loopsva 0:96d5698a376f 21
loopsva 2:d52fb7ef7429 22 int BQ27220::read_registers(BQ27220_TypeDef& dataSTR)
loopsva 0:96d5698a376f 23 {
loopsva 2:d52fb7ef7429 24 i2c_Buf[0] = BQ_CNTL;
loopsva 2:d52fb7ef7429 25 int result = _i2c.write((int)BQ27220_ADDR, i2c_Buf, 1, true);
loopsva 2:d52fb7ef7429 26 if(result) return(result + 0x10);
loopsva 2:d52fb7ef7429 27 _i2c.read((int)BQ27220_ADDR + 1, i2c_Buf, 32, false);
loopsva 2:d52fb7ef7429 28 wait_us(66);
loopsva 2:d52fb7ef7429 29 if(result) return(result + 0x18);
loopsva 2:d52fb7ef7429 30
loopsva 2:d52fb7ef7429 31 dataSTR.cntlReg = (i2c_Buf[BQ_CNTL - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_CNTL - BQ_CNTL];
loopsva 2:d52fb7ef7429 32 dataSTR.arReg = (i2c_Buf[BQ_AR - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_AR - BQ_CNTL];
loopsva 2:d52fb7ef7429 33 dataSTR.artteReg = (i2c_Buf[BQ_ARTTE - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_ARTTE - BQ_CNTL];
loopsva 2:d52fb7ef7429 34 dataSTR.tempReg = (i2c_Buf[BQ_TEMP - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_TEMP - BQ_CNTL];
loopsva 2:d52fb7ef7429 35 dataSTR.voltReg = (i2c_Buf[BQ_VOLT - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_VOLT - BQ_CNTL];
loopsva 2:d52fb7ef7429 36 dataSTR.flagsReg = (i2c_Buf[BQ_FLAGS - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_FLAGS - BQ_CNTL];
loopsva 2:d52fb7ef7429 37 dataSTR.currentReg = (i2c_Buf[BQ_CURRENT - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_CURRENT - BQ_CNTL];
loopsva 2:d52fb7ef7429 38
loopsva 2:d52fb7ef7429 39 dataSTR.rmReg = (i2c_Buf[BQ_RM - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_RM - BQ_CNTL];
loopsva 2:d52fb7ef7429 40 dataSTR.fccReg = (i2c_Buf[BQ_FCC - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_FCC - BQ_CNTL];
loopsva 2:d52fb7ef7429 41 dataSTR.aiReg = (i2c_Buf[BQ_AI - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_AI - BQ_CNTL];
loopsva 2:d52fb7ef7429 42 dataSTR.tteReg = (i2c_Buf[BQ_TTE - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_TTE - BQ_CNTL];
loopsva 2:d52fb7ef7429 43 dataSTR.ttfReg = (i2c_Buf[BQ_TTF - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_TTF - BQ_CNTL];
loopsva 2:d52fb7ef7429 44 dataSTR.siReg = (i2c_Buf[BQ_SI - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_SI - BQ_CNTL];
loopsva 2:d52fb7ef7429 45 dataSTR.stteReg = (i2c_Buf[BQ_STTE - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_STTE - BQ_CNTL];
loopsva 2:d52fb7ef7429 46 dataSTR.mliReg = (i2c_Buf[BQ_MLI - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_MLI - BQ_CNTL];
loopsva 2:d52fb7ef7429 47
loopsva 2:d52fb7ef7429 48 i2c_Buf[0] = BQ_MLTTE;
loopsva 2:d52fb7ef7429 49 result = _i2c.write((int)BQ27220_ADDR, i2c_Buf, 1, true);
loopsva 2:d52fb7ef7429 50 if(result) return(result + 0x20);
loopsva 2:d52fb7ef7429 51 result =_i2c.read((int)BQ27220_ADDR + 1, i2c_Buf, 32, false);
loopsva 2:d52fb7ef7429 52 wait_us(66);
loopsva 2:d52fb7ef7429 53 if(result) return(result + 0x28);
loopsva 0:96d5698a376f 54
loopsva 2:d52fb7ef7429 55 dataSTR.mltteReg = (i2c_Buf[BQ_MLTTE - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_MLTTE - BQ_MLTTE];
loopsva 2:d52fb7ef7429 56 dataSTR.rawccReg = (i2c_Buf[BQ_RCC - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_RCC - BQ_MLTTE];
loopsva 2:d52fb7ef7429 57 dataSTR.apReg = (i2c_Buf[BQ_AP - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_AP - BQ_MLTTE];
loopsva 2:d52fb7ef7429 58 dataSTR.intTempReg = (i2c_Buf[BQ_INTTEMP - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_INTTEMP - BQ_MLTTE];
loopsva 2:d52fb7ef7429 59 dataSTR.cycReg = (i2c_Buf[BQ_CYC - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_CYC - BQ_MLTTE];
loopsva 2:d52fb7ef7429 60 dataSTR.socReg = (i2c_Buf[BQ_SOC - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_SOC - BQ_MLTTE];
loopsva 2:d52fb7ef7429 61 dataSTR.sohReg = (i2c_Buf[BQ_SOH - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_SOH - BQ_MLTTE];
loopsva 2:d52fb7ef7429 62
loopsva 2:d52fb7ef7429 63 dataSTR.cvReg = (i2c_Buf[BQ_CV - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_CV - BQ_MLTTE];
loopsva 2:d52fb7ef7429 64 dataSTR.ccReg = (i2c_Buf[BQ_CC - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_CC - BQ_MLTTE];
loopsva 2:d52fb7ef7429 65 dataSTR.btpdReg = (i2c_Buf[BQ_BTPD - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_BTPD - BQ_MLTTE];
loopsva 2:d52fb7ef7429 66 dataSTR.btpcReg = (i2c_Buf[BQ_BTPC - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_BTPC - BQ_MLTTE];
loopsva 2:d52fb7ef7429 67 dataSTR.osReg = (i2c_Buf[BQ_OS - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_OS - BQ_MLTTE];
loopsva 2:d52fb7ef7429 68 dataSTR.dcReg = (i2c_Buf[BQ_DC - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_DC - BQ_MLTTE];
loopsva 2:d52fb7ef7429 69
loopsva 2:d52fb7ef7429 70 i2c_Buf[0] = BQ_MACDATA;
loopsva 2:d52fb7ef7429 71 result = _i2c.write((int)BQ27220_ADDR, i2c_Buf, 1, true);
loopsva 2:d52fb7ef7429 72 if(result) return(result + 0x30);
loopsva 2:d52fb7ef7429 73 result =_i2c.read((int)BQ27220_ADDR + 1, i2c_Buf, 32, false);
loopsva 2:d52fb7ef7429 74 wait_us(66);
loopsva 2:d52fb7ef7429 75 if(result) return(result + 0x38);
loopsva 2:d52fb7ef7429 76
loopsva 2:d52fb7ef7429 77 for(int i = 0; i < 32; i++) {
loopsva 2:d52fb7ef7429 78 dataSTR.macData[i] = i2c_Buf[i];
loopsva 2:d52fb7ef7429 79 }
loopsva 2:d52fb7ef7429 80
loopsva 2:d52fb7ef7429 81 i2c_Buf[0] = BQ_MACDATASUM;
loopsva 2:d52fb7ef7429 82 result = _i2c.write((int)BQ27220_ADDR, i2c_Buf, 1, true);
loopsva 2:d52fb7ef7429 83 if(result) return(result + 0x40);
loopsva 2:d52fb7ef7429 84 result =_i2c.read((int)BQ27220_ADDR + 1, i2c_Buf, 32, false);
loopsva 2:d52fb7ef7429 85 wait_us(66);
loopsva 2:d52fb7ef7429 86 if(result) return(result + 0x48);
loopsva 2:d52fb7ef7429 87
loopsva 2:d52fb7ef7429 88 dataSTR.macSumReg = (i2c_Buf[BQ_MACDATASUM - BQ_MACDATASUM + 1] << 8) | i2c_Buf[BQ_MACDATASUM - BQ_MACDATASUM];
loopsva 2:d52fb7ef7429 89 dataSTR.macLenReg = (i2c_Buf[BQ_MACDATALEN - BQ_MACDATASUM + 1] << 8) | i2c_Buf[BQ_MACDATALEN - BQ_MACDATASUM];
loopsva 2:d52fb7ef7429 90 dataSTR.anacReg = i2c_Buf[BQ_ANACNT - BQ_MACDATASUM];
loopsva 2:d52fb7ef7429 91 dataSTR.rawcReg = (i2c_Buf[BQ_RAWC - BQ_MACDATASUM + 1] << 8) | i2c_Buf[BQ_RAWC - BQ_MACDATASUM];
loopsva 2:d52fb7ef7429 92 dataSTR.rawvReg = (i2c_Buf[BQ_RAWV - BQ_MACDATASUM + 1] << 8) | i2c_Buf[BQ_RAWV - BQ_MACDATASUM];
loopsva 2:d52fb7ef7429 93 dataSTR.rawtReg = (i2c_Buf[BQ_RAWT - BQ_MACDATASUM + 1] << 8) | i2c_Buf[BQ_RAWT - BQ_MACDATASUM];
loopsva 2:d52fb7ef7429 94
loopsva 0:96d5698a376f 95 return(0);
loopsva 0:96d5698a376f 96 }
loopsva 0:96d5698a376f 97
loopsva 1:ab433d7c3e30 98
loopsva 2:d52fb7ef7429 99