Library for I2C communication with LiPo battery fuel gauge to measure battery level.
Dependents: MAX1704X_example_app
Diff: MAX1704X.cpp
- Revision:
- 0:b3b7aff20a1d
- Child:
- 1:b2d54467330d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MAX1704X.cpp Mon Oct 09 12:52:15 2017 +0000 @@ -0,0 +1,168 @@ +/* MAX1704X Simple Driver Library + * Copyright (c) 2017 Mac Lobdell + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +//todo: configure pin interrupt on battery level alert + +#include "MAX1704X.h" + +MAX1704X::MAX1704X(PinName sda, PinName scl, Address addr, int hz) : m_I2C(sda, scl), m_ADDR((int)addr) +{ + //Set the I2C bus frequency + m_I2C.frequency(hz); + + write16(REG_CONFIG_H,0x9700); //set alert to 32% + +} + +bool MAX1704X::open() +{ + //Probe for the I2C Device using a Zero Length Transfer + if (!m_I2C.write(m_ADDR, NULL, 0)) { + //Return success + return true; + } else { + //Return failure + return false; + } +} + +uint32_t MAX1704X::read_ad() +{ + char xm, xl; + uint32_t temp, xo; + + xm = read8(REG_VCELL_H); //high byte + xl = read8(REG_VCELL_L); //low byte + + temp = (xl|(xm << 8)); + //alternatively can read16 + //xo = read16(REG_VCELL_H); //does this work? + + xo = 1.25* (temp >>4); + + //returns A/D value in mV + return xo; + +} + +uint16_t MAX1704X::read_config() +{ + char xm, xl; + uint16_t xo; + + xm = read8(REG_CONFIG_H); //high byte + xl = read8(REG_CONFIG_L); //low byte + + xo = xl|(xm << 8); + + //alternatively can read16 +// xo = read16(REG_CONFIG_H); //does this work? + + return xo; +} + +uint32_t MAX1704X::read_percent() +{ + char xm, xl; + uint32_t xo; + + xm = read8(REG_SOC_H); //high byte + xl = read8(REG_SOC_L); //low byte + + xo = (xl|(xm << 8)); + + //alternatively can read16 +// xo = read16(REG_SOC_H); //does this work? + + //percent_decimal = (0.003906)*xl + xm; + + //returns percent + return xo; + +} + + void MAX1704X::power_on_reset(void) + { + + write8(REG_COMMAND_H, 0x54); + write8(REG_COMMAND_L, 0x00); + + //alternatively can write16 + //write16(REG_COMMAND_H, 0x5400); //does this work? + + } +/* +//#ifdef MBED_OPERATORS //this no longer be needed? +MAX1704X::operator uint32_t() +{ + //Return the current battery percentage + return read_percent(); +} +//#endif +*/ +char MAX1704X::read8(char reg) +{ + //Select the register + m_I2C.write(m_ADDR, ®, 1, true); + + //Read the 8-bit register + m_I2C.read(m_ADDR, ®, 1); + + //Return the byte + return reg; +} + +void MAX1704X::write8(char reg, char data) +{ + //Create a temporary buffer + char buff[2]; + + //Load the register address and 8-bit data + buff[0] = reg; + buff[1] = data; + + //Write the data + m_I2C.write(m_ADDR, buff, 2); +} + +uint16_t MAX1704X::read16(char reg) +{ + //Create a temporary buffer + char buff[2]; + + //Select the register + m_I2C.write(m_ADDR, ®, 1, true); + + //Read the 16-bit register + m_I2C.read(m_ADDR, buff, 2); + + //Return the combined 16-bit value + return (buff[0] << 8) | buff[1]; +} + +void MAX1704X::write16(char reg, uint16_t data) +{ + //Create a temporary buffer + char buff[3]; + + //Load the register address and 16-bit data + buff[0] = reg; + buff[1] = data >> 8; + buff[2] = data; + + //Write the data + m_I2C.write(m_ADDR, buff, 3); +}