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

Fork of bq27210 by Kevin Braun

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers bq27220.cpp Source File

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 }