TI BQ27220 I2C based, battery State of Charge and Coulomb Counter

Fork of bq27210 by Kevin Braun

bq27220.h

Committer:
loopsva
Date:
2017-06-21
Revision:
2:d52fb7ef7429
Parent:
bq27210.h@ 1:ab433d7c3e30
Child:
3:1b12fa9dc673

File content as of revision 2:d52fb7ef7429:

#ifndef        MBED_BQ27220
#define        MBED_BQ27220

#define BQ_SHUNT_RESISTOR       10 // 0.010 ohms * 1000

// Set data into "addr"
#define BQ27220_ADDR            0xAA

// Standard Commands
#define BQ_CNTL                 0x00
#define BQ_AR                   0x02
#define BQ_ARTTE                0x04
#define BQ_TEMP                 0x06
#define BQ_VOLT                 0x08
#define BQ_FLAGS                0x0A
#define BQ_CURRENT              0x0C

#define BQ_RM                   0x10
#define BQ_FCC                  0x12
#define BQ_AI                   0x14
#define BQ_TTE                  0x16
#define BQ_TTF                  0x18
#define BQ_SI                   0x1A
#define BQ_STTE                 0x1C
#define BQ_MLI                  0x1E

#define BQ_MLTTE                0x20
#define BQ_RCC                  0x22
#define BQ_AP                   0x24

#define BQ_INTTEMP              0x28
#define BQ_CYC                  0x2A
#define BQ_SOC                  0x2C
#define BQ_SOH                  0x2E

#define BQ_CV                   0x30
#define BQ_CC                   0x32
#define BQ_BTPD                 0x34
#define BQ_BTPC                 0x36

#define BQ_OS                   0x3A
#define BQ_DC                   0x3C

#define BQ_MACDATA              0x40

#define BQ_MACDATASUM           0x60
#define BQ_MACDATALEN           0x61

#define BQ_ANACNT               0x79
#define BQ_RAWC                 0x7A
#define BQ_RAWV                 0x7C
#define BQ_RAWT                 0x7E

// Sub Commands
#define BQ_CNTL_STAT            0x0000
#define BQ_DEVICE_NUMBER        0x0001
#define BQ_FW_VERSION           0x0002

#define BQ_BOARD_OFFSET         0x0009
#define BQ_CC_OFFSET            0x000A
#define BQ_CC_OFFSET_SAVE       0x000B
#define BQ_OCV_CMD              0x000C
#define BQ_BAT_INSERT           0x000D
#define BQ_BAT_REMOVE           0x000E

#define BQ_SET_SNOOZE           0x0013
#define BQ_CLEAR_SNOOZE         0x0014
#define BQ_SET_PROFILE_1        0x0015
#define BQ_SET_PROFILE_2        0x0016
#define BQ_SET_PROFILE_3        0x0017
#define BQ_SET_PROFILE_4        0x0018
#define BQ_SET_PROFILE_5        0x0019
#define BQ_SET_PROFILE_6        0x001A

#define BQ_CAL_TOGGLE           0x002D

#define BQ_SET_SEALED           0x0030

#define BQ_RESET                0x0040

#define BQ_EXIT_CAL             0x0080
#define BQ_ENTER_CAL            0x0081

#define BQ_ENTER_CFG_UPDATE     0x0090
#define BQ_EXIT_CFG_UPDATE_REINIT  0x0091
#define BQ_EXIT_CFG_UPDATE      0x0092

#define BQ_RETURN_TO_ROM        0x0F00

// CNTL_STAT register bit equates
#define BQ_BIT_CS_CCA           0x0020
#define BQ_BIT_CS_BCA           0x0010
#define BQ_BIT_CS_SNOOZE        0x0008
#define BQ_BIT_CS_BAT_ID2       0x0004
#define BQ_BIT_CS_BAT_ID1       0x0002
#define BQ_BIT_CS_BAT_ID0       0x0001

//GaugingStatus register bit equates
#define BQ_BIT_GS_VDQ           0x8000
#define BQ_BIT_GS_EDV2          0x4000
#define BQ_BIT_GS_EDV1          0x2000
#define BQ_BIT_GS_FCCX          0x0400
#define BQ_BIT_GS_CF            0x0080
#define BQ_BIT_GS_DSG           0x0040
#define BQ_BIT_GS_EDV           0x0020
#define BQ_BIT_GS_TC            0x0008
#define BQ_BIT_GS_TD            0x0004
#define BQ_BIT_GS_FC            0x0002
#define BQ_BIT_GS_FD            0x0001


// FLAGS register bit equates
#define BQ_BIT_F_FD             0x8000
#define BQ_BIT_F_OCV_COMP       0x4000
#define BQ_BIT_F_OCV_FAIL       0x2000
#define BQ_BIT_F_SLEEP          0x1000
#define BQ_BIT_F_OTC            0x0800
#define BQ_BIT_F_OTD            0x0400
#define BQ_BIT_F_FC             0x0200
#define BQ_BIT_F_CHGINH         0x0100
#define BQ_BIT_F_TCA            0x0040
#define BQ_BIT_F_OCVGD          0x0020
#define BQ_BIT_F_AUTH_GD        0x0010
#define BQ_BIT_F_BATTPRES       0x0008
#define BQ_BIT_F_TDA            0x0004
#define BQ_BIT_F_SYSDWN         0x0002
#define BQ_BIT_F_DSG            0x0001

// OS register bit equates
#define BQ_BIT_OS_CFGUPDATE     0x0400
#define BQ_BIT_OS_BTPINT        0x0080
#define BQ_BIT_OS_SMTH          0x0040
#define BQ_BIT_OS_INITCOMP      0x0020
#define BQ_BIT_OS_VDQ           0x0010
#define BQ_BIT_OS_EDV2          0x0008
#define BQ_BIT_OS_SEC1          0x0004
#define BQ_BIT_OS_SEC0          0x0002
#define BQ_BIT_OS_CALMD         0x0001
    
class BQ27220
{
public:
    /** 
     * Data structure for BQ27220 data values.
     * 
    **/
    typedef struct {
        uint16_t cntlReg;       /*!< CNTL register */
        uint16_t arReg;         /*!< AR register */
        uint16_t artteReg;      /*!< ARTTE register */
        uint16_t tempReg;       /*!< TEMP register */
        uint16_t voltReg;       /*!< VOLT register */
        
        uint16_t flagsReg;      /*!< FLAGS register */
        uint16_t currentReg;    /*!< CURRENT register */
        uint16_t rmReg;         /*!< RM register */
        uint16_t fccReg;        /*!< FCC register */
        uint16_t aiReg;         /*!< AI register */
        
        uint16_t tteReg;        /*!< TTE register */
        uint16_t ttfReg;        /*!< TTF register */
        uint16_t siReg;         /*!< SI register */
        uint16_t stteReg;       /*!< STTE register */
        uint16_t mliReg;        /*!< MLI register */
        
        uint16_t mltteReg;      /*!< MLTTE register */
        uint16_t rawccReg;      /*!< RCC register */
        uint16_t apReg;         /*!< AP register */
        uint16_t intTempReg;    /*!< INTTEMP register */
        uint16_t cycReg;        /*!< CYC register */
        
        uint16_t socReg;        /*!< SOC register */
        uint16_t sohReg;        /*!< SOH register */
        uint16_t cvReg;         /*!< CV register */
        uint16_t ccReg;         /*!< CC register */
        uint16_t btpdReg;       /*!< BTPD register */
        
        uint16_t btpcReg;       /*!< BTPC register */
        uint16_t osReg;         /*!< OS register */
        uint16_t dcReg;         /*!< DC register */
        char macData[32];       /*!< MAC Data array */
        uint16_t macSumReg;     /*!< MAC Data Sum register */
        
        uint16_t macLenReg;     /*!< MAC Data Len register */
        uint8_t anacReg;        /*!< Analog Count register */
        uint16_t rawcReg;       /*!< RAWC register */
        uint16_t rawvReg;       /*!< RAWV register */
        uint16_t rawtReg;       /*!< RAWT register */

        int16_t shunt_res;      /*!< Shunt Resistor value * 1000, 20 = 0.020 ohm */
        char i2c_Bufx[32];      /*!< i2c buffer */
    } BQ27220_TypeDef;
    
    /** Configure data pin
     * @param data SDA and SCL pins
     * // @param digital output 21V control pin
    **/
    //BQ27220(PinName p_sda, PinName p_scl, PinName p_pgrm);
    BQ27220(PinName p_sda, PinName p_scl);
    
    
    /** Write default values for CNTL register and shunt resistor * 1000
      * @param I2c pins
      * @param programming enable EEPROM pin (21V)
      * @return none
      */
    void default_init(BQ27220_TypeDef& dataSTR);
    
    /** Read all bq registers and put them into the data structure
      * @param pointer to data structure
      * @return i2c error, 0 = no error
      */
    int read_registers(BQ27220_TypeDef& dataSTR);
    
    /** Initialize SoC for a new battery
      * @param pointer to data structure
      * @return error, 0 = no error
      */
    int new_battery_init(BQ27220_TypeDef& dataSTR);
    
    /** Read all bq EEPROM registers and put them into the data structure
      * @param pointer to data structure
      * @return i2c error, 0 = no error
      */
    int read_eep_registers(BQ27220_TypeDef& dataSTR);
      
protected:
    I2C  _i2c;
    
private:

};

#endif // MBED_BQ27220