MAX77650 Driver

Dependents:   MAX32620FTHR_Pmic MAX32620FTHR_Pmic_Boot MAX32620FTHR_GPS_Tracker

Fork of MAX77650 by Jesse Marroquin

Committer:
jessexm
Date:
Tue Apr 24 20:09:13 2018 +0000
Revision:
0:d29ae4cd4af7
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jessexm 0:d29ae4cd4af7 1 /*******************************************************************************
jessexm 0:d29ae4cd4af7 2 * Copyright (C) 2018 Maxim Integrated Products, Inc., All Rights Reserved.
jessexm 0:d29ae4cd4af7 3 *
jessexm 0:d29ae4cd4af7 4 * Permission is hereby granted, free of charge, to any person obtaining a
jessexm 0:d29ae4cd4af7 5 * copy of this software and associated documentation files (the "Software"),
jessexm 0:d29ae4cd4af7 6 * to deal in the Software without restriction, including without limitation
jessexm 0:d29ae4cd4af7 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
jessexm 0:d29ae4cd4af7 8 * and/or sell copies of the Software, and to permit persons to whom the
jessexm 0:d29ae4cd4af7 9 * Software is furnished to do so, subject to the following conditions:
jessexm 0:d29ae4cd4af7 10 *
jessexm 0:d29ae4cd4af7 11 * The above copyright notice and this permission notice shall be included
jessexm 0:d29ae4cd4af7 12 * in all copies or substantial portions of the Software.
jessexm 0:d29ae4cd4af7 13 *
jessexm 0:d29ae4cd4af7 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
jessexm 0:d29ae4cd4af7 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
jessexm 0:d29ae4cd4af7 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
jessexm 0:d29ae4cd4af7 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
jessexm 0:d29ae4cd4af7 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
jessexm 0:d29ae4cd4af7 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
jessexm 0:d29ae4cd4af7 20 * OTHER DEALINGS IN THE SOFTWARE.
jessexm 0:d29ae4cd4af7 21 *
jessexm 0:d29ae4cd4af7 22 * Except as contained in this notice, the name of Maxim Integrated
jessexm 0:d29ae4cd4af7 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
jessexm 0:d29ae4cd4af7 24 * Products, Inc. Branding Policy.
jessexm 0:d29ae4cd4af7 25 *
jessexm 0:d29ae4cd4af7 26 * The mere transfer of this software does not imply any licenses
jessexm 0:d29ae4cd4af7 27 * of trade secrets, proprietary technology, copyrights, patents,
jessexm 0:d29ae4cd4af7 28 * trademarks, maskwork rights, or any other form of intellectual
jessexm 0:d29ae4cd4af7 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
jessexm 0:d29ae4cd4af7 30 * ownership rights.
jessexm 0:d29ae4cd4af7 31 *******************************************************************************
jessexm 0:d29ae4cd4af7 32 */
jessexm 0:d29ae4cd4af7 33
jessexm 0:d29ae4cd4af7 34 #ifndef _MAX77650_H_
jessexm 0:d29ae4cd4af7 35 #define _MAX77650_H_
jessexm 0:d29ae4cd4af7 36
jessexm 0:d29ae4cd4af7 37 #include "mbed.h"
jessexm 0:d29ae4cd4af7 38
jessexm 0:d29ae4cd4af7 39 #define MAX77650_NO_ERROR 0
jessexm 0:d29ae4cd4af7 40 #define MAX77650_ERROR -1
jessexm 0:d29ae4cd4af7 41
jessexm 0:d29ae4cd4af7 42 #define MAX77650_I2C_ADDRESS 0x90
jessexm 0:d29ae4cd4af7 43
jessexm 0:d29ae4cd4af7 44 #define MAX77650_CID 0x78
jessexm 0:d29ae4cd4af7 45
jessexm 0:d29ae4cd4af7 46 /**
jessexm 0:d29ae4cd4af7 47 * @brief MAX77650 Ultra-Low Power PMIC with 3-Output SIMO and Charger
jessexm 0:d29ae4cd4af7 48 *
jessexm 0:d29ae4cd4af7 49 * @details The MAX77650/MAX77651 provide highly-integrated battery
jessexm 0:d29ae4cd4af7 50 * charging and power supply solutions for low-power wearable applications
jessexm 0:d29ae4cd4af7 51 * where size and efficiency are critical.
jessexm 0:d29ae4cd4af7 52 * <br>https://www.maximintegrated.com/en/products/power/battery-management/MAX77650.html
jessexm 0:d29ae4cd4af7 53 *
jessexm 0:d29ae4cd4af7 54 * @code
jessexm 0:d29ae4cd4af7 55 * #include "mbed.h"
jessexm 0:d29ae4cd4af7 56 * #include "MAX77650.h"
jessexm 0:d29ae4cd4af7 57 *
jessexm 0:d29ae4cd4af7 58 * // Configure LED to rotate colors
jessexm 0:d29ae4cd4af7 59 * static const char ledRotate[] = {
jessexm 0:d29ae4cd4af7 60 * MAX77650::CNFG_LED0_A,
jessexm 0:d29ae4cd4af7 61 * 0x44, 0x44, 0x44,
jessexm 0:d29ae4cd4af7 62 * 0x17, 0x37, 0x77,
jessexm 0:d29ae4cd4af7 63 * 0x01,
jessexm 0:d29ae4cd4af7 64 * };
jessexm 0:d29ae4cd4af7 65 *
jessexm 0:d29ae4cd4af7 66 * I2C i2c2(I2C2_SDA, I2C2_SCL);
jessexm 0:d29ae4cd4af7 67 *
jessexm 0:d29ae4cd4af7 68 * MAX77650 max77650(i2c2);
jessexm 0:d29ae4cd4af7 69 *
jessexm 0:d29ae4cd4af7 70 * int main()
jessexm 0:d29ae4cd4af7 71 * {
jessexm 0:d29ae4cd4af7 72 * // Turn off Low-Dropout Linear Regulator
jessexm 0:d29ae4cd4af7 73 * max77650.disableLDO();
jessexm 0:d29ae4cd4af7 74 *
jessexm 0:d29ae4cd4af7 75 * // Set SBB supply 2 at 3.3V
jessexm 0:d29ae4cd4af7 76 * max77650.setSBB2Voltage(3.3f);
jessexm 0:d29ae4cd4af7 77 *
jessexm 0:d29ae4cd4af7 78 * // Configure LED current sinks
jessexm 0:d29ae4cd4af7 79 * max77650.writeReg(ledRotate, sizeof(ledRotate));
jessexm 0:d29ae4cd4af7 80 *
jessexm 0:d29ae4cd4af7 81 * while(1) ;
jessexm 0:d29ae4cd4af7 82 *
jessexm 0:d29ae4cd4af7 83 * }
jessexm 0:d29ae4cd4af7 84 * @endcode
jessexm 0:d29ae4cd4af7 85 */
jessexm 0:d29ae4cd4af7 86
jessexm 0:d29ae4cd4af7 87 class MAX77650
jessexm 0:d29ae4cd4af7 88 {
jessexm 0:d29ae4cd4af7 89 public:
jessexm 0:d29ae4cd4af7 90
jessexm 0:d29ae4cd4af7 91 /**
jessexm 0:d29ae4cd4af7 92 * @brief Register Addresses
jessexm 0:d29ae4cd4af7 93 * @details Enumerated MAX77650 register addresses
jessexm 0:d29ae4cd4af7 94 */
jessexm 0:d29ae4cd4af7 95 typedef enum {
jessexm 0:d29ae4cd4af7 96 CNFG_GLBL = 0x10, // Global Configuration
jessexm 0:d29ae4cd4af7 97 INT_GLBL = 0x00, // Interrupt Status
jessexm 0:d29ae4cd4af7 98 INTM_GLBL = 0x06, // Interrupt Mask
jessexm 0:d29ae4cd4af7 99 STAT_GLBL = 0x05, // Global Status
jessexm 0:d29ae4cd4af7 100 ERCFLAG = 0x04, // Flags
jessexm 0:d29ae4cd4af7 101 CNFG_GPIO = 0x12, // GPIO Configuration
jessexm 0:d29ae4cd4af7 102 CID = 0x11, // Chip Identification Code
jessexm 0:d29ae4cd4af7 103 INT_CHG = 0x01, // Charger Interrupt Status
jessexm 0:d29ae4cd4af7 104 INT_M_CHG = 0x07, // Charger Interrupt Mask
jessexm 0:d29ae4cd4af7 105 STAT_CHG_A = 0x02, // Charger Status A
jessexm 0:d29ae4cd4af7 106 STAT_CHG_B = 0x03, // Charger Status B
jessexm 0:d29ae4cd4af7 107 CNFG_CHG_A = 0x18, // Charger Configuration A
jessexm 0:d29ae4cd4af7 108 CNFG_CHG_B = 0x19, // Charger Configuration B
jessexm 0:d29ae4cd4af7 109 CNFG_CHG_C = 0x1A, // Charger Configuration C
jessexm 0:d29ae4cd4af7 110 CNFG_CHG_D = 0x1B, // Charger Configuration D
jessexm 0:d29ae4cd4af7 111 CNFG_CHG_E = 0x1C, // Charger Configuration E
jessexm 0:d29ae4cd4af7 112 CNFG_CHG_F = 0x1D, // Charger Configuration F
jessexm 0:d29ae4cd4af7 113 CNFG_CHG_G = 0x1E, // Charger Configuration G
jessexm 0:d29ae4cd4af7 114 CNFG_CHG_H = 0x1F, // Charger Configuration H
jessexm 0:d29ae4cd4af7 115 CNFG_CHG_I = 0x20, // Charger Configuration I
jessexm 0:d29ae4cd4af7 116 CNFG_LDO_A = 0x38, // LDO Configuration A
jessexm 0:d29ae4cd4af7 117 CNFG_LDO_B = 0x39, // LDO Configuration B
jessexm 0:d29ae4cd4af7 118 CNFG_SBB_TOP = 0x28, // SIMO Buck-Boost Configuration
jessexm 0:d29ae4cd4af7 119 CNFG_SBB0_A = 0x29, // SIMO Buck-Boost 0 Configuration A
jessexm 0:d29ae4cd4af7 120 CNFG_SBB0_B = 0x2A, // SIMO Buck-Boost 0 Configuration B
jessexm 0:d29ae4cd4af7 121 CNFG_SBB1_A = 0x2B, // SIMO Buck-Boost 1 Configuration A
jessexm 0:d29ae4cd4af7 122 CNFG_SBB1_B = 0x2C, // SIMO Buck-Boost 1 Configuration B
jessexm 0:d29ae4cd4af7 123 CNFG_SBB2_A = 0x2D, // SIMO Buck-Boost 2 Configuration A
jessexm 0:d29ae4cd4af7 124 CNFG_SBB2_B = 0x2E, // SIMO Buck-Boost 2 Configuration B
jessexm 0:d29ae4cd4af7 125 CNFG_LED0_A = 0x40, // LED 0 Configuration A
jessexm 0:d29ae4cd4af7 126 CNFG_LED0_B = 0x43, // LED 0 Configuration B
jessexm 0:d29ae4cd4af7 127 CNFG_LED1_A = 0x41, // LED 1 Configuration A
jessexm 0:d29ae4cd4af7 128 CNFG_LED1_B = 0x44, // LED 1 Configuration B
jessexm 0:d29ae4cd4af7 129 CNFG_LED2_A = 0x42, // LED 2 Configuration A
jessexm 0:d29ae4cd4af7 130 CNFG_LED2_B = 0x45, // LED 2 Configuration A
jessexm 0:d29ae4cd4af7 131 CNFG_LED_TOP = 0x46 // LED Configuration
jessexm 0:d29ae4cd4af7 132 } reg_t;
jessexm 0:d29ae4cd4af7 133
jessexm 0:d29ae4cd4af7 134 /**
jessexm 0:d29ae4cd4af7 135 * @brief Global Configuration settings
jessexm 0:d29ae4cd4af7 136 * @details Enumerated global configuration settings
jessexm 0:d29ae4cd4af7 137 */
jessexm 0:d29ae4cd4af7 138 typedef enum {
jessexm 0:d29ae4cd4af7 139 SBIA_LPM = 0x20,
jessexm 0:d29ae4cd4af7 140 SBIA_EN = 0x10,
jessexm 0:d29ae4cd4af7 141 NEN_PUSH = 0x00,
jessexm 0:d29ae4cd4af7 142 NEN_SLIDE = 0x08,
jessexm 0:d29ae4cd4af7 143 DBEN_100_US = 0x00,
jessexm 0:d29ae4cd4af7 144 DBEN_30_MS = 0x04,
jessexm 0:d29ae4cd4af7 145 SFT_OFF = 0x02,
jessexm 0:d29ae4cd4af7 146 SFT_CRST = 0x01,
jessexm 0:d29ae4cd4af7 147 } cnfg_gbl_t;
jessexm 0:d29ae4cd4af7 148
jessexm 0:d29ae4cd4af7 149 /**
jessexm 0:d29ae4cd4af7 150 * @brief Interrupt Enable Flags
jessexm 0:d29ae4cd4af7 151 * @details Enumerated interrupt enable flags
jessexm 0:d29ae4cd4af7 152 */
jessexm 0:d29ae4cd4af7 153 typedef enum {
jessexm 0:d29ae4cd4af7 154 DOD = 0x40,
jessexm 0:d29ae4cd4af7 155 TJAL_2 = 0x20,
jessexm 0:d29ae4cd4af7 156 TJAL_1 = 0x10,
jessexm 0:d29ae4cd4af7 157 NEN_RISE = 0x08,
jessexm 0:d29ae4cd4af7 158 NEN_FALL = 0x04,
jessexm 0:d29ae4cd4af7 159 GPI_RISE = 0x02,
jessexm 0:d29ae4cd4af7 160 GPI_FALL = 0x01,
jessexm 0:d29ae4cd4af7 161 } intm_glbl_t;
jessexm 0:d29ae4cd4af7 162
jessexm 0:d29ae4cd4af7 163 /**
jessexm 0:d29ae4cd4af7 164 * MAX77650 constructor.
jessexm 0:d29ae4cd4af7 165 *
jessexm 0:d29ae4cd4af7 166 * @param i2c I2C object to use.
jessexm 0:d29ae4cd4af7 167 * @param pwrHldPin Pin power hold input is connected to.
jessexm 0:d29ae4cd4af7 168 * @param slaveAddress Slave Address of the device.
jessexm 0:d29ae4cd4af7 169 */
jessexm 0:d29ae4cd4af7 170 MAX77650(I2C &i2c, PinName pwrHldPin = NC, int addr = MAX77650_I2C_ADDRESS);
jessexm 0:d29ae4cd4af7 171
jessexm 0:d29ae4cd4af7 172 /**
jessexm 0:d29ae4cd4af7 173 * MAX77650 destructor.
jessexm 0:d29ae4cd4af7 174 */
jessexm 0:d29ae4cd4af7 175 ~MAX77650();
jessexm 0:d29ae4cd4af7 176
jessexm 0:d29ae4cd4af7 177 /**
jessexm 0:d29ae4cd4af7 178 * @brief Read Register
jessexm 0:d29ae4cd4af7 179 * @details Reads from the specified register
jessexm 0:d29ae4cd4af7 180 * @param reg The register to be read
jessexm 0:d29ae4cd4af7 181 * @param val Pointer for where to store the data
jessexm 0:d29ae4cd4af7 182 * @returns 0 if no errors, -1 if error.
jessexm 0:d29ae4cd4af7 183 */
jessexm 0:d29ae4cd4af7 184 int readReg(reg_t reg, char *val);
jessexm 0:d29ae4cd4af7 185
jessexm 0:d29ae4cd4af7 186 /**
jessexm 0:d29ae4cd4af7 187 * @brief Write Register
jessexm 0:d29ae4cd4af7 188 * @details Writes the given value to the specified register.
jessexm 0:d29ae4cd4af7 189 * @param reg The register to be written
jessexm 0:d29ae4cd4af7 190 * @param val The data to be written
jessexm 0:d29ae4cd4af7 191 * @returns 0 if no errors, -1 if error.
jessexm 0:d29ae4cd4af7 192 */
jessexm 0:d29ae4cd4af7 193 int writeReg(reg_t reg, char val);
jessexm 0:d29ae4cd4af7 194
jessexm 0:d29ae4cd4af7 195 /**
jessexm 0:d29ae4cd4af7 196 * @brief Write Register
jessexm 0:d29ae4cd4af7 197 * @details Writes the given value(s) beginning with
jessexm 0:d29ae4cd4af7 198 * the register specified in the first buffer entry.
jessexm 0:d29ae4cd4af7 199 * @param buf The register and data to be written
jessexm 0:d29ae4cd4af7 200 * @param len The buffer length including starting register and data to be written
jessexm 0:d29ae4cd4af7 201 * @returns 0 if no errors, -1 if error.
jessexm 0:d29ae4cd4af7 202 */
jessexm 0:d29ae4cd4af7 203 int writeReg(const char *buf, int len);
jessexm 0:d29ae4cd4af7 204
jessexm 0:d29ae4cd4af7 205 /**
jessexm 0:d29ae4cd4af7 206 * @brief Read the CID
jessexm 0:d29ae4cd4af7 207 * @details Read and return Chip Identification Code register value
jessexm 0:d29ae4cd4af7 208 * @returns CID if no errors, -1 if error.
jessexm 0:d29ae4cd4af7 209 */
jessexm 0:d29ae4cd4af7 210 int cid(void);
jessexm 0:d29ae4cd4af7 211
jessexm 0:d29ae4cd4af7 212 /**
jessexm 0:d29ae4cd4af7 213 * @brief Enable LDO
jessexm 0:d29ae4cd4af7 214 * @details Enables LDO
jessexm 0:d29ae4cd4af7 215 * @returns 0 if no errors, -1 if error.
jessexm 0:d29ae4cd4af7 216 */
jessexm 0:d29ae4cd4af7 217 int enableLDO(void);
jessexm 0:d29ae4cd4af7 218
jessexm 0:d29ae4cd4af7 219 /**
jessexm 0:d29ae4cd4af7 220 * @brief Disable LDO
jessexm 0:d29ae4cd4af7 221 * @details Disables LDO
jessexm 0:d29ae4cd4af7 222 * @returns 0 if no errors, -1 if error.
jessexm 0:d29ae4cd4af7 223 */
jessexm 0:d29ae4cd4af7 224 int disableLDO(void);
jessexm 0:d29ae4cd4af7 225
jessexm 0:d29ae4cd4af7 226 /**
jessexm 0:d29ae4cd4af7 227 * @brief Set SBB 2 target voltage
jessexm 0:d29ae4cd4af7 228 * @details Select SBB 2 target output voltage.
jessexm 0:d29ae4cd4af7 229 * @param tv_mv The target voltage selection in milli-volts
jessexm 0:d29ae4cd4af7 230 * @returns 0 if no errors, -1 if error.
jessexm 0:d29ae4cd4af7 231 */
jessexm 0:d29ae4cd4af7 232 int setSBB2VoltageMV(uint32_t tv_mv);
jessexm 0:d29ae4cd4af7 233
jessexm 0:d29ae4cd4af7 234 /**
jessexm 0:d29ae4cd4af7 235 * @brief Set SBB 2 target voltage
jessexm 0:d29ae4cd4af7 236 * @details Select SBB 2 target output voltage.
jessexm 0:d29ae4cd4af7 237 * @param tv_v The target voltage selection in volts
jessexm 0:d29ae4cd4af7 238 * @returns 0 if no errors, -1 if error.
jessexm 0:d29ae4cd4af7 239 */
jessexm 0:d29ae4cd4af7 240 int setSBB2Voltage(float tv_v);
jessexm 0:d29ae4cd4af7 241
jessexm 0:d29ae4cd4af7 242 /**
jessexm 0:d29ae4cd4af7 243 * @brief Assert Power Hold input
jessexm 0:d29ae4cd4af7 244 * @details Asserts Power Hold input.
jessexm 0:d29ae4cd4af7 245 * @param pin The pin connected to Power Hold input
jessexm 0:d29ae4cd4af7 246 * @returns 0 if no errors, -1 if error.
jessexm 0:d29ae4cd4af7 247 */
jessexm 0:d29ae4cd4af7 248 void assertPowerHold(void);
jessexm 0:d29ae4cd4af7 249
jessexm 0:d29ae4cd4af7 250 /**
jessexm 0:d29ae4cd4af7 251 * @brief Deassert Power Hold input
jessexm 0:d29ae4cd4af7 252 * @details Deasserts Power Hold input.
jessexm 0:d29ae4cd4af7 253 * @param pin The pin connected to Power Hold input
jessexm 0:d29ae4cd4af7 254 * @returns 0 if no errors, -1 if error.
jessexm 0:d29ae4cd4af7 255 */
jessexm 0:d29ae4cd4af7 256 void deassertPowerHold(void);
jessexm 0:d29ae4cd4af7 257
jessexm 0:d29ae4cd4af7 258 private:
jessexm 0:d29ae4cd4af7 259 I2C &i2c;
jessexm 0:d29ae4cd4af7 260 int devAddr;
jessexm 0:d29ae4cd4af7 261 DigitalOut *pwrHld;
jessexm 0:d29ae4cd4af7 262 };
jessexm 0:d29ae4cd4af7 263
jessexm 0:d29ae4cd4af7 264 #endif