Library for I2C communication with LiPo battery fuel gauge to measure battery level.

Dependents:   MAX1704X_example_app

MAX1704X.h

Committer:
maclobdell
Date:
2017-10-09
Revision:
0:b3b7aff20a1d

File content as of revision 0:b3b7aff20a1d:

/* MAX1704X Simple Driver Library
 * Copyright (c) 2017 Mac Lobdell
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef MAX1704X_H
#define MAX1704X_H

#include "mbed.h"

/** MAX1704X class.
 *  Used for reading  MAX1704X lipo fuel guage connected via I2C.
 *
 * Example:
 * @code
 * #include "mbed.h"
 * #include "MAX1704X.h"
 *
 * //Create an MAX1704X object at the default address (ADDRESS_0)
 * MAX1704X battery_level(p28, p27);
 *
 * int main()
 * {
 *     //Try to open the MAX1704X
 *     if (battery_level.open()) {
 *         printf("Device detected!\n");
 *
 *         while (1) {
 *             //Print the current battery level
 *             printf("battery = %d\n", battery_level);
 *
 *             //Sleep for 1 seconds
 *             wait(1);
 *         }
 *     } else {
 *         error("Device not detected!\n");
 *     }
 * }
 * @endcode
 */
class MAX1704X
{
public:
    /** Represents the different I2C address possibilities for the MAX1704X
     */
     
    enum Address {
        ADDRESS_0 = (0x36 << 1)    /* Slave Address 011 0110 + r/w bit */
    };

    /** Create an MAX1704X object connected to the specified I2C pins with the specified I2C slave address
     *
     * @param sda The I2C data pin.
     * @param scl The I2C clock pin.
     * @param addr The I2C slave address (defaults to ADDRESS_0).
     * @param hz The I2C bus frequency (defaults to 400kHz).
     */
    MAX1704X(PinName sda, PinName scl, Address addr = ADDRESS_0, int hz = 400000);

    /** Probe for the MAX1704X and indicate if it's present on the bus
     *
     * @returns
     *   'true' if the device exists on the bus,
     *   'false' if the device doesn't exist on the bus.
     */
    bool open();

    /** assert power on reset on MAX1704X
     *
     * @returns void
     */
     void power_on_reset(void);

    /** Get the current ad of the MAX1704X
     *
     * @returns The current ad.
     */
    uint32_t read_ad();

    /** Get the current config of the MAX1704X
     *
     * @returns The current config of the MAX170X.
     */
    uint16_t read_config();

    /** Get the current battery charge percent from MAX1704X
     *
     * @returns The current battery charge percent from MAX1704X.
     */
    uint32_t read_percent();

//#ifdef MBED_OPERATORS
    /** A shorthand for percentage()
     *
     * @returns the current battery percentage measurement.
     */
//    operator uint32_t();
//#endif

private:
    //I2C register addresses
    enum Register {
        REG_VCELL_H = 0x02,
        REG_VCELL_L = 0x03,
        REG_SOC_H   = 0x04,
        REG_SOC_L   = 0x05,        
        REG_MODE_H  = 0x06,        
        REG_MODE_L  = 0x07,                
        REG_VER_H   = 0x08,        
        REG_VER_L   = 0x09,                
        REG_CONFIG_H  = 0x0C,        
        REG_CONFIG_L  = 0x0D,                                
        REG_COMMAND_H  = 0xFE,        
        REG_COMMAND_L  = 0xFF                                       
    };

    //Member variables
    I2C m_I2C;
    const int m_ADDR;
    
    //Internal functions
    char read8(char reg);
    void write8(char reg, char data);
    uint16_t read16(char reg);
    void write16(char reg, uint16_t data);
};

#endif