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

Revision:
1:a031f0c6a71e
Parent:
0:80c39eb8f3ba
Child:
2:ff7db397b70f
--- a/max17055.cpp	Thu Sep 21 00:53:05 2017 +0000
+++ b/max17055.cpp	Thu Sep 21 22:35:39 2017 +0000
@@ -45,76 +45,116 @@
 {
     //empty block
 }
-
+///////////////////////////////////////////////////////////////////////////////
 
 /**
 * \brief        Write a value to a MAX17055 register
 * \par          Details
 *               This function writes a value to a MAX17055 register
 *
-* \param[in]    Registers_e - register address
-* \param[in]    reg_data          - register data
+* \param[in]    reg_addr - register address
+* \param[in]    reg_data - register data
 *
-* \retval       true on success
+* \retval       1 on success
 */
 
 int MAX17055::writeReg(Registers_e reg_addr, uint16_t reg_data)
 {
 
-    char add_plus_data[2] = {reg_addr, reg_data};
+    
+    uint8_t dataLSB;
+    uint8_t dataMSB;
     
-    if ( m_i2cBus.write(I2C_W_ADRS, add_plus_data, 2, false) == 0)
+    dataLSB = reg_data & 0x00FF;
+    dataMSB = (reg_data >> 8) & 0x00FF; 
+    
+    char add_plus_data[3] = {reg_addr, dataLSB, dataMSB};
+    
+    if ( m_i2cBus.write(I2C_W_ADRS, add_plus_data, 3, false) == 0)
         return 1;
     else
         return 0;
 
 }
-
+///////////////////////////////////////////////////////////////////////////////
 /**
 * \brief        Read a MAX17055 register
 * \par          Details
 *               This function reads a MAX17055 register
 *
-* \param[in]    uch_addr    - register address
-* \param[out]   puch_data    - pointer that stores the register data
+* \param[in]    reg_addr   - register address
+* \param[out]   &value   - pointer that stores the register data
 *
 * \retval       1 on success
 */
 
 
-int32_t MAX17055::readReg(Registers_e reg_addr, uint8_t &value)
+int32_t MAX17055::readReg(Registers_e reg_addr, uint16_t &value)
 {
     int32_t result;
-    
-    char local_data[2];
+    //int16_t value2;
+    //int16_t twoBytes;
+    char local_data[1];
     local_data[0] = reg_addr;
+    char read_data[2];
  
     result = m_i2cBus.write(I2C_W_ADRS, local_data, 1);
     if(result == 0) 
     {
-        result = m_i2cBus.read(I2C_R_ADRS, (local_data + 1), 1);
-        if (result == 0) 
+        result = m_i2cBus.read(I2C_R_ADRS, read_data , 2, false);
+        if (result == 0)
         {
-            value = local_data[1];
-        }
+            value = ( ((read_data[1] & 0x00FF) << 8) + (read_data[0]));
+            result = 1;
+        } 
     }
- 
+    
     return result;
+  
 }
 
-//int MAX17055::write_and_verify_reg (MAX17055::Registers_e reg_addr, uint8_t reg_data)
-//{
-//    uint8_t data;
-//
-//    writeReg(reg_addr,reg_data);
-//    data = readReg(reg_addr);
-//
-//    if (data != reg_data) {
-//        return -1;
-//    }
-//
-//    return E_NO_ERROR;
-//}
+
+/**
+* \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
+*/
+
+
+int MAX17055::write_and_verify_reg (MAX17055::Registers_e reg_addr, uint16_t reg_data)
+{   
+    int retries = 8;
+    int ret;
+    int statusRead;
+    int statusWrite;
+    uint16_t read_data;
+    
+    do {
+        statusWrite = writeReg(reg_addr, reg_data);
+        if (statusWrite != 1)
+            ret = -1;
+        wait_ms(3);
+        statusRead = readReg(reg_addr, read_data); 
+        if  (statusRead != 1)
+            ret = -2;
+        if (read_data != reg_data){
+            ret = -3;
+            retries--;
+        }
+    }while (retries && read_data != reg_data);
+    
+    if (ret<0)
+    {
+        return ret;
+    } else
+        return 1;
+}
 //
 //int MAX17055::init()
 //{