This is a library for the MAX17055 Li+ Battery Fuel Gauge.

Dependents:   Low_Power_Long_Distance_IR_Vision_Robot MAX17055_EZconfig MAX17055_EZconfig_Sample Low_Power_Long_Distance_IR_Vision_Robot

Fork of max17055 by Maxim Integrated

Committer:
fneirab
Date:
Tue Sep 26 00:15:04 2017 +0000
Revision:
3:f77a8345b0e3
Parent:
2:ff7db397b70f
Child:
4:a4d6ae2182c2
safety commit save from office work.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fneirab 0:80c39eb8f3ba 1 /*******************************************************************************
fneirab 0:80c39eb8f3ba 2 * Copyright (C) 2017 Maxim Integrated Products, Inc., All Rights Reserved.
fneirab 0:80c39eb8f3ba 3 *
fneirab 0:80c39eb8f3ba 4 * Permission is hereby granted, free of charge, to any person obtaining a
fneirab 0:80c39eb8f3ba 5 * copy of this software and associated documentation files (the "Software"),
fneirab 0:80c39eb8f3ba 6 * to deal in the Software without restriction, including without limitation
fneirab 0:80c39eb8f3ba 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
fneirab 0:80c39eb8f3ba 8 * and/or sell copies of the Software, and to permit persons to whom the
fneirab 0:80c39eb8f3ba 9 * Software is furnished to do so, subject to the following conditions:
fneirab 0:80c39eb8f3ba 10 *
fneirab 0:80c39eb8f3ba 11 * The above copyright notice and this permission notice shall be included
fneirab 0:80c39eb8f3ba 12 * in all copies or substantial portions of the Software.
fneirab 0:80c39eb8f3ba 13 *
fneirab 0:80c39eb8f3ba 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
fneirab 0:80c39eb8f3ba 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
fneirab 0:80c39eb8f3ba 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
fneirab 0:80c39eb8f3ba 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
fneirab 0:80c39eb8f3ba 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
fneirab 0:80c39eb8f3ba 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
fneirab 0:80c39eb8f3ba 20 * OTHER DEALINGS IN THE SOFTWARE.
fneirab 0:80c39eb8f3ba 21 *
fneirab 0:80c39eb8f3ba 22 * Except as contained in this notice, the name of Maxim Integrated
fneirab 0:80c39eb8f3ba 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
fneirab 0:80c39eb8f3ba 24 * Products, Inc. Branding Policy.
fneirab 0:80c39eb8f3ba 25 *
fneirab 0:80c39eb8f3ba 26 * The mere transfer of this software does not imply any licenses
fneirab 0:80c39eb8f3ba 27 * of trade secrets, proprietary technology, copyrights, patents,
fneirab 0:80c39eb8f3ba 28 * trademarks, maskwork rights, or any other form of intellectual
fneirab 0:80c39eb8f3ba 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
fneirab 0:80c39eb8f3ba 30 * ownership rights.
fneirab 0:80c39eb8f3ba 31 *
fneirab 0:80c39eb8f3ba 32 ******************************************************************************/
fneirab 0:80c39eb8f3ba 33
fneirab 0:80c39eb8f3ba 34 #include "mbed.h"
fneirab 0:80c39eb8f3ba 35 #include "max17055.h"
fneirab 0:80c39eb8f3ba 36
fneirab 0:80c39eb8f3ba 37
fneirab 0:80c39eb8f3ba 38 MAX17055::MAX17055(I2C &i2c):
fneirab 0:80c39eb8f3ba 39 m_i2cBus(i2c)
fneirab 0:80c39eb8f3ba 40 {
fneirab 0:80c39eb8f3ba 41 //empty block
fneirab 0:80c39eb8f3ba 42 }
fneirab 0:80c39eb8f3ba 43
fneirab 0:80c39eb8f3ba 44 MAX17055::~MAX17055()
fneirab 0:80c39eb8f3ba 45 {
fneirab 0:80c39eb8f3ba 46 //empty block
fneirab 0:80c39eb8f3ba 47 }
fneirab 1:a031f0c6a71e 48 ///////////////////////////////////////////////////////////////////////////////
fneirab 0:80c39eb8f3ba 49
fneirab 0:80c39eb8f3ba 50 /**
fneirab 0:80c39eb8f3ba 51 * \brief Write a value to a MAX17055 register
fneirab 0:80c39eb8f3ba 52 * \par Details
fneirab 0:80c39eb8f3ba 53 * This function writes a value to a MAX17055 register
fneirab 0:80c39eb8f3ba 54 *
fneirab 1:a031f0c6a71e 55 * \param[in] reg_addr - register address
fneirab 1:a031f0c6a71e 56 * \param[in] reg_data - register data
fneirab 0:80c39eb8f3ba 57 *
fneirab 1:a031f0c6a71e 58 * \retval 1 on success
fneirab 0:80c39eb8f3ba 59 */
fneirab 0:80c39eb8f3ba 60
fneirab 0:80c39eb8f3ba 61 int MAX17055::writeReg(Registers_e reg_addr, uint16_t reg_data)
fneirab 0:80c39eb8f3ba 62 {
fneirab 0:80c39eb8f3ba 63
fneirab 1:a031f0c6a71e 64
fneirab 1:a031f0c6a71e 65 uint8_t dataLSB;
fneirab 1:a031f0c6a71e 66 uint8_t dataMSB;
fneirab 0:80c39eb8f3ba 67
fneirab 1:a031f0c6a71e 68 dataLSB = reg_data & 0x00FF;
fneirab 1:a031f0c6a71e 69 dataMSB = (reg_data >> 8) & 0x00FF;
fneirab 1:a031f0c6a71e 70
fneirab 1:a031f0c6a71e 71 char add_plus_data[3] = {reg_addr, dataLSB, dataMSB};
fneirab 1:a031f0c6a71e 72
fneirab 1:a031f0c6a71e 73 if ( m_i2cBus.write(I2C_W_ADRS, add_plus_data, 3, false) == 0)
fneirab 0:80c39eb8f3ba 74 return 1;
fneirab 0:80c39eb8f3ba 75 else
fneirab 0:80c39eb8f3ba 76 return 0;
fneirab 0:80c39eb8f3ba 77
fneirab 0:80c39eb8f3ba 78 }
fneirab 1:a031f0c6a71e 79 ///////////////////////////////////////////////////////////////////////////////
fneirab 0:80c39eb8f3ba 80 /**
fneirab 0:80c39eb8f3ba 81 * \brief Read a MAX17055 register
fneirab 0:80c39eb8f3ba 82 * \par Details
fneirab 0:80c39eb8f3ba 83 * This function reads a MAX17055 register
fneirab 0:80c39eb8f3ba 84 *
fneirab 1:a031f0c6a71e 85 * \param[in] reg_addr - register address
fneirab 1:a031f0c6a71e 86 * \param[out] &value - pointer that stores the register data
fneirab 0:80c39eb8f3ba 87 *
fneirab 0:80c39eb8f3ba 88 * \retval 1 on success
fneirab 0:80c39eb8f3ba 89 */
fneirab 0:80c39eb8f3ba 90
fneirab 0:80c39eb8f3ba 91
fneirab 1:a031f0c6a71e 92 int32_t MAX17055::readReg(Registers_e reg_addr, uint16_t &value)
fneirab 0:80c39eb8f3ba 93 {
fneirab 0:80c39eb8f3ba 94 int32_t result;
fneirab 1:a031f0c6a71e 95 //int16_t value2;
fneirab 1:a031f0c6a71e 96 //int16_t twoBytes;
fneirab 1:a031f0c6a71e 97 char local_data[1];
fneirab 0:80c39eb8f3ba 98 local_data[0] = reg_addr;
fneirab 1:a031f0c6a71e 99 char read_data[2];
fneirab 0:80c39eb8f3ba 100
fneirab 0:80c39eb8f3ba 101 result = m_i2cBus.write(I2C_W_ADRS, local_data, 1);
fneirab 0:80c39eb8f3ba 102 if(result == 0)
fneirab 0:80c39eb8f3ba 103 {
fneirab 1:a031f0c6a71e 104 result = m_i2cBus.read(I2C_R_ADRS, read_data , 2, false);
fneirab 1:a031f0c6a71e 105 if (result == 0)
fneirab 0:80c39eb8f3ba 106 {
fneirab 1:a031f0c6a71e 107 value = ( ((read_data[1] & 0x00FF) << 8) + (read_data[0]));
fneirab 1:a031f0c6a71e 108 result = 1;
fneirab 1:a031f0c6a71e 109 }
fneirab 0:80c39eb8f3ba 110 }
fneirab 1:a031f0c6a71e 111
fneirab 0:80c39eb8f3ba 112 return result;
fneirab 1:a031f0c6a71e 113
fneirab 0:80c39eb8f3ba 114 }
fneirab 0:80c39eb8f3ba 115
fneirab 2:ff7db397b70f 116 ///////////////////////////////////////////////////////////////////////////////
fneirab 1:a031f0c6a71e 117 /**
fneirab 1:a031f0c6a71e 118 * \brief Write and Verify a MAX17055 register
fneirab 1:a031f0c6a71e 119 * \par Details
fneirab 1:a031f0c6a71e 120 * This function wites and verifies if the writing process was successful
fneirab 1:a031f0c6a71e 121 *
fneirab 1:a031f0c6a71e 122 * \param[in] reg_addr - register address
fneirab 1:a031f0c6a71e 123 * \param[out] reg_data - the variable that contains the data to write
fneirab 1:a031f0c6a71e 124 * to the register address
fneirab 1:a031f0c6a71e 125 *
fneirab 1:a031f0c6a71e 126 * \retval 1 on success
fneirab 1:a031f0c6a71e 127 */
fneirab 1:a031f0c6a71e 128
fneirab 1:a031f0c6a71e 129
fneirab 1:a031f0c6a71e 130 int MAX17055::write_and_verify_reg (MAX17055::Registers_e reg_addr, uint16_t reg_data)
fneirab 1:a031f0c6a71e 131 {
fneirab 1:a031f0c6a71e 132 int retries = 8;
fneirab 1:a031f0c6a71e 133 int ret;
fneirab 1:a031f0c6a71e 134 int statusRead;
fneirab 1:a031f0c6a71e 135 int statusWrite;
fneirab 1:a031f0c6a71e 136 uint16_t read_data;
fneirab 1:a031f0c6a71e 137
fneirab 1:a031f0c6a71e 138 do {
fneirab 1:a031f0c6a71e 139 statusWrite = writeReg(reg_addr, reg_data);
fneirab 1:a031f0c6a71e 140 if (statusWrite != 1)
fneirab 1:a031f0c6a71e 141 ret = -1;
fneirab 1:a031f0c6a71e 142 wait_ms(3);
fneirab 1:a031f0c6a71e 143 statusRead = readReg(reg_addr, read_data);
fneirab 1:a031f0c6a71e 144 if (statusRead != 1)
fneirab 1:a031f0c6a71e 145 ret = -2;
fneirab 1:a031f0c6a71e 146 if (read_data != reg_data){
fneirab 1:a031f0c6a71e 147 ret = -3;
fneirab 1:a031f0c6a71e 148 retries--;
fneirab 1:a031f0c6a71e 149 }
fneirab 1:a031f0c6a71e 150 }while (retries && read_data != reg_data);
fneirab 1:a031f0c6a71e 151
fneirab 1:a031f0c6a71e 152 if (ret<0)
fneirab 1:a031f0c6a71e 153 {
fneirab 1:a031f0c6a71e 154 return ret;
fneirab 1:a031f0c6a71e 155 } else
fneirab 1:a031f0c6a71e 156 return 1;
fneirab 1:a031f0c6a71e 157 }
fneirab 2:ff7db397b70f 158
fneirab 2:ff7db397b70f 159 ////////////////////////////////////////////////////////////////////////////////
fneirab 2:ff7db397b70f 160
fneirab 2:ff7db397b70f 161 /**
fneirab 3:f77a8345b0e3 162 * \brief Initialise Function for MAX17055
fneirab 3:f77a8345b0e3 163 * \par Details
fneirab 3:f77a8345b0e3 164 * This function intitializes the MAX17055
fneirab 3:f77a8345b0e3 165 *
fneirab 3:f77a8345b0e3 166 * \retval 1 on success
fneirab 3:f77a8345b0e3 167 * 0 if device is not present
fneirab 3:f77a8345b0e3 168 * -1 if errors exist
fneirab 3:f77a8345b0e3 169 */
fneirab 2:ff7db397b70f 170
fneirab 2:ff7db397b70f 171
fneirab 2:ff7db397b70f 172 int MAX17055::init()
fneirab 2:ff7db397b70f 173 {
fneirab 2:ff7db397b70f 174 int status;
fneirab 2:ff7db397b70f 175 uint16_t read_data;
fneirab 2:ff7db397b70f 176
fneirab 2:ff7db397b70f 177 status = readReg(MAX17055_VERSION_REG, read_data);
fneirab 2:ff7db397b70f 178 if (status == 0)
fneirab 2:ff7db397b70f 179 return status; //Device is not present in the i2c Bus
fneirab 2:ff7db397b70f 180
fneirab 2:ff7db397b70f 181 /* Step 0: Check for POR */
fneirab 2:ff7db397b70f 182 /* Skip load model if POR bit is cleared */
fneirab 2:ff7db397b70f 183
fneirab 2:ff7db397b70f 184 readReg(MAX17055_STATUS_REG, read_data);
fneirab 2:ff7db397b70f 185
fneirab 2:ff7db397b70f 186 if (!(read_data & MAX17055_STATUS_POR ) )
fneirab 2:ff7db397b70f 187 return -1; //POR is not set. Skip Initialization.
fneirab 2:ff7db397b70f 188
fneirab 2:ff7db397b70f 189 /* Step 1: Check if FStat.DNR == 0 */
fneirab 3:f77a8345b0e3 190 // Do not continue until FSTAT.DNR == 0
fneirab 3:f77a8345b0e3 191
fneirab 3:f77a8345b0e3 192 while(readReg(MAX17055_FSTAT_REG, read_data)&1)
fneirab 3:f77a8345b0e3 193 {
fneirab 3:f77a8345b0e3 194 wait_ms(10);//10 ms wait empty loop
fneirab 3:f77a8345b0e3 195 }
fneirab 3:f77a8345b0e3 196
fneirab 3:f77a8345b0e3 197
fneirab 2:ff7db397b70f 198 return 1;
fneirab 2:ff7db397b70f 199 }
fneirab 2:ff7db397b70f 200
fneirab 2:ff7db397b70f 201 ////////////////////////////////////////////////////////////////////////////////
fneirab 2:ff7db397b70f 202
fneirab 2:ff7db397b70f 203 /**
fneirab 3:f77a8345b0e3 204 * \brief Get Internal Temperature Function for MAX17055
fneirab 3:f77a8345b0e3 205 * \par Details
fneirab 3:f77a8345b0e3 206 * This function sends a request to access the internal
fneirab 3:f77a8345b0e3 207 * of the MAX17055
fneirab 3:f77a8345b0e3 208 *
fneirab 3:f77a8345b0e3 209 * \param[in] reg_addr - register address
fneirab 3:f77a8345b0e3 210 * \param[out] reg_data - the variable that contains the data to write
fneirab 3:f77a8345b0e3 211 * to the register address
fneirab 3:f77a8345b0e3 212 * \retval 1 on success
fneirab 3:f77a8345b0e3 213 *
fneirab 3:f77a8345b0e3 214 * -1 if errors exist
fneirab 3:f77a8345b0e3 215 */
fneirab 2:ff7db397b70f 216
fneirab 2:ff7db397b70f 217
fneirab 2:ff7db397b70f 218 int MAX17055::get_temperature(int *temp)
fneirab 2:ff7db397b70f 219 {
fneirab 2:ff7db397b70f 220
fneirab 2:ff7db397b70f 221 int ret;
fneirab 2:ff7db397b70f 222 uint16_t data;
fneirab 2:ff7db397b70f 223
fneirab 2:ff7db397b70f 224 ret = readReg(MAX17055_TEMP_REG, data);
fneirab 2:ff7db397b70f 225 if (ret < 0)
fneirab 2:ff7db397b70f 226 return ret;
fneirab 2:ff7db397b70f 227
fneirab 2:ff7db397b70f 228 *temp = data;
fneirab 2:ff7db397b70f 229 /* The value is signed. */
fneirab 2:ff7db397b70f 230 if (*temp & 0x8000)
fneirab 2:ff7db397b70f 231 *temp |= 0xFFFF0000;
fneirab 2:ff7db397b70f 232
fneirab 2:ff7db397b70f 233 /* The value is converted into centigrade scale */
fneirab 2:ff7db397b70f 234 /* Units of LSB = 1 / 256 degree Celsius */
fneirab 2:ff7db397b70f 235 *temp >>= 8;
fneirab 2:ff7db397b70f 236
fneirab 2:ff7db397b70f 237 return 1;
fneirab 2:ff7db397b70f 238 }
fneirab 3:f77a8345b0e3 239
fneirab 3:f77a8345b0e3 240
fneirab 3:f77a8345b0e3 241 ////////////////////////////////////////////////////////////////////////////////
fneirab 3:f77a8345b0e3 242
fneirab 3:f77a8345b0e3 243 /**
fneirab 3:f77a8345b0e3 244 * \brief Forced Exit Hibernate Mode Function for MAX17055
fneirab 3:f77a8345b0e3 245 * \par Details
fneirab 3:f77a8345b0e3 246 * This function executes a force exit from hibernate mode.
fneirab 3:f77a8345b0e3 247 *
fneirab 3:f77a8345b0e3 248 * \retval returns HibCFG original value before forced Exit Hybernate mode
fneirab 3:f77a8345b0e3 249 *
fneirab 3:f77a8345b0e3 250 */
fneirab 2:ff7db397b70f 251
fneirab 3:f77a8345b0e3 252
fneirab 3:f77a8345b0e3 253 uint16_t MAX17055::forcedExitHyberMode()
fneirab 3:f77a8345b0e3 254 {
fneirab 3:f77a8345b0e3 255 uint16_t hibcfg;
fneirab 3:f77a8345b0e3 256
fneirab 3:f77a8345b0e3 257 /* Force exit from hibernate */
fneirab 3:f77a8345b0e3 258
fneirab 3:f77a8345b0e3 259 //STEP 0: Store original HibCFG value
fneirab 3:f77a8345b0e3 260 readReg(MAX17055_HIBCFG_REG, hibcfg);
fneirab 3:f77a8345b0e3 261
fneirab 3:f77a8345b0e3 262 //STEP 1: Write to Soft-Wakeup Commannd Register
fneirab 3:f77a8345b0e3 263 writeReg(MAX17055_VFSOC0_QH0_LOCK_REG, 0x90); //Soft-Wakeup from hybernate
fneirab 3:f77a8345b0e3 264
fneirab 3:f77a8345b0e3 265 //STEP 2: Write to Hibernate Configuration register
fneirab 3:f77a8345b0e3 266 writeReg(MAX17055_HIBCFG_REG, 0x0); //disable hibernate mode
fneirab 3:f77a8345b0e3 267
fneirab 3:f77a8345b0e3 268 //STEP 3:Write to Soft-Wakeup Commannd Register
fneirab 3:f77a8345b0e3 269 writeReg(MAX17055_VFSOC0_QH0_LOCK_REG, 0x0); //Clear All commnads
fneirab 3:f77a8345b0e3 270
fneirab 3:f77a8345b0e3 271 return hibcfg;
fneirab 3:f77a8345b0e3 272 }
fneirab 3:f77a8345b0e3 273
fneirab 0:80c39eb8f3ba 274 //step_1:
fneirab 0:80c39eb8f3ba 275 // // Wait until MAX17055 complete setup operations (Data is Ready)
fneirab 0:80c39eb8f3ba 276 // while(readReg(F_STAT) & 0x0001) delay(10);
fneirab 0:80c39eb8f3ba 277 // /***************************************************************/
fneirab 0:80c39eb8f3ba 278 // // Setting up or initializing charging configurations down here , EZ CONFIG because no .INI file
fneirab 0:80c39eb8f3ba 279 // // FIXX:: DOUBLE CHECK THE INITIALIZATION VALUES
fneirab 0:80c39eb8f3ba 280 // // init values is claculated based on the register lsb's default value page 1 software implementation UG
fneirab 0:80c39eb8f3ba 281 // /* Capacity is in mAH and 1 bit is 0.5mAH)*/
fneirab 0:80c39eb8f3ba 282 // temp = battery->capacity*2;
fneirab 0:80c39eb8f3ba 283 // writeReg(DESIGN_CAP, temp);
fneirab 0:80c39eb8f3ba 284 // writeReg(DQ_A_CC, temp/32);
fneirab 0:80c39eb8f3ba 285 // /* Current measurement, assuming current input in mA */
fneirab 0:80c39eb8f3ba 286 // temp = battery->currentTerm*1000/1.5625;
fneirab 0:80c39eb8f3ba 287 // writeReg(ICHG_TERM, temp);
fneirab 0:80c39eb8f3ba 288 // /* FIXX: DOUBLE CHECK Vempty register (v empty | v recovery), I am assuming that
fneirab 0:80c39eb8f3ba 289 // VE resolution is 10mV and VR resolution is 40mV (programmer's guide)*/
fneirab 0:80c39eb8f3ba 290 // temp =((battery->voltageMin/10) << 7 | (battery->voltageNom)/40);
fneirab 0:80c39eb8f3ba 291 // writeReg(V_EMPTY ,temp);
fneirab 0:80c39eb8f3ba 292 //
fneirab 0:80c39eb8f3ba 293 // data = readReg(HIB_CFG); // Store original HIB_CFG inside
fneirab 0:80c39eb8f3ba 294 // writeReg((Registers_e)0x60, 0x90); // Exit hibernate mode step 1
fneirab 0:80c39eb8f3ba 295 // writeReg(CONFIG_2, 0x0); // Exit hibernate mode step 2
fneirab 0:80c39eb8f3ba 296 // writeReg((Registers_e)0x60, 0x0); // Exit hibernate mode step 3
fneirab 0:80c39eb8f3ba 297 //
fneirab 0:80c39eb8f3ba 298 // temp = battery->capacity*2;
fneirab 0:80c39eb8f3ba 299 // if (battery->voltageMax > 4.275) {
fneirab 0:80c39eb8f3ba 300 // writeReg(DP_A_CC, (temp/32)*51200/temp); // Write dPAcc
fneirab 0:80c39eb8f3ba 301 // writeReg(MODEL_CFG, 0x8400); // Write ModelCFG
fneirab 0:80c39eb8f3ba 302 // } else {
fneirab 0:80c39eb8f3ba 303 // writeReg(DP_A_CC, (temp/32)*44138/temp);
fneirab 0:80c39eb8f3ba 304 // writeReg(MODEL_CFG, 0x8000);
fneirab 0:80c39eb8f3ba 305 // }
fneirab 0:80c39eb8f3ba 306 // // Poll ModelCFG.refresh (highest bit), proceed to next step when ModelCFG.Refresh = 0.
fneirab 0:80c39eb8f3ba 307 // while(readReg(MODEL_CFG) & 0x8000) delay(10);
fneirab 0:80c39eb8f3ba 308 // writeReg(HIB_CFG, data); // Restore the original HibCFG value
fneirab 0:80c39eb8f3ba 309 // /***************************************************************/
fneirab 0:80c39eb8f3ba 310 // }
fneirab 0:80c39eb8f3ba 311 // /***************************************************************/
fneirab 0:80c39eb8f3ba 312 // // FIXX: DOUBLE CHECK, STEP 4 IN PROGRAMMER'S GUIDE
fneirab 0:80c39eb8f3ba 313 // data = readReg(STATUS); // read status register
fneirab 0:80c39eb8f3ba 314 //
fneirab 0:80c39eb8f3ba 315 // if (write_and_verify_reg(STATUS, data & 0xFFFD) != E_NO_ERROR) {
fneirab 0:80c39eb8f3ba 316 // return -1;
fneirab 0:80c39eb8f3ba 317 // }
fneirab 0:80c39eb8f3ba 318 // // Check whether there is saved history parameters
fneirab 0:80c39eb8f3ba 319 // temp = saved_param->rcomp0;
fneirab 0:80c39eb8f3ba 320 // temp &= saved_param ->temp_co;
fneirab 0:80c39eb8f3ba 321 // temp &= saved_param->full_cap_rep;
fneirab 0:80c39eb8f3ba 322 // temp &= saved_param->cycles;
fneirab 0:80c39eb8f3ba 323 // temp &= saved_param->full_cap_nom;
fneirab 0:80c39eb8f3ba 324 // // If there is no history setup the battery
fneirab 0:80c39eb8f3ba 325 // if (temp == 0) {
fneirab 0:80c39eb8f3ba 326 // // Check for MAX17055 reset
fneirab 0:80c39eb8f3ba 327 // StatusPOR = readReg(STATUS) & 0x0002;
fneirab 0:80c39eb8f3ba 328 // if (StatusPOR == 1) goto step_1;
fneirab 0:80c39eb8f3ba 329 // }
fneirab 0:80c39eb8f3ba 330 //step_4P3:
fneirab 0:80c39eb8f3ba 331 // // Read the reported capacity(mAH) and SOC (percentage)
fneirab 0:80c39eb8f3ba 332 // RepCap = readReg(REP_CAP);
fneirab 0:80c39eb8f3ba 333 // RepSOC = readReg(REP_SOC);
fneirab 0:80c39eb8f3ba 334 //
fneirab 0:80c39eb8f3ba 335 // // Read the TTE (in 5.625s)
fneirab 0:80c39eb8f3ba 336 // TTE_val = ((float)(readReg(TTE))) * 5.625;
fneirab 0:80c39eb8f3ba 337 //
fneirab 0:80c39eb8f3ba 338 // // Save learned parameters
fneirab 0:80c39eb8f3ba 339 // saved_param->rcomp0 = readReg(R_COMP_0);
fneirab 0:80c39eb8f3ba 340 // saved_param->temp_co = readReg(TEMP_CO);
fneirab 0:80c39eb8f3ba 341 // saved_param->full_cap_rep = readReg(FULL_CAP_REP);
fneirab 0:80c39eb8f3ba 342 // saved_param->cycles = readReg(CYCLES);
fneirab 0:80c39eb8f3ba 343 // saved_param->full_cap_nom = readReg(FULL_CAP_NOM);
fneirab 0:80c39eb8f3ba 344 //
fneirab 0:80c39eb8f3ba 345 // // Restoring Capacity Parameters
fneirab 0:80c39eb8f3ba 346 // if (write_and_verify_reg(R_COMP_0, saved_param->rcomp0) != E_NO_ERROR) {
fneirab 0:80c39eb8f3ba 347 // return -1;
fneirab 0:80c39eb8f3ba 348 // }
fneirab 0:80c39eb8f3ba 349 // if (write_and_verify_reg(TEMP_CO, saved_param->temp_co) != E_NO_ERROR) {
fneirab 0:80c39eb8f3ba 350 // return -1;
fneirab 0:80c39eb8f3ba 351 // }
fneirab 0:80c39eb8f3ba 352 // if (write_and_verify_reg(FULL_CAP_REP, saved_param->full_cap_rep) != E_NO_ERROR) {
fneirab 0:80c39eb8f3ba 353 // return -1;
fneirab 0:80c39eb8f3ba 354 // }
fneirab 0:80c39eb8f3ba 355 //
fneirab 0:80c39eb8f3ba 356 // delay(350);
fneirab 0:80c39eb8f3ba 357 // // Restore FullCap
fneirab 0:80c39eb8f3ba 358 // temp = readReg(FULL_CAP_NOM); // Read full_cap_nom
fneirab 0:80c39eb8f3ba 359 // data = (readReg(MIX_SOC)*temp)/25600; // MIXCAP
fneirab 0:80c39eb8f3ba 360 // if (write_and_verify_reg(MIX_CAP, data) != E_NO_ERROR) {
fneirab 0:80c39eb8f3ba 361 // return -1;
fneirab 0:80c39eb8f3ba 362 // }
fneirab 0:80c39eb8f3ba 363 // if (write_and_verify_reg(FULL_CAP_REP, temp) != E_NO_ERROR) {
fneirab 0:80c39eb8f3ba 364 // return -1;
fneirab 0:80c39eb8f3ba 365 // }
fneirab 0:80c39eb8f3ba 366 // data = saved_param->full_cap_nom/16; // This act as dQacc
fneirab 0:80c39eb8f3ba 367 // if (write_and_verify_reg(DP_A_CC, 0x0C80) != E_NO_ERROR) {
fneirab 0:80c39eb8f3ba 368 // return -1;
fneirab 0:80c39eb8f3ba 369 // }
fneirab 0:80c39eb8f3ba 370 // if (write_and_verify_reg(DQ_A_CC, temp) != E_NO_ERROR) {
fneirab 0:80c39eb8f3ba 371 // return -1;
fneirab 0:80c39eb8f3ba 372 // }
fneirab 0:80c39eb8f3ba 373 //
fneirab 0:80c39eb8f3ba 374 // delay(350);
fneirab 0:80c39eb8f3ba 375 // // Restore Cycles Register
fneirab 0:80c39eb8f3ba 376 // if (write_and_verify_reg(CYCLES, saved_param->cycles) != E_NO_ERROR) {
fneirab 0:80c39eb8f3ba 377 // return -1;
fneirab 0:80c39eb8f3ba 378 // }
fneirab 2:ff7db397b70f 379 //
fneirab 0:80c39eb8f3ba 380 //return E_NO_ERROR;
fneirab 2:ff7db397b70f 381 //
fneirab 0:80c39eb8f3ba 382 //
fneirab 0:80c39eb8f3ba 383 //saved_fuel_gauge_params_t default_param = {0,0,0,0,0};