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