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 14 04:52:16 2013 +0000
Revision:
2:0a98e081b48c
Parent:
0:abc480f8eeab
Child:
3:32087cca331f
Modified library so as to be more compliant with C++ conventions

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 2:0a98e081b48c 20 MAX17048::MAX17048(PinName sda, PinName scl) : m_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 2:0a98e081b48c 28 write(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 2:0a98e081b48c 34 unsigned short value = read(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 2:0a98e081b48c 40 write(REG_MODE, value);
neilt6 0:abc480f8eeab 41 }
neilt6 0:abc480f8eeab 42
neilt6 2:0a98e081b48c 43 bool MAX17048::sleepEnabled(void)
neilt6 0:abc480f8eeab 44 {
neilt6 0:abc480f8eeab 45 //Read the 16-bit register value
neilt6 2:0a98e081b48c 46 unsigned short value = read(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 2:0a98e081b48c 55 void MAX17048::sleepEnabled(bool enabled)
neilt6 0:abc480f8eeab 56 {
neilt6 0:abc480f8eeab 57 //Read the current 16-bit register value
neilt6 2:0a98e081b48c 58 unsigned short value = read(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 2:0a98e081b48c 67 write(REG_MODE, value);
neilt6 0:abc480f8eeab 68 }
neilt6 0:abc480f8eeab 69
neilt6 2:0a98e081b48c 70 bool MAX17048::hibernating(void)
neilt6 0:abc480f8eeab 71 {
neilt6 0:abc480f8eeab 72 //Read the 16-bit register value
neilt6 2:0a98e081b48c 73 unsigned short value = read(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 2:0a98e081b48c 82 float MAX17048::hibernateThreshold(void)
neilt6 0:abc480f8eeab 83 {
neilt6 0:abc480f8eeab 84 //Read the 16-bit register value
neilt6 2:0a98e081b48c 85 unsigned short value = read(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 2:0a98e081b48c 91 void MAX17048::hibernateThreshold(float threshold)
neilt6 0:abc480f8eeab 92 {
neilt6 0:abc480f8eeab 93 //Read the current 16-bit register value
neilt6 2:0a98e081b48c 94 unsigned short value = read(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 2:0a98e081b48c 108 write(REG_HIBRT, value);
neilt6 0:abc480f8eeab 109 }
neilt6 0:abc480f8eeab 110
neilt6 2:0a98e081b48c 111 float MAX17048::activeThreshold(void)
neilt6 0:abc480f8eeab 112 {
neilt6 0:abc480f8eeab 113 //Read the 16-bit register value
neilt6 2:0a98e081b48c 114 unsigned short value = read(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 2:0a98e081b48c 120 void MAX17048::activeThreshold(float threshold)
neilt6 0:abc480f8eeab 121 {
neilt6 0:abc480f8eeab 122 //Read the current 16-bit register value
neilt6 2:0a98e081b48c 123 unsigned short value = read(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 2:0a98e081b48c 137 write(REG_HIBRT, value);
neilt6 0:abc480f8eeab 138 }
neilt6 0:abc480f8eeab 139
neilt6 2:0a98e081b48c 140 unsigned short MAX17048::version(void)
neilt6 0:abc480f8eeab 141 {
neilt6 0:abc480f8eeab 142 //Return the 16-bit production version
neilt6 2:0a98e081b48c 143 return read(REG_VERSION);
neilt6 0:abc480f8eeab 144 }
neilt6 0:abc480f8eeab 145
neilt6 2:0a98e081b48c 146 void MAX17048::tempCompensation(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 2:0a98e081b48c 151 rcomp = m_RCOMP0 + (temp - 20.0) * -0.5;
neilt6 0:abc480f8eeab 152 } else {
neilt6 2:0a98e081b48c 153 rcomp = m_RCOMP0 + (temp - 20.0) * -5.0;
neilt6 0:abc480f8eeab 154 }
neilt6 0:abc480f8eeab 155
neilt6 0:abc480f8eeab 156 //Update the RCOMP value
neilt6 2:0a98e081b48c 157 writeRCOMP(rcomp);
neilt6 0:abc480f8eeab 158 }
neilt6 0:abc480f8eeab 159
neilt6 2:0a98e081b48c 160 bool MAX17048::sleeping(void)
neilt6 0:abc480f8eeab 161 {
neilt6 0:abc480f8eeab 162 //Read the 16-bit register value
neilt6 2:0a98e081b48c 163 unsigned short value = read(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 2:0a98e081b48c 172 void MAX17048::sleep(bool sleep)
neilt6 0:abc480f8eeab 173 {
neilt6 0:abc480f8eeab 174 //Read the current 16-bit register value
neilt6 2:0a98e081b48c 175 unsigned short value = read(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 2:0a98e081b48c 184 write(REG_CONFIG, value);
neilt6 0:abc480f8eeab 185 }
neilt6 0:abc480f8eeab 186
neilt6 2:0a98e081b48c 187 bool MAX17048::socChangeAlertEnabled(void)
neilt6 0:abc480f8eeab 188 {
neilt6 0:abc480f8eeab 189 //Read the 16-bit register value
neilt6 2:0a98e081b48c 190 unsigned short value = read(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 2:0a98e081b48c 199 void MAX17048::socChangeAlertEnabled(bool enabled)
neilt6 0:abc480f8eeab 200 {
neilt6 0:abc480f8eeab 201 //Read the current 16-bit register value
neilt6 2:0a98e081b48c 202 unsigned short value = read(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 2:0a98e081b48c 211 write(REG_CONFIG, value);
neilt6 0:abc480f8eeab 212 }
neilt6 0:abc480f8eeab 213
neilt6 2:0a98e081b48c 214 bool MAX17048::alerting(void)
neilt6 0:abc480f8eeab 215 {
neilt6 0:abc480f8eeab 216 //Read the 16-bit register value
neilt6 2:0a98e081b48c 217 unsigned short value = read(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 2:0a98e081b48c 229 unsigned short value = read(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 2:0a98e081b48c 235 write(REG_CONFIG, value);
neilt6 0:abc480f8eeab 236 }
neilt6 0:abc480f8eeab 237
neilt6 2:0a98e081b48c 238 char MAX17048::emptyAlertThreshold(void)
neilt6 0:abc480f8eeab 239 {
neilt6 0:abc480f8eeab 240 //Read the 16-bit register value
neilt6 2:0a98e081b48c 241 unsigned short value = read(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 2:0a98e081b48c 247 void MAX17048::emptyAlertThreshold(char threshold)
neilt6 0:abc480f8eeab 248 {
neilt6 0:abc480f8eeab 249 //Read the current 16-bit register value
neilt6 2:0a98e081b48c 250 unsigned short value = read(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 2:0a98e081b48c 263 write(REG_CONFIG, value);
neilt6 0:abc480f8eeab 264 }
neilt6 0:abc480f8eeab 265
neilt6 2:0a98e081b48c 266 float MAX17048::vAlertMinThreshold(void)
neilt6 0:abc480f8eeab 267 {
neilt6 0:abc480f8eeab 268 //Read the 16-bit register value
neilt6 2:0a98e081b48c 269 unsigned short value = read(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 2:0a98e081b48c 275 void MAX17048::vAlertMinThreshold(float threshold)
neilt6 0:abc480f8eeab 276 {
neilt6 0:abc480f8eeab 277 //Read the current 16-bit register value
neilt6 2:0a98e081b48c 278 unsigned short value = read(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 2:0a98e081b48c 292 write(REG_VALRT, value);
neilt6 0:abc480f8eeab 293 }
neilt6 0:abc480f8eeab 294
neilt6 2:0a98e081b48c 295 float MAX17048::vAlertMaxThreshold(void)
neilt6 0:abc480f8eeab 296 {
neilt6 0:abc480f8eeab 297 //Read the 16-bit register value
neilt6 2:0a98e081b48c 298 unsigned short value = read(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 2:0a98e081b48c 304 void MAX17048::vAlertMaxThreshold(float threshold)
neilt6 0:abc480f8eeab 305 {
neilt6 0:abc480f8eeab 306 //Read the current 16-bit register value
neilt6 2:0a98e081b48c 307 unsigned short value = read(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 2:0a98e081b48c 321 write(REG_VALRT, value);
neilt6 0:abc480f8eeab 322 }
neilt6 0:abc480f8eeab 323
neilt6 2:0a98e081b48c 324 float MAX17048::vResetThreshold(void)
neilt6 0:abc480f8eeab 325 {
neilt6 0:abc480f8eeab 326 //Read the 16-bit register value
neilt6 2:0a98e081b48c 327 unsigned short value = read(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 2:0a98e081b48c 333 void MAX17048::vResetThreshold(float threshold)
neilt6 0:abc480f8eeab 334 {
neilt6 0:abc480f8eeab 335 //Read the current 16-bit register value
neilt6 2:0a98e081b48c 336 unsigned short value = read(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 2:0a98e081b48c 350 write(REG_VRESET_ID, value);
neilt6 0:abc480f8eeab 351 }
neilt6 0:abc480f8eeab 352
neilt6 2:0a98e081b48c 353 bool MAX17048::comparatorEnabled(void)
neilt6 0:abc480f8eeab 354 {
neilt6 0:abc480f8eeab 355 //Read the 16-bit register value
neilt6 2:0a98e081b48c 356 unsigned short value = read(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 2:0a98e081b48c 365 void MAX17048::comparatorEnabled(bool enabled)
neilt6 0:abc480f8eeab 366 {
neilt6 0:abc480f8eeab 367 //Read the current 16-bit register value
neilt6 2:0a98e081b48c 368 unsigned short value = read(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 2:0a98e081b48c 377 write(REG_VRESET_ID, value);
neilt6 0:abc480f8eeab 378 }
neilt6 0:abc480f8eeab 379
neilt6 2:0a98e081b48c 380 char MAX17048::id(void)
neilt6 0:abc480f8eeab 381 {
neilt6 0:abc480f8eeab 382 //Read the 16-bit register value
neilt6 2:0a98e081b48c 383 unsigned short value = read(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 2:0a98e081b48c 389 bool MAX17048::vResetAlertEnabled(void)
neilt6 0:abc480f8eeab 390 {
neilt6 0:abc480f8eeab 391 //Read the 16-bit register value
neilt6 2:0a98e081b48c 392 unsigned short value = read(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 2:0a98e081b48c 401 void MAX17048::vResetAlertEnabled(bool enabled)
neilt6 0:abc480f8eeab 402 {
neilt6 0:abc480f8eeab 403 //Read the current 16-bit register value
neilt6 2:0a98e081b48c 404 unsigned short value = read(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 2:0a98e081b48c 413 write(REG_STATUS, value);
neilt6 0:abc480f8eeab 414 }
neilt6 0:abc480f8eeab 415
neilt6 2:0a98e081b48c 416 char MAX17048::alertFlags(void)
neilt6 0:abc480f8eeab 417 {
neilt6 0:abc480f8eeab 418 //Read the 16-bit register value
neilt6 2:0a98e081b48c 419 unsigned short value = read(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 2:0a98e081b48c 428 unsigned short value = read(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 2:0a98e081b48c 434 write(REG_STATUS, value);
neilt6 0:abc480f8eeab 435 }
neilt6 0:abc480f8eeab 436
neilt6 2:0a98e081b48c 437 float MAX17048::vcell(void)
neilt6 0:abc480f8eeab 438 {
neilt6 0:abc480f8eeab 439 //Read the 16-bit raw Vcell value
neilt6 2:0a98e081b48c 440 unsigned short value = read(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 2:0a98e081b48c 446 float MAX17048::soc(void)
neilt6 0:abc480f8eeab 447 {
neilt6 0:abc480f8eeab 448 //Read the 16-bit raw SOC value
neilt6 2:0a98e081b48c 449 unsigned short value = read(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 2:0a98e081b48c 455 float MAX17048::crate(void)
neilt6 0:abc480f8eeab 456 {
neilt6 0:abc480f8eeab 457 //Read the 16-bit raw C/Rate value
neilt6 2:0a98e081b48c 458 short value = read(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 2:0a98e081b48c 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 2:0a98e081b48c 470 m_I2C.write(m_ADDR, &reg, 1);
neilt6 0:abc480f8eeab 471
neilt6 0:abc480f8eeab 472 //Read the 16-bit register
neilt6 2:0a98e081b48c 473 m_I2C.read(m_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 2:0a98e081b48c 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 2:0a98e081b48c 490 m_I2C.write(m_ADDR, buff, 3);
neilt6 0:abc480f8eeab 491 }
neilt6 0:abc480f8eeab 492
neilt6 2:0a98e081b48c 493 void MAX17048::writeRCOMP(char rcomp)
neilt6 0:abc480f8eeab 494 {
neilt6 0:abc480f8eeab 495 //Read the current 16-bit register value
neilt6 2:0a98e081b48c 496 unsigned short value = read(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 2:0a98e081b48c 503 write(REG_CONFIG, value);
neilt6 0:abc480f8eeab 504 }