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 23 17:30:14 2018 +0000
Revision:
19:20590e00feab
Parent:
18:37bca022d144
Child:
20:dcb0e5893677
fixed Write verify function bugs, and POR clear function

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