Fork of MAX14690 library
Fork of MAX14690 by
Diff: MAX14690.cpp
- Revision:
- 10:32c7e2ab67aa
- Parent:
- 9:8fb54367ceb5
- Child:
- 13:dff55b34fe1f
diff -r 8fb54367ceb5 -r 32c7e2ab67aa MAX14690.cpp --- 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; +}