A feature complete driver for the MAX17048 lithium fuel gauge from Maxim.

Dependents:   MAX17048_HelloWorld ECGAFE_copy MAX17048_HelloWorld Orion_newPCB_test_LV ... more

Now fully tested!

Committer:
neilt6
Date:
Wed Aug 07 22:19:36 2013 +0000
Revision:
0:abc480f8eeab
Child:
2:0a98e081b48c
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
neilt6 0:abc480f8eeab 1 /* MAX17048 Driver Library
neilt6 0:abc480f8eeab 2 * Copyright (c) 2013 Neil Thiessen
neilt6 0:abc480f8eeab 3 *
neilt6 0:abc480f8eeab 4 * Licensed under the Apache License, Version 2.0 (the "License");
neilt6 0:abc480f8eeab 5 * you may not use this file except in compliance with the License.
neilt6 0:abc480f8eeab 6 * You may obtain a copy of the License at
neilt6 0:abc480f8eeab 7 *
neilt6 0:abc480f8eeab 8 * http://www.apache.org/licenses/LICENSE-2.0
neilt6 0:abc480f8eeab 9 *
neilt6 0:abc480f8eeab 10 * Unless required by applicable law or agreed to in writing, software
neilt6 0:abc480f8eeab 11 * distributed under the License is distributed on an "AS IS" BASIS,
neilt6 0:abc480f8eeab 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
neilt6 0:abc480f8eeab 13 * See the License for the specific language governing permissions and
neilt6 0:abc480f8eeab 14 * limitations under the License.
neilt6 0:abc480f8eeab 15 */
neilt6 0:abc480f8eeab 16
neilt6 0:abc480f8eeab 17 #include "MAX17048.h"
neilt6 0:abc480f8eeab 18 #include "mbed.h"
neilt6 0:abc480f8eeab 19
neilt6 0:abc480f8eeab 20 MAX17048::MAX17048(PinName sda, PinName scl) : _i2c(sda, scl)
neilt6 0:abc480f8eeab 21 {
neilt6 0:abc480f8eeab 22 //Nothing else to initialize
neilt6 0:abc480f8eeab 23 }
neilt6 0:abc480f8eeab 24
neilt6 0:abc480f8eeab 25 void MAX17048::reset(void)
neilt6 0:abc480f8eeab 26 {
neilt6 0:abc480f8eeab 27 //Write the POR command
neilt6 0:abc480f8eeab 28 _write(__MAX17048_REG_CMD, 0x5400);
neilt6 0:abc480f8eeab 29 }
neilt6 0:abc480f8eeab 30
neilt6 0:abc480f8eeab 31 void MAX17048::quickStart(void)
neilt6 0:abc480f8eeab 32 {
neilt6 0:abc480f8eeab 33 //Read the current 16-bit register value
neilt6 0:abc480f8eeab 34 unsigned short value = _read(__MAX17048_REG_MODE);
neilt6 0:abc480f8eeab 35
neilt6 0:abc480f8eeab 36 //Set the QuickStart bit
neilt6 0:abc480f8eeab 37 value |= (1 << 14);
neilt6 0:abc480f8eeab 38
neilt6 0:abc480f8eeab 39 //Write the value back out
neilt6 0:abc480f8eeab 40 _write(__MAX17048_REG_MODE, value);
neilt6 0:abc480f8eeab 41 }
neilt6 0:abc480f8eeab 42
neilt6 0:abc480f8eeab 43 bool MAX17048::isSleepEnabled(void)
neilt6 0:abc480f8eeab 44 {
neilt6 0:abc480f8eeab 45 //Read the 16-bit register value
neilt6 0:abc480f8eeab 46 unsigned short value = _read(__MAX17048_REG_MODE);
neilt6 0:abc480f8eeab 47
neilt6 0:abc480f8eeab 48 //Return the status of the EnSleep bit
neilt6 0:abc480f8eeab 49 if (value & (1 << 13))
neilt6 0:abc480f8eeab 50 return true;
neilt6 0:abc480f8eeab 51 else
neilt6 0:abc480f8eeab 52 return false;
neilt6 0:abc480f8eeab 53 }
neilt6 0:abc480f8eeab 54
neilt6 0:abc480f8eeab 55 void MAX17048::setSleepEnabled(bool enabled)
neilt6 0:abc480f8eeab 56 {
neilt6 0:abc480f8eeab 57 //Read the current 16-bit register value
neilt6 0:abc480f8eeab 58 unsigned short value = _read(__MAX17048_REG_MODE);
neilt6 0:abc480f8eeab 59
neilt6 0:abc480f8eeab 60 //Set or clear the EnSleep bit
neilt6 0:abc480f8eeab 61 if (enabled)
neilt6 0:abc480f8eeab 62 value |= (1 << 13);
neilt6 0:abc480f8eeab 63 else
neilt6 0:abc480f8eeab 64 value &= ~(1 << 13);
neilt6 0:abc480f8eeab 65
neilt6 0:abc480f8eeab 66 //Write the value back out
neilt6 0:abc480f8eeab 67 _write(__MAX17048_REG_MODE, value);
neilt6 0:abc480f8eeab 68 }
neilt6 0:abc480f8eeab 69
neilt6 0:abc480f8eeab 70 bool MAX17048::isHibernating(void)
neilt6 0:abc480f8eeab 71 {
neilt6 0:abc480f8eeab 72 //Read the 16-bit register value
neilt6 0:abc480f8eeab 73 unsigned short value = _read(__MAX17048_REG_MODE);
neilt6 0:abc480f8eeab 74
neilt6 0:abc480f8eeab 75 //Return the status of the HibStat bit
neilt6 0:abc480f8eeab 76 if (value & (1 << 12))
neilt6 0:abc480f8eeab 77 return true;
neilt6 0:abc480f8eeab 78 else
neilt6 0:abc480f8eeab 79 return false;
neilt6 0:abc480f8eeab 80 }
neilt6 0:abc480f8eeab 81
neilt6 0:abc480f8eeab 82 float MAX17048::getHibernateThreshold(void)
neilt6 0:abc480f8eeab 83 {
neilt6 0:abc480f8eeab 84 //Read the 16-bit register value
neilt6 0:abc480f8eeab 85 unsigned short value = _read(__MAX17048_REG_HIBRT);
neilt6 0:abc480f8eeab 86
neilt6 0:abc480f8eeab 87 //Extract the hibernate threshold
neilt6 0:abc480f8eeab 88 return (value >> 8) * 0.208;
neilt6 0:abc480f8eeab 89 }
neilt6 0:abc480f8eeab 90
neilt6 0:abc480f8eeab 91 void MAX17048::setHibernateThreshold(float threshold)
neilt6 0:abc480f8eeab 92 {
neilt6 0:abc480f8eeab 93 //Read the current 16-bit register value
neilt6 0:abc480f8eeab 94 unsigned short value = _read(__MAX17048_REG_HIBRT);
neilt6 0:abc480f8eeab 95
neilt6 0:abc480f8eeab 96 //Mask off the old value
neilt6 0:abc480f8eeab 97 value &= 0x00FF;
neilt6 0:abc480f8eeab 98
neilt6 0:abc480f8eeab 99 //Do a smart update
neilt6 0:abc480f8eeab 100 if (threshold > 0.0) {
neilt6 0:abc480f8eeab 101 if (threshold < 53.04)
neilt6 0:abc480f8eeab 102 value |= (unsigned short)(threshold / 0.208) << 8;
neilt6 0:abc480f8eeab 103 else
neilt6 0:abc480f8eeab 104 value |= 0xFF00;
neilt6 0:abc480f8eeab 105 }
neilt6 0:abc480f8eeab 106
neilt6 0:abc480f8eeab 107 //Write the 16-bit register
neilt6 0:abc480f8eeab 108 _write(__MAX17048_REG_HIBRT, value);
neilt6 0:abc480f8eeab 109 }
neilt6 0:abc480f8eeab 110
neilt6 0:abc480f8eeab 111 float MAX17048::getActiveThreshold(void)
neilt6 0:abc480f8eeab 112 {
neilt6 0:abc480f8eeab 113 //Read the 16-bit register value
neilt6 0:abc480f8eeab 114 unsigned short value = _read(__MAX17048_REG_HIBRT);
neilt6 0:abc480f8eeab 115
neilt6 0:abc480f8eeab 116 //Extract the active threshold
neilt6 0:abc480f8eeab 117 return (value & 0x00FF) * 0.00125;
neilt6 0:abc480f8eeab 118 }
neilt6 0:abc480f8eeab 119
neilt6 0:abc480f8eeab 120 void MAX17048::setActiveThreshold(float threshold)
neilt6 0:abc480f8eeab 121 {
neilt6 0:abc480f8eeab 122 //Read the current 16-bit register value
neilt6 0:abc480f8eeab 123 unsigned short value = _read(__MAX17048_REG_HIBRT);
neilt6 0:abc480f8eeab 124
neilt6 0:abc480f8eeab 125 //Mask off the old value
neilt6 0:abc480f8eeab 126 value &= 0xFF00;
neilt6 0:abc480f8eeab 127
neilt6 0:abc480f8eeab 128 //Do a smart update
neilt6 0:abc480f8eeab 129 if (threshold > 0.0) {
neilt6 0:abc480f8eeab 130 if (threshold < 0.31875)
neilt6 0:abc480f8eeab 131 value |= (char)(threshold / 0.00125);
neilt6 0:abc480f8eeab 132 else
neilt6 0:abc480f8eeab 133 value |= 0x00FF;
neilt6 0:abc480f8eeab 134 }
neilt6 0:abc480f8eeab 135
neilt6 0:abc480f8eeab 136 //Write the 16-bit register
neilt6 0:abc480f8eeab 137 _write(__MAX17048_REG_HIBRT, value);
neilt6 0:abc480f8eeab 138 }
neilt6 0:abc480f8eeab 139
neilt6 0:abc480f8eeab 140 unsigned short MAX17048::getVersion(void)
neilt6 0:abc480f8eeab 141 {
neilt6 0:abc480f8eeab 142 //Return the 16-bit production version
neilt6 0:abc480f8eeab 143 return _read(__MAX17048_REG_VERSION);
neilt6 0:abc480f8eeab 144 }
neilt6 0:abc480f8eeab 145
neilt6 0:abc480f8eeab 146 void MAX17048::setTempCompensation(float temp)
neilt6 0:abc480f8eeab 147 {
neilt6 0:abc480f8eeab 148 //Calculate the new RCOMP value
neilt6 0:abc480f8eeab 149 char rcomp;
neilt6 0:abc480f8eeab 150 if (temp > 20.0) {
neilt6 0:abc480f8eeab 151 rcomp = __MAX17048_RCOMP0 + (temp - 20.0) * -0.5;
neilt6 0:abc480f8eeab 152 } else {
neilt6 0:abc480f8eeab 153 rcomp = __MAX17048_RCOMP0 + (temp - 20.0) * -5.0;
neilt6 0:abc480f8eeab 154 }
neilt6 0:abc480f8eeab 155
neilt6 0:abc480f8eeab 156 //Update the RCOMP value
neilt6 0:abc480f8eeab 157 _writeRCOMP(rcomp);
neilt6 0:abc480f8eeab 158 }
neilt6 0:abc480f8eeab 159
neilt6 0:abc480f8eeab 160 bool MAX17048::isSleeping(void)
neilt6 0:abc480f8eeab 161 {
neilt6 0:abc480f8eeab 162 //Read the 16-bit register value
neilt6 0:abc480f8eeab 163 unsigned short value = _read(__MAX17048_REG_CONFIG);
neilt6 0:abc480f8eeab 164
neilt6 0:abc480f8eeab 165 //Return the status of the SLEEP bit
neilt6 0:abc480f8eeab 166 if (value & (1 << 7))
neilt6 0:abc480f8eeab 167 return true;
neilt6 0:abc480f8eeab 168 else
neilt6 0:abc480f8eeab 169 return false;
neilt6 0:abc480f8eeab 170 }
neilt6 0:abc480f8eeab 171
neilt6 0:abc480f8eeab 172 void MAX17048::setSleep(bool sleep)
neilt6 0:abc480f8eeab 173 {
neilt6 0:abc480f8eeab 174 //Read the current 16-bit register value
neilt6 0:abc480f8eeab 175 unsigned short value = _read(__MAX17048_REG_CONFIG);
neilt6 0:abc480f8eeab 176
neilt6 0:abc480f8eeab 177 //Set or clear the SLEEP bit
neilt6 0:abc480f8eeab 178 if (sleep)
neilt6 0:abc480f8eeab 179 value |= (1 << 7);
neilt6 0:abc480f8eeab 180 else
neilt6 0:abc480f8eeab 181 value &= ~(1 << 7);
neilt6 0:abc480f8eeab 182
neilt6 0:abc480f8eeab 183 //Write the value back out
neilt6 0:abc480f8eeab 184 _write(__MAX17048_REG_CONFIG, value);
neilt6 0:abc480f8eeab 185 }
neilt6 0:abc480f8eeab 186
neilt6 0:abc480f8eeab 187 bool MAX17048::isSOCChangeAlertEnabled(void)
neilt6 0:abc480f8eeab 188 {
neilt6 0:abc480f8eeab 189 //Read the 16-bit register value
neilt6 0:abc480f8eeab 190 unsigned short value = _read(__MAX17048_REG_CONFIG);
neilt6 0:abc480f8eeab 191
neilt6 0:abc480f8eeab 192 //Return the status of the ALSC bit
neilt6 0:abc480f8eeab 193 if (value & (1 << 6))
neilt6 0:abc480f8eeab 194 return true;
neilt6 0:abc480f8eeab 195 else
neilt6 0:abc480f8eeab 196 return false;
neilt6 0:abc480f8eeab 197 }
neilt6 0:abc480f8eeab 198
neilt6 0:abc480f8eeab 199 void MAX17048::setSOCChangeAlertEnabled(bool enabled)
neilt6 0:abc480f8eeab 200 {
neilt6 0:abc480f8eeab 201 //Read the current 16-bit register value
neilt6 0:abc480f8eeab 202 unsigned short value = _read(__MAX17048_REG_CONFIG);
neilt6 0:abc480f8eeab 203
neilt6 0:abc480f8eeab 204 //Set or clear the ALSC bit
neilt6 0:abc480f8eeab 205 if (enabled)
neilt6 0:abc480f8eeab 206 value |= (1 << 6);
neilt6 0:abc480f8eeab 207 else
neilt6 0:abc480f8eeab 208 value &= ~(1 << 6);
neilt6 0:abc480f8eeab 209
neilt6 0:abc480f8eeab 210 //Write the value back out
neilt6 0:abc480f8eeab 211 _write(__MAX17048_REG_CONFIG, value);
neilt6 0:abc480f8eeab 212 }
neilt6 0:abc480f8eeab 213
neilt6 0:abc480f8eeab 214 bool MAX17048::isAlerting(void)
neilt6 0:abc480f8eeab 215 {
neilt6 0:abc480f8eeab 216 //Read the 16-bit register value
neilt6 0:abc480f8eeab 217 unsigned short value = _read(__MAX17048_REG_CONFIG);
neilt6 0:abc480f8eeab 218
neilt6 0:abc480f8eeab 219 //Return the status of the ALRT bit
neilt6 0:abc480f8eeab 220 if (value & (1 << 5))
neilt6 0:abc480f8eeab 221 return true;
neilt6 0:abc480f8eeab 222 else
neilt6 0:abc480f8eeab 223 return false;
neilt6 0:abc480f8eeab 224 }
neilt6 0:abc480f8eeab 225
neilt6 0:abc480f8eeab 226 void MAX17048::clearAlert(void)
neilt6 0:abc480f8eeab 227 {
neilt6 0:abc480f8eeab 228 //Read the current 16-bit register value
neilt6 0:abc480f8eeab 229 unsigned short value = _read(__MAX17048_REG_CONFIG);
neilt6 0:abc480f8eeab 230
neilt6 0:abc480f8eeab 231 //Clear the ALRT bit
neilt6 0:abc480f8eeab 232 value &= ~(1 << 5);
neilt6 0:abc480f8eeab 233
neilt6 0:abc480f8eeab 234 //Write the value back out
neilt6 0:abc480f8eeab 235 _write(__MAX17048_REG_CONFIG, value);
neilt6 0:abc480f8eeab 236 }
neilt6 0:abc480f8eeab 237
neilt6 0:abc480f8eeab 238 char MAX17048::getEmptyAlertThreshold(void)
neilt6 0:abc480f8eeab 239 {
neilt6 0:abc480f8eeab 240 //Read the 16-bit register value
neilt6 0:abc480f8eeab 241 unsigned short value = _read(__MAX17048_REG_CONFIG);
neilt6 0:abc480f8eeab 242
neilt6 0:abc480f8eeab 243 //Extract the threshold
neilt6 0:abc480f8eeab 244 return 32 - (value & 0x001F);
neilt6 0:abc480f8eeab 245 }
neilt6 0:abc480f8eeab 246
neilt6 0:abc480f8eeab 247 void MAX17048::setEmptyAlertThreshold(char threshold)
neilt6 0:abc480f8eeab 248 {
neilt6 0:abc480f8eeab 249 //Read the current 16-bit register value
neilt6 0:abc480f8eeab 250 unsigned short value = _read(__MAX17048_REG_CONFIG);
neilt6 0:abc480f8eeab 251
neilt6 0:abc480f8eeab 252 //Range check threshold
neilt6 0:abc480f8eeab 253 if (threshold < 1)
neilt6 0:abc480f8eeab 254 threshold = 1;
neilt6 0:abc480f8eeab 255 else if (threshold > 32)
neilt6 0:abc480f8eeab 256 threshold = 32;
neilt6 0:abc480f8eeab 257
neilt6 0:abc480f8eeab 258 //Update the register value
neilt6 0:abc480f8eeab 259 value &= 0xFFE0;
neilt6 0:abc480f8eeab 260 value |= 32 - threshold;
neilt6 0:abc480f8eeab 261
neilt6 0:abc480f8eeab 262 //Write the 16-bit register
neilt6 0:abc480f8eeab 263 _write(__MAX17048_REG_CONFIG, value);
neilt6 0:abc480f8eeab 264 }
neilt6 0:abc480f8eeab 265
neilt6 0:abc480f8eeab 266 float MAX17048::getVAlertMinThreshold(void)
neilt6 0:abc480f8eeab 267 {
neilt6 0:abc480f8eeab 268 //Read the 16-bit register value
neilt6 0:abc480f8eeab 269 unsigned short value = _read(__MAX17048_REG_VALRT);
neilt6 0:abc480f8eeab 270
neilt6 0:abc480f8eeab 271 //Extract the alert threshold
neilt6 0:abc480f8eeab 272 return (value >> 8) * 0.02;
neilt6 0:abc480f8eeab 273 }
neilt6 0:abc480f8eeab 274
neilt6 0:abc480f8eeab 275 void MAX17048::setVAlertMinThreshold(float threshold)
neilt6 0:abc480f8eeab 276 {
neilt6 0:abc480f8eeab 277 //Read the current 16-bit register value
neilt6 0:abc480f8eeab 278 unsigned short value = _read(__MAX17048_REG_VALRT);
neilt6 0:abc480f8eeab 279
neilt6 0:abc480f8eeab 280 //Mask off the old value
neilt6 0:abc480f8eeab 281 value &= 0x00FF;
neilt6 0:abc480f8eeab 282
neilt6 0:abc480f8eeab 283 //Do a smart update
neilt6 0:abc480f8eeab 284 if (threshold > 0.0) {
neilt6 0:abc480f8eeab 285 if (threshold < 5.1)
neilt6 0:abc480f8eeab 286 value |= (unsigned short)(threshold / 0.02) << 8;
neilt6 0:abc480f8eeab 287 else
neilt6 0:abc480f8eeab 288 value |= 0xFF00;
neilt6 0:abc480f8eeab 289 }
neilt6 0:abc480f8eeab 290
neilt6 0:abc480f8eeab 291 //Write the 16-bit register
neilt6 0:abc480f8eeab 292 _write(__MAX17048_REG_VALRT, value);
neilt6 0:abc480f8eeab 293 }
neilt6 0:abc480f8eeab 294
neilt6 0:abc480f8eeab 295 float MAX17048::getVAlertMaxThreshold(void)
neilt6 0:abc480f8eeab 296 {
neilt6 0:abc480f8eeab 297 //Read the 16-bit register value
neilt6 0:abc480f8eeab 298 unsigned short value = _read(__MAX17048_REG_VALRT);
neilt6 0:abc480f8eeab 299
neilt6 0:abc480f8eeab 300 //Extract the active threshold
neilt6 0:abc480f8eeab 301 return (value & 0x00FF) * 0.02;
neilt6 0:abc480f8eeab 302 }
neilt6 0:abc480f8eeab 303
neilt6 0:abc480f8eeab 304 void MAX17048::setVAlertMaxThreshold(float threshold)
neilt6 0:abc480f8eeab 305 {
neilt6 0:abc480f8eeab 306 //Read the current 16-bit register value
neilt6 0:abc480f8eeab 307 unsigned short value = _read(__MAX17048_REG_VALRT);
neilt6 0:abc480f8eeab 308
neilt6 0:abc480f8eeab 309 //Mask off the old value
neilt6 0:abc480f8eeab 310 value &= 0xFF00;
neilt6 0:abc480f8eeab 311
neilt6 0:abc480f8eeab 312 //Do a smart update
neilt6 0:abc480f8eeab 313 if (threshold > 0.0) {
neilt6 0:abc480f8eeab 314 if (threshold < 5.1)
neilt6 0:abc480f8eeab 315 value |= (char)(threshold / 0.02);
neilt6 0:abc480f8eeab 316 else
neilt6 0:abc480f8eeab 317 value |= 0x00FF;
neilt6 0:abc480f8eeab 318 }
neilt6 0:abc480f8eeab 319
neilt6 0:abc480f8eeab 320 //Write the 16-bit register
neilt6 0:abc480f8eeab 321 _write(__MAX17048_REG_VALRT, value);
neilt6 0:abc480f8eeab 322 }
neilt6 0:abc480f8eeab 323
neilt6 0:abc480f8eeab 324 float MAX17048::getVResetThreshold(void)
neilt6 0:abc480f8eeab 325 {
neilt6 0:abc480f8eeab 326 //Read the 16-bit register value
neilt6 0:abc480f8eeab 327 unsigned short value = _read(__MAX17048_REG_VRESET_ID);
neilt6 0:abc480f8eeab 328
neilt6 0:abc480f8eeab 329 //Extract the threshold
neilt6 0:abc480f8eeab 330 return (value >> 9) * 0.04;
neilt6 0:abc480f8eeab 331 }
neilt6 0:abc480f8eeab 332
neilt6 0:abc480f8eeab 333 void MAX17048::setVResetThreshold(float threshold)
neilt6 0:abc480f8eeab 334 {
neilt6 0:abc480f8eeab 335 //Read the current 16-bit register value
neilt6 0:abc480f8eeab 336 unsigned short value = _read(__MAX17048_REG_VRESET_ID);
neilt6 0:abc480f8eeab 337
neilt6 0:abc480f8eeab 338 //Mask off the old value
neilt6 0:abc480f8eeab 339 value &= 0x01FF;
neilt6 0:abc480f8eeab 340
neilt6 0:abc480f8eeab 341 //Do a smart update
neilt6 0:abc480f8eeab 342 if (threshold > 0.0) {
neilt6 0:abc480f8eeab 343 if (threshold < 5.08)
neilt6 0:abc480f8eeab 344 value |= (unsigned short)(threshold / 0.04) << 9;
neilt6 0:abc480f8eeab 345 else
neilt6 0:abc480f8eeab 346 value |= 0xFE00;
neilt6 0:abc480f8eeab 347 }
neilt6 0:abc480f8eeab 348
neilt6 0:abc480f8eeab 349 //Write the 16-bit register
neilt6 0:abc480f8eeab 350 _write(__MAX17048_REG_VRESET_ID, value);
neilt6 0:abc480f8eeab 351 }
neilt6 0:abc480f8eeab 352
neilt6 0:abc480f8eeab 353 bool MAX17048::isComparatorEnabled(void)
neilt6 0:abc480f8eeab 354 {
neilt6 0:abc480f8eeab 355 //Read the 16-bit register value
neilt6 0:abc480f8eeab 356 unsigned short value = _read(__MAX17048_REG_VRESET_ID);
neilt6 0:abc480f8eeab 357
neilt6 0:abc480f8eeab 358 //Return the status of the Dis bit
neilt6 0:abc480f8eeab 359 if (value & (1 << 8))
neilt6 0:abc480f8eeab 360 return false;
neilt6 0:abc480f8eeab 361 else
neilt6 0:abc480f8eeab 362 return true;
neilt6 0:abc480f8eeab 363 }
neilt6 0:abc480f8eeab 364
neilt6 0:abc480f8eeab 365 void MAX17048::setComparatorEnabled(bool enabled)
neilt6 0:abc480f8eeab 366 {
neilt6 0:abc480f8eeab 367 //Read the current 16-bit register value
neilt6 0:abc480f8eeab 368 unsigned short value = _read(__MAX17048_REG_VRESET_ID);
neilt6 0:abc480f8eeab 369
neilt6 0:abc480f8eeab 370 //Set or clear the Dis bit
neilt6 0:abc480f8eeab 371 if (enabled)
neilt6 0:abc480f8eeab 372 value &= ~(1 << 8);
neilt6 0:abc480f8eeab 373 else
neilt6 0:abc480f8eeab 374 value |= (1 << 8);
neilt6 0:abc480f8eeab 375
neilt6 0:abc480f8eeab 376 //Write the value back out
neilt6 0:abc480f8eeab 377 _write(__MAX17048_REG_VRESET_ID, value);
neilt6 0:abc480f8eeab 378 }
neilt6 0:abc480f8eeab 379
neilt6 0:abc480f8eeab 380 char MAX17048::getID(void)
neilt6 0:abc480f8eeab 381 {
neilt6 0:abc480f8eeab 382 //Read the 16-bit register value
neilt6 0:abc480f8eeab 383 unsigned short value = _read(__MAX17048_REG_VRESET_ID);
neilt6 0:abc480f8eeab 384
neilt6 0:abc480f8eeab 385 //Return only the ID bits
neilt6 0:abc480f8eeab 386 return value;
neilt6 0:abc480f8eeab 387 }
neilt6 0:abc480f8eeab 388
neilt6 0:abc480f8eeab 389 bool MAX17048::isVResetAlertEnabled(void)
neilt6 0:abc480f8eeab 390 {
neilt6 0:abc480f8eeab 391 //Read the 16-bit register value
neilt6 0:abc480f8eeab 392 unsigned short value = _read(__MAX17048_REG_STATUS);
neilt6 0:abc480f8eeab 393
neilt6 0:abc480f8eeab 394 //Return the status of the EnVR bit
neilt6 0:abc480f8eeab 395 if (value & (1 << 14))
neilt6 0:abc480f8eeab 396 return true;
neilt6 0:abc480f8eeab 397 else
neilt6 0:abc480f8eeab 398 return false;
neilt6 0:abc480f8eeab 399 }
neilt6 0:abc480f8eeab 400
neilt6 0:abc480f8eeab 401 void MAX17048::setVResetAlertEnabled(bool enabled)
neilt6 0:abc480f8eeab 402 {
neilt6 0:abc480f8eeab 403 //Read the current 16-bit register value
neilt6 0:abc480f8eeab 404 unsigned short value = _read(__MAX17048_REG_STATUS);
neilt6 0:abc480f8eeab 405
neilt6 0:abc480f8eeab 406 //Set or clear the EnVR bit
neilt6 0:abc480f8eeab 407 if (enabled)
neilt6 0:abc480f8eeab 408 value |= (1 << 14);
neilt6 0:abc480f8eeab 409 else
neilt6 0:abc480f8eeab 410 value &= ~(1 << 14);
neilt6 0:abc480f8eeab 411
neilt6 0:abc480f8eeab 412 //Write the value back out
neilt6 0:abc480f8eeab 413 _write(__MAX17048_REG_STATUS, value);
neilt6 0:abc480f8eeab 414 }
neilt6 0:abc480f8eeab 415
neilt6 0:abc480f8eeab 416 char MAX17048::getAlertFlags(void)
neilt6 0:abc480f8eeab 417 {
neilt6 0:abc480f8eeab 418 //Read the 16-bit register value
neilt6 0:abc480f8eeab 419 unsigned short value = _read(__MAX17048_REG_STATUS);
neilt6 0:abc480f8eeab 420
neilt6 0:abc480f8eeab 421 //Return only the flag bits
neilt6 0:abc480f8eeab 422 return (value >> 8) & 0x3F;
neilt6 0:abc480f8eeab 423 }
neilt6 0:abc480f8eeab 424
neilt6 0:abc480f8eeab 425 void MAX17048::clearAlertFlags(char flags)
neilt6 0:abc480f8eeab 426 {
neilt6 0:abc480f8eeab 427 //Read the current 16-bit register value
neilt6 0:abc480f8eeab 428 unsigned short value = _read(__MAX17048_REG_STATUS);
neilt6 0:abc480f8eeab 429
neilt6 0:abc480f8eeab 430 //Clear the specified flag bits
neilt6 0:abc480f8eeab 431 value &= ~((flags & 0x3F) << 8);
neilt6 0:abc480f8eeab 432
neilt6 0:abc480f8eeab 433 //Write the value back out
neilt6 0:abc480f8eeab 434 _write(__MAX17048_REG_STATUS, value);
neilt6 0:abc480f8eeab 435 }
neilt6 0:abc480f8eeab 436
neilt6 0:abc480f8eeab 437 float MAX17048::getVcell(void)
neilt6 0:abc480f8eeab 438 {
neilt6 0:abc480f8eeab 439 //Read the 16-bit raw Vcell value
neilt6 0:abc480f8eeab 440 unsigned short value = _read(__MAX17048_REG_VCELL);
neilt6 0:abc480f8eeab 441
neilt6 0:abc480f8eeab 442 //Return Vcell in volts
neilt6 0:abc480f8eeab 443 return value * 0.000078125;
neilt6 0:abc480f8eeab 444 }
neilt6 0:abc480f8eeab 445
neilt6 0:abc480f8eeab 446 float MAX17048::getSOC(void)
neilt6 0:abc480f8eeab 447 {
neilt6 0:abc480f8eeab 448 //Read the 16-bit raw SOC value
neilt6 0:abc480f8eeab 449 unsigned short value = _read(__MAX17048_REG_SOC);
neilt6 0:abc480f8eeab 450
neilt6 0:abc480f8eeab 451 //Return SOC in percent
neilt6 0:abc480f8eeab 452 return value * 0.00390625;
neilt6 0:abc480f8eeab 453 }
neilt6 0:abc480f8eeab 454
neilt6 0:abc480f8eeab 455 float MAX17048::getCRate(void)
neilt6 0:abc480f8eeab 456 {
neilt6 0:abc480f8eeab 457 //Read the 16-bit raw C/Rate value
neilt6 0:abc480f8eeab 458 short value = _read(__MAX17048_REG_CRATE);
neilt6 0:abc480f8eeab 459
neilt6 0:abc480f8eeab 460 //Return C/Rate in %/hr
neilt6 0:abc480f8eeab 461 return value * 0.208;
neilt6 0:abc480f8eeab 462 }
neilt6 0:abc480f8eeab 463
neilt6 0:abc480f8eeab 464 unsigned short MAX17048::_read(char reg)
neilt6 0:abc480f8eeab 465 {
neilt6 0:abc480f8eeab 466 //Create a temporary buffer
neilt6 0:abc480f8eeab 467 char buff[2];
neilt6 0:abc480f8eeab 468
neilt6 0:abc480f8eeab 469 //Select the register
neilt6 0:abc480f8eeab 470 _i2c.write(__MAX17048_ADDR, &reg, 1);
neilt6 0:abc480f8eeab 471
neilt6 0:abc480f8eeab 472 //Read the 16-bit register
neilt6 0:abc480f8eeab 473 _i2c.read(__MAX17048_ADDR, buff, 2);
neilt6 0:abc480f8eeab 474
neilt6 0:abc480f8eeab 475 //Return the combined 16-bit value
neilt6 0:abc480f8eeab 476 return (buff[0] << 8) | buff[1];
neilt6 0:abc480f8eeab 477 }
neilt6 0:abc480f8eeab 478
neilt6 0:abc480f8eeab 479 void MAX17048::_write(char reg, unsigned short data)
neilt6 0:abc480f8eeab 480 {
neilt6 0:abc480f8eeab 481 //Create a temporary buffer
neilt6 0:abc480f8eeab 482 char buff[3];
neilt6 0:abc480f8eeab 483
neilt6 0:abc480f8eeab 484 //Load the register address and 16-bit data
neilt6 0:abc480f8eeab 485 buff[0] = reg;
neilt6 0:abc480f8eeab 486 buff[1] = data >> 8;
neilt6 0:abc480f8eeab 487 buff[2] = data;
neilt6 0:abc480f8eeab 488
neilt6 0:abc480f8eeab 489 //Write the data
neilt6 0:abc480f8eeab 490 _i2c.write(__MAX17048_ADDR, buff, 3);
neilt6 0:abc480f8eeab 491 }
neilt6 0:abc480f8eeab 492
neilt6 0:abc480f8eeab 493 void MAX17048::_writeRCOMP(char rcomp)
neilt6 0:abc480f8eeab 494 {
neilt6 0:abc480f8eeab 495 //Read the current 16-bit register value
neilt6 0:abc480f8eeab 496 unsigned short value = _read(__MAX17048_REG_CONFIG);
neilt6 0:abc480f8eeab 497
neilt6 0:abc480f8eeab 498 //Update the register value
neilt6 0:abc480f8eeab 499 value &= 0x00FF;
neilt6 0:abc480f8eeab 500 value |= rcomp << 8;
neilt6 0:abc480f8eeab 501
neilt6 0:abc480f8eeab 502 //Write the value back out
neilt6 0:abc480f8eeab 503 _write(__MAX17048_REG_CONFIG, value);
neilt6 0:abc480f8eeab 504 }