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:
Mon Sep 16 22:02:40 2013 +0000
Revision:
4:e61b2723d2cf
Parent:
3:32087cca331f
Child:
5:ffce4fe12ed1
Added new function for reading the state of charge measurement as an integer, added float and int operator overrides for state of charge measurements, improved example

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
neilt6 2:0a98e081b48c 19 MAX17048::MAX17048(PinName sda, PinName scl) : m_I2C(sda, scl)
neilt6 0:abc480f8eeab 20 {
neilt6 0:abc480f8eeab 21 //Nothing else to initialize
neilt6 0:abc480f8eeab 22 }
neilt6 0:abc480f8eeab 23
neilt6 3:32087cca331f 24 bool MAX17048::open(void)
neilt6 3:32087cca331f 25 {
neilt6 3:32087cca331f 26 //Probe for the MAX17048 using a Zero Length Transfer
neilt6 3:32087cca331f 27 if (!m_I2C.write(m_ADDR, NULL, 0)) {
neilt6 3:32087cca331f 28 //Load the default RCOMP value
neilt6 3:32087cca331f 29 writeRCOMP(m_RCOMP0);
neilt6 3:32087cca331f 30
neilt6 3:32087cca331f 31 //Return success
neilt6 3:32087cca331f 32 return true;
neilt6 3:32087cca331f 33 } else {
neilt6 3:32087cca331f 34 //Return failure
neilt6 3:32087cca331f 35 return false;
neilt6 3:32087cca331f 36 }
neilt6 3:32087cca331f 37 }
neilt6 3:32087cca331f 38
neilt6 0:abc480f8eeab 39 void MAX17048::reset(void)
neilt6 0:abc480f8eeab 40 {
neilt6 0:abc480f8eeab 41 //Write the POR command
neilt6 2:0a98e081b48c 42 write(REG_CMD, 0x5400);
neilt6 0:abc480f8eeab 43 }
neilt6 0:abc480f8eeab 44
neilt6 0:abc480f8eeab 45 void MAX17048::quickStart(void)
neilt6 0:abc480f8eeab 46 {
neilt6 0:abc480f8eeab 47 //Read the current 16-bit register value
neilt6 2:0a98e081b48c 48 unsigned short value = read(REG_MODE);
neilt6 0:abc480f8eeab 49
neilt6 0:abc480f8eeab 50 //Set the QuickStart bit
neilt6 0:abc480f8eeab 51 value |= (1 << 14);
neilt6 0:abc480f8eeab 52
neilt6 0:abc480f8eeab 53 //Write the value back out
neilt6 2:0a98e081b48c 54 write(REG_MODE, value);
neilt6 0:abc480f8eeab 55 }
neilt6 0:abc480f8eeab 56
neilt6 2:0a98e081b48c 57 bool MAX17048::sleepEnabled(void)
neilt6 0:abc480f8eeab 58 {
neilt6 0:abc480f8eeab 59 //Read the 16-bit register value
neilt6 2:0a98e081b48c 60 unsigned short value = read(REG_MODE);
neilt6 0:abc480f8eeab 61
neilt6 0:abc480f8eeab 62 //Return the status of the EnSleep bit
neilt6 0:abc480f8eeab 63 if (value & (1 << 13))
neilt6 0:abc480f8eeab 64 return true;
neilt6 0:abc480f8eeab 65 else
neilt6 0:abc480f8eeab 66 return false;
neilt6 0:abc480f8eeab 67 }
neilt6 0:abc480f8eeab 68
neilt6 2:0a98e081b48c 69 void MAX17048::sleepEnabled(bool enabled)
neilt6 0:abc480f8eeab 70 {
neilt6 0:abc480f8eeab 71 //Read the current 16-bit register value
neilt6 2:0a98e081b48c 72 unsigned short value = read(REG_MODE);
neilt6 0:abc480f8eeab 73
neilt6 0:abc480f8eeab 74 //Set or clear the EnSleep bit
neilt6 0:abc480f8eeab 75 if (enabled)
neilt6 0:abc480f8eeab 76 value |= (1 << 13);
neilt6 0:abc480f8eeab 77 else
neilt6 0:abc480f8eeab 78 value &= ~(1 << 13);
neilt6 0:abc480f8eeab 79
neilt6 0:abc480f8eeab 80 //Write the value back out
neilt6 2:0a98e081b48c 81 write(REG_MODE, value);
neilt6 0:abc480f8eeab 82 }
neilt6 0:abc480f8eeab 83
neilt6 2:0a98e081b48c 84 bool MAX17048::hibernating(void)
neilt6 0:abc480f8eeab 85 {
neilt6 0:abc480f8eeab 86 //Read the 16-bit register value
neilt6 2:0a98e081b48c 87 unsigned short value = read(REG_MODE);
neilt6 0:abc480f8eeab 88
neilt6 0:abc480f8eeab 89 //Return the status of the HibStat bit
neilt6 0:abc480f8eeab 90 if (value & (1 << 12))
neilt6 0:abc480f8eeab 91 return true;
neilt6 0:abc480f8eeab 92 else
neilt6 0:abc480f8eeab 93 return false;
neilt6 0:abc480f8eeab 94 }
neilt6 0:abc480f8eeab 95
neilt6 2:0a98e081b48c 96 float MAX17048::hibernateThreshold(void)
neilt6 0:abc480f8eeab 97 {
neilt6 0:abc480f8eeab 98 //Read the 16-bit register value
neilt6 2:0a98e081b48c 99 unsigned short value = read(REG_HIBRT);
neilt6 0:abc480f8eeab 100
neilt6 0:abc480f8eeab 101 //Extract the hibernate threshold
neilt6 0:abc480f8eeab 102 return (value >> 8) * 0.208;
neilt6 0:abc480f8eeab 103 }
neilt6 0:abc480f8eeab 104
neilt6 2:0a98e081b48c 105 void MAX17048::hibernateThreshold(float threshold)
neilt6 0:abc480f8eeab 106 {
neilt6 0:abc480f8eeab 107 //Read the current 16-bit register value
neilt6 2:0a98e081b48c 108 unsigned short value = read(REG_HIBRT);
neilt6 0:abc480f8eeab 109
neilt6 0:abc480f8eeab 110 //Mask off the old value
neilt6 0:abc480f8eeab 111 value &= 0x00FF;
neilt6 0:abc480f8eeab 112
neilt6 0:abc480f8eeab 113 //Do a smart update
neilt6 0:abc480f8eeab 114 if (threshold > 0.0) {
neilt6 0:abc480f8eeab 115 if (threshold < 53.04)
neilt6 0:abc480f8eeab 116 value |= (unsigned short)(threshold / 0.208) << 8;
neilt6 0:abc480f8eeab 117 else
neilt6 0:abc480f8eeab 118 value |= 0xFF00;
neilt6 0:abc480f8eeab 119 }
neilt6 0:abc480f8eeab 120
neilt6 0:abc480f8eeab 121 //Write the 16-bit register
neilt6 2:0a98e081b48c 122 write(REG_HIBRT, value);
neilt6 0:abc480f8eeab 123 }
neilt6 0:abc480f8eeab 124
neilt6 2:0a98e081b48c 125 float MAX17048::activeThreshold(void)
neilt6 0:abc480f8eeab 126 {
neilt6 0:abc480f8eeab 127 //Read the 16-bit register value
neilt6 2:0a98e081b48c 128 unsigned short value = read(REG_HIBRT);
neilt6 0:abc480f8eeab 129
neilt6 0:abc480f8eeab 130 //Extract the active threshold
neilt6 0:abc480f8eeab 131 return (value & 0x00FF) * 0.00125;
neilt6 0:abc480f8eeab 132 }
neilt6 0:abc480f8eeab 133
neilt6 2:0a98e081b48c 134 void MAX17048::activeThreshold(float threshold)
neilt6 0:abc480f8eeab 135 {
neilt6 0:abc480f8eeab 136 //Read the current 16-bit register value
neilt6 2:0a98e081b48c 137 unsigned short value = read(REG_HIBRT);
neilt6 0:abc480f8eeab 138
neilt6 0:abc480f8eeab 139 //Mask off the old value
neilt6 0:abc480f8eeab 140 value &= 0xFF00;
neilt6 0:abc480f8eeab 141
neilt6 0:abc480f8eeab 142 //Do a smart update
neilt6 0:abc480f8eeab 143 if (threshold > 0.0) {
neilt6 0:abc480f8eeab 144 if (threshold < 0.31875)
neilt6 0:abc480f8eeab 145 value |= (char)(threshold / 0.00125);
neilt6 0:abc480f8eeab 146 else
neilt6 0:abc480f8eeab 147 value |= 0x00FF;
neilt6 0:abc480f8eeab 148 }
neilt6 0:abc480f8eeab 149
neilt6 0:abc480f8eeab 150 //Write the 16-bit register
neilt6 2:0a98e081b48c 151 write(REG_HIBRT, value);
neilt6 0:abc480f8eeab 152 }
neilt6 0:abc480f8eeab 153
neilt6 2:0a98e081b48c 154 unsigned short MAX17048::version(void)
neilt6 0:abc480f8eeab 155 {
neilt6 0:abc480f8eeab 156 //Return the 16-bit production version
neilt6 2:0a98e081b48c 157 return read(REG_VERSION);
neilt6 0:abc480f8eeab 158 }
neilt6 0:abc480f8eeab 159
neilt6 2:0a98e081b48c 160 void MAX17048::tempCompensation(float temp)
neilt6 0:abc480f8eeab 161 {
neilt6 0:abc480f8eeab 162 //Calculate the new RCOMP value
neilt6 0:abc480f8eeab 163 char rcomp;
neilt6 0:abc480f8eeab 164 if (temp > 20.0) {
neilt6 2:0a98e081b48c 165 rcomp = m_RCOMP0 + (temp - 20.0) * -0.5;
neilt6 0:abc480f8eeab 166 } else {
neilt6 2:0a98e081b48c 167 rcomp = m_RCOMP0 + (temp - 20.0) * -5.0;
neilt6 0:abc480f8eeab 168 }
neilt6 0:abc480f8eeab 169
neilt6 0:abc480f8eeab 170 //Update the RCOMP value
neilt6 2:0a98e081b48c 171 writeRCOMP(rcomp);
neilt6 0:abc480f8eeab 172 }
neilt6 0:abc480f8eeab 173
neilt6 2:0a98e081b48c 174 bool MAX17048::sleeping(void)
neilt6 0:abc480f8eeab 175 {
neilt6 0:abc480f8eeab 176 //Read the 16-bit register value
neilt6 2:0a98e081b48c 177 unsigned short value = read(REG_CONFIG);
neilt6 0:abc480f8eeab 178
neilt6 0:abc480f8eeab 179 //Return the status of the SLEEP bit
neilt6 0:abc480f8eeab 180 if (value & (1 << 7))
neilt6 0:abc480f8eeab 181 return true;
neilt6 0:abc480f8eeab 182 else
neilt6 0:abc480f8eeab 183 return false;
neilt6 0:abc480f8eeab 184 }
neilt6 0:abc480f8eeab 185
neilt6 2:0a98e081b48c 186 void MAX17048::sleep(bool sleep)
neilt6 0:abc480f8eeab 187 {
neilt6 0:abc480f8eeab 188 //Read the current 16-bit register value
neilt6 2:0a98e081b48c 189 unsigned short value = read(REG_CONFIG);
neilt6 0:abc480f8eeab 190
neilt6 0:abc480f8eeab 191 //Set or clear the SLEEP bit
neilt6 0:abc480f8eeab 192 if (sleep)
neilt6 0:abc480f8eeab 193 value |= (1 << 7);
neilt6 0:abc480f8eeab 194 else
neilt6 0:abc480f8eeab 195 value &= ~(1 << 7);
neilt6 0:abc480f8eeab 196
neilt6 0:abc480f8eeab 197 //Write the value back out
neilt6 2:0a98e081b48c 198 write(REG_CONFIG, value);
neilt6 0:abc480f8eeab 199 }
neilt6 0:abc480f8eeab 200
neilt6 2:0a98e081b48c 201 bool MAX17048::socChangeAlertEnabled(void)
neilt6 0:abc480f8eeab 202 {
neilt6 0:abc480f8eeab 203 //Read the 16-bit register value
neilt6 2:0a98e081b48c 204 unsigned short value = read(REG_CONFIG);
neilt6 0:abc480f8eeab 205
neilt6 0:abc480f8eeab 206 //Return the status of the ALSC bit
neilt6 0:abc480f8eeab 207 if (value & (1 << 6))
neilt6 0:abc480f8eeab 208 return true;
neilt6 0:abc480f8eeab 209 else
neilt6 0:abc480f8eeab 210 return false;
neilt6 0:abc480f8eeab 211 }
neilt6 0:abc480f8eeab 212
neilt6 2:0a98e081b48c 213 void MAX17048::socChangeAlertEnabled(bool enabled)
neilt6 0:abc480f8eeab 214 {
neilt6 0:abc480f8eeab 215 //Read the current 16-bit register value
neilt6 2:0a98e081b48c 216 unsigned short value = read(REG_CONFIG);
neilt6 0:abc480f8eeab 217
neilt6 0:abc480f8eeab 218 //Set or clear the ALSC bit
neilt6 0:abc480f8eeab 219 if (enabled)
neilt6 0:abc480f8eeab 220 value |= (1 << 6);
neilt6 0:abc480f8eeab 221 else
neilt6 0:abc480f8eeab 222 value &= ~(1 << 6);
neilt6 0:abc480f8eeab 223
neilt6 0:abc480f8eeab 224 //Write the value back out
neilt6 2:0a98e081b48c 225 write(REG_CONFIG, value);
neilt6 0:abc480f8eeab 226 }
neilt6 0:abc480f8eeab 227
neilt6 2:0a98e081b48c 228 bool MAX17048::alerting(void)
neilt6 0:abc480f8eeab 229 {
neilt6 0:abc480f8eeab 230 //Read the 16-bit register value
neilt6 2:0a98e081b48c 231 unsigned short value = read(REG_CONFIG);
neilt6 0:abc480f8eeab 232
neilt6 0:abc480f8eeab 233 //Return the status of the ALRT bit
neilt6 0:abc480f8eeab 234 if (value & (1 << 5))
neilt6 0:abc480f8eeab 235 return true;
neilt6 0:abc480f8eeab 236 else
neilt6 0:abc480f8eeab 237 return false;
neilt6 0:abc480f8eeab 238 }
neilt6 0:abc480f8eeab 239
neilt6 0:abc480f8eeab 240 void MAX17048::clearAlert(void)
neilt6 0:abc480f8eeab 241 {
neilt6 0:abc480f8eeab 242 //Read the current 16-bit register value
neilt6 2:0a98e081b48c 243 unsigned short value = read(REG_CONFIG);
neilt6 0:abc480f8eeab 244
neilt6 0:abc480f8eeab 245 //Clear the ALRT bit
neilt6 0:abc480f8eeab 246 value &= ~(1 << 5);
neilt6 0:abc480f8eeab 247
neilt6 0:abc480f8eeab 248 //Write the value back out
neilt6 2:0a98e081b48c 249 write(REG_CONFIG, value);
neilt6 0:abc480f8eeab 250 }
neilt6 0:abc480f8eeab 251
neilt6 2:0a98e081b48c 252 char MAX17048::emptyAlertThreshold(void)
neilt6 0:abc480f8eeab 253 {
neilt6 0:abc480f8eeab 254 //Read the 16-bit register value
neilt6 2:0a98e081b48c 255 unsigned short value = read(REG_CONFIG);
neilt6 0:abc480f8eeab 256
neilt6 0:abc480f8eeab 257 //Extract the threshold
neilt6 0:abc480f8eeab 258 return 32 - (value & 0x001F);
neilt6 0:abc480f8eeab 259 }
neilt6 0:abc480f8eeab 260
neilt6 2:0a98e081b48c 261 void MAX17048::emptyAlertThreshold(char threshold)
neilt6 0:abc480f8eeab 262 {
neilt6 0:abc480f8eeab 263 //Read the current 16-bit register value
neilt6 2:0a98e081b48c 264 unsigned short value = read(REG_CONFIG);
neilt6 0:abc480f8eeab 265
neilt6 0:abc480f8eeab 266 //Range check threshold
neilt6 0:abc480f8eeab 267 if (threshold < 1)
neilt6 0:abc480f8eeab 268 threshold = 1;
neilt6 0:abc480f8eeab 269 else if (threshold > 32)
neilt6 0:abc480f8eeab 270 threshold = 32;
neilt6 0:abc480f8eeab 271
neilt6 0:abc480f8eeab 272 //Update the register value
neilt6 0:abc480f8eeab 273 value &= 0xFFE0;
neilt6 0:abc480f8eeab 274 value |= 32 - threshold;
neilt6 0:abc480f8eeab 275
neilt6 0:abc480f8eeab 276 //Write the 16-bit register
neilt6 2:0a98e081b48c 277 write(REG_CONFIG, value);
neilt6 0:abc480f8eeab 278 }
neilt6 0:abc480f8eeab 279
neilt6 2:0a98e081b48c 280 float MAX17048::vAlertMinThreshold(void)
neilt6 0:abc480f8eeab 281 {
neilt6 0:abc480f8eeab 282 //Read the 16-bit register value
neilt6 2:0a98e081b48c 283 unsigned short value = read(REG_VALRT);
neilt6 0:abc480f8eeab 284
neilt6 0:abc480f8eeab 285 //Extract the alert threshold
neilt6 0:abc480f8eeab 286 return (value >> 8) * 0.02;
neilt6 0:abc480f8eeab 287 }
neilt6 0:abc480f8eeab 288
neilt6 2:0a98e081b48c 289 void MAX17048::vAlertMinThreshold(float threshold)
neilt6 0:abc480f8eeab 290 {
neilt6 0:abc480f8eeab 291 //Read the current 16-bit register value
neilt6 2:0a98e081b48c 292 unsigned short value = read(REG_VALRT);
neilt6 0:abc480f8eeab 293
neilt6 0:abc480f8eeab 294 //Mask off the old value
neilt6 0:abc480f8eeab 295 value &= 0x00FF;
neilt6 0:abc480f8eeab 296
neilt6 0:abc480f8eeab 297 //Do a smart update
neilt6 0:abc480f8eeab 298 if (threshold > 0.0) {
neilt6 0:abc480f8eeab 299 if (threshold < 5.1)
neilt6 0:abc480f8eeab 300 value |= (unsigned short)(threshold / 0.02) << 8;
neilt6 0:abc480f8eeab 301 else
neilt6 0:abc480f8eeab 302 value |= 0xFF00;
neilt6 0:abc480f8eeab 303 }
neilt6 0:abc480f8eeab 304
neilt6 0:abc480f8eeab 305 //Write the 16-bit register
neilt6 2:0a98e081b48c 306 write(REG_VALRT, value);
neilt6 0:abc480f8eeab 307 }
neilt6 0:abc480f8eeab 308
neilt6 2:0a98e081b48c 309 float MAX17048::vAlertMaxThreshold(void)
neilt6 0:abc480f8eeab 310 {
neilt6 0:abc480f8eeab 311 //Read the 16-bit register value
neilt6 2:0a98e081b48c 312 unsigned short value = read(REG_VALRT);
neilt6 0:abc480f8eeab 313
neilt6 0:abc480f8eeab 314 //Extract the active threshold
neilt6 0:abc480f8eeab 315 return (value & 0x00FF) * 0.02;
neilt6 0:abc480f8eeab 316 }
neilt6 0:abc480f8eeab 317
neilt6 2:0a98e081b48c 318 void MAX17048::vAlertMaxThreshold(float threshold)
neilt6 0:abc480f8eeab 319 {
neilt6 0:abc480f8eeab 320 //Read the current 16-bit register value
neilt6 2:0a98e081b48c 321 unsigned short value = read(REG_VALRT);
neilt6 0:abc480f8eeab 322
neilt6 0:abc480f8eeab 323 //Mask off the old value
neilt6 0:abc480f8eeab 324 value &= 0xFF00;
neilt6 0:abc480f8eeab 325
neilt6 0:abc480f8eeab 326 //Do a smart update
neilt6 0:abc480f8eeab 327 if (threshold > 0.0) {
neilt6 0:abc480f8eeab 328 if (threshold < 5.1)
neilt6 0:abc480f8eeab 329 value |= (char)(threshold / 0.02);
neilt6 0:abc480f8eeab 330 else
neilt6 0:abc480f8eeab 331 value |= 0x00FF;
neilt6 0:abc480f8eeab 332 }
neilt6 0:abc480f8eeab 333
neilt6 0:abc480f8eeab 334 //Write the 16-bit register
neilt6 2:0a98e081b48c 335 write(REG_VALRT, value);
neilt6 0:abc480f8eeab 336 }
neilt6 0:abc480f8eeab 337
neilt6 2:0a98e081b48c 338 float MAX17048::vResetThreshold(void)
neilt6 0:abc480f8eeab 339 {
neilt6 0:abc480f8eeab 340 //Read the 16-bit register value
neilt6 2:0a98e081b48c 341 unsigned short value = read(REG_VRESET_ID);
neilt6 0:abc480f8eeab 342
neilt6 0:abc480f8eeab 343 //Extract the threshold
neilt6 0:abc480f8eeab 344 return (value >> 9) * 0.04;
neilt6 0:abc480f8eeab 345 }
neilt6 0:abc480f8eeab 346
neilt6 2:0a98e081b48c 347 void MAX17048::vResetThreshold(float threshold)
neilt6 0:abc480f8eeab 348 {
neilt6 0:abc480f8eeab 349 //Read the current 16-bit register value
neilt6 2:0a98e081b48c 350 unsigned short value = read(REG_VRESET_ID);
neilt6 0:abc480f8eeab 351
neilt6 0:abc480f8eeab 352 //Mask off the old value
neilt6 0:abc480f8eeab 353 value &= 0x01FF;
neilt6 0:abc480f8eeab 354
neilt6 0:abc480f8eeab 355 //Do a smart update
neilt6 0:abc480f8eeab 356 if (threshold > 0.0) {
neilt6 0:abc480f8eeab 357 if (threshold < 5.08)
neilt6 0:abc480f8eeab 358 value |= (unsigned short)(threshold / 0.04) << 9;
neilt6 0:abc480f8eeab 359 else
neilt6 0:abc480f8eeab 360 value |= 0xFE00;
neilt6 0:abc480f8eeab 361 }
neilt6 0:abc480f8eeab 362
neilt6 0:abc480f8eeab 363 //Write the 16-bit register
neilt6 2:0a98e081b48c 364 write(REG_VRESET_ID, value);
neilt6 0:abc480f8eeab 365 }
neilt6 0:abc480f8eeab 366
neilt6 2:0a98e081b48c 367 bool MAX17048::comparatorEnabled(void)
neilt6 0:abc480f8eeab 368 {
neilt6 0:abc480f8eeab 369 //Read the 16-bit register value
neilt6 2:0a98e081b48c 370 unsigned short value = read(REG_VRESET_ID);
neilt6 0:abc480f8eeab 371
neilt6 0:abc480f8eeab 372 //Return the status of the Dis bit
neilt6 0:abc480f8eeab 373 if (value & (1 << 8))
neilt6 0:abc480f8eeab 374 return false;
neilt6 0:abc480f8eeab 375 else
neilt6 0:abc480f8eeab 376 return true;
neilt6 0:abc480f8eeab 377 }
neilt6 0:abc480f8eeab 378
neilt6 2:0a98e081b48c 379 void MAX17048::comparatorEnabled(bool enabled)
neilt6 0:abc480f8eeab 380 {
neilt6 0:abc480f8eeab 381 //Read the current 16-bit register value
neilt6 2:0a98e081b48c 382 unsigned short value = read(REG_VRESET_ID);
neilt6 0:abc480f8eeab 383
neilt6 0:abc480f8eeab 384 //Set or clear the Dis bit
neilt6 0:abc480f8eeab 385 if (enabled)
neilt6 0:abc480f8eeab 386 value &= ~(1 << 8);
neilt6 0:abc480f8eeab 387 else
neilt6 0:abc480f8eeab 388 value |= (1 << 8);
neilt6 0:abc480f8eeab 389
neilt6 0:abc480f8eeab 390 //Write the value back out
neilt6 2:0a98e081b48c 391 write(REG_VRESET_ID, value);
neilt6 0:abc480f8eeab 392 }
neilt6 0:abc480f8eeab 393
neilt6 2:0a98e081b48c 394 char MAX17048::id(void)
neilt6 0:abc480f8eeab 395 {
neilt6 0:abc480f8eeab 396 //Read the 16-bit register value
neilt6 2:0a98e081b48c 397 unsigned short value = read(REG_VRESET_ID);
neilt6 0:abc480f8eeab 398
neilt6 0:abc480f8eeab 399 //Return only the ID bits
neilt6 0:abc480f8eeab 400 return value;
neilt6 0:abc480f8eeab 401 }
neilt6 0:abc480f8eeab 402
neilt6 2:0a98e081b48c 403 bool MAX17048::vResetAlertEnabled(void)
neilt6 0:abc480f8eeab 404 {
neilt6 0:abc480f8eeab 405 //Read the 16-bit register value
neilt6 2:0a98e081b48c 406 unsigned short value = read(REG_STATUS);
neilt6 0:abc480f8eeab 407
neilt6 0:abc480f8eeab 408 //Return the status of the EnVR bit
neilt6 0:abc480f8eeab 409 if (value & (1 << 14))
neilt6 0:abc480f8eeab 410 return true;
neilt6 0:abc480f8eeab 411 else
neilt6 0:abc480f8eeab 412 return false;
neilt6 0:abc480f8eeab 413 }
neilt6 0:abc480f8eeab 414
neilt6 2:0a98e081b48c 415 void MAX17048::vResetAlertEnabled(bool enabled)
neilt6 0:abc480f8eeab 416 {
neilt6 0:abc480f8eeab 417 //Read the current 16-bit register value
neilt6 2:0a98e081b48c 418 unsigned short value = read(REG_STATUS);
neilt6 0:abc480f8eeab 419
neilt6 0:abc480f8eeab 420 //Set or clear the EnVR bit
neilt6 0:abc480f8eeab 421 if (enabled)
neilt6 0:abc480f8eeab 422 value |= (1 << 14);
neilt6 0:abc480f8eeab 423 else
neilt6 0:abc480f8eeab 424 value &= ~(1 << 14);
neilt6 0:abc480f8eeab 425
neilt6 0:abc480f8eeab 426 //Write the value back out
neilt6 2:0a98e081b48c 427 write(REG_STATUS, value);
neilt6 0:abc480f8eeab 428 }
neilt6 0:abc480f8eeab 429
neilt6 2:0a98e081b48c 430 char MAX17048::alertFlags(void)
neilt6 0:abc480f8eeab 431 {
neilt6 0:abc480f8eeab 432 //Read the 16-bit register value
neilt6 2:0a98e081b48c 433 unsigned short value = read(REG_STATUS);
neilt6 0:abc480f8eeab 434
neilt6 0:abc480f8eeab 435 //Return only the flag bits
neilt6 0:abc480f8eeab 436 return (value >> 8) & 0x3F;
neilt6 0:abc480f8eeab 437 }
neilt6 0:abc480f8eeab 438
neilt6 0:abc480f8eeab 439 void MAX17048::clearAlertFlags(char flags)
neilt6 0:abc480f8eeab 440 {
neilt6 0:abc480f8eeab 441 //Read the current 16-bit register value
neilt6 2:0a98e081b48c 442 unsigned short value = read(REG_STATUS);
neilt6 0:abc480f8eeab 443
neilt6 0:abc480f8eeab 444 //Clear the specified flag bits
neilt6 0:abc480f8eeab 445 value &= ~((flags & 0x3F) << 8);
neilt6 0:abc480f8eeab 446
neilt6 0:abc480f8eeab 447 //Write the value back out
neilt6 2:0a98e081b48c 448 write(REG_STATUS, value);
neilt6 0:abc480f8eeab 449 }
neilt6 0:abc480f8eeab 450
neilt6 2:0a98e081b48c 451 float MAX17048::vcell(void)
neilt6 0:abc480f8eeab 452 {
neilt6 0:abc480f8eeab 453 //Read the 16-bit raw Vcell value
neilt6 2:0a98e081b48c 454 unsigned short value = read(REG_VCELL);
neilt6 0:abc480f8eeab 455
neilt6 0:abc480f8eeab 456 //Return Vcell in volts
neilt6 0:abc480f8eeab 457 return value * 0.000078125;
neilt6 0:abc480f8eeab 458 }
neilt6 0:abc480f8eeab 459
neilt6 2:0a98e081b48c 460 float MAX17048::soc(void)
neilt6 0:abc480f8eeab 461 {
neilt6 0:abc480f8eeab 462 //Read the 16-bit raw SOC value
neilt6 2:0a98e081b48c 463 unsigned short value = read(REG_SOC);
neilt6 0:abc480f8eeab 464
neilt6 0:abc480f8eeab 465 //Return SOC in percent
neilt6 0:abc480f8eeab 466 return value * 0.00390625;
neilt6 0:abc480f8eeab 467 }
neilt6 0:abc480f8eeab 468
neilt6 4:e61b2723d2cf 469 int MAX17048::socInt(void)
neilt6 4:e61b2723d2cf 470 {
neilt6 4:e61b2723d2cf 471 //Read the 16-bit raw SOC value
neilt6 4:e61b2723d2cf 472 unsigned short value = read(REG_SOC);
neilt6 4:e61b2723d2cf 473
neilt6 4:e61b2723d2cf 474 //Return only the top byte
neilt6 4:e61b2723d2cf 475 return value >> 8;
neilt6 4:e61b2723d2cf 476 }
neilt6 4:e61b2723d2cf 477
neilt6 2:0a98e081b48c 478 float MAX17048::crate(void)
neilt6 0:abc480f8eeab 479 {
neilt6 0:abc480f8eeab 480 //Read the 16-bit raw C/Rate value
neilt6 2:0a98e081b48c 481 short value = read(REG_CRATE);
neilt6 0:abc480f8eeab 482
neilt6 0:abc480f8eeab 483 //Return C/Rate in %/hr
neilt6 0:abc480f8eeab 484 return value * 0.208;
neilt6 0:abc480f8eeab 485 }
neilt6 0:abc480f8eeab 486
neilt6 2:0a98e081b48c 487 unsigned short MAX17048::read(char reg)
neilt6 0:abc480f8eeab 488 {
neilt6 0:abc480f8eeab 489 //Create a temporary buffer
neilt6 0:abc480f8eeab 490 char buff[2];
neilt6 0:abc480f8eeab 491
neilt6 0:abc480f8eeab 492 //Select the register
neilt6 2:0a98e081b48c 493 m_I2C.write(m_ADDR, &reg, 1);
neilt6 0:abc480f8eeab 494
neilt6 0:abc480f8eeab 495 //Read the 16-bit register
neilt6 2:0a98e081b48c 496 m_I2C.read(m_ADDR, buff, 2);
neilt6 0:abc480f8eeab 497
neilt6 0:abc480f8eeab 498 //Return the combined 16-bit value
neilt6 0:abc480f8eeab 499 return (buff[0] << 8) | buff[1];
neilt6 0:abc480f8eeab 500 }
neilt6 0:abc480f8eeab 501
neilt6 2:0a98e081b48c 502 void MAX17048::write(char reg, unsigned short data)
neilt6 0:abc480f8eeab 503 {
neilt6 0:abc480f8eeab 504 //Create a temporary buffer
neilt6 0:abc480f8eeab 505 char buff[3];
neilt6 0:abc480f8eeab 506
neilt6 0:abc480f8eeab 507 //Load the register address and 16-bit data
neilt6 0:abc480f8eeab 508 buff[0] = reg;
neilt6 0:abc480f8eeab 509 buff[1] = data >> 8;
neilt6 0:abc480f8eeab 510 buff[2] = data;
neilt6 0:abc480f8eeab 511
neilt6 0:abc480f8eeab 512 //Write the data
neilt6 2:0a98e081b48c 513 m_I2C.write(m_ADDR, buff, 3);
neilt6 0:abc480f8eeab 514 }
neilt6 0:abc480f8eeab 515
neilt6 2:0a98e081b48c 516 void MAX17048::writeRCOMP(char rcomp)
neilt6 0:abc480f8eeab 517 {
neilt6 0:abc480f8eeab 518 //Read the current 16-bit register value
neilt6 2:0a98e081b48c 519 unsigned short value = read(REG_CONFIG);
neilt6 0:abc480f8eeab 520
neilt6 0:abc480f8eeab 521 //Update the register value
neilt6 0:abc480f8eeab 522 value &= 0x00FF;
neilt6 0:abc480f8eeab 523 value |= rcomp << 8;
neilt6 0:abc480f8eeab 524
neilt6 0:abc480f8eeab 525 //Write the value back out
neilt6 2:0a98e081b48c 526 write(REG_CONFIG, value);
neilt6 0:abc480f8eeab 527 }