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 10 00:06:40 2017 +0000
Revision:
7:479a36909ced
Parent:
6:5ced10109ebf
Child:
8:ca8765c30ed2
add functions and debugged for complete EZ config function to be completed.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fneirab 4:a4d6ae2182c2 1 /******************************************************************//**
fneirab 4:a4d6ae2182c2 2 * @file max17055.cpp
fneirab 4:a4d6ae2182c2 3 *
fneirab 4:a4d6ae2182c2 4 * @author Felipe Neira - Maxim Integrated - TTS
fneirab 4:a4d6ae2182c2 5 *
fneirab 4:a4d6ae2182c2 6 * @version 1.0
fneirab 4:a4d6ae2182c2 7 *
fneirab 4:a4d6ae2182c2 8 * Started: 11SEP17
fneirab 4:a4d6ae2182c2 9 *
fneirab 5:a18a189588dc 10 * Updated:
fneirab 4:a4d6ae2182c2 11 *
fneirab 4:a4d6ae2182c2 12 * @brief Source file for MAX31855 class
fneirab 4:a4d6ae2182c2 13 *
fneirab 4:a4d6ae2182c2 14 ********************************************************************************
fneirab 4:a4d6ae2182c2 15 * Copyright (C) 2017 Maxim Integrated Products, Inc., All Rights Reserved.
fneirab 4:a4d6ae2182c2 16 *
fneirab 4:a4d6ae2182c2 17 * Permission is hereby granted, free of charge, to any person obtaining a
fneirab 4:a4d6ae2182c2 18 * copy of this software and associated documentation files (the "Software"),
fneirab 4:a4d6ae2182c2 19 * to deal in the Software without restriction, including without limitation
fneirab 4:a4d6ae2182c2 20 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
fneirab 4:a4d6ae2182c2 21 * and/or sell copies of the Software, and to permit persons to whom the
fneirab 4:a4d6ae2182c2 22 * Software is furnished to do so, subject to the following conditions:
fneirab 4:a4d6ae2182c2 23 *
fneirab 4:a4d6ae2182c2 24 * The above copyright notice and this permission notice shall be included
fneirab 4:a4d6ae2182c2 25 * in all copies or substantial portions of the Software.
fneirab 4:a4d6ae2182c2 26 *
fneirab 4:a4d6ae2182c2 27 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
fneirab 4:a4d6ae2182c2 28 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
fneirab 4:a4d6ae2182c2 29 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
fneirab 4:a4d6ae2182c2 30 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
fneirab 4:a4d6ae2182c2 31 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
fneirab 4:a4d6ae2182c2 32 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
fneirab 4:a4d6ae2182c2 33 * OTHER DEALINGS IN THE SOFTWARE.
fneirab 4:a4d6ae2182c2 34 *
fneirab 4:a4d6ae2182c2 35 * Except as contained in this notice, the name of Maxim Integrated
fneirab 4:a4d6ae2182c2 36 * Products, Inc. shall not be used except as stated in the Maxim Integrated
fneirab 4:a4d6ae2182c2 37 * Products, Inc. Branding Policy.
fneirab 4:a4d6ae2182c2 38 *
fneirab 4:a4d6ae2182c2 39 * The mere transfer of this software does not imply any licenses
fneirab 4:a4d6ae2182c2 40 * of trade secrets, proprietary technology, copyrights, patents,
fneirab 4:a4d6ae2182c2 41 * trademarks, maskwork rights, or any other form of intellectual
fneirab 4:a4d6ae2182c2 42 * property whatsoever. Maxim Integrated Products, Inc. retains all
fneirab 4:a4d6ae2182c2 43 * ownership rights.
fneirab 4:a4d6ae2182c2 44 *
fneirab 4:a4d6ae2182c2 45 ******************************************************************************/
fneirab 0:80c39eb8f3ba 46
fneirab 0:80c39eb8f3ba 47 #include "mbed.h"
fneirab 0:80c39eb8f3ba 48 #include "max17055.h"
fneirab 0:80c39eb8f3ba 49
fneirab 5:a18a189588dc 50 #define DRV_NAME "max17055"
fneirab 5:a18a189588dc 51
fneirab 5:a18a189588dc 52 /* CONFIG register bits */
fneirab 5:a18a189588dc 53 #define MAX17055_CONFIG_ALRT_EN (1 << 2)
fneirab 5:a18a189588dc 54 #define MAX17055_CONFIG2_LDMDL (1 << 5)
fneirab 5:a18a189588dc 55
fneirab 5:a18a189588dc 56 /* STATUS register bits */
fneirab 5:a18a189588dc 57 #define MAX17055_STATUS_BST (1 << 3)
fneirab 5:a18a189588dc 58 #define MAX17055_STATUS_POR (1 << 1)
fneirab 5:a18a189588dc 59
fneirab 5:a18a189588dc 60 /* MODELCFG register bits */
fneirab 5:a18a189588dc 61 #define MAX17055_MODELCFG_REFRESH (1 << 15)
fneirab 5:a18a189588dc 62
fneirab 5:a18a189588dc 63 /* TALRTTH register bits */
fneirab 5:a18a189588dc 64 #define MIN_TEMP_ALERT 0
fneirab 5:a18a189588dc 65 #define MAX_TEMP_ALERT 8
fneirab 5:a18a189588dc 66
fneirab 5:a18a189588dc 67 /* FSTAT register bits */
fneirab 5:a18a189588dc 68 #define MAX17055_FSTAT_DNR (1)
fneirab 5:a18a189588dc 69
fneirab 5:a18a189588dc 70 /* STATUS interrupt status bits */
fneirab 5:a18a189588dc 71 #define MAX17055_STATUS_ALRT_CLR_MASK (0x88BB)
fneirab 5:a18a189588dc 72 #define MAX17055_STATUS_SOC_MAX_ALRT (1 << 14)
fneirab 5:a18a189588dc 73 #define MAX17055_STATUS_TEMP_MAX_ALRT (1 << 13)
fneirab 5:a18a189588dc 74 #define MAX17055_STATUS_VOLT_MAX_ALRT (1 << 12)
fneirab 5:a18a189588dc 75 #define MAX17055_STATUS_SOC_MIN_ALRT (1 << 10)
fneirab 5:a18a189588dc 76 #define MAX17055_STATUS_TEMP_MIN_ALRT (1 << 9)
fneirab 5:a18a189588dc 77 #define MAX17055_STATUS_VOLT_MIN_ALRT (1 << 8)
fneirab 5:a18a189588dc 78 #define MAX17055_STATUS_CURR_MAX_ALRT (1 << 6)
fneirab 5:a18a189588dc 79 #define MAX17055_STATUS_CURR_MIN_ALRT (1 << 2)
fneirab 5:a18a189588dc 80
fneirab 5:a18a189588dc 81 #define MAX17055_VMAX_TOLERANCE 50 /* 50 mV */
fneirab 4:a4d6ae2182c2 82
fneirab 0:80c39eb8f3ba 83
fneirab 6:5ced10109ebf 84 ///////////////////////////////////////////////////////////////////////////////
fneirab 5:a18a189588dc 85
fneirab 5:a18a189588dc 86 MAX17055::MAX17055(I2C &i2c):
fneirab 5:a18a189588dc 87 m_i2cBus(i2c)
fneirab 0:80c39eb8f3ba 88 {
fneirab 5:a18a189588dc 89 //empty block
fneirab 0:80c39eb8f3ba 90 }
fneirab 0:80c39eb8f3ba 91
fneirab 6:5ced10109ebf 92 ///////////////////////////////////////////////////////////////////////////////
fneirab 0:80c39eb8f3ba 93 MAX17055::~MAX17055()
fneirab 0:80c39eb8f3ba 94 {
fneirab 0:80c39eb8f3ba 95 //empty block
fneirab 0:80c39eb8f3ba 96 }
fneirab 5:a18a189588dc 97
fneirab 5:a18a189588dc 98
fneirab 1:a031f0c6a71e 99 ///////////////////////////////////////////////////////////////////////////////
fneirab 0:80c39eb8f3ba 100
fneirab 0:80c39eb8f3ba 101 /**
fneirab 0:80c39eb8f3ba 102 * \brief Write a value to a MAX17055 register
fneirab 0:80c39eb8f3ba 103 * \par Details
fneirab 0:80c39eb8f3ba 104 * This function writes a value to a MAX17055 register
fneirab 0:80c39eb8f3ba 105 *
fneirab 1:a031f0c6a71e 106 * \param[in] reg_addr - register address
fneirab 1:a031f0c6a71e 107 * \param[in] reg_data - register data
fneirab 0:80c39eb8f3ba 108 *
fneirab 1:a031f0c6a71e 109 * \retval 1 on success
fneirab 0:80c39eb8f3ba 110 */
fneirab 0:80c39eb8f3ba 111
fneirab 0:80c39eb8f3ba 112 int MAX17055::writeReg(Registers_e reg_addr, uint16_t reg_data)
fneirab 0:80c39eb8f3ba 113 {
fneirab 0:80c39eb8f3ba 114
fneirab 7:479a36909ced 115 uint16_t mask = 0x00FF;
fneirab 1:a031f0c6a71e 116 uint8_t dataLSB;
fneirab 1:a031f0c6a71e 117 uint8_t dataMSB;
fneirab 5:a18a189588dc 118
fneirab 7:479a36909ced 119 dataLSB = reg_data & mask;
fneirab 7:479a36909ced 120 dataMSB = (reg_data >> 8) & mask;
fneirab 5:a18a189588dc 121
fneirab 7:479a36909ced 122 char addr_plus_data[3] = {reg_addr, dataLSB, dataMSB};
fneirab 5:a18a189588dc 123
fneirab 7:479a36909ced 124 if ( m_i2cBus.write(I2C_W_ADRS, addr_plus_data, 3, false) == 0)
fneirab 0:80c39eb8f3ba 125 return 1;
fneirab 0:80c39eb8f3ba 126 else
fneirab 0:80c39eb8f3ba 127 return 0;
fneirab 0:80c39eb8f3ba 128
fneirab 0:80c39eb8f3ba 129 }
fneirab 1:a031f0c6a71e 130 ///////////////////////////////////////////////////////////////////////////////
fneirab 0:80c39eb8f3ba 131 /**
fneirab 0:80c39eb8f3ba 132 * \brief Read a MAX17055 register
fneirab 0:80c39eb8f3ba 133 * \par Details
fneirab 0:80c39eb8f3ba 134 * This function reads a MAX17055 register
fneirab 0:80c39eb8f3ba 135 *
fneirab 1:a031f0c6a71e 136 * \param[in] reg_addr - register address
fneirab 1:a031f0c6a71e 137 * \param[out] &value - pointer that stores the register data
fneirab 0:80c39eb8f3ba 138 *
fneirab 0:80c39eb8f3ba 139 * \retval 1 on success
fneirab 0:80c39eb8f3ba 140 */
fneirab 0:80c39eb8f3ba 141
fneirab 0:80c39eb8f3ba 142
fneirab 1:a031f0c6a71e 143 int32_t MAX17055::readReg(Registers_e reg_addr, uint16_t &value)
fneirab 0:80c39eb8f3ba 144 {
fneirab 0:80c39eb8f3ba 145 int32_t result;
fneirab 7:479a36909ced 146 uint16_t mask = 0x00FF;
fneirab 1:a031f0c6a71e 147 char local_data[1];
fneirab 0:80c39eb8f3ba 148 local_data[0] = reg_addr;
fneirab 1:a031f0c6a71e 149 char read_data[2];
fneirab 5:a18a189588dc 150
fneirab 0:80c39eb8f3ba 151 result = m_i2cBus.write(I2C_W_ADRS, local_data, 1);
fneirab 5:a18a189588dc 152 if(result == 0) {
fneirab 1:a031f0c6a71e 153 result = m_i2cBus.read(I2C_R_ADRS, read_data , 2, false);
fneirab 5:a18a189588dc 154 if (result == 0) {
fneirab 7:479a36909ced 155 value = ( ((read_data[1] & mask) << 8) + (read_data[0]));
fneirab 1:a031f0c6a71e 156 result = 1;
fneirab 5:a18a189588dc 157 }
fneirab 0:80c39eb8f3ba 158 }
fneirab 5:a18a189588dc 159
fneirab 0:80c39eb8f3ba 160 return result;
fneirab 5:a18a189588dc 161
fneirab 0:80c39eb8f3ba 162 }
fneirab 0:80c39eb8f3ba 163
fneirab 2:ff7db397b70f 164 ///////////////////////////////////////////////////////////////////////////////
fneirab 1:a031f0c6a71e 165 /**
fneirab 1:a031f0c6a71e 166 * \brief Write and Verify a MAX17055 register
fneirab 1:a031f0c6a71e 167 * \par Details
fneirab 1:a031f0c6a71e 168 * This function wites and verifies if the writing process was successful
fneirab 1:a031f0c6a71e 169 *
fneirab 1:a031f0c6a71e 170 * \param[in] reg_addr - register address
fneirab 5:a18a189588dc 171 * \param[out] reg_data - the variable that contains the data to write
fneirab 1:a031f0c6a71e 172 * to the register address
fneirab 1:a031f0c6a71e 173 *
fneirab 1:a031f0c6a71e 174 * \retval 1 on success
fneirab 1:a031f0c6a71e 175 */
fneirab 1:a031f0c6a71e 176
fneirab 1:a031f0c6a71e 177
fneirab 5:a18a189588dc 178 int MAX17055::write_and_verify_reg(Registers_e reg_addr, uint16_t reg_data)
fneirab 5:a18a189588dc 179 {
fneirab 1:a031f0c6a71e 180 int retries = 8;
fneirab 1:a031f0c6a71e 181 int ret;
fneirab 1:a031f0c6a71e 182 int statusRead;
fneirab 1:a031f0c6a71e 183 int statusWrite;
fneirab 1:a031f0c6a71e 184 uint16_t read_data;
fneirab 5:a18a189588dc 185
fneirab 1:a031f0c6a71e 186 do {
fneirab 1:a031f0c6a71e 187 statusWrite = writeReg(reg_addr, reg_data);
fneirab 1:a031f0c6a71e 188 if (statusWrite != 1)
fneirab 1:a031f0c6a71e 189 ret = -1;
fneirab 1:a031f0c6a71e 190 wait_ms(3);
fneirab 5:a18a189588dc 191 statusRead = readReg(reg_addr, read_data);
fneirab 1:a031f0c6a71e 192 if (statusRead != 1)
fneirab 1:a031f0c6a71e 193 ret = -2;
fneirab 5:a18a189588dc 194 if (read_data != reg_data) {
fneirab 1:a031f0c6a71e 195 ret = -3;
fneirab 1:a031f0c6a71e 196 retries--;
fneirab 1:a031f0c6a71e 197 }
fneirab 5:a18a189588dc 198 } while (retries && read_data != reg_data);
fneirab 5:a18a189588dc 199
fneirab 6:5ced10109ebf 200 if (ret<0)
fneirab 1:a031f0c6a71e 201 return ret;
fneirab 7:479a36909ced 202 else
fneirab 1:a031f0c6a71e 203 return 1;
fneirab 1:a031f0c6a71e 204 }
fneirab 2:ff7db397b70f 205
fneirab 2:ff7db397b70f 206 ////////////////////////////////////////////////////////////////////////////////
fneirab 2:ff7db397b70f 207
fneirab 2:ff7db397b70f 208 /**
fneirab 3:f77a8345b0e3 209 * \brief Initialise Function for MAX17055
fneirab 3:f77a8345b0e3 210 * \par Details
fneirab 3:f77a8345b0e3 211 * This function intitializes the MAX17055
fneirab 3:f77a8345b0e3 212 *
fneirab 5:a18a189588dc 213 * \retval 1 on success
fneirab 3:f77a8345b0e3 214 * 0 if device is not present
fneirab 3:f77a8345b0e3 215 * -1 if errors exist
fneirab 3:f77a8345b0e3 216 */
fneirab 5:a18a189588dc 217
fneirab 5:a18a189588dc 218
fneirab 7:479a36909ced 219 int MAX17055::init(platform_data des_data)
fneirab 2:ff7db397b70f 220 {
fneirab 6:5ced10109ebf 221
fneirab 5:a18a189588dc 222 int status, ret;
fneirab 7:479a36909ced 223 uint16_t read_data, hibcfg_value, reg;
fneirab 5:a18a189588dc 224
fneirab 5:a18a189588dc 225
fneirab 7:479a36909ced 226 status = readReg(VERSION_REG, read_data);
fneirab 2:ff7db397b70f 227 if (status == 0)
fneirab 2:ff7db397b70f 228 return status; //Device is not present in the i2c Bus
fneirab 5:a18a189588dc 229
fneirab 2:ff7db397b70f 230 /* Step 0: Check for POR */
fneirab 2:ff7db397b70f 231 /* Skip load model if POR bit is cleared */
fneirab 5:a18a189588dc 232
fneirab 7:479a36909ced 233 readReg(STATUS_REG, read_data);
fneirab 2:ff7db397b70f 234
fneirab 2:ff7db397b70f 235 if (!(read_data & MAX17055_STATUS_POR ) )
fneirab 5:a18a189588dc 236 return -1; //POR is not set. Skip Initialization.
fneirab 2:ff7db397b70f 237
fneirab 2:ff7db397b70f 238 /* Step 1: Check if FStat.DNR == 0 */
fneirab 3:f77a8345b0e3 239 // Do not continue until FSTAT.DNR == 0
fneirab 6:5ced10109ebf 240 printf("step 0 check \r\n");
fneirab 7:479a36909ced 241
fneirab 6:5ced10109ebf 242 int time_out = 500;
fneirab 7:479a36909ced 243 ret = poll_flag_clear(FSTAT_REG, MAX17055_FSTAT_DNR, time_out);
fneirab 7:479a36909ced 244 if (ret < 0) {
fneirab 6:5ced10109ebf 245 printf("Unsuccessful init: Data Not Ready!\n");
fneirab 6:5ced10109ebf 246 return ret;
fneirab 3:f77a8345b0e3 247 }
fneirab 5:a18a189588dc 248
fneirab 5:a18a189588dc 249 /* Force exit from hibernate */
fneirab 5:a18a189588dc 250 hibcfg_value = forcedExitHyberMode();
fneirab 7:479a36909ced 251
fneirab 6:5ced10109ebf 252 printf("step 1 check \r\n");
fneirab 5:a18a189588dc 253
fneirab 5:a18a189588dc 254 /* Step 2: Initialize configuration */
fneirab 5:a18a189588dc 255 switch (1) {
fneirab 5:a18a189588dc 256 case MODEL_LOADING_OPTION1:
fneirab 5:a18a189588dc 257 /* Step 2.1: Option 1 EZ Config */
fneirab 7:479a36909ced 258 EZconfig_init(des_data);
fneirab 5:a18a189588dc 259
fneirab 5:a18a189588dc 260 /* Poll ModelCFG.ModelRefresh bit for clear */
fneirab 7:479a36909ced 261 int time_out = 500; //msec
fneirab 7:479a36909ced 262 ret = poll_flag_clear(MODELCFG_REG, MAX17055_MODELCFG_REFRESH, time_out);
fneirab 5:a18a189588dc 263 if(ret < 0) {
fneirab 5:a18a189588dc 264 //dev_err(priv->dev, "Option1 model refresh not completed!\n");
fneirab 5:a18a189588dc 265 return ret;
fneirab 5:a18a189588dc 266 }
fneirab 7:479a36909ced 267
fneirab 5:a18a189588dc 268 break;
fneirab 5:a18a189588dc 269 }
fneirab 5:a18a189588dc 270 /* Restore original HibCfg */
fneirab 7:479a36909ced 271 writeReg(HIBCFG_REG, hibcfg_value);
fneirab 6:5ced10109ebf 272 printf("Last section check \r\n");
fneirab 6:5ced10109ebf 273
fneirab 5:a18a189588dc 274
fneirab 5:a18a189588dc 275 /* Optional step - alert threshold initialization */
fneirab 7:479a36909ced 276 //set_alert_thresholds(priv);
fneirab 5:a18a189588dc 277
fneirab 5:a18a189588dc 278 /* Clear Status.POR */
fneirab 7:479a36909ced 279 readReg(STATUS_REG, reg);
fneirab 7:479a36909ced 280 write_and_verify_reg(STATUS_REG, (reg & ~MAX17055_STATUS_POR));
fneirab 5:a18a189588dc 281
fneirab 2:ff7db397b70f 282 return 1;
fneirab 5:a18a189588dc 283 }
fneirab 5:a18a189588dc 284
fneirab 5:a18a189588dc 285
fneirab 5:a18a189588dc 286 ///////////////////////////////////////////////////////////////////////////////
fneirab 5:a18a189588dc 287
fneirab 5:a18a189588dc 288 /**
fneirab 5:a18a189588dc 289 * \brief Poll Flag clear
fneirab 5:a18a189588dc 290 * \par Details
fneirab 5:a18a189588dc 291 * This function clears status flags for the MAX17055
fneirab 5:a18a189588dc 292 *
fneirab 5:a18a189588dc 293 * \param[in] reg_addr - register address
fneirab 5:a18a189588dc 294 * \param[in] mask - register address
fneirab 5:a18a189588dc 295 * \param[in] timeout - register data
fneirab 5:a18a189588dc 296 *
fneirab 5:a18a189588dc 297 * \retval 1 on success
fneirab 5:a18a189588dc 298 * -1 on Failure
fneirab 5:a18a189588dc 299 */
fneirab 5:a18a189588dc 300
fneirab 7:479a36909ced 301 int MAX17055::poll_flag_clear (Registers_e reg_addr, int mask, int timeout)
fneirab 5:a18a189588dc 302 {
fneirab 5:a18a189588dc 303 uint16_t data;
fneirab 5:a18a189588dc 304 int ret;
fneirab 5:a18a189588dc 305
fneirab 5:a18a189588dc 306 do {
fneirab 7:479a36909ced 307 wait_ms(10);
fneirab 6:5ced10109ebf 308 ret = readReg(reg_addr, data);
fneirab 5:a18a189588dc 309 if(ret < 0)
fneirab 5:a18a189588dc 310 return ret;
fneirab 5:a18a189588dc 311
fneirab 5:a18a189588dc 312 if(!(data & mask))
fneirab 5:a18a189588dc 313 return 1;
fneirab 5:a18a189588dc 314
fneirab 7:479a36909ced 315 timeout -= 10;
fneirab 5:a18a189588dc 316 } while(timeout > 0);
fneirab 5:a18a189588dc 317
fneirab 5:a18a189588dc 318 return -1;
fneirab 5:a18a189588dc 319 }
fneirab 5:a18a189588dc 320
fneirab 5:a18a189588dc 321
fneirab 2:ff7db397b70f 322
fneirab 2:ff7db397b70f 323 ////////////////////////////////////////////////////////////////////////////////
fneirab 2:ff7db397b70f 324
fneirab 2:ff7db397b70f 325 /**
fneirab 3:f77a8345b0e3 326 * \brief Get Internal Temperature Function for MAX17055
fneirab 3:f77a8345b0e3 327 * \par Details
fneirab 3:f77a8345b0e3 328 * This function sends a request to access the internal
fneirab 3:f77a8345b0e3 329 * of the MAX17055
fneirab 3:f77a8345b0e3 330 *
fneirab 5:a18a189588dc 331 *
fneirab 7:479a36909ced 332 * \retval temperature value
fneirab 3:f77a8345b0e3 333 * -1 if errors exist
fneirab 3:f77a8345b0e3 334 */
fneirab 5:a18a189588dc 335
fneirab 5:a18a189588dc 336
fneirab 7:479a36909ced 337 int MAX17055::get_temperature()
fneirab 2:ff7db397b70f 338 {
fneirab 5:a18a189588dc 339
fneirab 2:ff7db397b70f 340 int ret;
fneirab 2:ff7db397b70f 341 uint16_t data;
fneirab 5:a18a189588dc 342
fneirab 7:479a36909ced 343 ret = readReg(TEMP_REG, data);
fneirab 2:ff7db397b70f 344 if (ret < 0)
fneirab 2:ff7db397b70f 345 return ret;
fneirab 2:ff7db397b70f 346
fneirab 2:ff7db397b70f 347 /* The value is signed. */
fneirab 7:479a36909ced 348 if (data & 0x8000)
fneirab 7:479a36909ced 349 data |= 0xFFFF0000;
fneirab 2:ff7db397b70f 350
fneirab 2:ff7db397b70f 351 /* The value is converted into centigrade scale */
fneirab 2:ff7db397b70f 352 /* Units of LSB = 1 / 256 degree Celsius */
fneirab 7:479a36909ced 353 data >>= 8;
fneirab 2:ff7db397b70f 354
fneirab 7:479a36909ced 355 return data ;
fneirab 5:a18a189588dc 356 }
fneirab 3:f77a8345b0e3 357
fneirab 3:f77a8345b0e3 358
fneirab 3:f77a8345b0e3 359 ////////////////////////////////////////////////////////////////////////////////
fneirab 3:f77a8345b0e3 360
fneirab 3:f77a8345b0e3 361 /**
fneirab 3:f77a8345b0e3 362 * \brief Forced Exit Hibernate Mode Function for MAX17055
fneirab 3:f77a8345b0e3 363 * \par Details
fneirab 5:a18a189588dc 364 * This function executes a force exit from hibernate mode.
fneirab 3:f77a8345b0e3 365 *
fneirab 3:f77a8345b0e3 366 * \retval returns HibCFG original value before forced Exit Hybernate mode
fneirab 3:f77a8345b0e3 367 *
fneirab 3:f77a8345b0e3 368 */
fneirab 5:a18a189588dc 369
fneirab 5:a18a189588dc 370
fneirab 3:f77a8345b0e3 371 uint16_t MAX17055::forcedExitHyberMode()
fneirab 3:f77a8345b0e3 372 {
fneirab 3:f77a8345b0e3 373 uint16_t hibcfg;
fneirab 5:a18a189588dc 374
fneirab 5:a18a189588dc 375 /* Force exit from hibernate */
fneirab 3:f77a8345b0e3 376 //STEP 0: Store original HibCFG value
fneirab 7:479a36909ced 377 readReg(HIBCFG_REG, hibcfg);
fneirab 3:f77a8345b0e3 378
fneirab 3:f77a8345b0e3 379 //STEP 1: Write to Soft-Wakeup Commannd Register
fneirab 7:479a36909ced 380 writeReg(VFSOC0_QH0_LOCK_REG, 0x90); //Soft-Wakeup from hybernate
fneirab 5:a18a189588dc 381
fneirab 3:f77a8345b0e3 382 //STEP 2: Write to Hibernate Configuration register
fneirab 7:479a36909ced 383 writeReg(HIBCFG_REG, 0x0); //disable hibernate mode
fneirab 5:a18a189588dc 384
fneirab 3:f77a8345b0e3 385 //STEP 3:Write to Soft-Wakeup Commannd Register
fneirab 7:479a36909ced 386 writeReg(VFSOC0_QH0_LOCK_REG, 0x0); //Clear All commnads
fneirab 5:a18a189588dc 387
fneirab 3:f77a8345b0e3 388 return hibcfg;
fneirab 5:a18a189588dc 389 }
fneirab 7:479a36909ced 390
fneirab 7:479a36909ced 391
fneirab 7:479a36909ced 392 ////////////////////////////////////////////////////////////////////////////////
fneirab 7:479a36909ced 393
fneirab 7:479a36909ced 394 /**
fneirab 7:479a36909ced 395 * \brief EZ COnfing Init function
fneirab 7:479a36909ced 396 * \par Details
fneirab 7:479a36909ced 397 * This function implements the steps for the EZ confing m5 FuelGauge
fneirab 7:479a36909ced 398 *
fneirab 7:479a36909ced 399 * \retval returns TBD
fneirab 7:479a36909ced 400 *
fneirab 7:479a36909ced 401 */
fneirab 7:479a36909ced 402
fneirab 7:479a36909ced 403
fneirab 7:479a36909ced 404 uint16_t MAX17055::EZconfig_init(platform_data des_data)
fneirab 7:479a36909ced 405 {
fneirab 7:479a36909ced 406 const int charger_th = 4275;
fneirab 7:479a36909ced 407 const int chg_V_high = 51200;
fneirab 7:479a36909ced 408 const int chg_V_low = 44138;
fneirab 7:479a36909ced 409 const int param_EZ_FG1 = 0x8400;
fneirab 7:479a36909ced 410 const int param_EZ_FG2 = 0x8000;
fneirab 7:479a36909ced 411 int ret;
fneirab 7:479a36909ced 412 uint16_t dpacc;
fneirab 7:479a36909ced 413
fneirab 7:479a36909ced 414
fneirab 7:479a36909ced 415 /* Step 2.1: Option 1 EZ Config */
fneirab 7:479a36909ced 416 writeReg(DESIGNCAP_REG, des_data.designcap);
fneirab 7:479a36909ced 417 writeReg(DQACC_REG, des_data.designcap >> 5);
fneirab 7:479a36909ced 418 writeReg(ICHGTERM_REG, des_data.ichgterm);
fneirab 7:479a36909ced 419 writeReg(VEMPTY_REG, des_data.vempty);
fneirab 7:479a36909ced 420
fneirab 7:479a36909ced 421 if (des_data.vcharge > charger_th) {
fneirab 7:479a36909ced 422 dpacc = (des_data.designcap >> 5) * chg_V_high / des_data.designcap;
fneirab 7:479a36909ced 423 writeReg(DPACC_REG, dpacc);
fneirab 7:479a36909ced 424 writeReg(MODELCFG_REG, param_EZ_FG1); //Why 0x8400
fneirab 7:479a36909ced 425 } else {
fneirab 7:479a36909ced 426 dpacc = (des_data.designcap >> 5) * chg_V_low / des_data.designcap;
fneirab 7:479a36909ced 427 writeReg(DPACC_REG, dpacc);
fneirab 7:479a36909ced 428 writeReg(MODELCFG_REG, param_EZ_FG2);
fneirab 7:479a36909ced 429 }
fneirab 7:479a36909ced 430
fneirab 7:479a36909ced 431
fneirab 7:479a36909ced 432 return ret;
fneirab 7:479a36909ced 433
fneirab 7:479a36909ced 434 }
fneirab 7:479a36909ced 435
fneirab 7:479a36909ced 436
fneirab 7:479a36909ced 437 ////////////////////////////////////////////////////////////////////////////////
fneirab 7:479a36909ced 438
fneirab 7:479a36909ced 439 /**
fneirab 7:479a36909ced 440 * \brief Get State Of Charge(SOC) Function for MAX17055
fneirab 7:479a36909ced 441 * \par Details
fneirab 7:479a36909ced 442 * This function sends a request to access the internal
fneirab 7:479a36909ced 443 * of the MAX17055
fneirab 7:479a36909ced 444 *
fneirab 7:479a36909ced 445 * \param[in] reg_addr - register address
fneirab 7:479a36909ced 446 * \param[out] reg_data - SOC data from the REPSOC_REG register
fneirab 7:479a36909ced 447 * \retval 1 on success
fneirab 7:479a36909ced 448 *
fneirab 7:479a36909ced 449 * -1 if errors exist
fneirab 7:479a36909ced 450 */
fneirab 7:479a36909ced 451
fneirab 7:479a36909ced 452
fneirab 7:479a36909ced 453 int MAX17055::get_SOC()
fneirab 7:479a36909ced 454 {
fneirab 7:479a36909ced 455
fneirab 7:479a36909ced 456 int ret;
fneirab 7:479a36909ced 457 uint16_t data;
fneirab 7:479a36909ced 458
fneirab 7:479a36909ced 459 ret = readReg(REPSOC_REG, data);
fneirab 7:479a36909ced 460 if (ret < 0)
fneirab 7:479a36909ced 461 return ret;
fneirab 7:479a36909ced 462
fneirab 7:479a36909ced 463 data = data >> 8; /* RepSOC LSB: 1/256 % */
fneirab 7:479a36909ced 464
fneirab 7:479a36909ced 465 return data;
fneirab 7:479a36909ced 466 }
fneirab 7:479a36909ced 467
fneirab 7:479a36909ced 468
fneirab 7:479a36909ced 469 ///////////////////////////////////////////////////////////////////////////////
fneirab 7:479a36909ced 470
fneirab 7:479a36909ced 471 /**
fneirab 7:479a36909ced 472 * \brief Get the remaining Time to Empty(TTE) Function for MAX17055
fneirab 7:479a36909ced 473 * \par Details
fneirab 7:479a36909ced 474 * This function sends a request to access the internal register
fneirab 7:479a36909ced 475 * of the MAX17055
fneirab 7:479a36909ced 476 *
fneirab 7:479a36909ced 477 * \retval tte_data - Time to Empty data from the TTE_REG register
fneirab 7:479a36909ced 478 *
fneirab 7:479a36909ced 479 * -1 if errors exist
fneirab 7:479a36909ced 480 */
fneirab 7:479a36909ced 481
fneirab 7:479a36909ced 482 int MAX17055::get_TTE()
fneirab 7:479a36909ced 483 {
fneirab 7:479a36909ced 484
fneirab 7:479a36909ced 485 int ret;
fneirab 7:479a36909ced 486 uint16_t data;
fneirab 7:479a36909ced 487
fneirab 7:479a36909ced 488 ret = readReg(TTE_REG, data);
fneirab 7:479a36909ced 489 if (ret < 0)
fneirab 7:479a36909ced 490 return ret;
fneirab 7:479a36909ced 491 else
fneirab 7:479a36909ced 492 data = (data * 45) >> 3; /* TTE LSB: 5.625 sec */
fneirab 7:479a36909ced 493
fneirab 7:479a36909ced 494 return data;
fneirab 7:479a36909ced 495 }
fneirab 7:479a36909ced 496
fneirab 7:479a36909ced 497
fneirab 7:479a36909ced 498 ////////////////////////////////////////////////////////////////////////////
fneirab 7:479a36909ced 499
fneirab 7:479a36909ced 500 /**
fneirab 7:479a36909ced 501 * \brief Get voltage of the cell Function for MAX17055
fneirab 7:479a36909ced 502 * \par Details
fneirab 7:479a36909ced 503 * This function sends a request to access the internal register
fneirab 7:479a36909ced 504 * of the MAX17055 to read the voltage of the cell
fneirab 7:479a36909ced 505 *
fneirab 7:479a36909ced 506 * \retval vcell_data - vcell data from the VCELL_REG register
fneirab 7:479a36909ced 507 *
fneirab 7:479a36909ced 508 * -1 if errors exist
fneirab 7:479a36909ced 509 */
fneirab 7:479a36909ced 510
fneirab 7:479a36909ced 511
fneirab 7:479a36909ced 512 int MAX17055::get_Vcell()
fneirab 7:479a36909ced 513 {
fneirab 7:479a36909ced 514
fneirab 7:479a36909ced 515 int ret;
fneirab 7:479a36909ced 516 uint16_t vcell_data;
fneirab 7:479a36909ced 517
fneirab 7:479a36909ced 518 ret = readReg(VCELL_REG, vcell_data);
fneirab 7:479a36909ced 519 if (ret < 0)
fneirab 7:479a36909ced 520 return ret;
fneirab 7:479a36909ced 521 else
fneirab 7:479a36909ced 522 //printf("Vcell Reg= %d \r\n",vcell_data);
fneirab 7:479a36909ced 523 ret = lsb_to_uvolts(vcell_data);
fneirab 7:479a36909ced 524 //printf("Vcell Conv= %d \r\n",ret);
fneirab 7:479a36909ced 525 return ret;
fneirab 7:479a36909ced 526
fneirab 7:479a36909ced 527 }
fneirab 7:479a36909ced 528
fneirab 7:479a36909ced 529
fneirab 7:479a36909ced 530 ////////////////////////////////////////////////////////////////////////////
fneirab 7:479a36909ced 531
fneirab 7:479a36909ced 532 /**
fneirab 7:479a36909ced 533 * \brief Get current Function for MAX17055
fneirab 7:479a36909ced 534 * \par Details
fneirab 7:479a36909ced 535 * This function sends a request to access the internal register
fneirab 7:479a36909ced 536 * of the MAX17055 to read the current register.
fneirab 7:479a36909ced 537 *
fneirab 7:479a36909ced 538 * \retval curr_data - vcell data from the VCELL_REG register
fneirab 7:479a36909ced 539 *
fneirab 7:479a36909ced 540 * -1 if errors exist
fneirab 7:479a36909ced 541 */
fneirab 7:479a36909ced 542
fneirab 7:479a36909ced 543
fneirab 7:479a36909ced 544 int MAX17055::get_Current( platform_data des_data )
fneirab 7:479a36909ced 545 {
fneirab 7:479a36909ced 546
fneirab 7:479a36909ced 547 int ret,design_rsense;
fneirab 7:479a36909ced 548 uint16_t data;
fneirab 7:479a36909ced 549
fneirab 7:479a36909ced 550 ret = readReg(CURRENT_REG, data);
fneirab 7:479a36909ced 551 if (ret < 0)
fneirab 7:479a36909ced 552 return ret;
fneirab 7:479a36909ced 553 else
fneirab 7:479a36909ced 554 design_rsense = des_data.rsense;
fneirab 7:479a36909ced 555 ret = raw_current_to_uamps((uint32_t)data, design_rsense);
fneirab 7:479a36909ced 556 return ret;
fneirab 7:479a36909ced 557
fneirab 7:479a36909ced 558 }
fneirab 7:479a36909ced 559
fneirab 7:479a36909ced 560
fneirab 7:479a36909ced 561 ////////////////////////////////////////////////////////////////////////////
fneirab 7:479a36909ced 562
fneirab 7:479a36909ced 563 /**
fneirab 7:479a36909ced 564 * \brief Get Average Current Function for MAX17055
fneirab 7:479a36909ced 565 * \par Details
fneirab 7:479a36909ced 566 * This function sends a request to access the internal register
fneirab 7:479a36909ced 567 * of the MAX17055 to read the average current register.
fneirab 7:479a36909ced 568 *
fneirab 7:479a36909ced 569 * \retval curr_data - vcell data from the AVGCURRENT_REG register
fneirab 7:479a36909ced 570 *
fneirab 7:479a36909ced 571 * -1 if errors exist
fneirab 7:479a36909ced 572 */
fneirab 7:479a36909ced 573
fneirab 7:479a36909ced 574
fneirab 7:479a36909ced 575 int MAX17055::get_AvgCurrent( platform_data des_data )
fneirab 7:479a36909ced 576 {
fneirab 7:479a36909ced 577
fneirab 7:479a36909ced 578 int ret, design_rsense;
fneirab 7:479a36909ced 579 uint16_t data;
fneirab 7:479a36909ced 580 uint32_t aveCurr_data;
fneirab 7:479a36909ced 581
fneirab 7:479a36909ced 582 ret = readReg(AVGCURRENT_REG, data);
fneirab 7:479a36909ced 583 if (ret < 0)
fneirab 7:479a36909ced 584 return ret;
fneirab 7:479a36909ced 585 else
fneirab 7:479a36909ced 586 aveCurr_data = data;
fneirab 7:479a36909ced 587 design_rsense = des_data.rsense;
fneirab 7:479a36909ced 588 aveCurr_data = raw_current_to_uamps(aveCurr_data, design_rsense);
fneirab 7:479a36909ced 589 return aveCurr_data;
fneirab 7:479a36909ced 590
fneirab 7:479a36909ced 591 }
fneirab 7:479a36909ced 592
fneirab 7:479a36909ced 593 ///////////////////////////////////////////////////////////////////////////////
fneirab 7:479a36909ced 594
fneirab 7:479a36909ced 595 /**
fneirab 7:479a36909ced 596 * \brief lsb_to_uvolts Converssion Function
fneirab 7:479a36909ced 597 * \par Details
fneirab 7:479a36909ced 598 * This function takes the lsb value of the register and convert it
fneirab 7:479a36909ced 599 * to uvolts
fneirab 7:479a36909ced 600 *
fneirab 7:479a36909ced 601 * \param[in] lsb - value of register lsb
fneirab 7:479a36909ced 602 * \retval lsb - converted lsb to uvolts
fneirab 7:479a36909ced 603 *
fneirab 7:479a36909ced 604 */
fneirab 7:479a36909ced 605
fneirab 7:479a36909ced 606 int MAX17055:: lsb_to_uvolts(uint16_t lsb)
fneirab 7:479a36909ced 607 {
fneirab 7:479a36909ced 608 int store;
fneirab 7:479a36909ced 609 store = (lsb * 625) / 8; /* 78.125uV per bit */
fneirab 7:479a36909ced 610 return store;
fneirab 7:479a36909ced 611 }
fneirab 7:479a36909ced 612
fneirab 7:479a36909ced 613
fneirab 7:479a36909ced 614 ///////////////////////////////////////////////////////////////////////////////
fneirab 7:479a36909ced 615
fneirab 7:479a36909ced 616 /**
fneirab 7:479a36909ced 617 * \brief raw_current_to_uamp Converssion Function
fneirab 7:479a36909ced 618 * \par Details
fneirab 7:479a36909ced 619 * This function takes the raw current value of the register and
fneirab 7:479a36909ced 620 * converts it to uamps
fneirab 7:479a36909ced 621 *
fneirab 7:479a36909ced 622 * \param[in] curr - raw current value of register
fneirab 7:479a36909ced 623 * \retval res - converted raw current to uamps - Signed 2's complement
fneirab 7:479a36909ced 624 *
fneirab 7:479a36909ced 625 */
fneirab 7:479a36909ced 626
fneirab 7:479a36909ced 627 int MAX17055::raw_current_to_uamps(uint32_t curr, int rsense_value)
fneirab 7:479a36909ced 628 {
fneirab 7:479a36909ced 629 int res = curr;
fneirab 7:479a36909ced 630 /* Negative */
fneirab 7:479a36909ced 631 if (res & 0x8000) {
fneirab 7:479a36909ced 632 res |= 0xFFFF0000;
fneirab 7:479a36909ced 633 } else {
fneirab 7:479a36909ced 634 res *= 1562500 /(rsense_value * 1000); //Change to interact with the rsense of customer
fneirab 7:479a36909ced 635 }
fneirab 7:479a36909ced 636 return res;
fneirab 7:479a36909ced 637 }