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:
Thu Sep 21 22:35:39 2017 +0000
Revision:
1:a031f0c6a71e
Parent:
0:80c39eb8f3ba
Child:
2:ff7db397b70f
working test of writ, read and write verify functions. Removed from private for access from main.cpp

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fneirab 0:80c39eb8f3ba 1 /*******************************************************************************
fneirab 0:80c39eb8f3ba 2 * Copyright (C) 2017 Maxim Integrated Products, Inc., All Rights Reserved.
fneirab 0:80c39eb8f3ba 3 *
fneirab 0:80c39eb8f3ba 4 * Permission is hereby granted, free of charge, to any person obtaining a
fneirab 0:80c39eb8f3ba 5 * copy of this software and associated documentation files (the "Software"),
fneirab 0:80c39eb8f3ba 6 * to deal in the Software without restriction, including without limitation
fneirab 0:80c39eb8f3ba 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
fneirab 0:80c39eb8f3ba 8 * and/or sell copies of the Software, and to permit persons to whom the
fneirab 0:80c39eb8f3ba 9 * Software is furnished to do so, subject to the following conditions:
fneirab 0:80c39eb8f3ba 10 *
fneirab 0:80c39eb8f3ba 11 * The above copyright notice and this permission notice shall be included
fneirab 0:80c39eb8f3ba 12 * in all copies or substantial portions of the Software.
fneirab 0:80c39eb8f3ba 13 *
fneirab 0:80c39eb8f3ba 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
fneirab 0:80c39eb8f3ba 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
fneirab 0:80c39eb8f3ba 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
fneirab 0:80c39eb8f3ba 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
fneirab 0:80c39eb8f3ba 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
fneirab 0:80c39eb8f3ba 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
fneirab 0:80c39eb8f3ba 20 * OTHER DEALINGS IN THE SOFTWARE.
fneirab 0:80c39eb8f3ba 21 *
fneirab 0:80c39eb8f3ba 22 * Except as contained in this notice, the name of Maxim Integrated
fneirab 0:80c39eb8f3ba 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
fneirab 0:80c39eb8f3ba 24 * Products, Inc. Branding Policy.
fneirab 0:80c39eb8f3ba 25 *
fneirab 0:80c39eb8f3ba 26 * The mere transfer of this software does not imply any licenses
fneirab 0:80c39eb8f3ba 27 * of trade secrets, proprietary technology, copyrights, patents,
fneirab 0:80c39eb8f3ba 28 * trademarks, maskwork rights, or any other form of intellectual
fneirab 0:80c39eb8f3ba 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
fneirab 0:80c39eb8f3ba 30 * ownership rights.
fneirab 0:80c39eb8f3ba 31 *
fneirab 0:80c39eb8f3ba 32 ******************************************************************************/
fneirab 0:80c39eb8f3ba 33
fneirab 0:80c39eb8f3ba 34 #include "mbed.h"
fneirab 0:80c39eb8f3ba 35 #include "max17055.h"
fneirab 0:80c39eb8f3ba 36
fneirab 0:80c39eb8f3ba 37
fneirab 0:80c39eb8f3ba 38 MAX17055::MAX17055(I2C &i2c):
fneirab 0:80c39eb8f3ba 39 m_i2cBus(i2c)
fneirab 0:80c39eb8f3ba 40 {
fneirab 0:80c39eb8f3ba 41 //empty block
fneirab 0:80c39eb8f3ba 42 }
fneirab 0:80c39eb8f3ba 43
fneirab 0:80c39eb8f3ba 44 MAX17055::~MAX17055()
fneirab 0:80c39eb8f3ba 45 {
fneirab 0:80c39eb8f3ba 46 //empty block
fneirab 0:80c39eb8f3ba 47 }
fneirab 1:a031f0c6a71e 48 ///////////////////////////////////////////////////////////////////////////////
fneirab 0:80c39eb8f3ba 49
fneirab 0:80c39eb8f3ba 50 /**
fneirab 0:80c39eb8f3ba 51 * \brief Write a value to a MAX17055 register
fneirab 0:80c39eb8f3ba 52 * \par Details
fneirab 0:80c39eb8f3ba 53 * This function writes a value to a MAX17055 register
fneirab 0:80c39eb8f3ba 54 *
fneirab 1:a031f0c6a71e 55 * \param[in] reg_addr - register address
fneirab 1:a031f0c6a71e 56 * \param[in] reg_data - register data
fneirab 0:80c39eb8f3ba 57 *
fneirab 1:a031f0c6a71e 58 * \retval 1 on success
fneirab 0:80c39eb8f3ba 59 */
fneirab 0:80c39eb8f3ba 60
fneirab 0:80c39eb8f3ba 61 int MAX17055::writeReg(Registers_e reg_addr, uint16_t reg_data)
fneirab 0:80c39eb8f3ba 62 {
fneirab 0:80c39eb8f3ba 63
fneirab 1:a031f0c6a71e 64
fneirab 1:a031f0c6a71e 65 uint8_t dataLSB;
fneirab 1:a031f0c6a71e 66 uint8_t dataMSB;
fneirab 0:80c39eb8f3ba 67
fneirab 1:a031f0c6a71e 68 dataLSB = reg_data & 0x00FF;
fneirab 1:a031f0c6a71e 69 dataMSB = (reg_data >> 8) & 0x00FF;
fneirab 1:a031f0c6a71e 70
fneirab 1:a031f0c6a71e 71 char add_plus_data[3] = {reg_addr, dataLSB, dataMSB};
fneirab 1:a031f0c6a71e 72
fneirab 1:a031f0c6a71e 73 if ( m_i2cBus.write(I2C_W_ADRS, add_plus_data, 3, false) == 0)
fneirab 0:80c39eb8f3ba 74 return 1;
fneirab 0:80c39eb8f3ba 75 else
fneirab 0:80c39eb8f3ba 76 return 0;
fneirab 0:80c39eb8f3ba 77
fneirab 0:80c39eb8f3ba 78 }
fneirab 1:a031f0c6a71e 79 ///////////////////////////////////////////////////////////////////////////////
fneirab 0:80c39eb8f3ba 80 /**
fneirab 0:80c39eb8f3ba 81 * \brief Read a MAX17055 register
fneirab 0:80c39eb8f3ba 82 * \par Details
fneirab 0:80c39eb8f3ba 83 * This function reads a MAX17055 register
fneirab 0:80c39eb8f3ba 84 *
fneirab 1:a031f0c6a71e 85 * \param[in] reg_addr - register address
fneirab 1:a031f0c6a71e 86 * \param[out] &value - pointer that stores the register data
fneirab 0:80c39eb8f3ba 87 *
fneirab 0:80c39eb8f3ba 88 * \retval 1 on success
fneirab 0:80c39eb8f3ba 89 */
fneirab 0:80c39eb8f3ba 90
fneirab 0:80c39eb8f3ba 91
fneirab 1:a031f0c6a71e 92 int32_t MAX17055::readReg(Registers_e reg_addr, uint16_t &value)
fneirab 0:80c39eb8f3ba 93 {
fneirab 0:80c39eb8f3ba 94 int32_t result;
fneirab 1:a031f0c6a71e 95 //int16_t value2;
fneirab 1:a031f0c6a71e 96 //int16_t twoBytes;
fneirab 1:a031f0c6a71e 97 char local_data[1];
fneirab 0:80c39eb8f3ba 98 local_data[0] = reg_addr;
fneirab 1:a031f0c6a71e 99 char read_data[2];
fneirab 0:80c39eb8f3ba 100
fneirab 0:80c39eb8f3ba 101 result = m_i2cBus.write(I2C_W_ADRS, local_data, 1);
fneirab 0:80c39eb8f3ba 102 if(result == 0)
fneirab 0:80c39eb8f3ba 103 {
fneirab 1:a031f0c6a71e 104 result = m_i2cBus.read(I2C_R_ADRS, read_data , 2, false);
fneirab 1:a031f0c6a71e 105 if (result == 0)
fneirab 0:80c39eb8f3ba 106 {
fneirab 1:a031f0c6a71e 107 value = ( ((read_data[1] & 0x00FF) << 8) + (read_data[0]));
fneirab 1:a031f0c6a71e 108 result = 1;
fneirab 1:a031f0c6a71e 109 }
fneirab 0:80c39eb8f3ba 110 }
fneirab 1:a031f0c6a71e 111
fneirab 0:80c39eb8f3ba 112 return result;
fneirab 1:a031f0c6a71e 113
fneirab 0:80c39eb8f3ba 114 }
fneirab 0:80c39eb8f3ba 115
fneirab 1:a031f0c6a71e 116
fneirab 1:a031f0c6a71e 117 /**
fneirab 1:a031f0c6a71e 118 * \brief Write and Verify a MAX17055 register
fneirab 1:a031f0c6a71e 119 * \par Details
fneirab 1:a031f0c6a71e 120 * This function wites and verifies if the writing process was successful
fneirab 1:a031f0c6a71e 121 *
fneirab 1:a031f0c6a71e 122 * \param[in] reg_addr - register address
fneirab 1:a031f0c6a71e 123 * \param[out] reg_data - the variable that contains the data to write
fneirab 1:a031f0c6a71e 124 * to the register address
fneirab 1:a031f0c6a71e 125 *
fneirab 1:a031f0c6a71e 126 * \retval 1 on success
fneirab 1:a031f0c6a71e 127 */
fneirab 1:a031f0c6a71e 128
fneirab 1:a031f0c6a71e 129
fneirab 1:a031f0c6a71e 130 int MAX17055::write_and_verify_reg (MAX17055::Registers_e reg_addr, uint16_t reg_data)
fneirab 1:a031f0c6a71e 131 {
fneirab 1:a031f0c6a71e 132 int retries = 8;
fneirab 1:a031f0c6a71e 133 int ret;
fneirab 1:a031f0c6a71e 134 int statusRead;
fneirab 1:a031f0c6a71e 135 int statusWrite;
fneirab 1:a031f0c6a71e 136 uint16_t read_data;
fneirab 1:a031f0c6a71e 137
fneirab 1:a031f0c6a71e 138 do {
fneirab 1:a031f0c6a71e 139 statusWrite = writeReg(reg_addr, reg_data);
fneirab 1:a031f0c6a71e 140 if (statusWrite != 1)
fneirab 1:a031f0c6a71e 141 ret = -1;
fneirab 1:a031f0c6a71e 142 wait_ms(3);
fneirab 1:a031f0c6a71e 143 statusRead = readReg(reg_addr, read_data);
fneirab 1:a031f0c6a71e 144 if (statusRead != 1)
fneirab 1:a031f0c6a71e 145 ret = -2;
fneirab 1:a031f0c6a71e 146 if (read_data != reg_data){
fneirab 1:a031f0c6a71e 147 ret = -3;
fneirab 1:a031f0c6a71e 148 retries--;
fneirab 1:a031f0c6a71e 149 }
fneirab 1:a031f0c6a71e 150 }while (retries && read_data != reg_data);
fneirab 1:a031f0c6a71e 151
fneirab 1:a031f0c6a71e 152 if (ret<0)
fneirab 1:a031f0c6a71e 153 {
fneirab 1:a031f0c6a71e 154 return ret;
fneirab 1:a031f0c6a71e 155 } else
fneirab 1:a031f0c6a71e 156 return 1;
fneirab 1:a031f0c6a71e 157 }
fneirab 0:80c39eb8f3ba 158 //
fneirab 0:80c39eb8f3ba 159 //int MAX17055::init()
fneirab 0:80c39eb8f3ba 160 //{
fneirab 0:80c39eb8f3ba 161 // int temp, data, StatusPOR, RepCap, RepSOC;
fneirab 0:80c39eb8f3ba 162 // float TTE_val;
fneirab 0:80c39eb8f3ba 163 // // Attach Interrupt to ALRT pin
fneirab 0:80c39eb8f3ba 164 //
fneirab 0:80c39eb8f3ba 165 // // Read the status power up on reset (POR is bit 1 in that register)
fneirab 0:80c39eb8f3ba 166 // // 0 means that POR has not occured, 1 means that it has just occured, has to be cleared
fneirab 0:80c39eb8f3ba 167 // StatusPOR = readReg(STATUS) & 0x0002;
fneirab 0:80c39eb8f3ba 168 //
fneirab 0:80c39eb8f3ba 169 // if (StatusPOR == 0) {
fneirab 0:80c39eb8f3ba 170 // goto step_4P3;
fneirab 0:80c39eb8f3ba 171 // } else {
fneirab 0:80c39eb8f3ba 172 //step_1:
fneirab 0:80c39eb8f3ba 173 // // Wait until MAX17055 complete setup operations (Data is Ready)
fneirab 0:80c39eb8f3ba 174 // while(readReg(F_STAT) & 0x0001) delay(10);
fneirab 0:80c39eb8f3ba 175 // /***************************************************************/
fneirab 0:80c39eb8f3ba 176 // // Setting up or initializing charging configurations down here , EZ CONFIG because no .INI file
fneirab 0:80c39eb8f3ba 177 // // FIXX:: DOUBLE CHECK THE INITIALIZATION VALUES
fneirab 0:80c39eb8f3ba 178 // // init values is claculated based on the register lsb's default value page 1 software implementation UG
fneirab 0:80c39eb8f3ba 179 // /* Capacity is in mAH and 1 bit is 0.5mAH)*/
fneirab 0:80c39eb8f3ba 180 // temp = battery->capacity*2;
fneirab 0:80c39eb8f3ba 181 // writeReg(DESIGN_CAP, temp);
fneirab 0:80c39eb8f3ba 182 // writeReg(DQ_A_CC, temp/32);
fneirab 0:80c39eb8f3ba 183 // /* Current measurement, assuming current input in mA */
fneirab 0:80c39eb8f3ba 184 // temp = battery->currentTerm*1000/1.5625;
fneirab 0:80c39eb8f3ba 185 // writeReg(ICHG_TERM, temp);
fneirab 0:80c39eb8f3ba 186 // /* FIXX: DOUBLE CHECK Vempty register (v empty | v recovery), I am assuming that
fneirab 0:80c39eb8f3ba 187 // VE resolution is 10mV and VR resolution is 40mV (programmer's guide)*/
fneirab 0:80c39eb8f3ba 188 // temp =((battery->voltageMin/10) << 7 | (battery->voltageNom)/40);
fneirab 0:80c39eb8f3ba 189 // writeReg(V_EMPTY ,temp);
fneirab 0:80c39eb8f3ba 190 //
fneirab 0:80c39eb8f3ba 191 // data = readReg(HIB_CFG); // Store original HIB_CFG inside
fneirab 0:80c39eb8f3ba 192 // writeReg((Registers_e)0x60, 0x90); // Exit hibernate mode step 1
fneirab 0:80c39eb8f3ba 193 // writeReg(CONFIG_2, 0x0); // Exit hibernate mode step 2
fneirab 0:80c39eb8f3ba 194 // writeReg((Registers_e)0x60, 0x0); // Exit hibernate mode step 3
fneirab 0:80c39eb8f3ba 195 //
fneirab 0:80c39eb8f3ba 196 // temp = battery->capacity*2;
fneirab 0:80c39eb8f3ba 197 // if (battery->voltageMax > 4.275) {
fneirab 0:80c39eb8f3ba 198 // writeReg(DP_A_CC, (temp/32)*51200/temp); // Write dPAcc
fneirab 0:80c39eb8f3ba 199 // writeReg(MODEL_CFG, 0x8400); // Write ModelCFG
fneirab 0:80c39eb8f3ba 200 // } else {
fneirab 0:80c39eb8f3ba 201 // writeReg(DP_A_CC, (temp/32)*44138/temp);
fneirab 0:80c39eb8f3ba 202 // writeReg(MODEL_CFG, 0x8000);
fneirab 0:80c39eb8f3ba 203 // }
fneirab 0:80c39eb8f3ba 204 // // Poll ModelCFG.refresh (highest bit), proceed to next step when ModelCFG.Refresh = 0.
fneirab 0:80c39eb8f3ba 205 // while(readReg(MODEL_CFG) & 0x8000) delay(10);
fneirab 0:80c39eb8f3ba 206 // writeReg(HIB_CFG, data); // Restore the original HibCFG value
fneirab 0:80c39eb8f3ba 207 // /***************************************************************/
fneirab 0:80c39eb8f3ba 208 // }
fneirab 0:80c39eb8f3ba 209 // /***************************************************************/
fneirab 0:80c39eb8f3ba 210 // // FIXX: DOUBLE CHECK, STEP 4 IN PROGRAMMER'S GUIDE
fneirab 0:80c39eb8f3ba 211 // data = readReg(STATUS); // read status register
fneirab 0:80c39eb8f3ba 212 //
fneirab 0:80c39eb8f3ba 213 // if (write_and_verify_reg(STATUS, data & 0xFFFD) != E_NO_ERROR) {
fneirab 0:80c39eb8f3ba 214 // return -1;
fneirab 0:80c39eb8f3ba 215 // }
fneirab 0:80c39eb8f3ba 216 // // Check whether there is saved history parameters
fneirab 0:80c39eb8f3ba 217 // temp = saved_param->rcomp0;
fneirab 0:80c39eb8f3ba 218 // temp &= saved_param ->temp_co;
fneirab 0:80c39eb8f3ba 219 // temp &= saved_param->full_cap_rep;
fneirab 0:80c39eb8f3ba 220 // temp &= saved_param->cycles;
fneirab 0:80c39eb8f3ba 221 // temp &= saved_param->full_cap_nom;
fneirab 0:80c39eb8f3ba 222 // // If there is no history setup the battery
fneirab 0:80c39eb8f3ba 223 // if (temp == 0) {
fneirab 0:80c39eb8f3ba 224 // // Check for MAX17055 reset
fneirab 0:80c39eb8f3ba 225 // StatusPOR = readReg(STATUS) & 0x0002;
fneirab 0:80c39eb8f3ba 226 // if (StatusPOR == 1) goto step_1;
fneirab 0:80c39eb8f3ba 227 // }
fneirab 0:80c39eb8f3ba 228 //step_4P3:
fneirab 0:80c39eb8f3ba 229 // // Read the reported capacity(mAH) and SOC (percentage)
fneirab 0:80c39eb8f3ba 230 // RepCap = readReg(REP_CAP);
fneirab 0:80c39eb8f3ba 231 // RepSOC = readReg(REP_SOC);
fneirab 0:80c39eb8f3ba 232 //
fneirab 0:80c39eb8f3ba 233 // // Read the TTE (in 5.625s)
fneirab 0:80c39eb8f3ba 234 // TTE_val = ((float)(readReg(TTE))) * 5.625;
fneirab 0:80c39eb8f3ba 235 //
fneirab 0:80c39eb8f3ba 236 // // Save learned parameters
fneirab 0:80c39eb8f3ba 237 // saved_param->rcomp0 = readReg(R_COMP_0);
fneirab 0:80c39eb8f3ba 238 // saved_param->temp_co = readReg(TEMP_CO);
fneirab 0:80c39eb8f3ba 239 // saved_param->full_cap_rep = readReg(FULL_CAP_REP);
fneirab 0:80c39eb8f3ba 240 // saved_param->cycles = readReg(CYCLES);
fneirab 0:80c39eb8f3ba 241 // saved_param->full_cap_nom = readReg(FULL_CAP_NOM);
fneirab 0:80c39eb8f3ba 242 //
fneirab 0:80c39eb8f3ba 243 // // Restoring Capacity Parameters
fneirab 0:80c39eb8f3ba 244 // if (write_and_verify_reg(R_COMP_0, saved_param->rcomp0) != E_NO_ERROR) {
fneirab 0:80c39eb8f3ba 245 // return -1;
fneirab 0:80c39eb8f3ba 246 // }
fneirab 0:80c39eb8f3ba 247 // if (write_and_verify_reg(TEMP_CO, saved_param->temp_co) != E_NO_ERROR) {
fneirab 0:80c39eb8f3ba 248 // return -1;
fneirab 0:80c39eb8f3ba 249 // }
fneirab 0:80c39eb8f3ba 250 // if (write_and_verify_reg(FULL_CAP_REP, saved_param->full_cap_rep) != E_NO_ERROR) {
fneirab 0:80c39eb8f3ba 251 // return -1;
fneirab 0:80c39eb8f3ba 252 // }
fneirab 0:80c39eb8f3ba 253 //
fneirab 0:80c39eb8f3ba 254 // delay(350);
fneirab 0:80c39eb8f3ba 255 // // Restore FullCap
fneirab 0:80c39eb8f3ba 256 // temp = readReg(FULL_CAP_NOM); // Read full_cap_nom
fneirab 0:80c39eb8f3ba 257 // data = (readReg(MIX_SOC)*temp)/25600; // MIXCAP
fneirab 0:80c39eb8f3ba 258 // if (write_and_verify_reg(MIX_CAP, data) != E_NO_ERROR) {
fneirab 0:80c39eb8f3ba 259 // return -1;
fneirab 0:80c39eb8f3ba 260 // }
fneirab 0:80c39eb8f3ba 261 // if (write_and_verify_reg(FULL_CAP_REP, temp) != E_NO_ERROR) {
fneirab 0:80c39eb8f3ba 262 // return -1;
fneirab 0:80c39eb8f3ba 263 // }
fneirab 0:80c39eb8f3ba 264 // data = saved_param->full_cap_nom/16; // This act as dQacc
fneirab 0:80c39eb8f3ba 265 // if (write_and_verify_reg(DP_A_CC, 0x0C80) != E_NO_ERROR) {
fneirab 0:80c39eb8f3ba 266 // return -1;
fneirab 0:80c39eb8f3ba 267 // }
fneirab 0:80c39eb8f3ba 268 // if (write_and_verify_reg(DQ_A_CC, temp) != E_NO_ERROR) {
fneirab 0:80c39eb8f3ba 269 // return -1;
fneirab 0:80c39eb8f3ba 270 // }
fneirab 0:80c39eb8f3ba 271 //
fneirab 0:80c39eb8f3ba 272 // delay(350);
fneirab 0:80c39eb8f3ba 273 // // Restore Cycles Register
fneirab 0:80c39eb8f3ba 274 // if (write_and_verify_reg(CYCLES, saved_param->cycles) != E_NO_ERROR) {
fneirab 0:80c39eb8f3ba 275 // return -1;
fneirab 0:80c39eb8f3ba 276 // }
fneirab 0:80c39eb8f3ba 277
fneirab 0:80c39eb8f3ba 278 //return E_NO_ERROR;
fneirab 0:80c39eb8f3ba 279 //}
fneirab 0:80c39eb8f3ba 280 //
fneirab 0:80c39eb8f3ba 281 //saved_fuel_gauge_params_t default_param = {0,0,0,0,0};