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

Fork of bq27210 by Kevin Braun

Revision:
2:d52fb7ef7429
Parent:
1:ab433d7c3e30
Child:
3:1b12fa9dc673
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bq27220.h	Wed Jun 21 19:56:02 2017 +0000
@@ -0,0 +1,234 @@
+#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
\ No newline at end of file