max20303 private fork

Fork of max20303 by Maxim Integrated

Committer:
seyhmuscacina
Date:
Thu Jan 25 15:31:43 2018 +0300
Revision:
1:d85b06dc60a3
Parent:
0:ff4818eff240
Child:
2:39e05cf7ef7d
updates max20303 library:

- added support for hard, soft reset
- removed external dependencies
- Application processor read and write functions added

Who changed what in which revision?

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