TI BQ27220 I2C based, battery State of Charge and Coulomb Counter
Fork of bq27210 by
bq27220.cpp@2:d52fb7ef7429, 2017-06-21 (annotated)
- 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?
User | Revision | Line number | New 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 |