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 Oct 09 20:28:41 2018 +0000
Revision:
17:7447aaa9c121
Parent:
15:291446b008df
Child:
18:37bca022d144
New sample code Updated, new functions for REP cap and specific register reads and clean up some of the old functions.

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