The MAX20303 is a highly integrated and programmable power management solution designed for ultra-low-power wearable applications.

Dependents:   MAX20303_Wearable_PMIC_Activity_Tracker MAX20303_Wearable_PMIC_Activity_Tracker

MAX20303 Wearable PMIC

MAX20303 Product Page

Committer:
Emre.Eken
Date:
Wed Apr 25 09:52:48 2018 +0300
Revision:
1:0333f77c665f
Parent:
0:ff4818eff240
The contents of the .cpp and .h files were changed

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Emre.Eken 1:0333f77c665f 1 /*******************************************************************************
Emre.Eken 1:0333f77c665f 2 * Copyright (C) 2018 Maxim Integrated Products, Inc., All Rights Reserved.
Emre.Eken 1:0333f77c665f 3 *
Emre.Eken 1:0333f77c665f 4 * Permission is hereby granted, free of charge, to any person obtaining a
Emre.Eken 1:0333f77c665f 5 * copy of this software and associated documentation files (the "Software"),
Emre.Eken 1:0333f77c665f 6 * to deal in the Software without restriction, including without limitation
Emre.Eken 1:0333f77c665f 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
Emre.Eken 1:0333f77c665f 8 * and/or sell copies of the Software, and to permit persons to whom the
Emre.Eken 1:0333f77c665f 9 * Software is furnished to do so, subject to the following conditions:
Emre.Eken 1:0333f77c665f 10 *
Emre.Eken 1:0333f77c665f 11 * The above copyright notice and this permission notice shall be included
Emre.Eken 1:0333f77c665f 12 * in all copies or substantial portions of the Software.
Emre.Eken 1:0333f77c665f 13 *
Emre.Eken 1:0333f77c665f 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
Emre.Eken 1:0333f77c665f 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Emre.Eken 1:0333f77c665f 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
Emre.Eken 1:0333f77c665f 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
Emre.Eken 1:0333f77c665f 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
Emre.Eken 1:0333f77c665f 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
Emre.Eken 1:0333f77c665f 20 * OTHER DEALINGS IN THE SOFTWARE.
Emre.Eken 1:0333f77c665f 21 *
Emre.Eken 1:0333f77c665f 22 * Except as contained in this notice, the name of Maxim Integrated
Emre.Eken 1:0333f77c665f 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
Emre.Eken 1:0333f77c665f 24 * Products, Inc. Branding Policy.
Emre.Eken 1:0333f77c665f 25 *
Emre.Eken 1:0333f77c665f 26 * The mere transfer of this software does not imply any licenses
Emre.Eken 1:0333f77c665f 27 * of trade secrets, proprietary technology, copyrights, patents,
Emre.Eken 1:0333f77c665f 28 * trademarks, maskwork rights, or any other form of intellectual
Emre.Eken 1:0333f77c665f 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
Emre.Eken 1:0333f77c665f 30 * ownership rights.
Emre.Eken 1:0333f77c665f 31 *******************************************************************************
Emre.Eken 1:0333f77c665f 32 */
Emre.Eken 1:0333f77c665f 33
Emre.Eken 1:0333f77c665f 34
Emre.Eken 1:0333f77c665f 35 #include "MAX20303.h"
Emre.Eken 1:0333f77c665f 36
Emre.Eken 1:0333f77c665f 37
Emre.Eken 1:0333f77c665f 38 //******************************************************************************
Emre.Eken 1:0333f77c665f 39 MAX20303::MAX20303(I2C *i2c):
Emre.Eken 1:0333f77c665f 40 m_i2c(i2c), m_writeAddress(MAX20303_SLAVE_WR_ADDR),
Emre.Eken 1:0333f77c665f 41 m_readAddress(MAX20303_SLAVE_RD_ADDR)
Emre.Eken 1:0333f77c665f 42 {
Emre.Eken 1:0333f77c665f 43 }
Emre.Eken 1:0333f77c665f 44
Emre.Eken 1:0333f77c665f 45
Emre.Eken 1:0333f77c665f 46 //******************************************************************************
Emre.Eken 1:0333f77c665f 47 MAX20303::~MAX20303(void)
Emre.Eken 1:0333f77c665f 48 {
Emre.Eken 1:0333f77c665f 49 //empty block
Emre.Eken 1:0333f77c665f 50 }
Emre.Eken 1:0333f77c665f 51
Emre.Eken 1:0333f77c665f 52
Emre.Eken 1:0333f77c665f 53 //******************************************************************************
Emre.Eken 1:0333f77c665f 54 int MAX20303::LDO1Config()
Emre.Eken 1:0333f77c665f 55 {
Emre.Eken 1:0333f77c665f 56 int32_t ret = 0;
Emre.Eken 1:0333f77c665f 57 uint8_t val;
Emre.Eken 1:0333f77c665f 58 appcmdoutvalue_ = 0x40;
Emre.Eken 1:0333f77c665f 59 appdatainoutbuffer_[0] = 0x05;
Emre.Eken 1:0333f77c665f 60 appdatainoutbuffer_[1] = 0x34;
Emre.Eken 1:0333f77c665f 61 AppWrite(2);
Emre.Eken 1:0333f77c665f 62
Emre.Eken 1:0333f77c665f 63 return ret;
Emre.Eken 1:0333f77c665f 64 }
Emre.Eken 1:0333f77c665f 65
Emre.Eken 1:0333f77c665f 66 //******************************************************************************
Emre.Eken 1:0333f77c665f 67 int MAX20303::writeReg(registers_t reg, uint8_t value)
Emre.Eken 1:0333f77c665f 68 {
Emre.Eken 1:0333f77c665f 69 int32_t ret;
Emre.Eken 1:0333f77c665f 70
Emre.Eken 1:0333f77c665f 71 char cmdData[2] = {reg, value};
Emre.Eken 1:0333f77c665f 72
Emre.Eken 1:0333f77c665f 73 ret = m_i2c->write(m_writeAddress, cmdData, sizeof(cmdData));
Emre.Eken 1:0333f77c665f 74
Emre.Eken 1:0333f77c665f 75 if (ret != 0)
Emre.Eken 1:0333f77c665f 76 return MAX20303_ERROR;
Emre.Eken 1:0333f77c665f 77
Emre.Eken 1:0333f77c665f 78 return MAX20303_NO_ERROR;
Emre.Eken 1:0333f77c665f 79 }
Emre.Eken 1:0333f77c665f 80
Emre.Eken 1:0333f77c665f 81
Emre.Eken 1:0333f77c665f 82 //******************************************************************************
Emre.Eken 1:0333f77c665f 83 int MAX20303::readReg(registers_t reg, uint8_t &value)
Emre.Eken 1:0333f77c665f 84 {
Emre.Eken 1:0333f77c665f 85 int32_t ret;
Emre.Eken 1:0333f77c665f 86
Emre.Eken 1:0333f77c665f 87 char data = reg;
Emre.Eken 1:0333f77c665f 88
Emre.Eken 1:0333f77c665f 89 ret = m_i2c->write(m_writeAddress, &data, sizeof(data));
Emre.Eken 1:0333f77c665f 90 if (ret != 0) {
Emre.Eken 1:0333f77c665f 91 printf("%s - failed - ret: %d\n", __func__);
Emre.Eken 1:0333f77c665f 92 return MAX20303_ERROR;
Emre.Eken 1:0333f77c665f 93 }
Emre.Eken 1:0333f77c665f 94
Emre.Eken 1:0333f77c665f 95 ret = m_i2c->read(m_readAddress, &data, sizeof(data));
Emre.Eken 1:0333f77c665f 96 if (ret != 0) {
Emre.Eken 1:0333f77c665f 97 printf("%s - failed - ret: %d\n", __func__);
Emre.Eken 1:0333f77c665f 98 return MAX20303_ERROR;
Emre.Eken 1:0333f77c665f 99 }
Emre.Eken 1:0333f77c665f 100
Emre.Eken 1:0333f77c665f 101 value = data;
Emre.Eken 1:0333f77c665f 102 printf("MAX20303 read reg[0x%X]=0x%X, ret=%d\r\n", (uint32_t)reg, value, ret);
Emre.Eken 1:0333f77c665f 103 return MAX20303_NO_ERROR;
Emre.Eken 1:0333f77c665f 104 }
Emre.Eken 1:0333f77c665f 105
Emre.Eken 1:0333f77c665f 106 //******************************************************************************
Emre.Eken 1:0333f77c665f 107 int MAX20303::readRegMulti(registers_t reg, uint8_t *value, uint8_t len){
Emre.Eken 1:0333f77c665f 108 int32_t ret;
Emre.Eken 1:0333f77c665f 109 char data = reg;
Emre.Eken 1:0333f77c665f 110
Emre.Eken 1:0333f77c665f 111 ret = m_i2c->write(m_writeAddress, &data, sizeof(data));
Emre.Eken 1:0333f77c665f 112 if (ret != 0) {
Emre.Eken 1:0333f77c665f 113 printf("%s - failed - ret: %d\n", __func__);
Emre.Eken 1:0333f77c665f 114 return MAX20303_ERROR;
Emre.Eken 1:0333f77c665f 115 }
Emre.Eken 1:0333f77c665f 116
Emre.Eken 1:0333f77c665f 117 ret = m_i2c->read(m_readAddress, (char *)value, len);
Emre.Eken 1:0333f77c665f 118 if (ret != 0) {
Emre.Eken 1:0333f77c665f 119 printf("%s - failed - ret: %d\n", __func__);
Emre.Eken 1:0333f77c665f 120 return MAX20303_ERROR;
Emre.Eken 1:0333f77c665f 121 }
Emre.Eken 1:0333f77c665f 122
Emre.Eken 1:0333f77c665f 123 printf("MAX20303 read reg[0x%X]=0x%X, ret=%d\r\n", (uint32_t)reg, value, ret);
Emre.Eken 1:0333f77c665f 124 return MAX20303_NO_ERROR;
Emre.Eken 1:0333f77c665f 125 }
Emre.Eken 1:0333f77c665f 126
Emre.Eken 1:0333f77c665f 127 //******************************************************************************
Emre.Eken 1:0333f77c665f 128 int MAX20303::writeRegMulti(registers_t reg, uint8_t *value, uint8_t len){
Emre.Eken 1:0333f77c665f 129 int32_t ret;
Emre.Eken 1:0333f77c665f 130 i2cbuffer_[0] = reg;
Emre.Eken 1:0333f77c665f 131 memcpy(&i2cbuffer_[1], value, len);
Emre.Eken 1:0333f77c665f 132
Emre.Eken 1:0333f77c665f 133 ret = m_i2c->write(m_writeAddress, (char *)i2cbuffer_, (len+1));
Emre.Eken 1:0333f77c665f 134
Emre.Eken 1:0333f77c665f 135 if (ret != 0)
Emre.Eken 1:0333f77c665f 136 return MAX20303_ERROR;
Emre.Eken 1:0333f77c665f 137
Emre.Eken 1:0333f77c665f 138 return MAX20303_NO_ERROR;
Emre.Eken 1:0333f77c665f 139 }
Emre.Eken 1:0333f77c665f 140 //******************************************************************************
Emre.Eken 1:0333f77c665f 141 int MAX20303::mv2bits(int mV)
Emre.Eken 1:0333f77c665f 142 {
Emre.Eken 1:0333f77c665f 143 int regBits;
Emre.Eken 1:0333f77c665f 144
Emre.Eken 1:0333f77c665f 145 if (( MAX20303_LDO_MIN_MV <= mV) && (mV <= MAX20303_LDO_MAX_MV)) {
Emre.Eken 1:0333f77c665f 146 regBits = (mV - MAX20303_LDO_MIN_MV) / MAX20303_LDO_STEP_MV;
Emre.Eken 1:0333f77c665f 147 } else {
Emre.Eken 1:0333f77c665f 148 return -1;
Emre.Eken 1:0333f77c665f 149 }
Emre.Eken 1:0333f77c665f 150
Emre.Eken 1:0333f77c665f 151 return regBits;
Emre.Eken 1:0333f77c665f 152 }
Emre.Eken 1:0333f77c665f 153 //******************************************************************************
Emre.Eken 1:0333f77c665f 154 int MAX20303::PowerOffthePMIC(){
Emre.Eken 1:0333f77c665f 155 int ret;
Emre.Eken 1:0333f77c665f 156 appdatainoutbuffer_[0] = 0xB2;
Emre.Eken 1:0333f77c665f 157 appcmdoutvalue_ = 0x80;
Emre.Eken 1:0333f77c665f 158 ret = AppWrite(1);
Emre.Eken 1:0333f77c665f 159
Emre.Eken 1:0333f77c665f 160 if(appcmdoutvalue_ != 0x80){
Emre.Eken 1:0333f77c665f 161 ret |= MAX20303_ERROR;
Emre.Eken 1:0333f77c665f 162 }
Emre.Eken 1:0333f77c665f 163
Emre.Eken 1:0333f77c665f 164 return ret;
Emre.Eken 1:0333f77c665f 165 }
Emre.Eken 1:0333f77c665f 166 //******************************************************************************
Emre.Eken 1:0333f77c665f 167 int MAX20303::SoftResetthePMIC(){
Emre.Eken 1:0333f77c665f 168 int ret;
Emre.Eken 1:0333f77c665f 169 appdatainoutbuffer_[0] = 0xB3;
Emre.Eken 1:0333f77c665f 170 appcmdoutvalue_ = 0x81;
Emre.Eken 1:0333f77c665f 171 ret = AppWrite(1);
Emre.Eken 1:0333f77c665f 172
Emre.Eken 1:0333f77c665f 173 if(appcmdoutvalue_ != 0x81){
Emre.Eken 1:0333f77c665f 174 ret |= MAX20303_ERROR;
Emre.Eken 1:0333f77c665f 175 }
Emre.Eken 1:0333f77c665f 176
Emre.Eken 1:0333f77c665f 177 return ret;
Emre.Eken 1:0333f77c665f 178 }
Emre.Eken 1:0333f77c665f 179 //******************************************************************************
Emre.Eken 1:0333f77c665f 180 int MAX20303::HardResetthePMIC(){
Emre.Eken 1:0333f77c665f 181 int ret;
Emre.Eken 1:0333f77c665f 182 appdatainoutbuffer_[0] = 0xB4;
Emre.Eken 1:0333f77c665f 183 appcmdoutvalue_ = 0x82;
Emre.Eken 1:0333f77c665f 184 ret = AppWrite(1);
Emre.Eken 1:0333f77c665f 185
Emre.Eken 1:0333f77c665f 186 if(appcmdoutvalue_ != 0x82){
Emre.Eken 1:0333f77c665f 187 ret |= MAX20303_ERROR;
Emre.Eken 1:0333f77c665f 188 }
Emre.Eken 1:0333f77c665f 189
Emre.Eken 1:0333f77c665f 190 return ret;
Emre.Eken 1:0333f77c665f 191 }
Emre.Eken 1:0333f77c665f 192
Emre.Eken 1:0333f77c665f 193 //******************************************************************************
Emre.Eken 1:0333f77c665f 194 int MAX20303::AppWrite(uint8_t dataoutlen){
Emre.Eken 1:0333f77c665f 195 int ret;
Emre.Eken 1:0333f77c665f 196
Emre.Eken 1:0333f77c665f 197 ret = writeRegMulti(MAX20303::REG_AP_DATOUT0, appdatainoutbuffer_, dataoutlen);
Emre.Eken 1:0333f77c665f 198 ret |= writeReg(MAX20303::REG_AP_CMDOUT, appcmdoutvalue_);
Emre.Eken 1:0333f77c665f 199 wait_ms(10);
Emre.Eken 1:0333f77c665f 200 ret |= readReg(MAX20303::REG_AP_RESPONSE, appcmdoutvalue_);
Emre.Eken 1:0333f77c665f 201
Emre.Eken 1:0333f77c665f 202 if(ret != 0)
Emre.Eken 1:0333f77c665f 203 return MAX20303_ERROR;
Emre.Eken 1:0333f77c665f 204
Emre.Eken 1:0333f77c665f 205 return MAX20303_NO_ERROR;
Emre.Eken 1:0333f77c665f 206 }
Emre.Eken 1:0333f77c665f 207
Emre.Eken 1:0333f77c665f 208
Emre.Eken 1:0333f77c665f 209 //******************************************************************************
Emre.Eken 1:0333f77c665f 210 int MAX20303::AppRead(uint8_t datainlen){
Emre.Eken 1:0333f77c665f 211 int ret;
Emre.Eken 1:0333f77c665f 212
Emre.Eken 1:0333f77c665f 213 ret = writeReg(MAX20303::REG_AP_CMDOUT, appcmdoutvalue_);
Emre.Eken 1:0333f77c665f 214 wait_ms(10);
Emre.Eken 1:0333f77c665f 215 ret |= readRegMulti(MAX20303::REG_AP_RESPONSE, i2cbuffer_, datainlen);
Emre.Eken 1:0333f77c665f 216 if(ret != 0)
Emre.Eken 1:0333f77c665f 217 return MAX20303_ERROR;
Emre.Eken 1:0333f77c665f 218
Emre.Eken 1:0333f77c665f 219 return MAX20303_NO_ERROR;
Emre.Eken 1:0333f77c665f 220 }
Emre.Eken 1:0333f77c665f 221
Emre.Eken 1:0333f77c665f 222 //******************************************************************************
Emre.Eken 1:0333f77c665f 223 char MAX20303::CheckPMICHWID(){
Emre.Eken 1:0333f77c665f 224 int ret;
Emre.Eken 1:0333f77c665f 225 uint8_t value = 0x00;
Emre.Eken 1:0333f77c665f 226
Emre.Eken 1:0333f77c665f 227 ret = readReg(MAX20303::REG_HARDWARE_ID, value);
Emre.Eken 1:0333f77c665f 228 if(ret != MAX20303_NO_ERROR)
Emre.Eken 1:0333f77c665f 229 return false;
Emre.Eken 1:0333f77c665f 230
Emre.Eken 1:0333f77c665f 231 if(value == 0x02)
Emre.Eken 1:0333f77c665f 232 return true;
Emre.Eken 1:0333f77c665f 233 else
Emre.Eken 1:0333f77c665f 234 return false;
Emre.Eken 1:0333f77c665f 235 }
Emre.Eken 1:0333f77c665f 236
Emre.Eken 1:0333f77c665f 237 //******************************************************************************
Emre.Eken 1:0333f77c665f 238 int MAX20303::led0on(char enable) {
Emre.Eken 1:0333f77c665f 239
Emre.Eken 1:0333f77c665f 240 if(enable)
Emre.Eken 1:0333f77c665f 241 return writeReg(REG_LED0_DIRECT, 0x21);
Emre.Eken 1:0333f77c665f 242 else
Emre.Eken 1:0333f77c665f 243 return writeReg(REG_LED0_DIRECT, 0x01);
Emre.Eken 1:0333f77c665f 244 }
Emre.Eken 1:0333f77c665f 245
Emre.Eken 1:0333f77c665f 246 //******************************************************************************
Emre.Eken 1:0333f77c665f 247 int MAX20303::led1on(char enable) {
Emre.Eken 1:0333f77c665f 248 if(enable)
Emre.Eken 1:0333f77c665f 249 return writeReg(REG_LED1_DIRECT, 0x21);
Emre.Eken 1:0333f77c665f 250 else
Emre.Eken 1:0333f77c665f 251 return writeReg(REG_LED1_DIRECT, 0x01);
Emre.Eken 1:0333f77c665f 252 }
Emre.Eken 1:0333f77c665f 253
Emre.Eken 1:0333f77c665f 254 //******************************************************************************
Emre.Eken 1:0333f77c665f 255 int MAX20303::led2on(char enable) {
Emre.Eken 1:0333f77c665f 256 if(enable)
Emre.Eken 1:0333f77c665f 257 return writeReg(REG_LED2_DIRECT, 0x21);
Emre.Eken 1:0333f77c665f 258 else
Emre.Eken 1:0333f77c665f 259 return writeReg(REG_LED2_DIRECT, 0x01);
Emre.Eken 1:0333f77c665f 260 }
Emre.Eken 1:0333f77c665f 261
Emre.Eken 1:0333f77c665f 262
Emre.Eken 1:0333f77c665f 263 //******************************************************************************
Emre.Eken 1:0333f77c665f 264 int MAX20303::BoostEnable(void) {
Emre.Eken 1:0333f77c665f 265
Emre.Eken 1:0333f77c665f 266 writeReg(REG_AP_CMDOUT, 0x30);
Emre.Eken 1:0333f77c665f 267 writeReg(REG_AP_DATOUT3, 0x00); // 00 : 5V
Emre.Eken 1:0333f77c665f 268 writeReg(REG_AP_DATOUT0, 0x01); // Boost Enabled
Emre.Eken 1:0333f77c665f 269
Emre.Eken 1:0333f77c665f 270 return MAX20303_NO_ERROR;
Emre.Eken 1:0333f77c665f 271 }
Emre.Eken 1:0333f77c665f 272
Emre.Eken 1:0333f77c665f 273 //******************************************************************************
Emre.Eken 1:0333f77c665f 274 int MAX20303::BuckBoostEnable(void)
Emre.Eken 1:0333f77c665f 275 {
Emre.Eken 1:0333f77c665f 276 int ret = 0;
Emre.Eken 1:0333f77c665f 277
Emre.Eken 1:0333f77c665f 278 ret |= writeReg( REG_AP_DATOUT0, 0x00); // Reserved = 0x00
Emre.Eken 1:0333f77c665f 279 ret |= writeReg( REG_AP_DATOUT1, 0x04); // BBstlSet = 0b'100 Buck Boost Peak current Limit = 200mA
Emre.Eken 1:0333f77c665f 280 ret |= writeReg( REG_AP_DATOUT2, 0x19); // BBstVSet = 0b'11001 Buck Boost Output Voltage = 5V
Emre.Eken 1:0333f77c665f 281 ret |= writeReg( REG_AP_DATOUT3, 0x01); // BBstRipRed = 1 Ripple Reduction
Emre.Eken 1:0333f77c665f 282 ret |= writeReg( REG_AP_CMDOUT, 0x70);
Emre.Eken 1:0333f77c665f 283 if (ret != 0)
Emre.Eken 1:0333f77c665f 284 return MAX20303_ERROR;
Emre.Eken 1:0333f77c665f 285
Emre.Eken 1:0333f77c665f 286 return MAX20303_NO_ERROR;
Emre.Eken 1:0333f77c665f 287 }