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

Fork of bq27210 by Kevin Braun

Committer:
loopsva
Date:
Mon Jul 31 19:12:28 2017 +0000
Revision:
3:1b12fa9dc673
Parent:
2:d52fb7ef7429
Working code.  On hold for now.  Moving to BQ34Z100-G1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
loopsva 0:96d5698a376f 1 #include "mbed.h"
loopsva 3:1b12fa9dc673 2 #include "rtos.h"
loopsva 2:d52fb7ef7429 3 #include "bq27220.h"
loopsva 2:d52fb7ef7429 4
loopsva 3:1b12fa9dc673 5 extern RawSerial pc;
loopsva 3:1b12fa9dc673 6
loopsva 0:96d5698a376f 7 #define i2c_Buf dataSTR.i2c_Bufx
loopsva 2:d52fb7ef7429 8
loopsva 3:1b12fa9dc673 9
loopsva 2:d52fb7ef7429 10 BQ27220::BQ27220(PinName p_sda, PinName p_scl) :
loopsva 0:96d5698a376f 11 _i2c(p_sda, p_scl)
loopsva 0:96d5698a376f 12 {
loopsva 3:1b12fa9dc673 13 _i2c.frequency(100000);
loopsva 3:1b12fa9dc673 14 }
loopsva 3:1b12fa9dc673 15
loopsva 3:1b12fa9dc673 16 BQ27220::BQ27220(PinName p_sda, PinName p_scl, int freq) :
loopsva 3:1b12fa9dc673 17 _i2c(p_sda, p_scl)
loopsva 3:1b12fa9dc673 18 {
loopsva 3:1b12fa9dc673 19 _i2c.frequency(freq);
loopsva 1:ab433d7c3e30 20 }
loopsva 1:ab433d7c3e30 21
loopsva 2:d52fb7ef7429 22 void BQ27220::default_init(BQ27220_TypeDef& dataSTR)
loopsva 2:d52fb7ef7429 23 {
loopsva 2:d52fb7ef7429 24 dataSTR.shunt_res = BQ_SHUNT_RESISTOR;
loopsva 2:d52fb7ef7429 25 }
loopsva 2:d52fb7ef7429 26
loopsva 2:d52fb7ef7429 27 int BQ27220::new_battery_init(BQ27220_TypeDef& dataSTR)
loopsva 1:ab433d7c3e30 28 {
loopsva 1:ab433d7c3e30 29 return(0);
loopsva 1:ab433d7c3e30 30 }
loopsva 0:96d5698a376f 31
loopsva 3:1b12fa9dc673 32 uint16_t BQ27220::get_sub_cmmd(BQ27220_TypeDef& dataSTR, uint16_t cmmd)
loopsva 3:1b12fa9dc673 33 {
loopsva 3:1b12fa9dc673 34 i2c_Buf[0] = BQ_CNTL;
loopsva 3:1b12fa9dc673 35 i2c_Buf[2] = cmmd >> 8;
loopsva 3:1b12fa9dc673 36 i2c_Buf[1] = cmmd & 255;
loopsva 3:1b12fa9dc673 37 _i2c.write(BQ27220_ADDR, i2c_Buf, 3, false);
loopsva 3:1b12fa9dc673 38 Thread::wait(5); // needs large delay here
loopsva 3:1b12fa9dc673 39 //pc.printf("sub-a: %02x %02x %02x %02x \r\n", i2c_Buf[0], i2c_Buf[1], i2c_Buf[2], i2c_Buf[3]);
loopsva 3:1b12fa9dc673 40 int i = 0;
loopsva 3:1b12fa9dc673 41 for(i = 0; i < 100; i++) {
loopsva 3:1b12fa9dc673 42 wait_us(66);
loopsva 3:1b12fa9dc673 43 _i2c.write(BQ27220_ADDR, i2c_Buf, 1, true);
loopsva 3:1b12fa9dc673 44 _i2c.read(BQ27220_ADDR + 1, i2c_Buf, 4, false);
loopsva 3:1b12fa9dc673 45 //pc.printf("sub-b: %02x %02x %02x %02x \r\n", i2c_Buf[0], i2c_Buf[1], i2c_Buf[2], i2c_Buf[3]);
loopsva 3:1b12fa9dc673 46 if((i2c_Buf[0]== 0xa5) && (i2c_Buf[1] == 0xff)) break;
loopsva 3:1b12fa9dc673 47 }
loopsva 3:1b12fa9dc673 48 wait_us(66);
loopsva 3:1b12fa9dc673 49 if(i > 98) pc.printf("sub-b: ERROR \r\n");
loopsva 3:1b12fa9dc673 50 return (i2c_Buf[0] << 8) | i2c_Buf[1];
loopsva 3:1b12fa9dc673 51 }
loopsva 3:1b12fa9dc673 52
loopsva 3:1b12fa9dc673 53 uint16_t BQ27220::get_sub_cmmd_s(BQ27220_TypeDef& dataSTR, uint16_t cmmd)
loopsva 3:1b12fa9dc673 54 {
loopsva 3:1b12fa9dc673 55 i2c_Buf[0] = BQ_CNTL;
loopsva 3:1b12fa9dc673 56 i2c_Buf[2] = cmmd >> 8;
loopsva 3:1b12fa9dc673 57 i2c_Buf[1] = cmmd & 255;
loopsva 3:1b12fa9dc673 58 //pc.printf("sub-a: %02x %02x %02x \r\n", i2c_Buf[0], i2c_Buf[1], i2c_Buf[2]);
loopsva 3:1b12fa9dc673 59 _i2c.write(BQ27220_ADDR, i2c_Buf, 3, false);
loopsva 3:1b12fa9dc673 60 wait_us(1066);
loopsva 3:1b12fa9dc673 61 i2c_Buf[0] = BQ_MACDATA;
loopsva 3:1b12fa9dc673 62 _i2c.write(BQ27220_ADDR, i2c_Buf, 1, true);
loopsva 3:1b12fa9dc673 63 _i2c.read(BQ27220_ADDR + 1, i2c_Buf, 2, false);
loopsva 3:1b12fa9dc673 64 wait_us(66);
loopsva 3:1b12fa9dc673 65 //pc.printf("sub-b: %04x \r\n", (i2c_Buf[0] << 8) | i2c_Buf[1]);
loopsva 3:1b12fa9dc673 66 return (i2c_Buf[0] << 8) | i2c_Buf[1];
loopsva 3:1b12fa9dc673 67 }
loopsva 3:1b12fa9dc673 68
loopsva 3:1b12fa9dc673 69 uint16_t BQ27220::get_reg_2B(BQ27220_TypeDef& dataSTR, uint8_t reg)
loopsva 3:1b12fa9dc673 70 {
loopsva 3:1b12fa9dc673 71 i2c_Buf[0] = reg;
loopsva 3:1b12fa9dc673 72 _i2c.write(BQ27220_ADDR, i2c_Buf, 1, true);
loopsva 3:1b12fa9dc673 73 _i2c.read(BQ27220_ADDR + 1, i2c_Buf, 2, false);
loopsva 3:1b12fa9dc673 74 //pc.printf("sub-b: %02x %02x %02x %02x \r\n", i2c_Buf[0], i2c_Buf[1], i2c_Buf[2], i2c_Buf[3]);
loopsva 3:1b12fa9dc673 75 wait_us(66);
loopsva 3:1b12fa9dc673 76 //Thread::wait(2);
loopsva 3:1b12fa9dc673 77 return (i2c_Buf[1] << 8) | i2c_Buf[0];
loopsva 3:1b12fa9dc673 78 }
loopsva 3:1b12fa9dc673 79
loopsva 3:1b12fa9dc673 80 void BQ27220::enter_cfg_update(BQ27220_TypeDef& dataSTR)
loopsva 3:1b12fa9dc673 81 {
loopsva 3:1b12fa9dc673 82 i2c_Buf[0] = BQ_CNTL;
loopsva 3:1b12fa9dc673 83 i2c_Buf[1] = 0x90;
loopsva 3:1b12fa9dc673 84 i2c_Buf[2] = 0x00;
loopsva 3:1b12fa9dc673 85 _i2c.write(BQ27220_ADDR, i2c_Buf, 3, false);
loopsva 3:1b12fa9dc673 86 wait_us(66);
loopsva 3:1b12fa9dc673 87 Thread::wait(1500);
loopsva 3:1b12fa9dc673 88 }
loopsva 3:1b12fa9dc673 89
loopsva 3:1b12fa9dc673 90 void BQ27220::exitCfgUpdateExit(BQ27220_TypeDef& dataSTR)
loopsva 3:1b12fa9dc673 91 {
loopsva 3:1b12fa9dc673 92 i2c_Buf[0] = BQ_CNTL;
loopsva 3:1b12fa9dc673 93 i2c_Buf[1] = BQ_EXIT_CFG_UPDATE & 255;
loopsva 3:1b12fa9dc673 94 i2c_Buf[2] = BQ_EXIT_CFG_UPDATE >> 8;
loopsva 3:1b12fa9dc673 95 pc.printf("exitCfg_cmmd: -> ");
loopsva 3:1b12fa9dc673 96 for(int i = 0; i < 3; i++) pc.printf("%02x ",i2c_Buf[i]);
loopsva 3:1b12fa9dc673 97 pc.printf("\r\n");
loopsva 3:1b12fa9dc673 98 _i2c.write(BQ27220_ADDR, i2c_Buf, 3, false);
loopsva 3:1b12fa9dc673 99 wait_us(66);
loopsva 3:1b12fa9dc673 100 Thread::wait(5);
loopsva 3:1b12fa9dc673 101 }
loopsva 3:1b12fa9dc673 102
loopsva 3:1b12fa9dc673 103 void BQ27220::exitCfgUpdateReInit(BQ27220_TypeDef& dataSTR)
loopsva 3:1b12fa9dc673 104 {
loopsva 3:1b12fa9dc673 105 i2c_Buf[0] = BQ_CNTL;
loopsva 3:1b12fa9dc673 106 i2c_Buf[1] = BQ_EXIT_CFG_UPDATE_REINIT & 255;
loopsva 3:1b12fa9dc673 107 i2c_Buf[2] = BQ_EXIT_CFG_UPDATE_REINIT >> 8;
loopsva 3:1b12fa9dc673 108 pc.printf("exitInit_cmmd: -> ");
loopsva 3:1b12fa9dc673 109 for(int i = 0; i < 3; i++) pc.printf("%02x ",i2c_Buf[i]);
loopsva 3:1b12fa9dc673 110 pc.printf("\r\n");
loopsva 3:1b12fa9dc673 111 _i2c.write(BQ27220_ADDR, i2c_Buf, 3, false);
loopsva 3:1b12fa9dc673 112 wait_us(66);
loopsva 3:1b12fa9dc673 113 Thread::wait(5);
loopsva 3:1b12fa9dc673 114 }
loopsva 3:1b12fa9dc673 115
loopsva 3:1b12fa9dc673 116
loopsva 3:1b12fa9dc673 117 void BQ27220::reset(BQ27220_TypeDef& dataSTR)
loopsva 3:1b12fa9dc673 118 {
loopsva 3:1b12fa9dc673 119 i2c_Buf[0] = BQ_CNTL;
loopsva 3:1b12fa9dc673 120 i2c_Buf[1] = BQ_RESET & 255;
loopsva 3:1b12fa9dc673 121 i2c_Buf[2] = BQ_RESET >> 8;
loopsva 3:1b12fa9dc673 122 pc.printf("reset_cmmd: -> ");
loopsva 3:1b12fa9dc673 123 for(int i = 0; i < 3; i++) pc.printf("%02x ",i2c_Buf[i]);
loopsva 3:1b12fa9dc673 124 pc.printf("\r\n");
loopsva 3:1b12fa9dc673 125 _i2c.write(BQ27220_ADDR, i2c_Buf, 3, false);
loopsva 3:1b12fa9dc673 126 wait_us(66);
loopsva 3:1b12fa9dc673 127 Thread::wait(5);
loopsva 3:1b12fa9dc673 128 }
loopsva 3:1b12fa9dc673 129
loopsva 3:1b12fa9dc673 130 void BQ27220::useProfile_1(BQ27220_TypeDef& dataSTR)
loopsva 3:1b12fa9dc673 131 {
loopsva 3:1b12fa9dc673 132 i2c_Buf[0] = BQ_CNTL;
loopsva 3:1b12fa9dc673 133 i2c_Buf[1] = BQ_SET_PROFILE_1 >> 8;
loopsva 3:1b12fa9dc673 134 i2c_Buf[2] = BQ_SET_PROFILE_1 & 255;;
loopsva 3:1b12fa9dc673 135 pc.printf("Profile_1_cmmd: -> ");
loopsva 3:1b12fa9dc673 136 for(int i = 0; i < 3; i++) pc.printf("%02x ",i2c_Buf[i]);
loopsva 3:1b12fa9dc673 137 pc.printf("\r\n");
loopsva 3:1b12fa9dc673 138 _i2c.write(BQ27220_ADDR, i2c_Buf, 3, false);
loopsva 3:1b12fa9dc673 139 wait_us(66);
loopsva 3:1b12fa9dc673 140 Thread::wait(200);
loopsva 3:1b12fa9dc673 141 }
loopsva 3:1b12fa9dc673 142
loopsva 3:1b12fa9dc673 143 uint16_t BQ27220::get_cs_len(BQ27220_TypeDef& dataSTR, bool pf)
loopsva 3:1b12fa9dc673 144 {
loopsva 3:1b12fa9dc673 145 i2c_Buf[0] = BQ_MACDATASUM;
loopsva 3:1b12fa9dc673 146 _i2c.write(BQ27220_ADDR, i2c_Buf, 1, true);
loopsva 3:1b12fa9dc673 147 _i2c.read(BQ27220_ADDR + 1, i2c_Buf, 1, false);
loopsva 3:1b12fa9dc673 148 wait_us(66);
loopsva 3:1b12fa9dc673 149 //Thread::wait(5);
loopsva 3:1b12fa9dc673 150 uint16_t csl = i2c_Buf[0];
loopsva 3:1b12fa9dc673 151
loopsva 3:1b12fa9dc673 152 i2c_Buf[0] = BQ_MACDATALEN;
loopsva 3:1b12fa9dc673 153 _i2c.write(BQ27220_ADDR, i2c_Buf, 1, true);
loopsva 3:1b12fa9dc673 154 _i2c.read(BQ27220_ADDR + 1, i2c_Buf, 1, false);
loopsva 3:1b12fa9dc673 155 wait_us(66);
loopsva 3:1b12fa9dc673 156 //Thread::wait(5);
loopsva 3:1b12fa9dc673 157 csl = (csl << 8) | i2c_Buf[0];
loopsva 3:1b12fa9dc673 158 if(pf) pc.printf("get_cs: %02x\r\n", csl >> 8);
loopsva 3:1b12fa9dc673 159 if(pf) pc.printf("get_ln: %02x\r\n", csl & 255);
loopsva 3:1b12fa9dc673 160 return(csl);
loopsva 3:1b12fa9dc673 161 }
loopsva 3:1b12fa9dc673 162
loopsva 3:1b12fa9dc673 163 uint8_t BQ27220::calc_checksum_rx(BQ27220_TypeDef& dataSTR, int length)
loopsva 3:1b12fa9dc673 164 {
loopsva 3:1b12fa9dc673 165 uint8_t cs = 0;
loopsva 3:1b12fa9dc673 166 //pc.printf("c_csum_rx_len: %02x -> ", length);
loopsva 3:1b12fa9dc673 167 i2c_Buf[0] = BQ_SUB;
loopsva 3:1b12fa9dc673 168 _i2c.write(BQ27220_ADDR, i2c_Buf, 1, true);
loopsva 3:1b12fa9dc673 169 _i2c.read(BQ27220_ADDR + 1, i2c_Buf, 34, false);
loopsva 3:1b12fa9dc673 170 wait_us(66);
loopsva 3:1b12fa9dc673 171 Thread::wait(5);
loopsva 3:1b12fa9dc673 172 for(int i = 0; i < length + 2; i++) {
loopsva 3:1b12fa9dc673 173 cs += i2c_Buf[i];
loopsva 3:1b12fa9dc673 174 //pc.printf("b: %02x cs: %02x ", i2c_Buf[i], cs);
loopsva 3:1b12fa9dc673 175 }
loopsva 3:1b12fa9dc673 176 cs = 255 - cs;
loopsva 3:1b12fa9dc673 177 //pc.printf("cs_rx:%02x \r\n", cs);
loopsva 3:1b12fa9dc673 178 return (cs);
loopsva 3:1b12fa9dc673 179 }
loopsva 3:1b12fa9dc673 180
loopsva 3:1b12fa9dc673 181 uint8_t BQ27220::calc_checksum_tx(BQ27220_TypeDef& dataSTR, int length)
loopsva 3:1b12fa9dc673 182 {
loopsva 3:1b12fa9dc673 183 uint8_t cs = 0;
loopsva 3:1b12fa9dc673 184 pc.printf("cs_tx_len: %02x -> ", length);
loopsva 3:1b12fa9dc673 185 for(int i = 0; i < length + 2; i++) {
loopsva 3:1b12fa9dc673 186 cs += i2c_Buf[i + 1];
loopsva 3:1b12fa9dc673 187 //pc.printf("i2c: %02x cs: %02x ", i2c_Buf[i + 1], cs);
loopsva 3:1b12fa9dc673 188 pc.printf("%02x ", i2c_Buf[i + 1]);
loopsva 3:1b12fa9dc673 189 }
loopsva 3:1b12fa9dc673 190 cs = 255 - cs;
loopsva 3:1b12fa9dc673 191 pc.printf("\r\ncs_tx: %02x\r\n", cs);
loopsva 3:1b12fa9dc673 192 return (cs);
loopsva 3:1b12fa9dc673 193 }
loopsva 3:1b12fa9dc673 194
loopsva 3:1b12fa9dc673 195 uint32_t BQ27220::get_data_32(BQ27220_TypeDef& dataSTR, uint16_t sub_cmmd, int length)
loopsva 3:1b12fa9dc673 196 {
loopsva 3:1b12fa9dc673 197 i2c_Buf[0] = BQ_SUB;
loopsva 3:1b12fa9dc673 198 i2c_Buf[2] = sub_cmmd >> 8;
loopsva 3:1b12fa9dc673 199 i2c_Buf[1] = sub_cmmd & 255;
loopsva 3:1b12fa9dc673 200 dataSTR.subReg = sub_cmmd;
loopsva 3:1b12fa9dc673 201 //pc.printf("dat-32a: %02x %02x %02x \r\n", i2c_Buf[0], i2c_Buf[1], i2c_Buf[2]);
loopsva 3:1b12fa9dc673 202 _i2c.write(BQ27220_ADDR, i2c_Buf, 3, false);
loopsva 3:1b12fa9dc673 203 wait_us(3066);
loopsva 3:1b12fa9dc673 204 //Thread::wait(3); //needs to be at least 2
loopsva 3:1b12fa9dc673 205
loopsva 3:1b12fa9dc673 206 dataSTR.checksum = calc_checksum_rx(dataSTR, length);
loopsva 3:1b12fa9dc673 207
loopsva 3:1b12fa9dc673 208 uint16_t cslen = get_cs_len(dataSTR, false);
loopsva 3:1b12fa9dc673 209 dataSTR.macSumReg = cslen >> 8;
loopsva 3:1b12fa9dc673 210 dataSTR.macLenReg = cslen & 255;
loopsva 3:1b12fa9dc673 211
loopsva 3:1b12fa9dc673 212 i2c_Buf[0] = BQ_MACDATA;
loopsva 3:1b12fa9dc673 213 _i2c.write(BQ27220_ADDR, i2c_Buf, 1, true);
loopsva 3:1b12fa9dc673 214 _i2c.read(BQ27220_ADDR + 1, i2c_Buf, length, false);
loopsva 3:1b12fa9dc673 215 wait_us(5066);
loopsva 3:1b12fa9dc673 216 //Thread::wait(5); //seems to work down to 1
loopsva 3:1b12fa9dc673 217 for(int i = 0; i < length; i++) {
loopsva 3:1b12fa9dc673 218 dataSTR.macData[i] = dataSTR.i2c_Bufx[i];
loopsva 3:1b12fa9dc673 219 pc.printf("%02x,", dataSTR.macData[i]);
loopsva 3:1b12fa9dc673 220 }
loopsva 3:1b12fa9dc673 221 pc.printf("\r\n");
loopsva 3:1b12fa9dc673 222 //pc.printf(" mdl: %02x, mdcs: %02x, ccs: %02x\r\n", dataSTR.macLenReg, dataSTR.macSumReg, dataSTR.checksum);
loopsva 3:1b12fa9dc673 223 return ((uint32_t)dataSTR.subReg);
loopsva 3:1b12fa9dc673 224 }
loopsva 3:1b12fa9dc673 225
loopsva 3:1b12fa9dc673 226 //#define BQ_SHORT 1
loopsva 3:1b12fa9dc673 227
loopsva 3:1b12fa9dc673 228 void BQ27220::change_ram_1_2_4(BQ27220_TypeDef& dataSTR, uint16_t sub_cmmd, uint32_t value, int qty, bool pre)
loopsva 3:1b12fa9dc673 229 {
loopsva 3:1b12fa9dc673 230 if(pre) {
loopsva 3:1b12fa9dc673 231 #ifndef BQ_SHORT
loopsva 3:1b12fa9dc673 232 pc.printf("ram124_a: %04x -> ", sub_cmmd);
loopsva 3:1b12fa9dc673 233 get_data_32(dataSTR, sub_cmmd, 32);
loopsva 3:1b12fa9dc673 234 #endif
loopsva 3:1b12fa9dc673 235
loopsva 3:1b12fa9dc673 236 if(qty == 1) {
loopsva 3:1b12fa9dc673 237 dataSTR.macData[0] = value & 255;
loopsva 3:1b12fa9dc673 238 #ifdef BQ_SHORT
loopsva 3:1b12fa9dc673 239 dataSTR.macData[1] = 0;
loopsva 3:1b12fa9dc673 240 dataSTR.macData[2] = 0;
loopsva 3:1b12fa9dc673 241 dataSTR.macData[3] = 0;
loopsva 3:1b12fa9dc673 242 #endif
loopsva 3:1b12fa9dc673 243 } else
loopsva 3:1b12fa9dc673 244 if(qty == 2) {
loopsva 3:1b12fa9dc673 245 dataSTR.macData[0] = (value >> 8) & 255;
loopsva 3:1b12fa9dc673 246 dataSTR.macData[1] = value & 255;
loopsva 3:1b12fa9dc673 247 #ifdef BQ_SHORT
loopsva 3:1b12fa9dc673 248 dataSTR.macData[2] = 0;
loopsva 3:1b12fa9dc673 249 dataSTR.macData[3] = 0;
loopsva 3:1b12fa9dc673 250 #endif
loopsva 3:1b12fa9dc673 251 } else
loopsva 3:1b12fa9dc673 252 if(qty == 4) {
loopsva 3:1b12fa9dc673 253 dataSTR.macData[0] = (value >> 24) & 255;
loopsva 3:1b12fa9dc673 254 dataSTR.macData[1] = (value >> 16) & 255;
loopsva 3:1b12fa9dc673 255 dataSTR.macData[2] = (value >> 8) & 255;
loopsva 3:1b12fa9dc673 256 dataSTR.macData[3] = value & 255;
loopsva 3:1b12fa9dc673 257 } else {
loopsva 3:1b12fa9dc673 258 pc.printf("ram124_q_error\r\n");
loopsva 3:1b12fa9dc673 259 return;
loopsva 3:1b12fa9dc673 260 }
loopsva 3:1b12fa9dc673 261 }
loopsva 3:1b12fa9dc673 262
loopsva 3:1b12fa9dc673 263 i2c_Buf[0] = BQ_SUB;
loopsva 3:1b12fa9dc673 264 i2c_Buf[1] = sub_cmmd >> 8;
loopsva 3:1b12fa9dc673 265 i2c_Buf[2] = sub_cmmd & 255;
loopsva 3:1b12fa9dc673 266 if(pre) {
loopsva 3:1b12fa9dc673 267 i2c_Buf[3] = dataSTR.macData[0];
loopsva 3:1b12fa9dc673 268 i2c_Buf[4] = dataSTR.macData[1];
loopsva 3:1b12fa9dc673 269 i2c_Buf[5] = dataSTR.macData[2];
loopsva 3:1b12fa9dc673 270 i2c_Buf[6] = dataSTR.macData[3];
loopsva 3:1b12fa9dc673 271 }
loopsva 3:1b12fa9dc673 272 pc.printf("ram124_cmmd: -> ");
loopsva 3:1b12fa9dc673 273 int i = 0;
loopsva 3:1b12fa9dc673 274 #ifdef BQ_SHORT
loopsva 3:1b12fa9dc673 275 for(i = 0; i < qty + 3; i++) pc.printf("%02x ",i2c_Buf[i]);
loopsva 3:1b12fa9dc673 276 pc.printf("\r\n");
loopsva 3:1b12fa9dc673 277 uint8_t x = calc_checksum_tx(dataSTR, qty);
loopsva 3:1b12fa9dc673 278 _i2c.write(BQ27220_ADDR, i2c_Buf, qty + 3, false);
loopsva 3:1b12fa9dc673 279 #else
loopsva 3:1b12fa9dc673 280 for(i = 0; i < 32; i++) i2c_Buf[i + 3] = dataSTR.macData[i];
loopsva 3:1b12fa9dc673 281 for(i = 0; i < 35; i++) pc.printf("%02x ",i2c_Buf[i]);
loopsva 3:1b12fa9dc673 282 pc.printf("\r\n");
loopsva 3:1b12fa9dc673 283 uint8_t x = calc_checksum_tx(dataSTR, 32);
loopsva 3:1b12fa9dc673 284 _i2c.write(BQ27220_ADDR, i2c_Buf, 35, false);
loopsva 3:1b12fa9dc673 285 #endif
loopsva 3:1b12fa9dc673 286 wait_us(66);
loopsva 3:1b12fa9dc673 287 //Thread::wait(5);
loopsva 3:1b12fa9dc673 288
loopsva 3:1b12fa9dc673 289 i2c_Buf[0] = BQ_MACDATASUM;
loopsva 3:1b12fa9dc673 290 i2c_Buf[1] = x;
loopsva 3:1b12fa9dc673 291 #ifndef BQ_SHORT
loopsva 3:1b12fa9dc673 292 i2c_Buf[1] -= 0x20; //why is this???? !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
loopsva 3:1b12fa9dc673 293 if((sub_cmmd >= 0x91e0) && (sub_cmmd < BQ_CONFIG_TAPER_CURR)) i2c_Buf[1]--;
loopsva 3:1b12fa9dc673 294 #endif
loopsva 3:1b12fa9dc673 295 pc.printf("ram124_cs: -> ");
loopsva 3:1b12fa9dc673 296 for(i = 0; i < 2; i++) pc.printf("%02x ",i2c_Buf[i]);
loopsva 3:1b12fa9dc673 297 pc.printf("\r\n");
loopsva 3:1b12fa9dc673 298 _i2c.write(BQ27220_ADDR, i2c_Buf, 2, false);
loopsva 3:1b12fa9dc673 299 wait_us(66);
loopsva 3:1b12fa9dc673 300 //Thread::wait(5);
loopsva 3:1b12fa9dc673 301
loopsva 3:1b12fa9dc673 302 i2c_Buf[0] = BQ_MACDATALEN;
loopsva 3:1b12fa9dc673 303 #ifdef BQ_SHORT
loopsva 3:1b12fa9dc673 304 i2c_Buf[1] = qty + 4;
loopsva 3:1b12fa9dc673 305 #else
loopsva 3:1b12fa9dc673 306 i2c_Buf[1] = 36;
loopsva 3:1b12fa9dc673 307 #endif
loopsva 3:1b12fa9dc673 308 pc.printf("ram124_len: -> ");
loopsva 3:1b12fa9dc673 309 for(i = 0; i < 2; i++) pc.printf("%02x ",i2c_Buf[i]);
loopsva 3:1b12fa9dc673 310 pc.printf("\r\n");
loopsva 3:1b12fa9dc673 311 _i2c.write(BQ27220_ADDR, i2c_Buf, 2, false);
loopsva 3:1b12fa9dc673 312 wait_us(5066);
loopsva 3:1b12fa9dc673 313 //Thread::wait(200);
loopsva 3:1b12fa9dc673 314
loopsva 3:1b12fa9dc673 315 get_cs_len(dataSTR, true);
loopsva 3:1b12fa9dc673 316 //pc.printf("\r\n");
loopsva 3:1b12fa9dc673 317
loopsva 3:1b12fa9dc673 318 #ifndef BQ_SHORT
loopsva 3:1b12fa9dc673 319 pc.printf("ram124_x: %04x -> ", sub_cmmd);
loopsva 3:1b12fa9dc673 320 get_data_32(dataSTR, sub_cmmd, 32);
loopsva 3:1b12fa9dc673 321 pc.printf("\r\n");
loopsva 3:1b12fa9dc673 322 #endif
loopsva 3:1b12fa9dc673 323 }
loopsva 3:1b12fa9dc673 324
loopsva 3:1b12fa9dc673 325 uint16_t BQ27220::get_16(BQ27220_TypeDef& dataSTR, uint16_t cmmd)
loopsva 3:1b12fa9dc673 326 {
loopsva 3:1b12fa9dc673 327 get_sub_cmmd_s(dataSTR, cmmd);
loopsva 3:1b12fa9dc673 328 i2c_Buf[0] = BQ_MACDATA;
loopsva 3:1b12fa9dc673 329 _i2c.write(BQ27220_ADDR, i2c_Buf, 1, true);
loopsva 3:1b12fa9dc673 330 _i2c.read(BQ27220_ADDR + 1, i2c_Buf, 2, false);
loopsva 3:1b12fa9dc673 331 wait_us(66);
loopsva 3:1b12fa9dc673 332 return (i2c_Buf[0] << 8) | i2c_Buf[1];
loopsva 3:1b12fa9dc673 333 }
loopsva 3:1b12fa9dc673 334
loopsva 3:1b12fa9dc673 335 uint8_t BQ27220::get_8(BQ27220_TypeDef& dataSTR, uint16_t cmmd)
loopsva 3:1b12fa9dc673 336 {
loopsva 3:1b12fa9dc673 337 //pc.printf("get_8: %04x\r\n", cmmd);
loopsva 3:1b12fa9dc673 338 get_sub_cmmd_s(dataSTR, cmmd);
loopsva 3:1b12fa9dc673 339 i2c_Buf[0] = BQ_MACDATA;
loopsva 3:1b12fa9dc673 340 _i2c.write(BQ27220_ADDR, i2c_Buf, 1, true);
loopsva 3:1b12fa9dc673 341 _i2c.read(BQ27220_ADDR + 1, i2c_Buf, 1, false);
loopsva 3:1b12fa9dc673 342 wait_us(66);
loopsva 3:1b12fa9dc673 343 return i2c_Buf[0];
loopsva 3:1b12fa9dc673 344 }
loopsva 3:1b12fa9dc673 345
loopsva 3:1b12fa9dc673 346 void BQ27220::seal(BQ27220_TypeDef& dataSTR)
loopsva 3:1b12fa9dc673 347 {
loopsva 3:1b12fa9dc673 348 i2c_Buf[0] = BQ_CNTL;
loopsva 3:1b12fa9dc673 349 i2c_Buf[1] = 0x30;
loopsva 3:1b12fa9dc673 350 i2c_Buf[2] = 0x00;
loopsva 3:1b12fa9dc673 351 _i2c.write(BQ27220_ADDR, i2c_Buf, 3, false);
loopsva 3:1b12fa9dc673 352 wait_us(66);
loopsva 3:1b12fa9dc673 353 wait_ms(5);
loopsva 3:1b12fa9dc673 354 //Thread::wait(5);
loopsva 3:1b12fa9dc673 355 }
loopsva 3:1b12fa9dc673 356
loopsva 3:1b12fa9dc673 357 void BQ27220::unseal(BQ27220_TypeDef& dataSTR)
loopsva 3:1b12fa9dc673 358 {
loopsva 3:1b12fa9dc673 359 i2c_Buf[0] = BQ_CNTL;
loopsva 3:1b12fa9dc673 360 i2c_Buf[1] = 0x14;
loopsva 3:1b12fa9dc673 361 i2c_Buf[2] = 0x04;
loopsva 3:1b12fa9dc673 362 _i2c.write(BQ27220_ADDR, i2c_Buf, 3, false);
loopsva 3:1b12fa9dc673 363 wait_us(66);
loopsva 3:1b12fa9dc673 364 wait_ms(5);
loopsva 3:1b12fa9dc673 365 //Thread::wait(5);
loopsva 3:1b12fa9dc673 366
loopsva 3:1b12fa9dc673 367 i2c_Buf[0] = BQ_CNTL;
loopsva 3:1b12fa9dc673 368 i2c_Buf[1] = 0x72;
loopsva 3:1b12fa9dc673 369 i2c_Buf[2] = 0x36;
loopsva 3:1b12fa9dc673 370 _i2c.write(BQ27220_ADDR, i2c_Buf, 3, false);
loopsva 3:1b12fa9dc673 371 wait_ms(5);
loopsva 3:1b12fa9dc673 372 //Thread::wait(5);
loopsva 3:1b12fa9dc673 373 }
loopsva 3:1b12fa9dc673 374
loopsva 3:1b12fa9dc673 375 void BQ27220::full_access(BQ27220_TypeDef& dataSTR)
loopsva 3:1b12fa9dc673 376 {
loopsva 3:1b12fa9dc673 377 i2c_Buf[0] = BQ_CNTL;
loopsva 3:1b12fa9dc673 378 i2c_Buf[1] = 0xff;
loopsva 3:1b12fa9dc673 379 i2c_Buf[2] = 0xff;
loopsva 3:1b12fa9dc673 380 _i2c.write(BQ27220_ADDR, i2c_Buf, 3, false);
loopsva 3:1b12fa9dc673 381 wait_us(66);
loopsva 3:1b12fa9dc673 382 wait_ms(5);
loopsva 3:1b12fa9dc673 383 //Thread::wait(5);
loopsva 3:1b12fa9dc673 384
loopsva 3:1b12fa9dc673 385 i2c_Buf[0] = BQ_CNTL;
loopsva 3:1b12fa9dc673 386 i2c_Buf[1] = 0xff;
loopsva 3:1b12fa9dc673 387 i2c_Buf[2] = 0xff;
loopsva 3:1b12fa9dc673 388 _i2c.write(BQ27220_ADDR, i2c_Buf, 3, false);
loopsva 3:1b12fa9dc673 389 wait_us(66);
loopsva 3:1b12fa9dc673 390 wait_ms(5);
loopsva 3:1b12fa9dc673 391 //Thread::wait(5);
loopsva 3:1b12fa9dc673 392 }
loopsva 3:1b12fa9dc673 393
loopsva 3:1b12fa9dc673 394 uint32_t BQ27220::get_dev_id(BQ27220_TypeDef& dataSTR)
loopsva 3:1b12fa9dc673 395 {
loopsva 3:1b12fa9dc673 396 uint16_t dat = get_sub_cmmd(dataSTR, BQ_DEVICE_NUMBER);
loopsva 3:1b12fa9dc673 397 //pc.printf("dat-idq: %04x \r\n", dat);
loopsva 3:1b12fa9dc673 398 if(dat != 0xa5ff) return(dat);
loopsva 3:1b12fa9dc673 399 i2c_Buf[0] = BQ_SUB;
loopsva 3:1b12fa9dc673 400 _i2c.write(BQ27220_ADDR, i2c_Buf, 1, true);
loopsva 3:1b12fa9dc673 401 _i2c.read(BQ27220_ADDR + 1, i2c_Buf, 4, false);
loopsva 3:1b12fa9dc673 402 uint32_t id = (i2c_Buf[0] << 24) | (i2c_Buf[1] << 16) | (i2c_Buf[2] << 8) | i2c_Buf[3];
loopsva 3:1b12fa9dc673 403 //pc.printf("dat-idq: %08x \r\n", id);
loopsva 3:1b12fa9dc673 404 wait_us(66);
loopsva 3:1b12fa9dc673 405 return(id) ;
loopsva 3:1b12fa9dc673 406 }
loopsva 3:1b12fa9dc673 407
loopsva 3:1b12fa9dc673 408 uint32_t BQ27220::get_fw_rev(BQ27220_TypeDef& dataSTR)
loopsva 3:1b12fa9dc673 409 {
loopsva 3:1b12fa9dc673 410 uint16_t dat = get_sub_cmmd(dataSTR, BQ_FW_VERSION);
loopsva 3:1b12fa9dc673 411 //pc.printf("dat-fwq: %04x \r\n", dat);
loopsva 3:1b12fa9dc673 412 if(dat != 0xa5ff) return(dat);
loopsva 3:1b12fa9dc673 413 i2c_Buf[0] = BQ_SUB;
loopsva 3:1b12fa9dc673 414 _i2c.write(BQ27220_ADDR, i2c_Buf, 1, true);
loopsva 3:1b12fa9dc673 415 _i2c.read(BQ27220_ADDR + 1, i2c_Buf, 34, false);
loopsva 3:1b12fa9dc673 416 wait_us(66);
loopsva 3:1b12fa9dc673 417 return (i2c_Buf[0] << 24) | (i2c_Buf[1] << 16) | (i2c_Buf[2] << 8) | i2c_Buf[3];
loopsva 3:1b12fa9dc673 418 }
loopsva 3:1b12fa9dc673 419
loopsva 3:1b12fa9dc673 420 uint32_t BQ27220::get_hw_rev(BQ27220_TypeDef& dataSTR)
loopsva 3:1b12fa9dc673 421 {
loopsva 3:1b12fa9dc673 422 uint16_t dat = get_sub_cmmd(dataSTR, BQ_HW_VERSION);
loopsva 3:1b12fa9dc673 423 //pc.printf("dat-fwq: %04x \r\n", dat);
loopsva 3:1b12fa9dc673 424 if(dat != 0xa5ff) return(dat);
loopsva 3:1b12fa9dc673 425 i2c_Buf[0] = BQ_SUB;
loopsva 3:1b12fa9dc673 426 _i2c.write(BQ27220_ADDR, i2c_Buf, 1, true);
loopsva 3:1b12fa9dc673 427 _i2c.read(BQ27220_ADDR + 1, i2c_Buf, 34, false);
loopsva 3:1b12fa9dc673 428 wait_us(66);
loopsva 3:1b12fa9dc673 429 return (i2c_Buf[0] << 24) | (i2c_Buf[1] << 16) | (i2c_Buf[2] << 8) | i2c_Buf[3];
loopsva 3:1b12fa9dc673 430 }
loopsva 3:1b12fa9dc673 431
loopsva 3:1b12fa9dc673 432 void BQ27220::set_ntc_as_sensor(BQ27220_TypeDef& dataSTR, bool ntc)
loopsva 3:1b12fa9dc673 433 {
loopsva 3:1b12fa9dc673 434 uint16_t res = get_16(dataSTR, BQ_CONFIG_OP_CONFIG_A);
loopsva 3:1b12fa9dc673 435 pc.printf("s_ntc: %04x ", res);
loopsva 3:1b12fa9dc673 436
loopsva 3:1b12fa9dc673 437 if(!(ntc)) {
loopsva 3:1b12fa9dc673 438 pc.printf(" N ");
loopsva 3:1b12fa9dc673 439 res &= ~BQ_BIT_OCA_TEMPS;
loopsva 3:1b12fa9dc673 440 res |= BQ_BIT_OCA_BIE;
loopsva 3:1b12fa9dc673 441
loopsva 3:1b12fa9dc673 442 } else {
loopsva 3:1b12fa9dc673 443 pc.printf(" L ");
loopsva 3:1b12fa9dc673 444 res &= ~BQ_BIT_OCA_BIE;
loopsva 3:1b12fa9dc673 445 res |= BQ_BIT_OCA_TEMPS;
loopsva 3:1b12fa9dc673 446 }
loopsva 3:1b12fa9dc673 447
loopsva 3:1b12fa9dc673 448 pc.printf("new: %04x\r\n", res);
loopsva 3:1b12fa9dc673 449 change_ram_1_2_4(dataSTR, BQ_CONFIG_OP_CONFIG_A - 0x20, (uint32_t)res, 2, true);
loopsva 3:1b12fa9dc673 450 }
loopsva 3:1b12fa9dc673 451 /*
loopsva 3:1b12fa9dc673 452 void BQ27220::set_reg(BQ27220_TypeDef& dataSTR, uint16_t reg, uint16_t da, int byt)
loopsva 3:1b12fa9dc673 453 {
loopsva 3:1b12fa9dc673 454 uint16_t res = get_16(dataSTR, reg);
loopsva 3:1b12fa9dc673 455 change_ram_1_2_4(dataSTR, reg, (uint32_t)da, byt, true);
loopsva 3:1b12fa9dc673 456 }
loopsva 3:1b12fa9dc673 457 */
loopsva 3:1b12fa9dc673 458 /*
loopsva 3:1b12fa9dc673 459 uint16_t BQ27220::get_OS_reg(BQ27220_TypeDef& dataSTR)
loopsva 3:1b12fa9dc673 460 {
loopsva 3:1b12fa9dc673 461 i2c_Buf[0] = BQ_OS;
loopsva 3:1b12fa9dc673 462 _i2c.write(BQ27220_ADDR, i2c_Buf, 1, true);
loopsva 3:1b12fa9dc673 463 _i2c.read(BQ27220_ADDR + 1, i2c_Buf, 2, false);
loopsva 3:1b12fa9dc673 464 wait_us(66);
loopsva 3:1b12fa9dc673 465 dataSTR.osReg = (i2c_Buf[1] << 8) | i2c_Buf[0];
loopsva 3:1b12fa9dc673 466 return(dataSTR.osReg);
loopsva 3:1b12fa9dc673 467 }
loopsva 3:1b12fa9dc673 468 */
loopsva 3:1b12fa9dc673 469
loopsva 2:d52fb7ef7429 470 int BQ27220::read_registers(BQ27220_TypeDef& dataSTR)
loopsva 0:96d5698a376f 471 {
loopsva 2:d52fb7ef7429 472 i2c_Buf[0] = BQ_CNTL;
loopsva 3:1b12fa9dc673 473 int result = _i2c.write(BQ27220_ADDR, i2c_Buf, 1, true);
loopsva 2:d52fb7ef7429 474 if(result) return(result + 0x10);
loopsva 3:1b12fa9dc673 475 result = _i2c.read(BQ27220_ADDR + 1, i2c_Buf, 32, false);
loopsva 2:d52fb7ef7429 476 wait_us(66);
loopsva 2:d52fb7ef7429 477 if(result) return(result + 0x18);
loopsva 3:1b12fa9dc673 478 //Thread::wait(1);
loopsva 2:d52fb7ef7429 479
loopsva 2:d52fb7ef7429 480 dataSTR.cntlReg = (i2c_Buf[BQ_CNTL - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_CNTL - BQ_CNTL];
loopsva 2:d52fb7ef7429 481 dataSTR.arReg = (i2c_Buf[BQ_AR - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_AR - BQ_CNTL];
loopsva 2:d52fb7ef7429 482 dataSTR.artteReg = (i2c_Buf[BQ_ARTTE - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_ARTTE - BQ_CNTL];
loopsva 2:d52fb7ef7429 483 dataSTR.tempReg = (i2c_Buf[BQ_TEMP - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_TEMP - BQ_CNTL];
loopsva 2:d52fb7ef7429 484 dataSTR.voltReg = (i2c_Buf[BQ_VOLT - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_VOLT - BQ_CNTL];
loopsva 2:d52fb7ef7429 485 dataSTR.flagsReg = (i2c_Buf[BQ_FLAGS - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_FLAGS - BQ_CNTL];
loopsva 2:d52fb7ef7429 486 dataSTR.currentReg = (i2c_Buf[BQ_CURRENT - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_CURRENT - BQ_CNTL];
loopsva 2:d52fb7ef7429 487
loopsva 2:d52fb7ef7429 488 dataSTR.rmReg = (i2c_Buf[BQ_RM - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_RM - BQ_CNTL];
loopsva 2:d52fb7ef7429 489 dataSTR.fccReg = (i2c_Buf[BQ_FCC - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_FCC - BQ_CNTL];
loopsva 2:d52fb7ef7429 490 dataSTR.aiReg = (i2c_Buf[BQ_AI - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_AI - BQ_CNTL];
loopsva 2:d52fb7ef7429 491 dataSTR.tteReg = (i2c_Buf[BQ_TTE - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_TTE - BQ_CNTL];
loopsva 2:d52fb7ef7429 492 dataSTR.ttfReg = (i2c_Buf[BQ_TTF - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_TTF - BQ_CNTL];
loopsva 2:d52fb7ef7429 493 dataSTR.siReg = (i2c_Buf[BQ_SI - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_SI - BQ_CNTL];
loopsva 2:d52fb7ef7429 494 dataSTR.stteReg = (i2c_Buf[BQ_STTE - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_STTE - BQ_CNTL];
loopsva 2:d52fb7ef7429 495 dataSTR.mliReg = (i2c_Buf[BQ_MLI - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_MLI - BQ_CNTL];
loopsva 2:d52fb7ef7429 496
loopsva 2:d52fb7ef7429 497 i2c_Buf[0] = BQ_MLTTE;
loopsva 3:1b12fa9dc673 498 result = _i2c.write(BQ27220_ADDR, i2c_Buf, 1, true);
loopsva 3:1b12fa9dc673 499 //if(result) return(result + 0x20);
loopsva 3:1b12fa9dc673 500 result =_i2c.read(BQ27220_ADDR + 1, i2c_Buf, 32, false);
loopsva 2:d52fb7ef7429 501 wait_us(66);
loopsva 3:1b12fa9dc673 502 //Thread::wait(1);
loopsva 3:1b12fa9dc673 503 //if(result) return(result + 0x28);
loopsva 0:96d5698a376f 504
loopsva 2:d52fb7ef7429 505 dataSTR.mltteReg = (i2c_Buf[BQ_MLTTE - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_MLTTE - BQ_MLTTE];
loopsva 2:d52fb7ef7429 506 dataSTR.rawccReg = (i2c_Buf[BQ_RCC - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_RCC - BQ_MLTTE];
loopsva 2:d52fb7ef7429 507 dataSTR.apReg = (i2c_Buf[BQ_AP - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_AP - BQ_MLTTE];
loopsva 2:d52fb7ef7429 508 dataSTR.intTempReg = (i2c_Buf[BQ_INTTEMP - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_INTTEMP - BQ_MLTTE];
loopsva 2:d52fb7ef7429 509 dataSTR.cycReg = (i2c_Buf[BQ_CYC - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_CYC - BQ_MLTTE];
loopsva 2:d52fb7ef7429 510 dataSTR.socReg = (i2c_Buf[BQ_SOC - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_SOC - BQ_MLTTE];
loopsva 2:d52fb7ef7429 511 dataSTR.sohReg = (i2c_Buf[BQ_SOH - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_SOH - BQ_MLTTE];
loopsva 2:d52fb7ef7429 512
loopsva 2:d52fb7ef7429 513 dataSTR.cvReg = (i2c_Buf[BQ_CV - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_CV - BQ_MLTTE];
loopsva 2:d52fb7ef7429 514 dataSTR.ccReg = (i2c_Buf[BQ_CC - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_CC - BQ_MLTTE];
loopsva 2:d52fb7ef7429 515 dataSTR.btpdReg = (i2c_Buf[BQ_BTPD - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_BTPD - BQ_MLTTE];
loopsva 2:d52fb7ef7429 516 dataSTR.btpcReg = (i2c_Buf[BQ_BTPC - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_BTPC - BQ_MLTTE];
loopsva 2:d52fb7ef7429 517 dataSTR.osReg = (i2c_Buf[BQ_OS - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_OS - BQ_MLTTE];
loopsva 2:d52fb7ef7429 518 dataSTR.dcReg = (i2c_Buf[BQ_DC - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_DC - BQ_MLTTE];
loopsva 3:1b12fa9dc673 519 dataSTR.subReg = (i2c_Buf[BQ_SUB - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_SUB - BQ_MLTTE];
loopsva 2:d52fb7ef7429 520
loopsva 2:d52fb7ef7429 521 i2c_Buf[0] = BQ_MACDATA;
loopsva 3:1b12fa9dc673 522 result = _i2c.write(BQ27220_ADDR, i2c_Buf, 1, true);
loopsva 3:1b12fa9dc673 523 //if(result) return(result + 0x30);
loopsva 3:1b12fa9dc673 524 result =_i2c.read(BQ27220_ADDR + 1, i2c_Buf, 32, false);
loopsva 2:d52fb7ef7429 525 wait_us(66);
loopsva 3:1b12fa9dc673 526 //Thread::wait(1);
loopsva 3:1b12fa9dc673 527 //if(result) return(result + 0x38);
loopsva 2:d52fb7ef7429 528
loopsva 2:d52fb7ef7429 529 for(int i = 0; i < 32; i++) {
loopsva 2:d52fb7ef7429 530 dataSTR.macData[i] = i2c_Buf[i];
loopsva 2:d52fb7ef7429 531 }
loopsva 2:d52fb7ef7429 532
loopsva 2:d52fb7ef7429 533 i2c_Buf[0] = BQ_MACDATASUM;
loopsva 3:1b12fa9dc673 534 result = _i2c.write(BQ27220_ADDR, i2c_Buf, 1, true);
loopsva 3:1b12fa9dc673 535 //if(result) return(result + 0x40);
loopsva 3:1b12fa9dc673 536 result =_i2c.read(BQ27220_ADDR + 1, i2c_Buf, 32, false);
loopsva 2:d52fb7ef7429 537 wait_us(66);
loopsva 3:1b12fa9dc673 538 //Thread::wait(1);
loopsva 3:1b12fa9dc673 539 //if(result) return(result + 0x48);
loopsva 2:d52fb7ef7429 540
loopsva 2:d52fb7ef7429 541 dataSTR.macSumReg = (i2c_Buf[BQ_MACDATASUM - BQ_MACDATASUM + 1] << 8) | i2c_Buf[BQ_MACDATASUM - BQ_MACDATASUM];
loopsva 2:d52fb7ef7429 542 dataSTR.macLenReg = (i2c_Buf[BQ_MACDATALEN - BQ_MACDATASUM + 1] << 8) | i2c_Buf[BQ_MACDATALEN - BQ_MACDATASUM];
loopsva 2:d52fb7ef7429 543 dataSTR.anacReg = i2c_Buf[BQ_ANACNT - BQ_MACDATASUM];
loopsva 2:d52fb7ef7429 544 dataSTR.rawcReg = (i2c_Buf[BQ_RAWC - BQ_MACDATASUM + 1] << 8) | i2c_Buf[BQ_RAWC - BQ_MACDATASUM];
loopsva 2:d52fb7ef7429 545 dataSTR.rawvReg = (i2c_Buf[BQ_RAWV - BQ_MACDATASUM + 1] << 8) | i2c_Buf[BQ_RAWV - BQ_MACDATASUM];
loopsva 2:d52fb7ef7429 546 dataSTR.rawtReg = (i2c_Buf[BQ_RAWT - BQ_MACDATASUM + 1] << 8) | i2c_Buf[BQ_RAWT - BQ_MACDATASUM];
loopsva 2:d52fb7ef7429 547
loopsva 0:96d5698a376f 548 return(0);
loopsva 0:96d5698a376f 549 }