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

Fork of bq27210 by Kevin Braun

Revision:
1:ab433d7c3e30
Parent:
0:96d5698a376f
--- a/bq27210.h	Tue Jun 13 16:21:47 2017 +0000
+++ b/bq27210.h	Mon Jun 19 22:28:50 2017 +0000
@@ -2,6 +2,11 @@
 #define        MBED_BQ27210
 
 #define BQ_SHUNT_RESISTOR       20 // 0.020 ohms * 1000
+#define BQ_AR_VALUE             1121 // 200mA
+
+#define BQ_NEW_ILMD             0x21
+#define BQ_NEW_SEDVF            0x02
+#define BQ_NEW_SEDV1            0x24
 
 // Set data into "addr"
 #define BQ27210_ADDR            0xAA
@@ -68,6 +73,7 @@
 
 // read/write registers EEPROM
 #define BQ_EE_EN                0x6E
+#define BQ_EE_WRITE_EN          0xdd
 
 #define BQ_ILMD                 0x76
 #define BQ_SEDVF                0x77
@@ -85,10 +91,12 @@
 #define BQ_COMMAND_0x56         0x56
 #define BQ_COMMAND_0xC5         0xC5
 
+// bits common to all COMMAND types
 #define BQ_BIT_GPIEN            0x80
 #define BQ_BIT_GPSTAT           0x40
 #define BQ_BIT_INIT             0x04
 
+// bits unique to COMMAND types
 #define BQ_BIT_WRTNAC           0x20
 #define BQ_BIT_CEO              0x20
 #define BQ_BIT_UPDC             0x20
@@ -119,6 +127,14 @@
 #define BQ_BIT_EDVI             0x02
 #define BQ_BIT_EDVF             0x01
 
+/** 
+ * Factory default EEPROM data values, starting at BQ_ILMD
+ * 
+**/
+static const char bq_EEP_Defaults[10] = {
+        0x2c, 0x77, 0xa9, 0x48, 0x48, 0x89, 0x63, 0x66, 0x6c, 0x46
+};
+    
 class BQ27210
 {
 public:
@@ -165,32 +181,54 @@
         uint8_t gafDedvReg;     /*!< GAF/DEDV register */
         uint8_t dcompReg;       /*!< DCOMP register */
         uint8_t tcompReg;       /*!< TCOMP register */
+        int8_t cmmd_key;        /*!< Command Key 0xA9, 0x56 or 0xC5 */
         int16_t shunt_res;      /*!< Shunt Resistor value * 1000, 20 = 0.020 ohm */
-        char i2c_Bufx[48];        /*!< i2c buffer */
+        char i2c_Bufx[48];      /*!< i2c buffer */
     } BQ27210_TypeDef;
     
     /** Configure data pin
      * @param data SDA and SCL pins
+     * @param digital output 21V control pin
     **/
-    BQ27210(PinName p_sda, PinName p_scl);
+    BQ27210(PinName p_sda, PinName p_scl, PinName p_pgrm);
+    
+    /** Write default values for CNTL register and shunt resistor * 1000
+      * @param I2c pins
+      * @param programming enable EEPROM pin (21V)
+      * @return none
+      */
+    void default_init(BQ27210_TypeDef& dataSTR);
     
     /** Read all bq registers and put them into the data structure
-      * @param none
+      * @param pointer to data structure
       * @return i2c error, 0 = no error
       */
     int read_registers(BQ27210_TypeDef& dataSTR);
     
+    /** Initialize SoC for a new battery
+      * @param pointer to data structure
+      * @return error, 0 = no error
+      */
+    int new_battery_init(BQ27210_TypeDef& dataSTR);
+    
     /** Read all bq EEPROM registers and put them into the data structure
-      * @param none
+      * @param pointer to data structure
       * @return i2c error, 0 = no error
       */
     int read_eep_registers(BQ27210_TypeDef& dataSTR);
     
+    /** Write all bq EEPROM registers and put them into the data structure
+      * @param pointer to data structure, 21V needed
+      * @return i2c error, 0 = no error
+      */
+    int write_eep_registers(BQ27210_TypeDef& dataSTR);
+    
 private:
     //char i2c_Buf[48];           /* i2c buffer */
     
 protected:
     I2C  _i2c;
+    DigitalOut _pgm;
 
 
 };