TI BQ27220 I2C based, battery State of Charge and Coulomb Counter
Fork of bq27210 by
bq27220.cpp@3:1b12fa9dc673, 2017-07-31 (annotated)
- 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?
User | Revision | Line number | New 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 | } |