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

Fork of max17055 by Central Applications - Mbed Code repo

Committer:
fneirab
Date:
Tue Feb 27 15:53:04 2018 +0000
Revision:
11:bdbd3104995b
Parent:
9:f29d5e49b190
Child:
12:519a18fc3b28
new documentation. Need to check if the functions had been affected by the changes.

Who changed what in which revision?

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