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

Revision:
0:80c39eb8f3ba
Child:
1:a031f0c6a71e
diff -r 000000000000 -r 80c39eb8f3ba max17055.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/max17055.cpp	Thu Sep 21 00:53:05 2017 +0000
@@ -0,0 +1,241 @@
+/*******************************************************************************
+ * Copyright (C) 2017 Maxim Integrated Products, Inc., All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
+ * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of Maxim Integrated
+ * Products, Inc. shall not be used except as stated in the Maxim Integrated
+ * Products, Inc. Branding Policy.
+ *
+ * The mere transfer of this software does not imply any licenses
+ * of trade secrets, proprietary technology, copyrights, patents,
+ * trademarks, maskwork rights, or any other form of intellectual
+ * property whatsoever. Maxim Integrated Products, Inc. retains all
+ * ownership rights.
+ *
+ ******************************************************************************/
+
+#include "mbed.h"
+#include "max17055.h"
+
+
+MAX17055::MAX17055(I2C &i2c): 
+m_i2cBus(i2c)
+{
+  //empty block
+}
+
+MAX17055::~MAX17055()
+{
+    //empty block
+}
+
+
+/**
+* \brief        Write a value to a MAX17055 register
+* \par          Details
+*               This function writes a value to a MAX17055 register
+*
+* \param[in]    Registers_e - register address
+* \param[in]    reg_data          - register data
+*
+* \retval       true on success
+*/
+
+int MAX17055::writeReg(Registers_e reg_addr, uint16_t reg_data)
+{
+
+    char add_plus_data[2] = {reg_addr, reg_data};
+    
+    if ( m_i2cBus.write(I2C_W_ADRS, add_plus_data, 2, false) == 0)
+        return 1;
+    else
+        return 0;
+
+}
+
+/**
+* \brief        Read a MAX17055 register
+* \par          Details
+*               This function reads a MAX17055 register
+*
+* \param[in]    uch_addr    - register address
+* \param[out]   puch_data    - pointer that stores the register data
+*
+* \retval       1 on success
+*/
+
+
+int32_t MAX17055::readReg(Registers_e reg_addr, uint8_t &value)
+{
+    int32_t result;
+    
+    char local_data[2];
+    local_data[0] = reg_addr;
+ 
+    result = m_i2cBus.write(I2C_W_ADRS, local_data, 1);
+    if(result == 0) 
+    {
+        result = m_i2cBus.read(I2C_R_ADRS, (local_data + 1), 1);
+        if (result == 0) 
+        {
+            value = local_data[1];
+        }
+    }
+ 
+    return result;
+}
+
+//int MAX17055::write_and_verify_reg (MAX17055::Registers_e reg_addr, uint8_t reg_data)
+//{
+//    uint8_t data;
+//
+//    writeReg(reg_addr,reg_data);
+//    data = readReg(reg_addr);
+//
+//    if (data != reg_data) {
+//        return -1;
+//    }
+//
+//    return E_NO_ERROR;
+//}
+//
+//int MAX17055::init()
+//{
+//    int temp, data, StatusPOR, RepCap, RepSOC;
+//    float TTE_val;
+//    // Attach Interrupt to ALRT pin
+//
+//    // Read the status power up on reset (POR is bit 1 in that register)
+//    // 0 means that POR has not occured, 1 means that it has just occured, has to be cleared
+//    StatusPOR = readReg(STATUS) & 0x0002;
+//
+//    if (StatusPOR == 0) {
+//        goto step_4P3;
+//    } else {
+//step_1:
+//        // Wait until MAX17055 complete setup operations (Data is Ready)
+//        while(readReg(F_STAT) & 0x0001) delay(10);
+//        /***************************************************************/
+//        // Setting up or initializing charging configurations down here , EZ CONFIG because no .INI file
+//        // FIXX:: DOUBLE CHECK THE INITIALIZATION VALUES
+//        // init values is claculated based on the register lsb's default value page 1 software implementation UG
+//        /* Capacity is in mAH and 1 bit is 0.5mAH)*/
+//        temp = battery->capacity*2;
+//        writeReg(DESIGN_CAP, temp);
+//        writeReg(DQ_A_CC, temp/32);
+//        /* Current measurement, assuming current input in mA */
+//        temp = battery->currentTerm*1000/1.5625;
+//        writeReg(ICHG_TERM, temp);
+//        /* FIXX: DOUBLE CHECK Vempty register (v empty | v recovery), I am assuming that
+//        VE resolution is 10mV and VR resolution is 40mV (programmer's guide)*/
+//        temp =((battery->voltageMin/10) << 7 | (battery->voltageNom)/40);
+//        writeReg(V_EMPTY ,temp);
+//
+//        data = readReg(HIB_CFG); // Store original HIB_CFG inside
+//        writeReg((Registers_e)0x60, 0x90); // Exit hibernate mode step 1
+//        writeReg(CONFIG_2, 0x0); // Exit hibernate mode step 2
+//        writeReg((Registers_e)0x60, 0x0); // Exit hibernate mode step 3
+//
+//        temp = battery->capacity*2;
+//        if (battery->voltageMax > 4.275) {
+//            writeReg(DP_A_CC, (temp/32)*51200/temp); // Write dPAcc
+//            writeReg(MODEL_CFG, 0x8400);    // Write ModelCFG
+//        } else {
+//            writeReg(DP_A_CC, (temp/32)*44138/temp);
+//            writeReg(MODEL_CFG, 0x8000);
+//        }
+//        // Poll ModelCFG.refresh (highest bit), proceed to next step when ModelCFG.Refresh = 0.
+//        while(readReg(MODEL_CFG) & 0x8000) delay(10);
+//        writeReg(HIB_CFG, data);    // Restore the original HibCFG value
+//        /***************************************************************/
+//    }
+//    /***************************************************************/
+//    // FIXX: DOUBLE CHECK, STEP 4 IN PROGRAMMER'S GUIDE
+//    data = readReg(STATUS); // read status register
+//
+//    if (write_and_verify_reg(STATUS, data & 0xFFFD) != E_NO_ERROR) {
+//        return -1;
+//    }
+//    // Check whether there is saved history parameters
+//    temp = saved_param->rcomp0;
+//    temp &= saved_param ->temp_co;
+//    temp &= saved_param->full_cap_rep;
+//    temp &= saved_param->cycles;
+//    temp &= saved_param->full_cap_nom;
+//    // If there is no history setup the battery
+//    if (temp == 0) {
+//        // Check for MAX17055 reset
+//        StatusPOR = readReg(STATUS) & 0x0002;
+//        if (StatusPOR == 1) goto step_1;
+//    }
+//step_4P3:
+//    // Read the reported capacity(mAH) and SOC (percentage)
+//    RepCap = readReg(REP_CAP);
+//    RepSOC = readReg(REP_SOC);
+//
+//    // Read the TTE (in 5.625s)
+//    TTE_val = ((float)(readReg(TTE))) * 5.625;
+//
+//    // Save learned parameters
+//    saved_param->rcomp0 = readReg(R_COMP_0);
+//    saved_param->temp_co = readReg(TEMP_CO);
+//    saved_param->full_cap_rep = readReg(FULL_CAP_REP);
+//    saved_param->cycles = readReg(CYCLES);
+//    saved_param->full_cap_nom = readReg(FULL_CAP_NOM);
+//
+//    // Restoring Capacity Parameters
+//    if (write_and_verify_reg(R_COMP_0, saved_param->rcomp0) != E_NO_ERROR) {
+//        return -1;
+//    }
+//    if (write_and_verify_reg(TEMP_CO, saved_param->temp_co) != E_NO_ERROR) {
+//        return -1;
+//    }
+//    if (write_and_verify_reg(FULL_CAP_REP, saved_param->full_cap_rep) != E_NO_ERROR) {
+//        return -1;
+//    }
+//
+//    delay(350);
+//    // Restore FullCap
+//    temp = readReg(FULL_CAP_NOM); // Read full_cap_nom
+//    data = (readReg(MIX_SOC)*temp)/25600; // MIXCAP
+//    if (write_and_verify_reg(MIX_CAP, data) != E_NO_ERROR) {
+//        return -1;
+//    }
+//    if (write_and_verify_reg(FULL_CAP_REP, temp) != E_NO_ERROR) {
+//        return -1;
+//    }
+//    data = saved_param->full_cap_nom/16; // This act as dQacc
+//    if (write_and_verify_reg(DP_A_CC, 0x0C80) != E_NO_ERROR) {
+//        return -1;
+//    }
+//    if (write_and_verify_reg(DQ_A_CC, temp) != E_NO_ERROR) {
+//        return -1;
+//    }
+//
+//    delay(350);
+//    // Restore Cycles Register
+//    if (write_and_verify_reg(CYCLES, saved_param->cycles) != E_NO_ERROR) {
+//        return -1;
+//    }
+
+//return E_NO_ERROR;
+//}
+//
+//saved_fuel_gauge_params_t default_param = {0,0,0,0,0};
\ No newline at end of file