Fork of MAX14690 library

Fork of MAX14690 by Greg Steiert

Revision:
10:32c7e2ab67aa
Parent:
9:8fb54367ceb5
Child:
13:dff55b34fe1f
--- a/MAX14690.cpp	Thu Nov 10 16:06:11 2016 +0000
+++ b/MAX14690.cpp	Fri Nov 18 22:06:28 2016 +0000
@@ -34,60 +34,18 @@
 #include "MAX14690.h"
 
 //******************************************************************************
-MAX14690::MAX14690(PinName sda, PinName scl, int slaveAddress) :
-    slaveAddress(slaveAddress)
+MAX14690::MAX14690(PinName sda, PinName scl)
 {
     i2c = new I2C(sda,scl);
     isOwner = true;
-    clkDivEn = false;
-    clkDivSet = 0;
-    boostISet = BOOST_ISET_100mA;
-    boostMillivolts = 3300;
-    boostEn = BOOST_DISABLED;
-    boostEMI = false;
-    boostInd = false;
-    boostHysOff = false;
-    boostPasDsc = false;
-    boostActDsc = false;
-    buckMd = BUCK_BURST;
-    buckFst = false;
-    buckISet = BUCK_ISET_300mA;
-    buckCfg = false;
-    buckInd = false;
-    buckHysOff = true;
-    buckMinOT = true;
-    buckInteg = true;
-    buckPasDsc = false;
-    buckActDsc = false;
-    buckFScl = false;
+    resetToDefaults();
 }
 //******************************************************************************
-MAX14690::MAX14690(I2C *i2c, int slaveAddress) :
-    slaveAddress(slaveAddress)
+MAX14690::MAX14690(I2C *i2c)
 {
     this->i2c = i2c;
     isOwner = false;
-    clkDivEn = false;
-    clkDivSet = 0;
-    boostISet = BOOST_ISET_100mA;
-    boostMillivolts = 3300;
-    boostEn = BOOST_DISABLED;
-    boostEMI = false;
-    boostInd = false;
-    boostHysOff = false;
-    boostPasDsc = false;
-    boostActDsc = false;
-    buckMd = BUCK_BURST;
-    buckFst = false;
-    buckISet = BUCK_ISET_300mA;
-    buckCfg = false;
-    buckInd = false;
-    buckHysOff = true;
-    buckMinOT = true;
-    buckInteg = true;
-    buckPasDsc = false;
-    buckActDsc = false;
-    buckFScl = false;
+    resetToDefaults();
 }
 
 //******************************************************************************
@@ -99,40 +57,121 @@
 }
 
 //******************************************************************************
-int MAX14690::boostSetMode(boostEn_t mode)
+void MAX14690::resetToDefaults()
 {
-    char data;
-
-    boostEn = mode;
-    data = (boostEn << 3) | (boostEMI << 1) | (boostInd);
-    return writeReg(REG_BOOST_CFG, data);
+    intEnThermStatus = false;
+    intEnChgStatus = false;
+    intEnILim = false;
+    intEnUSBOVP = false;
+    intEnUSBOK = false;
+    intEnChgThmSD = false;
+    intEnThermReg = false;
+    intEnChgTimeOut = false;
+    intEnThermBuck1 = false;
+    intEnThermBuck2 = false;
+    intEnThermLDO1 = false;
+    intEnThermLDO2 = false;
+    intEnThermLDO3 = false;
+    iLimCntl = ILIM_500mA;
+    chgAutoStp = true;
+    chgAutoReSta = true;
+    batReChg = BAT_RECHG_120mV;
+    batReg = BAT_REG_4200mV;
+    chgEn = true;
+    vPChg = VPCHG_3000mV;
+    iPChg = IPCHG_10;
+    chgDone = CHGDONE_10;
+    mtChgTmr = MTCHGTMR_0min;
+    fChgTmr = FCHGTMR_300min;
+    pChgTmr = PCHGTMR_60min;
+    buck1Md = BUCK_BURST;
+    buck1Ind = 0;
+    buck2Md = BUCK_BURST;
+    buck2Ind = 0;
+    ldo2Mode = LDO_DISABLED;
+    ldo2Millivolts = 3200;
+    ldo3Mode = LDO_DISABLED;
+    ldo3Millivolts = 3000;
+    thrmCfg = THRM_ENABLED;
+    monRatio = MON_DIV4;
+    monCfg = MON_PULLDOWN;
+    buck2ActDsc = false;
+    buck2FFET = false;
+    buck1ActDsc = false;
+    buck1FFET = false;
+    pfnResEna = true;
+    stayOn = true;
 }
 
 //******************************************************************************
-int MAX14690::boostSetVoltage(int mV)
+int MAX14690::ldo2SetMode(ldoMode_t mode)
 {
+    ldo2Mode = mode;
+    return writeReg(REG_LDO2_CFG, mode);
+}
+
+//******************************************************************************
+int MAX14690::ldo2SetVoltage(int mV)
+{
+    int regBits = mv2bits(mV);
     char data;
 
-    if ((MAX14690_BOOST_MIN_MV <= mV) && (mV <= MAX14690_BOOST_MAX_MV)) {
-        boostMillivolts = mV;
-        data = (mV - MAX14690_BOOST_MIN_MV) / MAX14690_BOOST_STEP_MV;
+    if (regBits < 0) {
+        return MAX14690_ERROR;
     } else {
-        return MAX14690_ERROR;
+        data = regBits;
     }
 
-    if (boostEn == BOOST_ENABLED) {
-        if (writeReg(REG_BOOST_CFG, 0x00) != MAX14690_NO_ERROR) {
+    if (ldo2Mode == LDO_ENABLED) {
+        if (writeReg(REG_LDO2_CFG, LDO_DISABLED) != MAX14690_NO_ERROR) {
             return MAX14690_ERROR;
         }
     }
 
-    if (writeReg(REG_BOOST_VSET, data) != MAX14690_NO_ERROR) {
+    if (writeReg(REG_LDO2_VSET, data) != MAX14690_NO_ERROR) {
         return MAX14690_ERROR;
     }
 
-    if (boostEn == BOOST_ENABLED) {
-        data = (boostEn << 3) | (boostEMI << 1) | (boostInd);
-        if (writeReg(REG_BOOST_CFG, data) != MAX14690_NO_ERROR) {
+    if (ldo2Mode == LDO_ENABLED) {
+        if (writeReg(REG_LDO2_CFG, LDO_ENABLED) != MAX14690_NO_ERROR) {
+            return MAX14690_ERROR;
+        }
+    }
+
+    return MAX14690_NO_ERROR;
+}
+
+//******************************************************************************
+int MAX14690::ldo3SetMode(ldoMode_t mode)
+{
+    ldo3Mode = mode;
+    return writeReg(REG_LDO3_CFG, mode);
+}
+
+//******************************************************************************
+int MAX14690::ldo3SetVoltage(int mV)
+{
+    int regBits = mv2bits(mV);
+    char data;
+
+    if (regBits < 0) {
+        return MAX14690_ERROR;
+    } else {
+        data = regBits;
+    }
+
+    if (ldo3Mode == LDO_ENABLED) {
+        if (writeReg(REG_LDO3_CFG, LDO_DISABLED) != MAX14690_NO_ERROR) {
+            return MAX14690_ERROR;
+        }
+    }
+
+    if (writeReg(REG_LDO3_VSET, data) != MAX14690_NO_ERROR) {
+        return MAX14690_ERROR;
+    }
+
+    if (ldo3Mode == LDO_ENABLED) {
+        if (writeReg(REG_LDO3_CFG, LDO_ENABLED) != MAX14690_NO_ERROR) {
             return MAX14690_ERROR;
         }
     }
@@ -143,52 +182,132 @@
 //******************************************************************************
 int MAX14690::init()
 {
+    int regBits;
     char data;
 
-    data = (clkDivEn << 7) | (clkDivSet);
-    if (writeReg(REG_BOOST_CDIV, data) != MAX14690_NO_ERROR) {
+    // Configure buck regulators
+    data = (buck1Md << 1) |
+           (buck1Ind);
+    if (writeReg(REG_BUCK1_CFG, data) != MAX14690_NO_ERROR) {
+        return MAX14690_ERROR;
+    }
+    data = (buck2Md << 1) |
+           (buck2Ind);
+    if (writeReg(REG_BUCK2_CFG, data) != MAX14690_NO_ERROR) {
+        return MAX14690_ERROR;
+    }
+    data = (buck2ActDsc << 5) |
+           (buck2FFET << 4) |
+           (buck1ActDsc << 1) |
+           (buck1FFET);
+    if (writeReg(REG_BUCK_EXTRA, data) != MAX14690_NO_ERROR) {
         return MAX14690_ERROR;
     }
 
-    data = (boostISet);
-    if (writeReg(REG_BOOST_ISET, data) != MAX14690_NO_ERROR) {
+    // Configure Charger
+    data = (iLimCntl);
+    if (writeReg(REG_I_LIM_CNTL, data) != MAX14690_NO_ERROR) {
+        return MAX14690_ERROR;
+    }
+    data = (vPChg << 4) |
+           (iPChg << 2) |
+           (chgDone);
+    if (writeReg(REG_CHG_CNTL_B, data) != MAX14690_NO_ERROR) {
+        return MAX14690_ERROR;
+    }
+    data = (mtChgTmr << 4) |
+           (fChgTmr << 2) |
+           (pChgTmr);
+    if (writeReg(REG_CHG_TMR, data) != MAX14690_NO_ERROR) {
+        return MAX14690_ERROR;
+    }
+    data = (thrmCfg);
+    if (writeReg(REG_THRM_CFG, data) != MAX14690_NO_ERROR) {
+        return MAX14690_ERROR;
+    }
+    // Set enable bit after setting other charger bits
+    data = (chgAutoStp << 7) |
+           (chgAutoReSta << 6) |
+           (batReChg << 4) |
+           (batReg << 1) |
+           (chgEn);
+    if (writeReg(REG_CHG_CNTL_A, data) != MAX14690_NO_ERROR) {
         return MAX14690_ERROR;
     }
 
-    if ((MAX14690_BOOST_MIN_MV <= boostMillivolts) &&
-        (boostMillivolts <= MAX14690_BOOST_MAX_MV)) {
-        data = (boostMillivolts - MAX14690_BOOST_MIN_MV) / MAX14690_BOOST_STEP_MV;
-        if (writeReg(REG_BOOST_VSET, data) != MAX14690_NO_ERROR) {
-            return MAX14690_ERROR;
-        }
-    } else {
+    // Configure monitor multiplexer
+    data = (monRatio << 4) |
+           (monCfg);
+    if (writeReg(REG_MON_CFG, data) != MAX14690_NO_ERROR) {
         return MAX14690_ERROR;
     }
 
-    data = (buckMd << 1) | (buckFst);
-    if (writeReg(REG_BUCK_CFG, data) != MAX14690_NO_ERROR) {
+    // Configure and enable LDOs
+    regBits = mv2bits(ldo2Millivolts);
+    if (regBits < 0) {
+        return MAX14690_ERROR;
+    } else {
+        data = regBits;
+    }
+    if (writeReg(REG_LDO2_VSET, data) != MAX14690_NO_ERROR) {
+        return MAX14690_ERROR;
+    }
+    data = (ldo2Mode);
+    if (writeReg(REG_LDO2_CFG, data) != MAX14690_NO_ERROR) {
+        return MAX14690_ERROR;
+    }
+    regBits = mv2bits(ldo3Millivolts);
+    if (regBits < 0) {
+        return MAX14690_ERROR;
+    } else {
+        data = regBits;
+    }
+    if (writeReg(REG_LDO3_VSET, data) != MAX14690_NO_ERROR) {
+        return MAX14690_ERROR;
+    }
+    data = (ldo3Mode);
+    if (writeReg(REG_LDO3_CFG, data) != MAX14690_NO_ERROR) {
+        return MAX14690_ERROR;
+    }
+    
+    // Set stayOn bit after other registers to confirm successful boot.
+    data = (pfnResEna << 7) |
+           (stayOn);
+    if (writeReg(REG_PWR_CFG, data) != MAX14690_NO_ERROR) {
         return MAX14690_ERROR;
     }
 
-    data = (boostHysOff << 7) | (boostPasDsc << 6) | (boostActDsc << 5) |
-           (buckPasDsc << 2) | (buckActDsc << 1) | (buckFScl);
-    if (writeReg(REG_BBB_EXTRA, data) != MAX14690_NO_ERROR) {
+    // Unmask Interrupts Last
+    data = (intEnThermStatus << 7) |
+           (intEnChgStatus << 6) |
+           (intEnILim << 5) |
+           (intEnUSBOVP << 4) |
+           (intEnUSBOK << 3) |
+           (intEnChgThmSD << 2) |
+           (intEnThermReg << 1) |
+           (intEnChgTimeOut);
+    if (writeReg(REG_INT_MASK_A, data) != MAX14690_NO_ERROR) {
         return MAX14690_ERROR;
     }
-
-    // Write Boost Enable Register Last
-    data = (boostEn << 3) | (boostEMI << 1) | (boostInd);
-    if (writeReg(REG_BOOST_CFG, data) != MAX14690_NO_ERROR) {
+    data = (intEnThermBuck1 << 4) |
+           (intEnThermBuck2 << 3) |
+           (intEnThermLDO1 << 2) |
+           (intEnThermLDO2 << 1) |
+           (intEnThermLDO3);
+    if (writeReg(REG_INT_MASK_B, data) != MAX14690_NO_ERROR) {
         return MAX14690_ERROR;
     }
-
+    
     return MAX14690_NO_ERROR;
 }
 
 //******************************************************************************
-int MAX14690::monSet(monCfg_t monCfg)
+int MAX14690::monSet(monCfg_t newMonCfg, monRatio_t newMonRatio)
 {
-    return writeReg(REG_MON_CFG, monCfg);
+    char data = (newMonRatio << 4) | (newMonCfg);
+    monCfg = newMonCfg;
+    monRatio = newMonRatio;
+    return writeReg(REG_MON_CFG, data);
 }
 
 //******************************************************************************
@@ -203,7 +322,7 @@
 {
     char cmdData[2] = { (char)reg, value };
 
-    if (i2c->write(slaveAddress, cmdData, sizeof(cmdData)) != 0) {
+    if (i2c->write(MAX14690_I2C_ADDR, cmdData, sizeof(cmdData)) != 0) {
         return MAX14690_ERROR;
     }
 
@@ -215,13 +334,27 @@
 {
     char cmdData[1] = { (char)reg };
 
-    if (i2c->write(slaveAddress, cmdData, sizeof(cmdData)) != 0) {
+    if (i2c->write(MAX14690_I2C_ADDR, cmdData, sizeof(cmdData)) != 0) {
         return MAX14690_ERROR;
     }
 
-    if (i2c->read(slaveAddress, value, 1) != 0) {
+    if (i2c->read(MAX14690_I2C_ADDR, value, 1) != 0) {
         return MAX14690_ERROR;
     }
 
     return MAX14690_NO_ERROR;
 }
+
+//******************************************************************************
+int MAX14690::mv2bits(int mV)
+{
+    int regBits;
+
+    if ((MAX14690_LDO_MIN_MV <= mV) && (mV <= MAX14690_LDO_MAX_MV)) {
+        regBits = (mV - MAX14690_LDO_MIN_MV) / MAX14690_LDO_STEP_MV;
+    } else {
+        return -1;
+    }
+
+    return regBits;
+}