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

Fork of max17055 by Central Applications - Mbed Code repo

Committer:
fneirab
Date:
Thu Sep 21 00:53:05 2017 +0000
Revision:
0:80c39eb8f3ba
Child:
1:a031f0c6a71e
First Pass with some compilation errors on MBED online compiler. ;

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 0:80c39eb8f3ba 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 0:80c39eb8f3ba 55 * \param[in] Registers_e - register address
fneirab 0:80c39eb8f3ba 56 * \param[in] reg_data - register data
fneirab 0:80c39eb8f3ba 57 *
fneirab 0:80c39eb8f3ba 58 * \retval true 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 0:80c39eb8f3ba 64 char add_plus_data[2] = {reg_addr, reg_data};
fneirab 0:80c39eb8f3ba 65
fneirab 0:80c39eb8f3ba 66 if ( m_i2cBus.write(I2C_W_ADRS, add_plus_data, 2, false) == 0)
fneirab 0:80c39eb8f3ba 67 return 1;
fneirab 0:80c39eb8f3ba 68 else
fneirab 0:80c39eb8f3ba 69 return 0;
fneirab 0:80c39eb8f3ba 70
fneirab 0:80c39eb8f3ba 71 }
fneirab 0:80c39eb8f3ba 72
fneirab 0:80c39eb8f3ba 73 /**
fneirab 0:80c39eb8f3ba 74 * \brief Read a MAX17055 register
fneirab 0:80c39eb8f3ba 75 * \par Details
fneirab 0:80c39eb8f3ba 76 * This function reads a MAX17055 register
fneirab 0:80c39eb8f3ba 77 *
fneirab 0:80c39eb8f3ba 78 * \param[in] uch_addr - register address
fneirab 0:80c39eb8f3ba 79 * \param[out] puch_data - pointer that stores the register data
fneirab 0:80c39eb8f3ba 80 *
fneirab 0:80c39eb8f3ba 81 * \retval 1 on success
fneirab 0:80c39eb8f3ba 82 */
fneirab 0:80c39eb8f3ba 83
fneirab 0:80c39eb8f3ba 84
fneirab 0:80c39eb8f3ba 85 int32_t MAX17055::readReg(Registers_e reg_addr, uint8_t &value)
fneirab 0:80c39eb8f3ba 86 {
fneirab 0:80c39eb8f3ba 87 int32_t result;
fneirab 0:80c39eb8f3ba 88
fneirab 0:80c39eb8f3ba 89 char local_data[2];
fneirab 0:80c39eb8f3ba 90 local_data[0] = reg_addr;
fneirab 0:80c39eb8f3ba 91
fneirab 0:80c39eb8f3ba 92 result = m_i2cBus.write(I2C_W_ADRS, local_data, 1);
fneirab 0:80c39eb8f3ba 93 if(result == 0)
fneirab 0:80c39eb8f3ba 94 {
fneirab 0:80c39eb8f3ba 95 result = m_i2cBus.read(I2C_R_ADRS, (local_data + 1), 1);
fneirab 0:80c39eb8f3ba 96 if (result == 0)
fneirab 0:80c39eb8f3ba 97 {
fneirab 0:80c39eb8f3ba 98 value = local_data[1];
fneirab 0:80c39eb8f3ba 99 }
fneirab 0:80c39eb8f3ba 100 }
fneirab 0:80c39eb8f3ba 101
fneirab 0:80c39eb8f3ba 102 return result;
fneirab 0:80c39eb8f3ba 103 }
fneirab 0:80c39eb8f3ba 104
fneirab 0:80c39eb8f3ba 105 //int MAX17055::write_and_verify_reg (MAX17055::Registers_e reg_addr, uint8_t reg_data)
fneirab 0:80c39eb8f3ba 106 //{
fneirab 0:80c39eb8f3ba 107 // uint8_t data;
fneirab 0:80c39eb8f3ba 108 //
fneirab 0:80c39eb8f3ba 109 // writeReg(reg_addr,reg_data);
fneirab 0:80c39eb8f3ba 110 // data = readReg(reg_addr);
fneirab 0:80c39eb8f3ba 111 //
fneirab 0:80c39eb8f3ba 112 // if (data != reg_data) {
fneirab 0:80c39eb8f3ba 113 // return -1;
fneirab 0:80c39eb8f3ba 114 // }
fneirab 0:80c39eb8f3ba 115 //
fneirab 0:80c39eb8f3ba 116 // return E_NO_ERROR;
fneirab 0:80c39eb8f3ba 117 //}
fneirab 0:80c39eb8f3ba 118 //
fneirab 0:80c39eb8f3ba 119 //int MAX17055::init()
fneirab 0:80c39eb8f3ba 120 //{
fneirab 0:80c39eb8f3ba 121 // int temp, data, StatusPOR, RepCap, RepSOC;
fneirab 0:80c39eb8f3ba 122 // float TTE_val;
fneirab 0:80c39eb8f3ba 123 // // Attach Interrupt to ALRT pin
fneirab 0:80c39eb8f3ba 124 //
fneirab 0:80c39eb8f3ba 125 // // Read the status power up on reset (POR is bit 1 in that register)
fneirab 0:80c39eb8f3ba 126 // // 0 means that POR has not occured, 1 means that it has just occured, has to be cleared
fneirab 0:80c39eb8f3ba 127 // StatusPOR = readReg(STATUS) & 0x0002;
fneirab 0:80c39eb8f3ba 128 //
fneirab 0:80c39eb8f3ba 129 // if (StatusPOR == 0) {
fneirab 0:80c39eb8f3ba 130 // goto step_4P3;
fneirab 0:80c39eb8f3ba 131 // } else {
fneirab 0:80c39eb8f3ba 132 //step_1:
fneirab 0:80c39eb8f3ba 133 // // Wait until MAX17055 complete setup operations (Data is Ready)
fneirab 0:80c39eb8f3ba 134 // while(readReg(F_STAT) & 0x0001) delay(10);
fneirab 0:80c39eb8f3ba 135 // /***************************************************************/
fneirab 0:80c39eb8f3ba 136 // // Setting up or initializing charging configurations down here , EZ CONFIG because no .INI file
fneirab 0:80c39eb8f3ba 137 // // FIXX:: DOUBLE CHECK THE INITIALIZATION VALUES
fneirab 0:80c39eb8f3ba 138 // // init values is claculated based on the register lsb's default value page 1 software implementation UG
fneirab 0:80c39eb8f3ba 139 // /* Capacity is in mAH and 1 bit is 0.5mAH)*/
fneirab 0:80c39eb8f3ba 140 // temp = battery->capacity*2;
fneirab 0:80c39eb8f3ba 141 // writeReg(DESIGN_CAP, temp);
fneirab 0:80c39eb8f3ba 142 // writeReg(DQ_A_CC, temp/32);
fneirab 0:80c39eb8f3ba 143 // /* Current measurement, assuming current input in mA */
fneirab 0:80c39eb8f3ba 144 // temp = battery->currentTerm*1000/1.5625;
fneirab 0:80c39eb8f3ba 145 // writeReg(ICHG_TERM, temp);
fneirab 0:80c39eb8f3ba 146 // /* FIXX: DOUBLE CHECK Vempty register (v empty | v recovery), I am assuming that
fneirab 0:80c39eb8f3ba 147 // VE resolution is 10mV and VR resolution is 40mV (programmer's guide)*/
fneirab 0:80c39eb8f3ba 148 // temp =((battery->voltageMin/10) << 7 | (battery->voltageNom)/40);
fneirab 0:80c39eb8f3ba 149 // writeReg(V_EMPTY ,temp);
fneirab 0:80c39eb8f3ba 150 //
fneirab 0:80c39eb8f3ba 151 // data = readReg(HIB_CFG); // Store original HIB_CFG inside
fneirab 0:80c39eb8f3ba 152 // writeReg((Registers_e)0x60, 0x90); // Exit hibernate mode step 1
fneirab 0:80c39eb8f3ba 153 // writeReg(CONFIG_2, 0x0); // Exit hibernate mode step 2
fneirab 0:80c39eb8f3ba 154 // writeReg((Registers_e)0x60, 0x0); // Exit hibernate mode step 3
fneirab 0:80c39eb8f3ba 155 //
fneirab 0:80c39eb8f3ba 156 // temp = battery->capacity*2;
fneirab 0:80c39eb8f3ba 157 // if (battery->voltageMax > 4.275) {
fneirab 0:80c39eb8f3ba 158 // writeReg(DP_A_CC, (temp/32)*51200/temp); // Write dPAcc
fneirab 0:80c39eb8f3ba 159 // writeReg(MODEL_CFG, 0x8400); // Write ModelCFG
fneirab 0:80c39eb8f3ba 160 // } else {
fneirab 0:80c39eb8f3ba 161 // writeReg(DP_A_CC, (temp/32)*44138/temp);
fneirab 0:80c39eb8f3ba 162 // writeReg(MODEL_CFG, 0x8000);
fneirab 0:80c39eb8f3ba 163 // }
fneirab 0:80c39eb8f3ba 164 // // Poll ModelCFG.refresh (highest bit), proceed to next step when ModelCFG.Refresh = 0.
fneirab 0:80c39eb8f3ba 165 // while(readReg(MODEL_CFG) & 0x8000) delay(10);
fneirab 0:80c39eb8f3ba 166 // writeReg(HIB_CFG, data); // Restore the original HibCFG value
fneirab 0:80c39eb8f3ba 167 // /***************************************************************/
fneirab 0:80c39eb8f3ba 168 // }
fneirab 0:80c39eb8f3ba 169 // /***************************************************************/
fneirab 0:80c39eb8f3ba 170 // // FIXX: DOUBLE CHECK, STEP 4 IN PROGRAMMER'S GUIDE
fneirab 0:80c39eb8f3ba 171 // data = readReg(STATUS); // read status register
fneirab 0:80c39eb8f3ba 172 //
fneirab 0:80c39eb8f3ba 173 // if (write_and_verify_reg(STATUS, data & 0xFFFD) != E_NO_ERROR) {
fneirab 0:80c39eb8f3ba 174 // return -1;
fneirab 0:80c39eb8f3ba 175 // }
fneirab 0:80c39eb8f3ba 176 // // Check whether there is saved history parameters
fneirab 0:80c39eb8f3ba 177 // temp = saved_param->rcomp0;
fneirab 0:80c39eb8f3ba 178 // temp &= saved_param ->temp_co;
fneirab 0:80c39eb8f3ba 179 // temp &= saved_param->full_cap_rep;
fneirab 0:80c39eb8f3ba 180 // temp &= saved_param->cycles;
fneirab 0:80c39eb8f3ba 181 // temp &= saved_param->full_cap_nom;
fneirab 0:80c39eb8f3ba 182 // // If there is no history setup the battery
fneirab 0:80c39eb8f3ba 183 // if (temp == 0) {
fneirab 0:80c39eb8f3ba 184 // // Check for MAX17055 reset
fneirab 0:80c39eb8f3ba 185 // StatusPOR = readReg(STATUS) & 0x0002;
fneirab 0:80c39eb8f3ba 186 // if (StatusPOR == 1) goto step_1;
fneirab 0:80c39eb8f3ba 187 // }
fneirab 0:80c39eb8f3ba 188 //step_4P3:
fneirab 0:80c39eb8f3ba 189 // // Read the reported capacity(mAH) and SOC (percentage)
fneirab 0:80c39eb8f3ba 190 // RepCap = readReg(REP_CAP);
fneirab 0:80c39eb8f3ba 191 // RepSOC = readReg(REP_SOC);
fneirab 0:80c39eb8f3ba 192 //
fneirab 0:80c39eb8f3ba 193 // // Read the TTE (in 5.625s)
fneirab 0:80c39eb8f3ba 194 // TTE_val = ((float)(readReg(TTE))) * 5.625;
fneirab 0:80c39eb8f3ba 195 //
fneirab 0:80c39eb8f3ba 196 // // Save learned parameters
fneirab 0:80c39eb8f3ba 197 // saved_param->rcomp0 = readReg(R_COMP_0);
fneirab 0:80c39eb8f3ba 198 // saved_param->temp_co = readReg(TEMP_CO);
fneirab 0:80c39eb8f3ba 199 // saved_param->full_cap_rep = readReg(FULL_CAP_REP);
fneirab 0:80c39eb8f3ba 200 // saved_param->cycles = readReg(CYCLES);
fneirab 0:80c39eb8f3ba 201 // saved_param->full_cap_nom = readReg(FULL_CAP_NOM);
fneirab 0:80c39eb8f3ba 202 //
fneirab 0:80c39eb8f3ba 203 // // Restoring Capacity Parameters
fneirab 0:80c39eb8f3ba 204 // if (write_and_verify_reg(R_COMP_0, saved_param->rcomp0) != E_NO_ERROR) {
fneirab 0:80c39eb8f3ba 205 // return -1;
fneirab 0:80c39eb8f3ba 206 // }
fneirab 0:80c39eb8f3ba 207 // if (write_and_verify_reg(TEMP_CO, saved_param->temp_co) != E_NO_ERROR) {
fneirab 0:80c39eb8f3ba 208 // return -1;
fneirab 0:80c39eb8f3ba 209 // }
fneirab 0:80c39eb8f3ba 210 // if (write_and_verify_reg(FULL_CAP_REP, saved_param->full_cap_rep) != E_NO_ERROR) {
fneirab 0:80c39eb8f3ba 211 // return -1;
fneirab 0:80c39eb8f3ba 212 // }
fneirab 0:80c39eb8f3ba 213 //
fneirab 0:80c39eb8f3ba 214 // delay(350);
fneirab 0:80c39eb8f3ba 215 // // Restore FullCap
fneirab 0:80c39eb8f3ba 216 // temp = readReg(FULL_CAP_NOM); // Read full_cap_nom
fneirab 0:80c39eb8f3ba 217 // data = (readReg(MIX_SOC)*temp)/25600; // MIXCAP
fneirab 0:80c39eb8f3ba 218 // if (write_and_verify_reg(MIX_CAP, data) != E_NO_ERROR) {
fneirab 0:80c39eb8f3ba 219 // return -1;
fneirab 0:80c39eb8f3ba 220 // }
fneirab 0:80c39eb8f3ba 221 // if (write_and_verify_reg(FULL_CAP_REP, temp) != E_NO_ERROR) {
fneirab 0:80c39eb8f3ba 222 // return -1;
fneirab 0:80c39eb8f3ba 223 // }
fneirab 0:80c39eb8f3ba 224 // data = saved_param->full_cap_nom/16; // This act as dQacc
fneirab 0:80c39eb8f3ba 225 // if (write_and_verify_reg(DP_A_CC, 0x0C80) != E_NO_ERROR) {
fneirab 0:80c39eb8f3ba 226 // return -1;
fneirab 0:80c39eb8f3ba 227 // }
fneirab 0:80c39eb8f3ba 228 // if (write_and_verify_reg(DQ_A_CC, temp) != E_NO_ERROR) {
fneirab 0:80c39eb8f3ba 229 // return -1;
fneirab 0:80c39eb8f3ba 230 // }
fneirab 0:80c39eb8f3ba 231 //
fneirab 0:80c39eb8f3ba 232 // delay(350);
fneirab 0:80c39eb8f3ba 233 // // Restore Cycles Register
fneirab 0:80c39eb8f3ba 234 // if (write_and_verify_reg(CYCLES, saved_param->cycles) != E_NO_ERROR) {
fneirab 0:80c39eb8f3ba 235 // return -1;
fneirab 0:80c39eb8f3ba 236 // }
fneirab 0:80c39eb8f3ba 237
fneirab 0:80c39eb8f3ba 238 //return E_NO_ERROR;
fneirab 0:80c39eb8f3ba 239 //}
fneirab 0:80c39eb8f3ba 240 //
fneirab 0:80c39eb8f3ba 241 //saved_fuel_gauge_params_t default_param = {0,0,0,0,0};