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:
Wed Sep 27 17:10:18 2017 +0000
Revision:
4:a4d6ae2182c2
Parent:
3:f77a8345b0e3
Child:
5:a18a189588dc
Modifications testing documentation

Who changed what in which revision?

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