TI BQ27220 I2C based, battery State of Charge and Coulomb Counter
Fork of bq27210 by
bq27220.cpp
00001 #include "mbed.h" 00002 #include "rtos.h" 00003 #include "bq27220.h" 00004 00005 extern RawSerial pc; 00006 00007 #define i2c_Buf dataSTR.i2c_Bufx 00008 00009 00010 BQ27220::BQ27220(PinName p_sda, PinName p_scl) : 00011 _i2c(p_sda, p_scl) 00012 { 00013 _i2c.frequency(100000); 00014 } 00015 00016 BQ27220::BQ27220(PinName p_sda, PinName p_scl, int freq) : 00017 _i2c(p_sda, p_scl) 00018 { 00019 _i2c.frequency(freq); 00020 } 00021 00022 void BQ27220::default_init(BQ27220_TypeDef& dataSTR) 00023 { 00024 dataSTR.shunt_res = BQ_SHUNT_RESISTOR; 00025 } 00026 00027 int BQ27220::new_battery_init(BQ27220_TypeDef& dataSTR) 00028 { 00029 return(0); 00030 } 00031 00032 uint16_t BQ27220::get_sub_cmmd(BQ27220_TypeDef& dataSTR, uint16_t cmmd) 00033 { 00034 i2c_Buf[0] = BQ_CNTL; 00035 i2c_Buf[2] = cmmd >> 8; 00036 i2c_Buf[1] = cmmd & 255; 00037 _i2c.write(BQ27220_ADDR, i2c_Buf, 3, false); 00038 Thread::wait(5); // needs large delay here 00039 //pc.printf("sub-a: %02x %02x %02x %02x \r\n", i2c_Buf[0], i2c_Buf[1], i2c_Buf[2], i2c_Buf[3]); 00040 int i = 0; 00041 for(i = 0; i < 100; i++) { 00042 wait_us(66); 00043 _i2c.write(BQ27220_ADDR, i2c_Buf, 1, true); 00044 _i2c.read(BQ27220_ADDR + 1, i2c_Buf, 4, false); 00045 //pc.printf("sub-b: %02x %02x %02x %02x \r\n", i2c_Buf[0], i2c_Buf[1], i2c_Buf[2], i2c_Buf[3]); 00046 if((i2c_Buf[0]== 0xa5) && (i2c_Buf[1] == 0xff)) break; 00047 } 00048 wait_us(66); 00049 if(i > 98) pc.printf("sub-b: ERROR \r\n"); 00050 return (i2c_Buf[0] << 8) | i2c_Buf[1]; 00051 } 00052 00053 uint16_t BQ27220::get_sub_cmmd_s(BQ27220_TypeDef& dataSTR, uint16_t cmmd) 00054 { 00055 i2c_Buf[0] = BQ_CNTL; 00056 i2c_Buf[2] = cmmd >> 8; 00057 i2c_Buf[1] = cmmd & 255; 00058 //pc.printf("sub-a: %02x %02x %02x \r\n", i2c_Buf[0], i2c_Buf[1], i2c_Buf[2]); 00059 _i2c.write(BQ27220_ADDR, i2c_Buf, 3, false); 00060 wait_us(1066); 00061 i2c_Buf[0] = BQ_MACDATA; 00062 _i2c.write(BQ27220_ADDR, i2c_Buf, 1, true); 00063 _i2c.read(BQ27220_ADDR + 1, i2c_Buf, 2, false); 00064 wait_us(66); 00065 //pc.printf("sub-b: %04x \r\n", (i2c_Buf[0] << 8) | i2c_Buf[1]); 00066 return (i2c_Buf[0] << 8) | i2c_Buf[1]; 00067 } 00068 00069 uint16_t BQ27220::get_reg_2B(BQ27220_TypeDef& dataSTR, uint8_t reg) 00070 { 00071 i2c_Buf[0] = reg; 00072 _i2c.write(BQ27220_ADDR, i2c_Buf, 1, true); 00073 _i2c.read(BQ27220_ADDR + 1, i2c_Buf, 2, false); 00074 //pc.printf("sub-b: %02x %02x %02x %02x \r\n", i2c_Buf[0], i2c_Buf[1], i2c_Buf[2], i2c_Buf[3]); 00075 wait_us(66); 00076 //Thread::wait(2); 00077 return (i2c_Buf[1] << 8) | i2c_Buf[0]; 00078 } 00079 00080 void BQ27220::enter_cfg_update(BQ27220_TypeDef& dataSTR) 00081 { 00082 i2c_Buf[0] = BQ_CNTL; 00083 i2c_Buf[1] = 0x90; 00084 i2c_Buf[2] = 0x00; 00085 _i2c.write(BQ27220_ADDR, i2c_Buf, 3, false); 00086 wait_us(66); 00087 Thread::wait(1500); 00088 } 00089 00090 void BQ27220::exitCfgUpdateExit(BQ27220_TypeDef& dataSTR) 00091 { 00092 i2c_Buf[0] = BQ_CNTL; 00093 i2c_Buf[1] = BQ_EXIT_CFG_UPDATE & 255; 00094 i2c_Buf[2] = BQ_EXIT_CFG_UPDATE >> 8; 00095 pc.printf("exitCfg_cmmd: -> "); 00096 for(int i = 0; i < 3; i++) pc.printf("%02x ",i2c_Buf[i]); 00097 pc.printf("\r\n"); 00098 _i2c.write(BQ27220_ADDR, i2c_Buf, 3, false); 00099 wait_us(66); 00100 Thread::wait(5); 00101 } 00102 00103 void BQ27220::exitCfgUpdateReInit(BQ27220_TypeDef& dataSTR) 00104 { 00105 i2c_Buf[0] = BQ_CNTL; 00106 i2c_Buf[1] = BQ_EXIT_CFG_UPDATE_REINIT & 255; 00107 i2c_Buf[2] = BQ_EXIT_CFG_UPDATE_REINIT >> 8; 00108 pc.printf("exitInit_cmmd: -> "); 00109 for(int i = 0; i < 3; i++) pc.printf("%02x ",i2c_Buf[i]); 00110 pc.printf("\r\n"); 00111 _i2c.write(BQ27220_ADDR, i2c_Buf, 3, false); 00112 wait_us(66); 00113 Thread::wait(5); 00114 } 00115 00116 00117 void BQ27220::reset(BQ27220_TypeDef& dataSTR) 00118 { 00119 i2c_Buf[0] = BQ_CNTL; 00120 i2c_Buf[1] = BQ_RESET & 255; 00121 i2c_Buf[2] = BQ_RESET >> 8; 00122 pc.printf("reset_cmmd: -> "); 00123 for(int i = 0; i < 3; i++) pc.printf("%02x ",i2c_Buf[i]); 00124 pc.printf("\r\n"); 00125 _i2c.write(BQ27220_ADDR, i2c_Buf, 3, false); 00126 wait_us(66); 00127 Thread::wait(5); 00128 } 00129 00130 void BQ27220::useProfile_1(BQ27220_TypeDef& dataSTR) 00131 { 00132 i2c_Buf[0] = BQ_CNTL; 00133 i2c_Buf[1] = BQ_SET_PROFILE_1 >> 8; 00134 i2c_Buf[2] = BQ_SET_PROFILE_1 & 255;; 00135 pc.printf("Profile_1_cmmd: -> "); 00136 for(int i = 0; i < 3; i++) pc.printf("%02x ",i2c_Buf[i]); 00137 pc.printf("\r\n"); 00138 _i2c.write(BQ27220_ADDR, i2c_Buf, 3, false); 00139 wait_us(66); 00140 Thread::wait(200); 00141 } 00142 00143 uint16_t BQ27220::get_cs_len(BQ27220_TypeDef& dataSTR, bool pf) 00144 { 00145 i2c_Buf[0] = BQ_MACDATASUM; 00146 _i2c.write(BQ27220_ADDR, i2c_Buf, 1, true); 00147 _i2c.read(BQ27220_ADDR + 1, i2c_Buf, 1, false); 00148 wait_us(66); 00149 //Thread::wait(5); 00150 uint16_t csl = i2c_Buf[0]; 00151 00152 i2c_Buf[0] = BQ_MACDATALEN; 00153 _i2c.write(BQ27220_ADDR, i2c_Buf, 1, true); 00154 _i2c.read(BQ27220_ADDR + 1, i2c_Buf, 1, false); 00155 wait_us(66); 00156 //Thread::wait(5); 00157 csl = (csl << 8) | i2c_Buf[0]; 00158 if(pf) pc.printf("get_cs: %02x\r\n", csl >> 8); 00159 if(pf) pc.printf("get_ln: %02x\r\n", csl & 255); 00160 return(csl); 00161 } 00162 00163 uint8_t BQ27220::calc_checksum_rx(BQ27220_TypeDef& dataSTR, int length) 00164 { 00165 uint8_t cs = 0; 00166 //pc.printf("c_csum_rx_len: %02x -> ", length); 00167 i2c_Buf[0] = BQ_SUB; 00168 _i2c.write(BQ27220_ADDR, i2c_Buf, 1, true); 00169 _i2c.read(BQ27220_ADDR + 1, i2c_Buf, 34, false); 00170 wait_us(66); 00171 Thread::wait(5); 00172 for(int i = 0; i < length + 2; i++) { 00173 cs += i2c_Buf[i]; 00174 //pc.printf("b: %02x cs: %02x ", i2c_Buf[i], cs); 00175 } 00176 cs = 255 - cs; 00177 //pc.printf("cs_rx:%02x \r\n", cs); 00178 return (cs); 00179 } 00180 00181 uint8_t BQ27220::calc_checksum_tx(BQ27220_TypeDef& dataSTR, int length) 00182 { 00183 uint8_t cs = 0; 00184 pc.printf("cs_tx_len: %02x -> ", length); 00185 for(int i = 0; i < length + 2; i++) { 00186 cs += i2c_Buf[i + 1]; 00187 //pc.printf("i2c: %02x cs: %02x ", i2c_Buf[i + 1], cs); 00188 pc.printf("%02x ", i2c_Buf[i + 1]); 00189 } 00190 cs = 255 - cs; 00191 pc.printf("\r\ncs_tx: %02x\r\n", cs); 00192 return (cs); 00193 } 00194 00195 uint32_t BQ27220::get_data_32(BQ27220_TypeDef& dataSTR, uint16_t sub_cmmd, int length) 00196 { 00197 i2c_Buf[0] = BQ_SUB; 00198 i2c_Buf[2] = sub_cmmd >> 8; 00199 i2c_Buf[1] = sub_cmmd & 255; 00200 dataSTR.subReg = sub_cmmd; 00201 //pc.printf("dat-32a: %02x %02x %02x \r\n", i2c_Buf[0], i2c_Buf[1], i2c_Buf[2]); 00202 _i2c.write(BQ27220_ADDR, i2c_Buf, 3, false); 00203 wait_us(3066); 00204 //Thread::wait(3); //needs to be at least 2 00205 00206 dataSTR.checksum = calc_checksum_rx(dataSTR, length); 00207 00208 uint16_t cslen = get_cs_len(dataSTR, false); 00209 dataSTR.macSumReg = cslen >> 8; 00210 dataSTR.macLenReg = cslen & 255; 00211 00212 i2c_Buf[0] = BQ_MACDATA; 00213 _i2c.write(BQ27220_ADDR, i2c_Buf, 1, true); 00214 _i2c.read(BQ27220_ADDR + 1, i2c_Buf, length, false); 00215 wait_us(5066); 00216 //Thread::wait(5); //seems to work down to 1 00217 for(int i = 0; i < length; i++) { 00218 dataSTR.macData[i] = dataSTR.i2c_Bufx[i]; 00219 pc.printf("%02x,", dataSTR.macData[i]); 00220 } 00221 pc.printf("\r\n"); 00222 //pc.printf(" mdl: %02x, mdcs: %02x, ccs: %02x\r\n", dataSTR.macLenReg, dataSTR.macSumReg, dataSTR.checksum); 00223 return ((uint32_t)dataSTR.subReg); 00224 } 00225 00226 //#define BQ_SHORT 1 00227 00228 void BQ27220::change_ram_1_2_4(BQ27220_TypeDef& dataSTR, uint16_t sub_cmmd, uint32_t value, int qty, bool pre) 00229 { 00230 if(pre) { 00231 #ifndef BQ_SHORT 00232 pc.printf("ram124_a: %04x -> ", sub_cmmd); 00233 get_data_32(dataSTR, sub_cmmd, 32); 00234 #endif 00235 00236 if(qty == 1) { 00237 dataSTR.macData[0] = value & 255; 00238 #ifdef BQ_SHORT 00239 dataSTR.macData[1] = 0; 00240 dataSTR.macData[2] = 0; 00241 dataSTR.macData[3] = 0; 00242 #endif 00243 } else 00244 if(qty == 2) { 00245 dataSTR.macData[0] = (value >> 8) & 255; 00246 dataSTR.macData[1] = value & 255; 00247 #ifdef BQ_SHORT 00248 dataSTR.macData[2] = 0; 00249 dataSTR.macData[3] = 0; 00250 #endif 00251 } else 00252 if(qty == 4) { 00253 dataSTR.macData[0] = (value >> 24) & 255; 00254 dataSTR.macData[1] = (value >> 16) & 255; 00255 dataSTR.macData[2] = (value >> 8) & 255; 00256 dataSTR.macData[3] = value & 255; 00257 } else { 00258 pc.printf("ram124_q_error\r\n"); 00259 return; 00260 } 00261 } 00262 00263 i2c_Buf[0] = BQ_SUB; 00264 i2c_Buf[1] = sub_cmmd >> 8; 00265 i2c_Buf[2] = sub_cmmd & 255; 00266 if(pre) { 00267 i2c_Buf[3] = dataSTR.macData[0]; 00268 i2c_Buf[4] = dataSTR.macData[1]; 00269 i2c_Buf[5] = dataSTR.macData[2]; 00270 i2c_Buf[6] = dataSTR.macData[3]; 00271 } 00272 pc.printf("ram124_cmmd: -> "); 00273 int i = 0; 00274 #ifdef BQ_SHORT 00275 for(i = 0; i < qty + 3; i++) pc.printf("%02x ",i2c_Buf[i]); 00276 pc.printf("\r\n"); 00277 uint8_t x = calc_checksum_tx(dataSTR, qty); 00278 _i2c.write(BQ27220_ADDR, i2c_Buf, qty + 3, false); 00279 #else 00280 for(i = 0; i < 32; i++) i2c_Buf[i + 3] = dataSTR.macData[i]; 00281 for(i = 0; i < 35; i++) pc.printf("%02x ",i2c_Buf[i]); 00282 pc.printf("\r\n"); 00283 uint8_t x = calc_checksum_tx(dataSTR, 32); 00284 _i2c.write(BQ27220_ADDR, i2c_Buf, 35, false); 00285 #endif 00286 wait_us(66); 00287 //Thread::wait(5); 00288 00289 i2c_Buf[0] = BQ_MACDATASUM; 00290 i2c_Buf[1] = x; 00291 #ifndef BQ_SHORT 00292 i2c_Buf[1] -= 0x20; //why is this???? !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 00293 if((sub_cmmd >= 0x91e0) && (sub_cmmd < BQ_CONFIG_TAPER_CURR)) i2c_Buf[1]--; 00294 #endif 00295 pc.printf("ram124_cs: -> "); 00296 for(i = 0; i < 2; i++) pc.printf("%02x ",i2c_Buf[i]); 00297 pc.printf("\r\n"); 00298 _i2c.write(BQ27220_ADDR, i2c_Buf, 2, false); 00299 wait_us(66); 00300 //Thread::wait(5); 00301 00302 i2c_Buf[0] = BQ_MACDATALEN; 00303 #ifdef BQ_SHORT 00304 i2c_Buf[1] = qty + 4; 00305 #else 00306 i2c_Buf[1] = 36; 00307 #endif 00308 pc.printf("ram124_len: -> "); 00309 for(i = 0; i < 2; i++) pc.printf("%02x ",i2c_Buf[i]); 00310 pc.printf("\r\n"); 00311 _i2c.write(BQ27220_ADDR, i2c_Buf, 2, false); 00312 wait_us(5066); 00313 //Thread::wait(200); 00314 00315 get_cs_len(dataSTR, true); 00316 //pc.printf("\r\n"); 00317 00318 #ifndef BQ_SHORT 00319 pc.printf("ram124_x: %04x -> ", sub_cmmd); 00320 get_data_32(dataSTR, sub_cmmd, 32); 00321 pc.printf("\r\n"); 00322 #endif 00323 } 00324 00325 uint16_t BQ27220::get_16(BQ27220_TypeDef& dataSTR, uint16_t cmmd) 00326 { 00327 get_sub_cmmd_s(dataSTR, cmmd); 00328 i2c_Buf[0] = BQ_MACDATA; 00329 _i2c.write(BQ27220_ADDR, i2c_Buf, 1, true); 00330 _i2c.read(BQ27220_ADDR + 1, i2c_Buf, 2, false); 00331 wait_us(66); 00332 return (i2c_Buf[0] << 8) | i2c_Buf[1]; 00333 } 00334 00335 uint8_t BQ27220::get_8(BQ27220_TypeDef& dataSTR, uint16_t cmmd) 00336 { 00337 //pc.printf("get_8: %04x\r\n", cmmd); 00338 get_sub_cmmd_s(dataSTR, cmmd); 00339 i2c_Buf[0] = BQ_MACDATA; 00340 _i2c.write(BQ27220_ADDR, i2c_Buf, 1, true); 00341 _i2c.read(BQ27220_ADDR + 1, i2c_Buf, 1, false); 00342 wait_us(66); 00343 return i2c_Buf[0]; 00344 } 00345 00346 void BQ27220::seal(BQ27220_TypeDef& dataSTR) 00347 { 00348 i2c_Buf[0] = BQ_CNTL; 00349 i2c_Buf[1] = 0x30; 00350 i2c_Buf[2] = 0x00; 00351 _i2c.write(BQ27220_ADDR, i2c_Buf, 3, false); 00352 wait_us(66); 00353 wait_ms(5); 00354 //Thread::wait(5); 00355 } 00356 00357 void BQ27220::unseal(BQ27220_TypeDef& dataSTR) 00358 { 00359 i2c_Buf[0] = BQ_CNTL; 00360 i2c_Buf[1] = 0x14; 00361 i2c_Buf[2] = 0x04; 00362 _i2c.write(BQ27220_ADDR, i2c_Buf, 3, false); 00363 wait_us(66); 00364 wait_ms(5); 00365 //Thread::wait(5); 00366 00367 i2c_Buf[0] = BQ_CNTL; 00368 i2c_Buf[1] = 0x72; 00369 i2c_Buf[2] = 0x36; 00370 _i2c.write(BQ27220_ADDR, i2c_Buf, 3, false); 00371 wait_ms(5); 00372 //Thread::wait(5); 00373 } 00374 00375 void BQ27220::full_access(BQ27220_TypeDef& dataSTR) 00376 { 00377 i2c_Buf[0] = BQ_CNTL; 00378 i2c_Buf[1] = 0xff; 00379 i2c_Buf[2] = 0xff; 00380 _i2c.write(BQ27220_ADDR, i2c_Buf, 3, false); 00381 wait_us(66); 00382 wait_ms(5); 00383 //Thread::wait(5); 00384 00385 i2c_Buf[0] = BQ_CNTL; 00386 i2c_Buf[1] = 0xff; 00387 i2c_Buf[2] = 0xff; 00388 _i2c.write(BQ27220_ADDR, i2c_Buf, 3, false); 00389 wait_us(66); 00390 wait_ms(5); 00391 //Thread::wait(5); 00392 } 00393 00394 uint32_t BQ27220::get_dev_id(BQ27220_TypeDef& dataSTR) 00395 { 00396 uint16_t dat = get_sub_cmmd(dataSTR, BQ_DEVICE_NUMBER); 00397 //pc.printf("dat-idq: %04x \r\n", dat); 00398 if(dat != 0xa5ff) return(dat); 00399 i2c_Buf[0] = BQ_SUB; 00400 _i2c.write(BQ27220_ADDR, i2c_Buf, 1, true); 00401 _i2c.read(BQ27220_ADDR + 1, i2c_Buf, 4, false); 00402 uint32_t id = (i2c_Buf[0] << 24) | (i2c_Buf[1] << 16) | (i2c_Buf[2] << 8) | i2c_Buf[3]; 00403 //pc.printf("dat-idq: %08x \r\n", id); 00404 wait_us(66); 00405 return(id) ; 00406 } 00407 00408 uint32_t BQ27220::get_fw_rev(BQ27220_TypeDef& dataSTR) 00409 { 00410 uint16_t dat = get_sub_cmmd(dataSTR, BQ_FW_VERSION); 00411 //pc.printf("dat-fwq: %04x \r\n", dat); 00412 if(dat != 0xa5ff) return(dat); 00413 i2c_Buf[0] = BQ_SUB; 00414 _i2c.write(BQ27220_ADDR, i2c_Buf, 1, true); 00415 _i2c.read(BQ27220_ADDR + 1, i2c_Buf, 34, false); 00416 wait_us(66); 00417 return (i2c_Buf[0] << 24) | (i2c_Buf[1] << 16) | (i2c_Buf[2] << 8) | i2c_Buf[3]; 00418 } 00419 00420 uint32_t BQ27220::get_hw_rev(BQ27220_TypeDef& dataSTR) 00421 { 00422 uint16_t dat = get_sub_cmmd(dataSTR, BQ_HW_VERSION); 00423 //pc.printf("dat-fwq: %04x \r\n", dat); 00424 if(dat != 0xa5ff) return(dat); 00425 i2c_Buf[0] = BQ_SUB; 00426 _i2c.write(BQ27220_ADDR, i2c_Buf, 1, true); 00427 _i2c.read(BQ27220_ADDR + 1, i2c_Buf, 34, false); 00428 wait_us(66); 00429 return (i2c_Buf[0] << 24) | (i2c_Buf[1] << 16) | (i2c_Buf[2] << 8) | i2c_Buf[3]; 00430 } 00431 00432 void BQ27220::set_ntc_as_sensor(BQ27220_TypeDef& dataSTR, bool ntc) 00433 { 00434 uint16_t res = get_16(dataSTR, BQ_CONFIG_OP_CONFIG_A); 00435 pc.printf("s_ntc: %04x ", res); 00436 00437 if(!(ntc)) { 00438 pc.printf(" N "); 00439 res &= ~BQ_BIT_OCA_TEMPS; 00440 res |= BQ_BIT_OCA_BIE; 00441 00442 } else { 00443 pc.printf(" L "); 00444 res &= ~BQ_BIT_OCA_BIE; 00445 res |= BQ_BIT_OCA_TEMPS; 00446 } 00447 00448 pc.printf("new: %04x\r\n", res); 00449 change_ram_1_2_4(dataSTR, BQ_CONFIG_OP_CONFIG_A - 0x20, (uint32_t)res, 2, true); 00450 } 00451 /* 00452 void BQ27220::set_reg(BQ27220_TypeDef& dataSTR, uint16_t reg, uint16_t da, int byt) 00453 { 00454 uint16_t res = get_16(dataSTR, reg); 00455 change_ram_1_2_4(dataSTR, reg, (uint32_t)da, byt, true); 00456 } 00457 */ 00458 /* 00459 uint16_t BQ27220::get_OS_reg(BQ27220_TypeDef& dataSTR) 00460 { 00461 i2c_Buf[0] = BQ_OS; 00462 _i2c.write(BQ27220_ADDR, i2c_Buf, 1, true); 00463 _i2c.read(BQ27220_ADDR + 1, i2c_Buf, 2, false); 00464 wait_us(66); 00465 dataSTR.osReg = (i2c_Buf[1] << 8) | i2c_Buf[0]; 00466 return(dataSTR.osReg); 00467 } 00468 */ 00469 00470 int BQ27220::read_registers(BQ27220_TypeDef& dataSTR) 00471 { 00472 i2c_Buf[0] = BQ_CNTL; 00473 int result = _i2c.write(BQ27220_ADDR, i2c_Buf, 1, true); 00474 if(result) return(result + 0x10); 00475 result = _i2c.read(BQ27220_ADDR + 1, i2c_Buf, 32, false); 00476 wait_us(66); 00477 if(result) return(result + 0x18); 00478 //Thread::wait(1); 00479 00480 dataSTR.cntlReg = (i2c_Buf[BQ_CNTL - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_CNTL - BQ_CNTL]; 00481 dataSTR.arReg = (i2c_Buf[BQ_AR - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_AR - BQ_CNTL]; 00482 dataSTR.artteReg = (i2c_Buf[BQ_ARTTE - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_ARTTE - BQ_CNTL]; 00483 dataSTR.tempReg = (i2c_Buf[BQ_TEMP - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_TEMP - BQ_CNTL]; 00484 dataSTR.voltReg = (i2c_Buf[BQ_VOLT - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_VOLT - BQ_CNTL]; 00485 dataSTR.flagsReg = (i2c_Buf[BQ_FLAGS - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_FLAGS - BQ_CNTL]; 00486 dataSTR.currentReg = (i2c_Buf[BQ_CURRENT - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_CURRENT - BQ_CNTL]; 00487 00488 dataSTR.rmReg = (i2c_Buf[BQ_RM - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_RM - BQ_CNTL]; 00489 dataSTR.fccReg = (i2c_Buf[BQ_FCC - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_FCC - BQ_CNTL]; 00490 dataSTR.aiReg = (i2c_Buf[BQ_AI - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_AI - BQ_CNTL]; 00491 dataSTR.tteReg = (i2c_Buf[BQ_TTE - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_TTE - BQ_CNTL]; 00492 dataSTR.ttfReg = (i2c_Buf[BQ_TTF - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_TTF - BQ_CNTL]; 00493 dataSTR.siReg = (i2c_Buf[BQ_SI - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_SI - BQ_CNTL]; 00494 dataSTR.stteReg = (i2c_Buf[BQ_STTE - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_STTE - BQ_CNTL]; 00495 dataSTR.mliReg = (i2c_Buf[BQ_MLI - BQ_CNTL + 1] << 8) | i2c_Buf[BQ_MLI - BQ_CNTL]; 00496 00497 i2c_Buf[0] = BQ_MLTTE; 00498 result = _i2c.write(BQ27220_ADDR, i2c_Buf, 1, true); 00499 //if(result) return(result + 0x20); 00500 result =_i2c.read(BQ27220_ADDR + 1, i2c_Buf, 32, false); 00501 wait_us(66); 00502 //Thread::wait(1); 00503 //if(result) return(result + 0x28); 00504 00505 dataSTR.mltteReg = (i2c_Buf[BQ_MLTTE - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_MLTTE - BQ_MLTTE]; 00506 dataSTR.rawccReg = (i2c_Buf[BQ_RCC - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_RCC - BQ_MLTTE]; 00507 dataSTR.apReg = (i2c_Buf[BQ_AP - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_AP - BQ_MLTTE]; 00508 dataSTR.intTempReg = (i2c_Buf[BQ_INTTEMP - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_INTTEMP - BQ_MLTTE]; 00509 dataSTR.cycReg = (i2c_Buf[BQ_CYC - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_CYC - BQ_MLTTE]; 00510 dataSTR.socReg = (i2c_Buf[BQ_SOC - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_SOC - BQ_MLTTE]; 00511 dataSTR.sohReg = (i2c_Buf[BQ_SOH - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_SOH - BQ_MLTTE]; 00512 00513 dataSTR.cvReg = (i2c_Buf[BQ_CV - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_CV - BQ_MLTTE]; 00514 dataSTR.ccReg = (i2c_Buf[BQ_CC - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_CC - BQ_MLTTE]; 00515 dataSTR.btpdReg = (i2c_Buf[BQ_BTPD - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_BTPD - BQ_MLTTE]; 00516 dataSTR.btpcReg = (i2c_Buf[BQ_BTPC - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_BTPC - BQ_MLTTE]; 00517 dataSTR.osReg = (i2c_Buf[BQ_OS - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_OS - BQ_MLTTE]; 00518 dataSTR.dcReg = (i2c_Buf[BQ_DC - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_DC - BQ_MLTTE]; 00519 dataSTR.subReg = (i2c_Buf[BQ_SUB - BQ_MLTTE + 1] << 8) | i2c_Buf[BQ_SUB - BQ_MLTTE]; 00520 00521 i2c_Buf[0] = BQ_MACDATA; 00522 result = _i2c.write(BQ27220_ADDR, i2c_Buf, 1, true); 00523 //if(result) return(result + 0x30); 00524 result =_i2c.read(BQ27220_ADDR + 1, i2c_Buf, 32, false); 00525 wait_us(66); 00526 //Thread::wait(1); 00527 //if(result) return(result + 0x38); 00528 00529 for(int i = 0; i < 32; i++) { 00530 dataSTR.macData[i] = i2c_Buf[i]; 00531 } 00532 00533 i2c_Buf[0] = BQ_MACDATASUM; 00534 result = _i2c.write(BQ27220_ADDR, i2c_Buf, 1, true); 00535 //if(result) return(result + 0x40); 00536 result =_i2c.read(BQ27220_ADDR + 1, i2c_Buf, 32, false); 00537 wait_us(66); 00538 //Thread::wait(1); 00539 //if(result) return(result + 0x48); 00540 00541 dataSTR.macSumReg = (i2c_Buf[BQ_MACDATASUM - BQ_MACDATASUM + 1] << 8) | i2c_Buf[BQ_MACDATASUM - BQ_MACDATASUM]; 00542 dataSTR.macLenReg = (i2c_Buf[BQ_MACDATALEN - BQ_MACDATASUM + 1] << 8) | i2c_Buf[BQ_MACDATALEN - BQ_MACDATASUM]; 00543 dataSTR.anacReg = i2c_Buf[BQ_ANACNT - BQ_MACDATASUM]; 00544 dataSTR.rawcReg = (i2c_Buf[BQ_RAWC - BQ_MACDATASUM + 1] << 8) | i2c_Buf[BQ_RAWC - BQ_MACDATASUM]; 00545 dataSTR.rawvReg = (i2c_Buf[BQ_RAWV - BQ_MACDATASUM + 1] << 8) | i2c_Buf[BQ_RAWV - BQ_MACDATASUM]; 00546 dataSTR.rawtReg = (i2c_Buf[BQ_RAWT - BQ_MACDATASUM + 1] << 8) | i2c_Buf[BQ_RAWT - BQ_MACDATASUM]; 00547 00548 return(0); 00549 }
Generated on Sat Jul 16 2022 02:21:26 by 1.7.2