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:
Mon Jun 18 21:19:26 2018 +0000
Revision:
13:fc91b283e689
Parent:
12:519a18fc3b28
Child:
14:519754351400
updates to libraries, clean up

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fneirab 9:f29d5e49b190 1 /*******************************************************************************
fneirab 9:f29d5e49b190 2 * Copyright (C) 2018 Maxim Integrated Products, Inc., All Rights Reserved.
fneirab 4:a4d6ae2182c2 3 *
fneirab 4:a4d6ae2182c2 4 * Permission is hereby granted, free of charge, to any person obtaining a
fneirab 4:a4d6ae2182c2 5 * copy of this software and associated documentation files (the "Software"),
fneirab 4:a4d6ae2182c2 6 * to deal in the Software without restriction, including without limitation
fneirab 4:a4d6ae2182c2 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
fneirab 4:a4d6ae2182c2 8 * and/or sell copies of the Software, and to permit persons to whom the
fneirab 4:a4d6ae2182c2 9 * Software is furnished to do so, subject to the following conditions:
fneirab 4:a4d6ae2182c2 10 *
fneirab 4:a4d6ae2182c2 11 * The above copyright notice and this permission notice shall be included
fneirab 4:a4d6ae2182c2 12 * in all copies or substantial portions of the Software.
fneirab 4:a4d6ae2182c2 13 *
fneirab 4:a4d6ae2182c2 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
fneirab 4:a4d6ae2182c2 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
fneirab 4:a4d6ae2182c2 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
fneirab 4:a4d6ae2182c2 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
fneirab 4:a4d6ae2182c2 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
fneirab 4:a4d6ae2182c2 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
fneirab 4:a4d6ae2182c2 20 * OTHER DEALINGS IN THE SOFTWARE.
fneirab 4:a4d6ae2182c2 21 *
fneirab 4:a4d6ae2182c2 22 * Except as contained in this notice, the name of Maxim Integrated
fneirab 4:a4d6ae2182c2 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
fneirab 4:a4d6ae2182c2 24 * Products, Inc. Branding Policy.
fneirab 4:a4d6ae2182c2 25 *
fneirab 4:a4d6ae2182c2 26 * The mere transfer of this software does not imply any licenses
fneirab 4:a4d6ae2182c2 27 * of trade secrets, proprietary technology, copyrights, patents,
fneirab 4:a4d6ae2182c2 28 * trademarks, maskwork rights, or any other form of intellectual
fneirab 4:a4d6ae2182c2 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
fneirab 4:a4d6ae2182c2 30 * ownership rights.
fneirab 9:f29d5e49b190 31 *******************************************************************************
fneirab 9:f29d5e49b190 32 */
fneirab 0:80c39eb8f3ba 33
fneirab 0:80c39eb8f3ba 34 #include "mbed.h"
fneirab 0:80c39eb8f3ba 35 #include "max17055.h"
fneirab 0:80c39eb8f3ba 36
fneirab 9:f29d5e49b190 37 /* POR Mask */
fneirab 9:f29d5e49b190 38 #define MAX17055_POR_MASK (0xFFFD)
fneirab 9:f29d5e49b190 39
fneirab 5:a18a189588dc 40 /* MODELCFG register bits */
fneirab 5:a18a189588dc 41 #define MAX17055_MODELCFG_REFRESH (1 << 15)
fneirab 5:a18a189588dc 42
fneirab 5:a18a189588dc 43
fneirab 5:a18a189588dc 44 /* FSTAT register bits */
fneirab 5:a18a189588dc 45 #define MAX17055_FSTAT_DNR (1)
fneirab 5:a18a189588dc 46
fneirab 11:bdbd3104995b 47 /* LIBRARY FUNCTION SUCCESS*/
fneirab 11:bdbd3104995b 48 #define F_SUCCESS_0 0
fneirab 11:bdbd3104995b 49
fneirab 11:bdbd3104995b 50 /* LIBRARY FUNCTION ERROR CODES */
fneirab 12:519a18fc3b28 51 #define F_ERROR_1 -1 //-1 if I2C read/write errors exist
fneirab 11:bdbd3104995b 52 #define F_ERROR_2 -2 //-2 if device is not present
fneirab 11:bdbd3104995b 53 #define F_ERROR_3 -3 //-3 if function error
fneirab 11:bdbd3104995b 54 #define F_ERROR_4 -4 //-4 if other error
fneirab 11:bdbd3104995b 55 #define F_ERROR_5 -5 //-5 if POR not detected
fneirab 4:a4d6ae2182c2 56
fneirab 0:80c39eb8f3ba 57
fneirab 5:a18a189588dc 58
fneirab 11:bdbd3104995b 59 /**
fneirab 11:bdbd3104995b 60 * @brief max17055 Constructor
fneirab 11:bdbd3104995b 61 * @details max17055 Constructor with battery and i2c as parameters
fneirab 11:bdbd3104995b 62 */
fneirab 5:a18a189588dc 63 MAX17055::MAX17055(I2C &i2c):
fneirab 5:a18a189588dc 64 m_i2cBus(i2c)
fneirab 0:80c39eb8f3ba 65 {
fneirab 5:a18a189588dc 66 //empty block
fneirab 0:80c39eb8f3ba 67 }
fneirab 0:80c39eb8f3ba 68
fneirab 11:bdbd3104995b 69 /**
fneirab 11:bdbd3104995b 70 * @brief Fuel Gauge Destructor
fneirab 11:bdbd3104995b 71 */
fneirab 0:80c39eb8f3ba 72 MAX17055::~MAX17055()
fneirab 0:80c39eb8f3ba 73 {
fneirab 0:80c39eb8f3ba 74 //empty block
fneirab 0:80c39eb8f3ba 75 }
fneirab 5:a18a189588dc 76
fneirab 0:80c39eb8f3ba 77 /**
fneirab 11:bdbd3104995b 78 * @brief Writes a register.
fneirab 11:bdbd3104995b 79 *
fneirab 11:bdbd3104995b 80 * @param[in] reg_addr The register address
fneirab 11:bdbd3104995b 81 * @param[in] reg_data The register data
fneirab 11:bdbd3104995b 82 *
fneirab 11:bdbd3104995b 83 * @retval 0 on success
fneirab 11:bdbd3104995b 84 * @retval non-0 for errors
fneirab 11:bdbd3104995b 85 */
fneirab 0:80c39eb8f3ba 86 int MAX17055::writeReg(Registers_e reg_addr, uint16_t reg_data)
fneirab 0:80c39eb8f3ba 87 {
fneirab 0:80c39eb8f3ba 88
fneirab 7:479a36909ced 89 uint16_t mask = 0x00FF;
fneirab 1:a031f0c6a71e 90 uint8_t dataLSB;
fneirab 1:a031f0c6a71e 91 uint8_t dataMSB;
fneirab 5:a18a189588dc 92
fneirab 7:479a36909ced 93 dataLSB = reg_data & mask;
fneirab 7:479a36909ced 94 dataMSB = (reg_data >> 8) & mask;
fneirab 5:a18a189588dc 95
fneirab 7:479a36909ced 96 char addr_plus_data[3] = {reg_addr, dataLSB, dataMSB};
fneirab 5:a18a189588dc 97
fneirab 11:bdbd3104995b 98 if ( m_i2cBus.write(I2C_W_ADRS, addr_plus_data, 3, false) == F_SUCCESS_0)
fneirab 11:bdbd3104995b 99 return F_SUCCESS_0;
fneirab 0:80c39eb8f3ba 100 else
fneirab 11:bdbd3104995b 101 return F_ERROR_1;
fneirab 11:bdbd3104995b 102 }
fneirab 0:80c39eb8f3ba 103
fneirab 0:80c39eb8f3ba 104 /**
fneirab 11:bdbd3104995b 105 * @brief Reads from MAX17055 register.
fneirab 11:bdbd3104995b 106 *
fneirab 11:bdbd3104995b 107 * @param[in] reg_addr The register address
fneirab 11:bdbd3104995b 108 * @param value The value
fneirab 11:bdbd3104995b 109 *
fneirab 11:bdbd3104995b 110 * @retval 0 on success
fneirab 11:bdbd3104995b 111 * @retval non-0 for errors
fneirab 11:bdbd3104995b 112 */
fneirab 1:a031f0c6a71e 113 int32_t MAX17055::readReg(Registers_e reg_addr, uint16_t &value)
fneirab 0:80c39eb8f3ba 114 {
fneirab 0:80c39eb8f3ba 115 int32_t result;
fneirab 7:479a36909ced 116 uint16_t mask = 0x00FF;
fneirab 1:a031f0c6a71e 117 char local_data[1];
fneirab 0:80c39eb8f3ba 118 local_data[0] = reg_addr;
fneirab 1:a031f0c6a71e 119 char read_data[2];
fneirab 5:a18a189588dc 120
fneirab 0:80c39eb8f3ba 121 result = m_i2cBus.write(I2C_W_ADRS, local_data, 1);
fneirab 11:bdbd3104995b 122 if(result == F_SUCCESS_0) {
fneirab 1:a031f0c6a71e 123 result = m_i2cBus.read(I2C_R_ADRS, read_data , 2, false);
fneirab 11:bdbd3104995b 124 if (result == F_SUCCESS_0) {
fneirab 7:479a36909ced 125 value = ( ((read_data[1] & mask) << 8) + (read_data[0]));
fneirab 11:bdbd3104995b 126 result = F_SUCCESS_0;
fneirab 5:a18a189588dc 127 }
fneirab 0:80c39eb8f3ba 128 }
fneirab 0:80c39eb8f3ba 129 return result;
fneirab 0:80c39eb8f3ba 130 }
fneirab 0:80c39eb8f3ba 131
fneirab 1:a031f0c6a71e 132 /**
fneirab 11:bdbd3104995b 133 * @brief Write and Verify a MAX17055 register
fneirab 11:bdbd3104995b 134 * @par Details
fneirab 12:519a18fc3b28 135 * This function writes and verifies if the writing process was successful
fneirab 11:bdbd3104995b 136 *
fneirab 11:bdbd3104995b 137 * @param[in] reg_addr - register address
fneirab 11:bdbd3104995b 138 * @param[out] reg_data - the variable that contains the data to write
fneirab 11:bdbd3104995b 139 * to the register address
fneirab 11:bdbd3104995b 140 *
fneirab 11:bdbd3104995b 141 * @retval 0 on success
fneirab 12:519a18fc3b28 142 * @retval non-0 for errors
fneirab 11:bdbd3104995b 143 */
fneirab 5:a18a189588dc 144 int MAX17055::write_and_verify_reg(Registers_e reg_addr, uint16_t reg_data)
fneirab 5:a18a189588dc 145 {
fneirab 1:a031f0c6a71e 146 int retries = 8;
fneirab 1:a031f0c6a71e 147 int ret;
fneirab 1:a031f0c6a71e 148 int statusRead;
fneirab 1:a031f0c6a71e 149 int statusWrite;
fneirab 1:a031f0c6a71e 150 uint16_t read_data;
fneirab 5:a18a189588dc 151
fneirab 1:a031f0c6a71e 152 do {
fneirab 1:a031f0c6a71e 153 statusWrite = writeReg(reg_addr, reg_data);
fneirab 11:bdbd3104995b 154 if (statusWrite != F_SUCCESS_0)
fneirab 12:519a18fc3b28 155 ret = -6;
fneirab 1:a031f0c6a71e 156 wait_ms(3);
fneirab 5:a18a189588dc 157 statusRead = readReg(reg_addr, read_data);
fneirab 11:bdbd3104995b 158 if (statusRead != F_SUCCESS_0)
fneirab 12:519a18fc3b28 159 ret = -7;
fneirab 5:a18a189588dc 160 if (read_data != reg_data) {
fneirab 12:519a18fc3b28 161 ret = -8;
fneirab 1:a031f0c6a71e 162 retries--;
fneirab 1:a031f0c6a71e 163 }
fneirab 5:a18a189588dc 164 } while (retries && read_data != reg_data);
fneirab 5:a18a189588dc 165
fneirab 11:bdbd3104995b 166 if (ret!=F_SUCCESS_0)
fneirab 1:a031f0c6a71e 167 return ret;
fneirab 7:479a36909ced 168 else
fneirab 11:bdbd3104995b 169 return F_SUCCESS_0;
fneirab 1:a031f0c6a71e 170 }
fneirab 2:ff7db397b70f 171
fneirab 2:ff7db397b70f 172 /**
fneirab 11:bdbd3104995b 173 * @brief Initialization Function for MAX17055.
fneirab 11:bdbd3104995b 174 * @par Details
fneirab 12:519a18fc3b28 175 * This function initializes the MAX17055 for the implementation of the EZconfig model.\n
fneirab 12:519a18fc3b28 176 * The library needs to be customized for the implementation of customize model.\n
fneirab 11:bdbd3104995b 177 *
fneirab 11:bdbd3104995b 178 * @retval 0 on success
fneirab 11:bdbd3104995b 179 * @retval non-0 for errors
fneirab 11:bdbd3104995b 180 */
fneirab 7:479a36909ced 181 int MAX17055::init(platform_data des_data)
fneirab 2:ff7db397b70f 182 {
fneirab 6:5ced10109ebf 183
fneirab 5:a18a189588dc 184 int status, ret;
fneirab 9:f29d5e49b190 185 int time_out = 10;
fneirab 12:519a18fc3b28 186 uint16_t hibcfg_value,read_data;
fneirab 5:a18a189588dc 187
fneirab 5:a18a189588dc 188
fneirab 7:479a36909ced 189 status = readReg(VERSION_REG, read_data);
fneirab 11:bdbd3104995b 190 if (status != F_SUCCESS_0)
fneirab 11:bdbd3104995b 191 return status;
fneirab 5:a18a189588dc 192
fneirab 12:519a18fc3b28 193 ///STEP 0. Check for POR (Skip load model if POR bit is cleared)
fneirab 5:a18a189588dc 194
fneirab 11:bdbd3104995b 195 if (check_POR_func() == F_ERROR_5)
fneirab 11:bdbd3104995b 196 return F_ERROR_5; //POR not detected. Skip Initialization.
fneirab 12:519a18fc3b28 197 //This is not an error.
fneirab 2:ff7db397b70f 198
fneirab 12:519a18fc3b28 199 ///STEP 1. Check if FStat.DNR == 0 (Do not continue until FSTAT.DNR == 0)
fneirab 7:479a36909ced 200 ret = poll_flag_clear(FSTAT_REG, MAX17055_FSTAT_DNR, time_out);
fneirab 11:bdbd3104995b 201 if (ret < F_SUCCESS_0) {
fneirab 6:5ced10109ebf 202 return ret;
fneirab 3:f77a8345b0e3 203 }
fneirab 5:a18a189588dc 204
fneirab 12:519a18fc3b28 205 ///STEP 1.2. Force exit from hibernate
fneirab 12:519a18fc3b28 206 hibcfg_value = forcedExitHiberMode();
fneirab 7:479a36909ced 207
fneirab 9:f29d5e49b190 208 //printf("step 1 check \r\n");
fneirab 5:a18a189588dc 209
fneirab 12:519a18fc3b28 210 ///STEP 2. Initialize configuration
fneirab 5:a18a189588dc 211 switch (1) {
fneirab 5:a18a189588dc 212 case MODEL_LOADING_OPTION1:
fneirab 12:519a18fc3b28 213 ///STEP 2.1. Load EZ Config
fneirab 13:fc91b283e689 214 EZconfig(des_data);
fneirab 5:a18a189588dc 215
fneirab 12:519a18fc3b28 216 ///STEP 2.2. Poll ModelCFG.ModelRefresh bit for clear
fneirab 7:479a36909ced 217 ret = poll_flag_clear(MODELCFG_REG, MAX17055_MODELCFG_REFRESH, time_out);
fneirab 11:bdbd3104995b 218 if(ret < F_SUCCESS_0) {
fneirab 5:a18a189588dc 219 return ret;
fneirab 5:a18a189588dc 220 }
fneirab 7:479a36909ced 221
fneirab 9:f29d5e49b190 222 break;
fneirab 5:a18a189588dc 223 }
fneirab 12:519a18fc3b28 224 ///STEP3. Restore original HibCfg
fneirab 7:479a36909ced 225 writeReg(HIBCFG_REG, hibcfg_value);
fneirab 5:a18a189588dc 226
fneirab 5:a18a189588dc 227 /* Clear Status.POR */
fneirab 9:f29d5e49b190 228 ret = clear_POR_bit();
fneirab 11:bdbd3104995b 229 if (ret < F_SUCCESS_0)
fneirab 11:bdbd3104995b 230 return ret; //See errors
fneirab 11:bdbd3104995b 231 return F_SUCCESS_0;
fneirab 5:a18a189588dc 232 }
fneirab 5:a18a189588dc 233
fneirab 9:f29d5e49b190 234 /**
fneirab 11:bdbd3104995b 235 * @brief Check POR function
fneirab 11:bdbd3104995b 236 * @par Details
fneirab 11:bdbd3104995b 237 * This function check is there was a power on reset event for the
fneirab 11:bdbd3104995b 238 * MAX17055
fneirab 11:bdbd3104995b 239 *
fneirab 11:bdbd3104995b 240 * @retval 0 on success (POR detected)
fneirab 11:bdbd3104995b 241 * @retval non-0 for errors (POR not detected)
fneirab 11:bdbd3104995b 242 *
fneirab 11:bdbd3104995b 243 */
fneirab 9:f29d5e49b190 244 int MAX17055::check_POR_func()
fneirab 9:f29d5e49b190 245 {
fneirab 9:f29d5e49b190 246 uint16_t read_data;
fneirab 9:f29d5e49b190 247
fneirab 9:f29d5e49b190 248 readReg(STATUS_REG, read_data);
fneirab 9:f29d5e49b190 249
fneirab 9:f29d5e49b190 250 if (!(read_data & MAX17055_STATUS_POR ) )
fneirab 11:bdbd3104995b 251 return F_ERROR_5; //POR not detected.
fneirab 9:f29d5e49b190 252 else
fneirab 11:bdbd3104995b 253 return F_SUCCESS_0;
fneirab 9:f29d5e49b190 254 }
fneirab 9:f29d5e49b190 255
fneirab 9:f29d5e49b190 256 /**
fneirab 11:bdbd3104995b 257 * @brief clear POR bit function
fneirab 11:bdbd3104995b 258 * @par Details
fneirab 12:519a18fc3b28 259 * This function clear the indicating bit for POR - MAX17055
fneirab 11:bdbd3104995b 260 *
fneirab 11:bdbd3104995b 261 * @retval 0 for Success
fneirab 11:bdbd3104995b 262 * @retval non-0 for errors
fneirab 11:bdbd3104995b 263 */
fneirab 9:f29d5e49b190 264 int MAX17055::clear_POR_bit()
fneirab 9:f29d5e49b190 265 {
fneirab 9:f29d5e49b190 266 int status, ret;
fneirab 9:f29d5e49b190 267 uint16_t read_data, hibcfg_value, reg;
fneirab 9:f29d5e49b190 268
fneirab 9:f29d5e49b190 269
fneirab 9:f29d5e49b190 270 status = readReg(STATUS_REG, read_data);
fneirab 11:bdbd3104995b 271 if (status != F_SUCCESS_0)
fneirab 11:bdbd3104995b 272 return F_ERROR_2; //Device is not present in the i2c Bus
fneirab 9:f29d5e49b190 273 status = write_and_verify_reg(STATUS_REG, (read_data & MAX17055_POR_MASK));
fneirab 11:bdbd3104995b 274 if (status != F_SUCCESS_0)
fneirab 11:bdbd3104995b 275 return F_ERROR_1; //read or write error
fneirab 9:f29d5e49b190 276 else
fneirab 11:bdbd3104995b 277 return F_SUCCESS_0;
fneirab 9:f29d5e49b190 278 }
fneirab 5:a18a189588dc 279
fneirab 5:a18a189588dc 280 /**
fneirab 11:bdbd3104995b 281 * @brief Poll Flag clear Function.
fneirab 11:bdbd3104995b 282 * @par Details
fneirab 11:bdbd3104995b 283 * This function clears status flags for the MAX17055
fneirab 11:bdbd3104995b 284 *
fneirab 11:bdbd3104995b 285 * @param[in] reg_addr - register address
fneirab 11:bdbd3104995b 286 * @param[in] mask - register address
fneirab 11:bdbd3104995b 287 * @param[in] timeout - register data
fneirab 11:bdbd3104995b 288 *
fneirab 11:bdbd3104995b 289 * @retval 0 on success
fneirab 11:bdbd3104995b 290 * @retval non-0 negative for errors
fneirab 11:bdbd3104995b 291 */
fneirab 7:479a36909ced 292 int MAX17055::poll_flag_clear (Registers_e reg_addr, int mask, int timeout)
fneirab 5:a18a189588dc 293 {
fneirab 5:a18a189588dc 294 uint16_t data;
fneirab 5:a18a189588dc 295 int ret;
fneirab 5:a18a189588dc 296
fneirab 5:a18a189588dc 297 do {
fneirab 9:f29d5e49b190 298 wait_ms(1);
fneirab 6:5ced10109ebf 299 ret = readReg(reg_addr, data);
fneirab 11:bdbd3104995b 300 if(ret < F_SUCCESS_0)
fneirab 11:bdbd3104995b 301 return F_ERROR_1;
fneirab 5:a18a189588dc 302
fneirab 5:a18a189588dc 303 if(!(data & mask))
fneirab 11:bdbd3104995b 304 return F_SUCCESS_0;
fneirab 5:a18a189588dc 305
fneirab 9:f29d5e49b190 306 timeout -= 1;
fneirab 5:a18a189588dc 307 } while(timeout > 0);
fneirab 5:a18a189588dc 308
fneirab 11:bdbd3104995b 309 return F_ERROR_4;
fneirab 5:a18a189588dc 310 }
fneirab 5:a18a189588dc 311
fneirab 2:ff7db397b70f 312 /**
fneirab 11:bdbd3104995b 313 * @brief Get Temperature Function from the MAX17055 TEMP register.
fneirab 11:bdbd3104995b 314 * @par Details
fneirab 11:bdbd3104995b 315 * This function sends a request to access the TEMP register
fneirab 11:bdbd3104995b 316 * of the MAX17055, which reflects the temperature measured for the fuel gauge.
fneirab 11:bdbd3104995b 317 * The temperature values will reflect the Config Register (0x1D) selections for Tsel bit (D15).
fneirab 11:bdbd3104995b 318 * For this library the setting are for die temperature.
fneirab 11:bdbd3104995b 319 * The MAX32620FTHR thermistor bias pin is not connected. The biasing of the thermistor is
fneirab 11:bdbd3104995b 320 * done by the MAX77650. See MAX77650 library for how to enable the thermistor biasing.
fneirab 11:bdbd3104995b 321 *
fneirab 11:bdbd3104995b 322 *
fneirab 11:bdbd3104995b 323 * @retval temp - Temperature value from TEMP register in &deg;C
fneirab 11:bdbd3104995b 324 * @retval non-0 negative values check for errors
fneirab 11:bdbd3104995b 325 */
fneirab 7:479a36909ced 326 int MAX17055::get_temperature()
fneirab 2:ff7db397b70f 327 {
fneirab 5:a18a189588dc 328
fneirab 2:ff7db397b70f 329 int ret;
fneirab 11:bdbd3104995b 330 uint16_t temp;
fneirab 5:a18a189588dc 331
fneirab 11:bdbd3104995b 332 ret = readReg(TEMP_REG, temp);
fneirab 11:bdbd3104995b 333 if (ret < F_SUCCESS_0)
fneirab 2:ff7db397b70f 334 return ret;
fneirab 2:ff7db397b70f 335
fneirab 2:ff7db397b70f 336 /* The value is signed. */
fneirab 11:bdbd3104995b 337 if (temp & 0x8000)
fneirab 11:bdbd3104995b 338 temp |= 0xFFFF0000;
fneirab 2:ff7db397b70f 339
fneirab 2:ff7db397b70f 340 /* The value is converted into centigrade scale */
fneirab 2:ff7db397b70f 341 /* Units of LSB = 1 / 256 degree Celsius */
fneirab 11:bdbd3104995b 342 temp >>= 8;
fneirab 2:ff7db397b70f 343
fneirab 11:bdbd3104995b 344 return temp;
fneirab 5:a18a189588dc 345 }
fneirab 3:f77a8345b0e3 346
fneirab 3:f77a8345b0e3 347 /**
fneirab 11:bdbd3104995b 348 * @brief Forced Exit Hibernate Mode Function for MAX17055
fneirab 11:bdbd3104995b 349 * @par Details
fneirab 11:bdbd3104995b 350 * This function executes a force exit from hibernate mode.
fneirab 11:bdbd3104995b 351 *
fneirab 12:519a18fc3b28 352 * @retval HibCFG original value before forced Exit Hibernate mode *
fneirab 11:bdbd3104995b 353 */
fneirab 12:519a18fc3b28 354 uint16_t MAX17055::forcedExitHiberMode()
fneirab 3:f77a8345b0e3 355 {
fneirab 3:f77a8345b0e3 356 uint16_t hibcfg;
fneirab 5:a18a189588dc 357
fneirab 5:a18a189588dc 358 /* Force exit from hibernate */
fneirab 3:f77a8345b0e3 359 //STEP 0: Store original HibCFG value
fneirab 7:479a36909ced 360 readReg(HIBCFG_REG, hibcfg);
fneirab 3:f77a8345b0e3 361
fneirab 12:519a18fc3b28 362 //STEP 1: Write to Soft-Wakeup Command Register
fneirab 12:519a18fc3b28 363 writeReg(VFSOC0_QH0_LOCK_REG, 0x90); //Soft-Wakeup from hibernate
fneirab 5:a18a189588dc 364
fneirab 3:f77a8345b0e3 365 //STEP 2: Write to Hibernate Configuration register
fneirab 7:479a36909ced 366 writeReg(HIBCFG_REG, 0x0); //disable hibernate mode
fneirab 5:a18a189588dc 367
fneirab 12:519a18fc3b28 368 //STEP 3:Write to Soft-Wakeup Command Register
fneirab 12:519a18fc3b28 369 writeReg(VFSOC0_QH0_LOCK_REG, 0x0); //Clear All commands
fneirab 5:a18a189588dc 370
fneirab 3:f77a8345b0e3 371 return hibcfg;
fneirab 5:a18a189588dc 372 }
fneirab 7:479a36909ced 373
fneirab 7:479a36909ced 374 /**
fneirab 12:519a18fc3b28 375 * @brief EZ Config Initialization function
fneirab 11:bdbd3104995b 376 * @par Details
fneirab 12:519a18fc3b28 377 * This function implements the steps for the EZ config m5 FuelGauge
fneirab 12:519a18fc3b28 378 * @param[in] des_data - Plataform_data struct with information about the design.
fneirab 11:bdbd3104995b 379 * @retval 0 on success
fneirab 11:bdbd3104995b 380 * @retval non-zero for errors
fneirab 11:bdbd3104995b 381 */
fneirab 13:fc91b283e689 382 uint16_t MAX17055::EZconfig(platform_data des_data)
fneirab 7:479a36909ced 383 {
fneirab 12:519a18fc3b28 384 ///STEP 2.1.1 EZ config values suggested by manufacturer.
fneirab 7:479a36909ced 385 const int charger_th = 4275;
fneirab 12:519a18fc3b28 386 const int chg_V_high = 51200; // scaling factor high voltage charger
fneirab 7:479a36909ced 387 const int chg_V_low = 44138;
fneirab 12:519a18fc3b28 388 const int param_EZ_FG1 = 0x8400; // Sets config bit for the charge voltage for the m5
fneirab 7:479a36909ced 389 const int param_EZ_FG2 = 0x8000;
fneirab 8:ca8765c30ed2 390 uint16_t dpacc, ret;
fneirab 7:479a36909ced 391
fneirab 12:519a18fc3b28 392 ///STEP 2.1.2 Store the EZ Config values into the appropriate registers.
fneirab 9:f29d5e49b190 393 ret = writeReg(DESIGNCAP_REG, des_data.designcap);
fneirab 12:519a18fc3b28 394 ret = writeReg(DQACC_REG, des_data.designcap >> 5); //DesignCap divide by 32
fneirab 9:f29d5e49b190 395 ret = writeReg(ICHGTERM_REG, des_data.ichgterm);
fneirab 9:f29d5e49b190 396 ret = writeReg(VEMPTY_REG, des_data.vempty);
fneirab 7:479a36909ced 397
fneirab 7:479a36909ced 398 if (des_data.vcharge > charger_th) {
fneirab 7:479a36909ced 399 dpacc = (des_data.designcap >> 5) * chg_V_high / des_data.designcap;
fneirab 9:f29d5e49b190 400 ret = writeReg(DPACC_REG, dpacc);
fneirab 12:519a18fc3b28 401 ret = writeReg(MODELCFG_REG, param_EZ_FG1); //
fneirab 7:479a36909ced 402 } else {
fneirab 7:479a36909ced 403 dpacc = (des_data.designcap >> 5) * chg_V_low / des_data.designcap;
fneirab 9:f29d5e49b190 404 ret = writeReg(DPACC_REG, dpacc);
fneirab 9:f29d5e49b190 405 ret = writeReg(MODELCFG_REG, param_EZ_FG2);
fneirab 7:479a36909ced 406 }
fneirab 7:479a36909ced 407 return ret;
fneirab 7:479a36909ced 408 }
fneirab 7:479a36909ced 409
fneirab 7:479a36909ced 410 /**
fneirab 11:bdbd3104995b 411 * @brief Get reported State Of Charge(SOC) Function from MAX17055 Fuel Gauge.
fneirab 11:bdbd3104995b 412 * @par Details
fneirab 11:bdbd3104995b 413 * This function sends a request to access the RepSOC register
fneirab 11:bdbd3104995b 414 * of the MAX17055. RepSOC is the reported state-of-charge percentage output of the fuel gauge.
fneirab 11:bdbd3104995b 415 *
fneirab 11:bdbd3104995b 416 * @retval soc_data - Reported SOC data from the RepSOC register in % value.
fneirab 11:bdbd3104995b 417 * @retval non-0 negative values check for errors
fneirab 11:bdbd3104995b 418 */
fneirab 7:479a36909ced 419 int MAX17055::get_SOC()
fneirab 7:479a36909ced 420 {
fneirab 7:479a36909ced 421
fneirab 7:479a36909ced 422 int ret;
fneirab 11:bdbd3104995b 423 uint16_t soc_data;
fneirab 7:479a36909ced 424
fneirab 11:bdbd3104995b 425 ret = readReg(REPSOC_REG, soc_data);
fneirab 11:bdbd3104995b 426 if (ret < F_SUCCESS_0)
fneirab 7:479a36909ced 427 return ret;
fneirab 7:479a36909ced 428
fneirab 11:bdbd3104995b 429 soc_data = soc_data >> 8; /* RepSOC LSB: 1/256 % */
fneirab 7:479a36909ced 430
fneirab 11:bdbd3104995b 431 return soc_data;
fneirab 7:479a36909ced 432 }
fneirab 7:479a36909ced 433
fneirab 8:ca8765c30ed2 434 /**
fneirab 12:519a18fc3b28 435 * @brief Get at rate Average State Of Charge(SOC) Function from MAX17055 Fuel Gauge.
fneirab 11:bdbd3104995b 436 * @par Details
fneirab 12:519a18fc3b28 437 * This function sends a request to access the atAvSOC register of the MAX17055.
fneirab 11:bdbd3104995b 438 * The AvSOC registers hold the calculated available capacity and percentage of the
fneirab 11:bdbd3104995b 439 * battery based on all inputs from the ModelGauge m5 algorithm including empty
fneirab 11:bdbd3104995b 440 * compensation. These registers provide unfiltered results. Jumps in the reported
fneirab 11:bdbd3104995b 441 * values can be caused by abrupt changes in load current or temperature.
fneirab 11:bdbd3104995b 442 *
fneirab 12:519a18fc3b28 443 * @retval atAvSOC_data - Average SOC data from the atAVSOC register in % value.
fneirab 11:bdbd3104995b 444 * @retval non-0 negative values check for errors
fneirab 11:bdbd3104995b 445 */
fneirab 12:519a18fc3b28 446 int MAX17055::get_atAvSOC()
fneirab 8:ca8765c30ed2 447 {
fneirab 8:ca8765c30ed2 448 int ret;
fneirab 12:519a18fc3b28 449 uint16_t atAvSOC_data;
fneirab 8:ca8765c30ed2 450
fneirab 12:519a18fc3b28 451 ret = readReg(AVSOC_REG, atAvSOC_data);
fneirab 11:bdbd3104995b 452 if (ret < F_SUCCESS_0)
fneirab 11:bdbd3104995b 453 return ret; //Check errors if data is not correct
fneirab 8:ca8765c30ed2 454
fneirab 12:519a18fc3b28 455 atAvSOC_data = atAvSOC_data >> 8; /* avSOC LSB: 1/256 % */
fneirab 11:bdbd3104995b 456
fneirab 12:519a18fc3b28 457 return atAvSOC_data;
fneirab 8:ca8765c30ed2 458 }
fneirab 7:479a36909ced 459
fneirab 9:f29d5e49b190 460 /**
fneirab 11:bdbd3104995b 461 * @brief Get mix State Of Charge(SOC) Function for MAX17055 Fuel Gauge.
fneirab 11:bdbd3104995b 462 * @par Details
fneirab 11:bdbd3104995b 463 * This function sends a request to access mixSOC register
fneirab 11:bdbd3104995b 464 * of the MAX17055. The MixSOC registers holds the calculated
fneirab 11:bdbd3104995b 465 * remaining capacity and percentage of the cell before any empty compensation
fneirab 11:bdbd3104995b 466 * adjustments are performed.
fneirab 11:bdbd3104995b 467 *
fneirab 11:bdbd3104995b 468 * @retval mixSOC_data - Mixed SOC register values from the mixSOC register in % value.
fneirab 11:bdbd3104995b 469 * @retval non-0 for errors
fneirab 11:bdbd3104995b 470 */
fneirab 11:bdbd3104995b 471 int MAX17055::get_mixSOC()
fneirab 11:bdbd3104995b 472 {
fneirab 11:bdbd3104995b 473 int ret;
fneirab 11:bdbd3104995b 474 uint16_t mixSOC_data;
fneirab 11:bdbd3104995b 475
fneirab 11:bdbd3104995b 476 ret = readReg(MIXSOC_REG, mixSOC_data);
fneirab 11:bdbd3104995b 477 if (ret < F_SUCCESS_0)
fneirab 11:bdbd3104995b 478 return ret;
fneirab 9:f29d5e49b190 479
fneirab 11:bdbd3104995b 480 mixSOC_data = mixSOC_data >> 8; /* RepSOC LSB: 1/256 % */
fneirab 9:f29d5e49b190 481
fneirab 11:bdbd3104995b 482 return mixSOC_data;
fneirab 11:bdbd3104995b 483 }
fneirab 11:bdbd3104995b 484
fneirab 11:bdbd3104995b 485 /**
fneirab 11:bdbd3104995b 486 * @brief Get the Time to Empty(TTE) Function form MAX17055 Fuel Gauge.
fneirab 11:bdbd3104995b 487 * @par Details
fneirab 11:bdbd3104995b 488 * This function sends a request to access the TTE register
fneirab 11:bdbd3104995b 489 * of the MAX17055
fneirab 11:bdbd3104995b 490 * The TTE register holds the estimated time to empty for the
fneirab 11:bdbd3104995b 491 * application under present temperature and load conditions. The TTE value is
fneirab 11:bdbd3104995b 492 * determined by relating AvCap with AvgCurrent. The corresponding AvgCurrent
fneirab 11:bdbd3104995b 493 * filtering gives a delay in TTE, but provides more stable results.
fneirab 11:bdbd3104995b 494 *
fneirab 11:bdbd3104995b 495 * @retval tte_data - Time to Empty data from the TTE register in seconds.
fneirab 11:bdbd3104995b 496 * @retval non-0 negative values check for errors
fneirab 11:bdbd3104995b 497 */
fneirab 12:519a18fc3b28 498 float MAX17055::get_TTE()
fneirab 9:f29d5e49b190 499 {
fneirab 9:f29d5e49b190 500
fneirab 9:f29d5e49b190 501 int ret;
fneirab 11:bdbd3104995b 502 uint16_t tte_data;
fneirab 12:519a18fc3b28 503 float f_tte_data;
fneirab 9:f29d5e49b190 504
fneirab 11:bdbd3104995b 505 ret = readReg(TTE_REG, tte_data);
fneirab 11:bdbd3104995b 506 if (ret < F_SUCCESS_0)
fneirab 11:bdbd3104995b 507 return ret;
fneirab 11:bdbd3104995b 508 else
fneirab 12:519a18fc3b28 509 f_tte_data = ((float)tte_data * 5.625); /* TTE LSB: 5.625 sec */
fneirab 9:f29d5e49b190 510
fneirab 12:519a18fc3b28 511 return f_tte_data;
fneirab 9:f29d5e49b190 512 }
fneirab 7:479a36909ced 513
fneirab 7:479a36909ced 514 /**
fneirab 11:bdbd3104995b 515 * @brief Get the at Time to Empty(atTTE) value Function for MAX17055 Fuel Gauge.
fneirab 11:bdbd3104995b 516 * @par Details
fneirab 11:bdbd3104995b 517 * This function sends a request to access the internal register
fneirab 11:bdbd3104995b 518 * of the MAX17055
fneirab 11:bdbd3104995b 519 *
fneirab 11:bdbd3104995b 520 * @retval atTTE_data - Time to Empty data from the atTTE register in seconds.
fneirab 11:bdbd3104995b 521 * @retval non-0 negative values check for errors
fneirab 11:bdbd3104995b 522 */
fneirab 12:519a18fc3b28 523 float MAX17055::get_atTTE()
fneirab 7:479a36909ced 524 {
fneirab 7:479a36909ced 525
fneirab 7:479a36909ced 526 int ret;
fneirab 11:bdbd3104995b 527 uint16_t atTTE_data;
fneirab 12:519a18fc3b28 528 float f_atTTE_data;
fneirab 7:479a36909ced 529
fneirab 11:bdbd3104995b 530 ret = readReg(ATTTE_REG, atTTE_data);
fneirab 11:bdbd3104995b 531 if (ret < F_SUCCESS_0)
fneirab 11:bdbd3104995b 532 return ret; //Check for errors
fneirab 7:479a36909ced 533 else
fneirab 12:519a18fc3b28 534 f_atTTE_data = ((float)atTTE_data * 5.625); /* TTE LSB: 5.625 sec */
fneirab 7:479a36909ced 535
fneirab 12:519a18fc3b28 536 return f_atTTE_data;
fneirab 7:479a36909ced 537 }
fneirab 7:479a36909ced 538
fneirab 8:ca8765c30ed2 539 /**
fneirab 11:bdbd3104995b 540 * @brief Get the Time to Full(TTE) values Function for MAX17055 Fuel Gauge.
fneirab 11:bdbd3104995b 541 * @par Details
fneirab 11:bdbd3104995b 542 * This function sends a request to access the internal register of the MAX17055
fneirab 11:bdbd3104995b 543 * The TTF register holds the estimated time to full for the application
fneirab 11:bdbd3104995b 544 * under present conditions. The TTF value is determined by learning the
fneirab 11:bdbd3104995b 545 * constant current and constant voltage portions of the charge cycle based
fneirab 11:bdbd3104995b 546 * on experience of prior charge cycles. Time to full is then estimate
fneirab 11:bdbd3104995b 547 * by comparing present charge current to the charge termination current.
fneirab 11:bdbd3104995b 548 * Operation of the TTF register assumes all charge profiles are consistent in the application.
fneirab 11:bdbd3104995b 549 *
fneirab 11:bdbd3104995b 550 * @retval ttf_data - Time to Full data from the TTF register in seconds.
fneirab 11:bdbd3104995b 551 * @retval non-0 negative values check for errors
fneirab 11:bdbd3104995b 552 */
fneirab 12:519a18fc3b28 553 float MAX17055::get_TTF()
fneirab 8:ca8765c30ed2 554 {
fneirab 8:ca8765c30ed2 555
fneirab 8:ca8765c30ed2 556 int ret;
fneirab 8:ca8765c30ed2 557 uint16_t ttf_data;
fneirab 12:519a18fc3b28 558 float f_ttf_data;
fneirab 8:ca8765c30ed2 559
fneirab 8:ca8765c30ed2 560 ret = readReg(TTF_REG, ttf_data);
fneirab 11:bdbd3104995b 561 if (ret < F_SUCCESS_0)
fneirab 8:ca8765c30ed2 562 return ret;
fneirab 8:ca8765c30ed2 563 else
fneirab 12:519a18fc3b28 564 f_ttf_data = ((float)ttf_data * 5.625); /* TTE LSB: 5.625 sec */
fneirab 8:ca8765c30ed2 565
fneirab 12:519a18fc3b28 566 return f_ttf_data;
fneirab 8:ca8765c30ed2 567 }
fneirab 7:479a36909ced 568
fneirab 7:479a36909ced 569 /**
fneirab 11:bdbd3104995b 570 * @brief Get voltage of the cell Function for MAX17055 Fuel Gauge.
fneirab 11:bdbd3104995b 571 * @par Details
fneirab 11:bdbd3104995b 572 * This function sends a request to access the VCell Register
fneirab 11:bdbd3104995b 573 * of the MAX17055 to read the measured voltage from the cell.
fneirab 11:bdbd3104995b 574 *
fneirab 11:bdbd3104995b 575 * @retval vcell_data - vcell data from the VCELL_REG register in uVolts.
fneirab 11:bdbd3104995b 576 * @retval non-0 negative values check for errors
fneirab 11:bdbd3104995b 577 */
fneirab 7:479a36909ced 578 int MAX17055::get_Vcell()
fneirab 7:479a36909ced 579 {
fneirab 7:479a36909ced 580
fneirab 7:479a36909ced 581 int ret;
fneirab 7:479a36909ced 582 uint16_t vcell_data;
fneirab 7:479a36909ced 583
fneirab 7:479a36909ced 584 ret = readReg(VCELL_REG, vcell_data);
fneirab 11:bdbd3104995b 585 if (ret < F_SUCCESS_0)
fneirab 7:479a36909ced 586 return ret;
fneirab 7:479a36909ced 587 else
fneirab 7:479a36909ced 588 ret = lsb_to_uvolts(vcell_data);
fneirab 7:479a36909ced 589 return ret;
fneirab 7:479a36909ced 590 }
fneirab 7:479a36909ced 591
fneirab 7:479a36909ced 592 /**
fneirab 11:bdbd3104995b 593 * @brief Get current Function for MAX17055 Fuel Gauge.
fneirab 11:bdbd3104995b 594 * @par Details
fneirab 11:bdbd3104995b 595 * This function sends a request to access the CURRENT register
fneirab 12:519a18fc3b28 596 * of the MAX17055 to read the current readings.
fneirab 11:bdbd3104995b 597 *
fneirab 12:519a18fc3b28 598 * @param[in] des_data - Plataform_data struct with information about the design.
fneirab 11:bdbd3104995b 599 *
fneirab 11:bdbd3104995b 600 * @retval curr_data - current data from the CURRENT register in uAmps.
fneirab 11:bdbd3104995b 601 * @retval non-0 negative values check for errors.
fneirab 11:bdbd3104995b 602 */
fneirab 7:479a36909ced 603 int MAX17055::get_Current( platform_data des_data )
fneirab 7:479a36909ced 604 {
fneirab 7:479a36909ced 605
fneirab 7:479a36909ced 606 int ret,design_rsense;
fneirab 11:bdbd3104995b 607 uint16_t curr_data;
fneirab 7:479a36909ced 608
fneirab 11:bdbd3104995b 609 ret = readReg(CURRENT_REG, curr_data);
fneirab 11:bdbd3104995b 610 if (ret < F_SUCCESS_0)
fneirab 7:479a36909ced 611 return ret;
fneirab 7:479a36909ced 612 else
fneirab 7:479a36909ced 613 design_rsense = des_data.rsense;
fneirab 11:bdbd3104995b 614 ret = raw_current_to_uamps((uint32_t)curr_data, design_rsense);
fneirab 7:479a36909ced 615 return ret;
fneirab 7:479a36909ced 616 }
fneirab 7:479a36909ced 617
fneirab 7:479a36909ced 618 /**
fneirab 11:bdbd3104995b 619 * @brief Get average current Function for MAX17055 Fuel Gauge.
fneirab 11:bdbd3104995b 620 * @par Details
fneirab 11:bdbd3104995b 621 * This function sends a request to access the aveCURRENT register
fneirab 12:519a18fc3b28 622 * of the MAX17055 to read the average current readings.
fneirab 11:bdbd3104995b 623 *
fneirab 12:519a18fc3b28 624 * @param[in] des_data - Plataform_data struct with information about the design.
fneirab 11:bdbd3104995b 625 *
fneirab 11:bdbd3104995b 626 * @retval aveCurr_data - current data from the AVGCURRENT register in uAmps.
fneirab 11:bdbd3104995b 627 * @retval non-0 negative values check for errors.
fneirab 11:bdbd3104995b 628 */
fneirab 7:479a36909ced 629 int MAX17055::get_AvgCurrent( platform_data des_data )
fneirab 7:479a36909ced 630 {
fneirab 7:479a36909ced 631 int ret, design_rsense;
fneirab 7:479a36909ced 632 uint16_t data;
fneirab 7:479a36909ced 633 uint32_t aveCurr_data;
fneirab 7:479a36909ced 634
fneirab 7:479a36909ced 635 ret = readReg(AVGCURRENT_REG, data);
fneirab 11:bdbd3104995b 636 if (ret < F_SUCCESS_0)
fneirab 7:479a36909ced 637 return ret;
fneirab 7:479a36909ced 638 else
fneirab 7:479a36909ced 639 aveCurr_data = data;
fneirab 7:479a36909ced 640 design_rsense = des_data.rsense;
fneirab 7:479a36909ced 641 aveCurr_data = raw_current_to_uamps(aveCurr_data, design_rsense);
fneirab 7:479a36909ced 642 return aveCurr_data;
fneirab 7:479a36909ced 643 }
fneirab 7:479a36909ced 644
fneirab 7:479a36909ced 645 /**
fneirab 12:519a18fc3b28 646 * @brief lsb_to_uvolts Conversion Function
fneirab 11:bdbd3104995b 647 * @par Details
fneirab 11:bdbd3104995b 648 * This function takes the lsb value of the register and convert it
fneirab 11:bdbd3104995b 649 * to uvolts
fneirab 11:bdbd3104995b 650 *
fneirab 11:bdbd3104995b 651 * @param[in] lsb - value of register lsb
fneirab 11:bdbd3104995b 652 * @retval conv_2_uvolts - value converted lsb to uvolts
fneirab 11:bdbd3104995b 653 */
fneirab 7:479a36909ced 654 int MAX17055:: lsb_to_uvolts(uint16_t lsb)
fneirab 7:479a36909ced 655 {
fneirab 11:bdbd3104995b 656 int conv_2_uvolts;
fneirab 11:bdbd3104995b 657 conv_2_uvolts = (lsb * 625) / 8; /* 78.125uV per bit */
fneirab 11:bdbd3104995b 658 return conv_2_uvolts;
fneirab 7:479a36909ced 659 }
fneirab 7:479a36909ced 660
fneirab 7:479a36909ced 661 /**
fneirab 12:519a18fc3b28 662 * @brief raw_current_to_uamp Conversion Function
fneirab 11:bdbd3104995b 663 * @par Details
fneirab 11:bdbd3104995b 664 * This function takes the raw current value of the register and
fneirab 11:bdbd3104995b 665 * converts it to uamps
fneirab 11:bdbd3104995b 666 *
fneirab 11:bdbd3104995b 667 * @param[in] curr - raw current value of register
fneirab 11:bdbd3104995b 668 * @retval res - converted raw current to uamps (Signed 2's complement)
fneirab 11:bdbd3104995b 669 */
fneirab 7:479a36909ced 670 int MAX17055::raw_current_to_uamps(uint32_t curr, int rsense_value)
fneirab 7:479a36909ced 671 {
fneirab 7:479a36909ced 672 int res = curr;
fneirab 7:479a36909ced 673 /* Negative */
fneirab 7:479a36909ced 674 if (res & 0x8000) {
fneirab 7:479a36909ced 675 res |= 0xFFFF0000;
fneirab 7:479a36909ced 676 } else {
fneirab 12:519a18fc3b28 677 res *= 1562500 /(rsense_value * 1000); //Change to interact with the rsense implemented in the design
fneirab 7:479a36909ced 678 }
fneirab 7:479a36909ced 679 return res;
fneirab 9:f29d5e49b190 680 }
fneirab 9:f29d5e49b190 681
fneirab 9:f29d5e49b190 682 /**
fneirab 11:bdbd3104995b 683 * @brief Save Learned Parameters Function for battery Fuel Gauge model.
fneirab 11:bdbd3104995b 684 * @par Details
fneirab 11:bdbd3104995b 685 * It is recommended to save the learned capacity parameters every
fneirab 11:bdbd3104995b 686 * time bit 2 of the Cycles register toggles
fneirab 11:bdbd3104995b 687 * (so that it is saved every 64% change in the battery)
fneirab 11:bdbd3104995b 688 * so that if power is lost the values can easily be restored.
fneirab 11:bdbd3104995b 689 *
fneirab 11:bdbd3104995b 690 * @param[in] FG_params Fuel Gauge Parameters based on design details.
fneirab 11:bdbd3104995b 691 *
fneirab 11:bdbd3104995b 692 * @retval 0 for success
fneirab 11:bdbd3104995b 693 * @retval non-0 negative for errors
fneirab 11:bdbd3104995b 694 */
fneirab 9:f29d5e49b190 695 int MAX17055::save_Params(saved_FG_params_t FG_params)
fneirab 9:f29d5e49b190 696 {
fneirab 11:bdbd3104995b 697 int ret, value;
fneirab 9:f29d5e49b190 698 uint16_t data[5];
fneirab 11:bdbd3104995b 699 ///STEP 1. Checks if the cycel register bit 2 has changed.
fneirab 11:bdbd3104995b 700 ret = readReg(CYCLES_REG, data[3]);
fneirab 11:bdbd3104995b 701 if (ret < F_SUCCESS_0)
fneirab 11:bdbd3104995b 702 return ret;
fneirab 11:bdbd3104995b 703 else {
fneirab 11:bdbd3104995b 704 value = data[3];
fneirab 11:bdbd3104995b 705 }
fneirab 11:bdbd3104995b 706
fneirab 12:519a18fc3b28 707 ///STEP 2. Save the capacity parameters for the specific battery.
fneirab 9:f29d5e49b190 708 ret = readReg(RCOMP0_REG, data[0]);
fneirab 11:bdbd3104995b 709 if (ret < F_SUCCESS_0)
fneirab 9:f29d5e49b190 710 return ret;
fneirab 9:f29d5e49b190 711 else
fneirab 9:f29d5e49b190 712 FG_params.rcomp0 = data[0];
fneirab 9:f29d5e49b190 713
fneirab 9:f29d5e49b190 714 ret = readReg(TEMPCO_REG, data[1]);
fneirab 11:bdbd3104995b 715 if (ret < F_SUCCESS_0)
fneirab 9:f29d5e49b190 716 return ret;
fneirab 9:f29d5e49b190 717 else
fneirab 9:f29d5e49b190 718 FG_params.temp_co = data[1];
fneirab 9:f29d5e49b190 719
fneirab 9:f29d5e49b190 720 ret = readReg(FULLCAPREP_REG, data[2]);
fneirab 11:bdbd3104995b 721 if (ret < F_SUCCESS_0)
fneirab 9:f29d5e49b190 722 return ret;
fneirab 9:f29d5e49b190 723 else
fneirab 9:f29d5e49b190 724 FG_params.full_cap_rep = data[2];
fneirab 9:f29d5e49b190 725
fneirab 11:bdbd3104995b 726 FG_params.cycles = data[3];
fneirab 9:f29d5e49b190 727
fneirab 9:f29d5e49b190 728 ret = readReg(FULLCAPNOM_REG, data[4]);
fneirab 11:bdbd3104995b 729 if (ret < F_SUCCESS_0)
fneirab 9:f29d5e49b190 730 return ret;
fneirab 9:f29d5e49b190 731 else
fneirab 9:f29d5e49b190 732 FG_params.full_cap_nom = data[4];
fneirab 9:f29d5e49b190 733 return ret;
fneirab 9:f29d5e49b190 734 }
fneirab 9:f29d5e49b190 735
fneirab 9:f29d5e49b190 736 /**
fneirab 12:519a18fc3b28 737 * @brief Restore Parameters Function for battery Fuel Gauge model.
fneirab 11:bdbd3104995b 738 * @par Details
fneirab 11:bdbd3104995b 739 * If power is lost, then the capacity information
fneirab 11:bdbd3104995b 740 * can be easily restored with this function.
fneirab 11:bdbd3104995b 741 *
fneirab 11:bdbd3104995b 742 * @param[in] FG_params Struct for Fuel Gauge Parameters
fneirab 11:bdbd3104995b 743 * @retval 0 for success
fneirab 11:bdbd3104995b 744 * @retval non-0 negative for errors
fneirab 11:bdbd3104995b 745 */
fneirab 9:f29d5e49b190 746 int MAX17055::restore_Params(saved_FG_params_t FG_params)
fneirab 9:f29d5e49b190 747 {
fneirab 9:f29d5e49b190 748 int ret;
fneirab 9:f29d5e49b190 749 uint16_t temp_data, fullcapnom_data, mixCap_calc, dQacc_calc;
fneirab 12:519a18fc3b28 750 uint16_t dPacc_value = 0x0C80;//Set it to 200%
fneirab 9:f29d5e49b190 751
fneirab 11:bdbd3104995b 752 ///STEP 1. Restoring capacity parameters
fneirab 9:f29d5e49b190 753 write_and_verify_reg(RCOMP0_REG, FG_params.rcomp0);
fneirab 9:f29d5e49b190 754 write_and_verify_reg(TEMPCO_REG, FG_params.temp_co);
fneirab 9:f29d5e49b190 755 write_and_verify_reg(FULLCAPNOM_REG, FG_params.full_cap_nom);
fneirab 9:f29d5e49b190 756
fneirab 11:bdbd3104995b 757 wait_ms(350);//check the type of wait
fneirab 11:bdbd3104995b 758
fneirab 11:bdbd3104995b 759 ///STEP 2. Restore FullCap
fneirab 9:f29d5e49b190 760 ret = readReg(FULLCAPNOM_REG, fullcapnom_data);
fneirab 11:bdbd3104995b 761 if (ret < F_SUCCESS_0)
fneirab 9:f29d5e49b190 762 return ret;
fneirab 9:f29d5e49b190 763
fneirab 12:519a18fc3b28 764 ret = readReg(MIXSOC_REG, temp_data); //check if Error in software guide register incorrect
fneirab 11:bdbd3104995b 765 if (ret < F_SUCCESS_0)
fneirab 9:f29d5e49b190 766 return ret;
fneirab 9:f29d5e49b190 767
fneirab 9:f29d5e49b190 768 mixCap_calc = (temp_data*fullcapnom_data)/25600;
fneirab 9:f29d5e49b190 769
fneirab 9:f29d5e49b190 770 write_and_verify_reg(MIXCAP_REG, mixCap_calc);
fneirab 9:f29d5e49b190 771 write_and_verify_reg(FULLCAPREP_REG, FG_params.full_cap_rep);
fneirab 9:f29d5e49b190 772
fneirab 11:bdbd3104995b 773 ///STEP 3. Write DQACC to 200% of Capacity and DPACC to 200%
fneirab 9:f29d5e49b190 774 dQacc_calc = (FG_params.full_cap_nom/ 16) ;
fneirab 9:f29d5e49b190 775
fneirab 9:f29d5e49b190 776 write_and_verify_reg(DPACC_REG, dPacc_value);
fneirab 9:f29d5e49b190 777 write_and_verify_reg(DQACC_REG, dQacc_calc);
fneirab 9:f29d5e49b190 778
fneirab 9:f29d5e49b190 779 wait_ms(350);
fneirab 9:f29d5e49b190 780
fneirab 11:bdbd3104995b 781 ///STEP 4. Restore Cycles register
fneirab 9:f29d5e49b190 782 ret = write_and_verify_reg(CYCLES_REG, FG_params.cycles);
fneirab 11:bdbd3104995b 783 if (ret < F_SUCCESS_0)
fneirab 9:f29d5e49b190 784 return ret;
fneirab 11:bdbd3104995b 785 return ret;
fneirab 11:bdbd3104995b 786 }
fneirab 11:bdbd3104995b 787
fneirab 11:bdbd3104995b 788 /**
fneirab 11:bdbd3104995b 789 * @brief Function to Save Average Current to At Rate register.
fneirab 11:bdbd3104995b 790 * @par Details
fneirab 12:519a18fc3b28 791 * For User friendliness display of atTTE, atAvSOC, atAvCAP
fneirab 11:bdbd3104995b 792 * write the average current to At Rate registers every 10sec
fneirab 11:bdbd3104995b 793 * when the battery is in use.
fneirab 11:bdbd3104995b 794 * NOTE: do not use this function when the Battery is charging.
fneirab 11:bdbd3104995b 795 *
fneirab 11:bdbd3104995b 796 * @retval 0 for success
fneirab 11:bdbd3104995b 797 * @retval non-0 negative for errors
fneirab 11:bdbd3104995b 798 */
fneirab 11:bdbd3104995b 799 int MAX17055::avCurr_2_atRate()
fneirab 11:bdbd3104995b 800 {
fneirab 11:bdbd3104995b 801 int ret;
fneirab 11:bdbd3104995b 802 uint16_t avCurr_data;
fneirab 11:bdbd3104995b 803
fneirab 11:bdbd3104995b 804 ret = readReg(AVGCURRENT_REG, avCurr_data);
fneirab 12:519a18fc3b28 805 if (ret < F_SUCCESS_0){
fneirab 12:519a18fc3b28 806 return ret = -3;
fneirab 12:519a18fc3b28 807 }
fneirab 11:bdbd3104995b 808
fneirab 11:bdbd3104995b 809 //Write avCurrent to atRate Register
fneirab 12:519a18fc3b28 810 ret = writeReg(ATRATE_REG, avCurr_data);
fneirab 12:519a18fc3b28 811 if (ret < F_SUCCESS_0){
fneirab 11:bdbd3104995b 812 return ret;
fneirab 12:519a18fc3b28 813 }
fneirab 12:519a18fc3b28 814 return F_SUCCESS_0;
fneirab 7:479a36909ced 815 }