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

max17055.h

Committer:
fneirab
Date:
2017-10-02
Revision:
5:a18a189588dc
Parent:
4:a4d6ae2182c2
Child:
6:5ced10109ebf

File content as of revision 5:a18a189588dc:

/******************************************************************//**
* @file max17055.h
*
* @author Felipe Neira - Maxim Integrated - TTS
*
* @version 1.0
*
* Started: 11SEP17
*
* Updated:
*
* @brief Source file for MAX31855 class
*
********************************************************************************
* 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.
*
******************************************************************************/

#ifndef __MAX17055_H_
#define __MAX17055_H_

// Include
#include "mbed.h"

/* STATUS register bits */
#define MAX17055_STATUS_BST             (1 << 3)
#define MAX17055_STATUS_POR             (1 << 1)

/// Model loading options
#define MODEL_LOADING_OPTION1           1
#define MODEL_LOADING_OPTION2           2
#define MODEL_LOADING_OPTION3           3


/**
 * @brief Library for the MAX17055\n
 * The MAX17055 is a low 7μA operating current fuel gauge
 * which implements Maxim ModelGauge™ m5 EZ algorithm.
 * ModelGauge m5 EZ makes fuel gauge implementation easy
 * by eliminating battery characterization requirements
 * and simplifying host software interaction.
 * The ModelGauge m5 EZ robust algorithm provides tolerance against
 * battery diversity for most lithium batteries and applications.
 * Communication is through an SPI-compatible interface.
 *
 * @code
 * #include "mbed.h"
 * #include "MAX170155.h"
 *
 *
 * // Hardware serial port
 * Serial serial(USBTX, USBRX);
 *
 * //SPI communications
 * I2C i2c(SCL, SDA);
 *
 * //Fuel Gauge
 * MAX17055 max17055(i2C, Sutff );//To be completed
 *
 *
 * int main(void)
 * {
 *     CODE CODE
 *      while(true)
 *      {
 *          CODE CODE
 *      }
 * }
 * @endcode
 */

 /**
    * @brief       Saved Fuel Gauge Parameters
    * @details     Struct with saved fuel Gauge Parametrs
    */

struct saved_fuel_gauge_params_t{
        int rcomp0;              /**< Explain */
        int temp_co;             /**< Explain */
        int full_cap_rep;        /**< Explain */
        int cycles;              /**< Explain */
        int full_cap_nom;        /**< Explain */
     } ;

   /**
    * @brief       Saved Fuel Gauge Parameters
    * @details     Struct with saved fuel Gauge Parametrs
    */


 struct max17055_platform_data{
        uint16_t designcap;/**< struct value 1 */
        uint16_t ichgterm; /**< struct value 2 */
        uint16_t vempty;   /**< struct value 3 */
        int vcharge;       /**< struct value 1 */

        uint16_t learncfg;  /**< struct value 1 */
        uint16_t relaxcfg;  /**< struct value 1 */
        uint16_t config;    /**< struct value 1 */
        uint16_t config2;   /**< struct value 1 */
        uint16_t fullsocthr;/**< struct value 1 */
        uint16_t tgain;     /**< struct value 1 */
        uint16_t toff;      /**< struct value 1 */
        uint16_t curve;     /**< struct value 1 */
        uint16_t rcomp0;    /**< struct value 1 */
        uint16_t tempco;    /**< struct value 1 */ 
        uint16_t qrtable00;
        uint16_t qrtable10;
        uint16_t qrtable20;
        uint16_t qrtable30;

        uint16_t dpacc;
        uint16_t modelcfg;

        //uint16_t model_data[MAX17055_TABLE_SIZE];
        int (*get_charging_status)(void);
        int model_option;
        /**
         * rsense in miliOhms.
         * default 10 (if rsense = 0) as it is the recommended value by
         * the datasheet although it can be changed by board designers.
         */
        unsigned int rsense; 
        int volt_min;   /**< in mV */
        int volt_max;   /**< in mV */
        int temp_min;   /**< in DegreC */
        int temp_max;   /**< in DegreeC */
        int soc_max;    /**< in percent */
        int soc_min;    /**< in percent */
        int curr_max;   /**< in mA */
        int curr_min;   /**< in mA */
     } ;



//! BATTERY Battery Parameters Class
/*!
 Generic API for battery parameters
 */
class BATTERY
{

public:


     struct battery_cfg_t{
        int capacity;  //!< The rated capacity in mAh of the battery 
        int voltageMax;  //!< The maximum voltage in mV that should be used for charging
        int voltageNom;  //!< The normal voltage in mV of the battery near mid charge
        int voltageMin;  //!< The minimum voltage in mV that the battery should be discharged
        int temperatureMax;  //!< The maximum temperature in degrees C where charging is allowed
        int temperatureMin;  //!< The minimum temperature in degrees C where charging is allowed
        int currentCharge;  //!< The current as a percentage of capicity used for charging
        int currentTerm;  //!< The current as a percentage of capacity to stop charging
        int currentPre;  //!< The current as a percentage of capacity for pre-charging
     } ;
    
        
   

};

/******************************************************************//**
* MAX17055 Class
**********************************************************************/
/// MAX17055 Battery Fuel Gauge Class 
/** Generic API for a battery fuel gauge
 */
class MAX17055
{

public:

    ///7-bit slave address
    static const uint8_t I2C_ADRS   = 0x36;  //Slave address 0x6C or 0x36 for 7 MSbit Addres
    ///8-bit write address
    static const uint8_t I2C_W_ADRS = 0x6C;
    ///8-bit read address
    static const uint8_t I2C_R_ADRS = 0x6D;
    /////Max # Bytes in FIFO
//    static const uint16_t MAX_FIFO_BYTES = 288;
//    ///# of bytes per LED channel
//    static const uint8_t BYTES_PER_CH = 3;

    struct BATTERY::battery_cfg_t batt_con;
    struct max17055_platform_data design_data;
    struct saved_fuel_gauge_params_t fuelGauge_params;



    /**
     * @brief       Register Addresses for the MAX17055
     * @details     Enumerated register addresses
     */
    enum Registers_e {
        MAX17055_STATUS_REG                 = 0x00, /**< 0x00 */
        MAX17055_VALRTTH_REG                = 0x01, /**< 0x01 */
        MAX17055_TALRTTH_REG                = 0x02, /**< 0x02 */
        MAX17055_SALRTTH_REG                = 0x03, /**< 0x04 */
        MAX17055_REPCAP_REG                 = 0x05, /**< 0x05 */ 
        MAX17055_REPSOC_REG                 = 0x06, /**< 0x06 */
        MAX17055_TEMP_REG                   = 0x08, /**< 0x07 */
        MAX17055_VCELL_REG                  = 0x09, /**< 0x08 */
        MAX17055_CURRENT_REG                = 0x0A, /**< 0x0A */ 
        MAX17055_AVGCURRENT_REG             = 0x0B, /**< 0x0B */
        MAX17055_REMCAP_REG                 = 0x0F, /**< 0x0F */

        MAX17055_FULLCAPREP_REG             = 0x10, /**< 0x10 */
        MAX17055_TTE_REG                    = 0X11, /**< 0x11 */
        MAX17055_QRTABLE00_REG              = 0x12, /**< 0x12 */
        MAX17055_FULLSOCTHR_REG             = 0x13, /**< 0x13 */
        MAX17055_CYCLES_REG                 = 0x17,
        MAX17055_DESIGNCAP_REG              = 0x18,
        MAX17055_AVGVCELL_REG               = 0x19,
        MAX17055_MAXMINVOLT_REG             = 0x1B,
        MAX17055_CONFIG_REG                 = 0x1D,
        MAX17055_ICHGTERM_REG               = 0x1E,

        MAX17055_VERSION_REG                = 0x21,
        MAX17055_QRTABLE10_REG              = 0x22,
        MAX17055_FULLCAPNOM_REG             = 0x23,
        MAX17055_LEARNCFG_REG               = 0x28,
        MAX17055_RELAXCFG_REG               = 0x2A,
        MAX17055_TGAIN_REG                  = 0x2C,
        MAX17055_TOFF_REG                   = 0x2D,

        MAX17055_QRTABLE20_REG              = 0x32,
        MAX17055_RCOMP0_REG                 = 0x38,
        MAX17055_TEMPCO_REG                 = 0x39,
        MAX17055_VEMPTY_REG                 = 0x3A,
        MAX17055_FSTAT_REG                  = 0x3D,

        MAX17055_QRTABLE30_REG              = 0x42,
        MAX17055_DQACC_REG                  = 0x45,
        MAX17055_DPACC_REG                  = 0x46,
        MAX17055_VFSOC0_REG                 = 0x48,
        MAX17055_QH0_REG                    = 0x4C,
        MAX17055_QH_REG                     = 0x4D,

        MAX17055_VFSOC0_QH0_LOCK_REG        = 0x60,
        MAX17055_LOCK1_REG                  = 0x62,
        MAX17055_LOCK2_REG                  = 0x63,

        MAX17055_MODELDATA_START_REG        = 0x80,

        MAX17055_IALRTTH_REG                = 0xB4,
        MAX17055_CURVE_REG                  = 0xB9,
        MAX17055_HIBCFG_REG                 = 0xBA,
        MAX17055_CONFIG2_REG                = 0xBB,

        MAX17055_MODELCFG_REG               = 0xDB,

        MAX17055_OCV_REG                    = 0xFB,
        MAX17055_VFSOC_REG                  = 0xFF,
    } ;

   


    /**
     * @brief       max17055 Constructor
     * @details     max17055 Constructor with battery and i2c as parameters
     */
    MAX17055(I2C &i2c);

    /**
     * @brief       Fuel Gauge Destructor
     */
    ~MAX17055();

    ////////////////////////////////////////////////////////////////////////////
    
    /**
    * \brief        Poll Flag clear
    * \par          Details
    *               This function clears status flags for the MAX17055 
    *
    * \param[in]    reg_addr - register address
    * \param[in]    mask - register address
    * \param[in]    timeout - register data
    *
    * \retval       1 on success
    *              -1 on Failure
    */
    
    int max17055_poll_flag_clear(Registers_e reg_addr, int mask, int timeout);


    /**
    * \brief        Write and Verify a MAX17055 register
    * \par          Details
    *               This function wites and verifies if the writing process was successful
    *
    * \param[in]    reg_addr     - register address
    * \param[out]   reg_data     - the variable that contains the data to write
    *                              to the register address
    *
    * \retval       1 on success
    *              -1 if write errors
    *              -2 if read errors
    *              -3 if data curruption
    *
    */


    int write_and_verify_reg(Registers_e reg_addr, uint16_t reg_data);


    ///////////////////////////////////////////////////////////////////////////

    /**
    * \brief        Initialise Function for MAX17055
    * \par          Details
    *               This function intitializes the MAX17055
    *
    * \retval       1 on success
    *              -1 if errors exist
    */


    int init(struct max17055_platform_data *pri);


    ////////////////////////////////////////////////////////////////////////////

    /**
    * \brief        Get Internal Temperature Function for MAX17055
    * \par          Details
    *               This function sends a request to access the internal
    *               of the MAX17055
    *
    * \param[out]   *temp     - pointer? or Reference? to the volue of the temperature
    * \retval       1 on success
    *               0 on success
    *              -1 if errors exist
    */


    int get_temperature(int *temp);


    ////////////////////////////////////////////////////////////////////////////

    /**
    * \brief        Forced Exit Hibernate Mode Function for MAX17055
    * \par          Details
    *               This function executes a force exit from hibernate mode.
    *
    * \retval       returns HibCFG original value before forced Exit Hybernate mode
    *
    */


    uint16_t forcedExitHyberMode();



protected:
    /**
     * @brief       Write Register
     * @details     Writes data to max17055 Register
     *
     * @parameters  reg_addr Registers to write
     *              reg_data Data to write
     */
    int writeReg(const Registers_e reg_addr, uint16_t reg_data);

    /**
     * @brief       Read Register
     * @details     Reads data from max17055 register
     *
     * @parameters  reg_addr Register to read
     */
    int32_t readReg(Registers_e reg_addr, uint16_t &value);





private:

    I2C &m_i2cBus;                          // I2C object

};

#endif /* _MAX17055_H_ */