This class provides APIs to all of the registers of the TI BQ24295 battery charger chip, as used on the u-blox C030 board. This class is not required to charge a battery connected to the C030 board, charging will begin automatically when a battery is connected. This class is only required if the user wishes to monitor the charger's state or change the charger's settings. The caller should instantiate an I2C interface and pass this to init(), which will initialise the chip and place it into its lowest power state. The chip may then be configured using the API calls. Once the chip is configured, battery charging can be enabled. If battery charging is disabled the chip will once more be put into its lowest power state.

Dependents:   example-battery-charger-bq24295 example-C030-out-of-box-demo example-C030-out-of-box-demo Amit

Committer:
rob.meades@u-blox.com
Date:
Mon Apr 10 11:04:15 2017 +0100
Revision:
1:ed57b6ca43ab
Child:
2:f0bbe0269d67
Add files to repo, removing README.md as that description is now in the repo description of the on-line IDE.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rob.meades@u-blox.com 1:ed57b6ca43ab 1 /* mbed Microcontroller Library
rob.meades@u-blox.com 1:ed57b6ca43ab 2 * Copyright (c) 2017 u-blox
rob.meades@u-blox.com 1:ed57b6ca43ab 3 *
rob.meades@u-blox.com 1:ed57b6ca43ab 4 * Licensed under the Apache License, Version 2.0 (the "License");
rob.meades@u-blox.com 1:ed57b6ca43ab 5 * you may not use this file except in compliance with the License.
rob.meades@u-blox.com 1:ed57b6ca43ab 6 * You may obtain a copy of the License at
rob.meades@u-blox.com 1:ed57b6ca43ab 7 *
rob.meades@u-blox.com 1:ed57b6ca43ab 8 * http://www.apache.org/licenses/LICENSE-2.0
rob.meades@u-blox.com 1:ed57b6ca43ab 9 *
rob.meades@u-blox.com 1:ed57b6ca43ab 10 * Unless required by applicable law or agreed to in writing, software
rob.meades@u-blox.com 1:ed57b6ca43ab 11 * distributed under the License is distributed on an "AS IS" BASIS,
rob.meades@u-blox.com 1:ed57b6ca43ab 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rob.meades@u-blox.com 1:ed57b6ca43ab 13 * See the License for the specific language governing permissions and
rob.meades@u-blox.com 1:ed57b6ca43ab 14 * limitations under the License.
rob.meades@u-blox.com 1:ed57b6ca43ab 15 */
rob.meades@u-blox.com 1:ed57b6ca43ab 16
rob.meades@u-blox.com 1:ed57b6ca43ab 17 /**
rob.meades@u-blox.com 1:ed57b6ca43ab 18 * @file bq24295.cpp
rob.meades@u-blox.com 1:ed57b6ca43ab 19 * This file defines the API to the TI BQ24295 battery charging chip.
rob.meades@u-blox.com 1:ed57b6ca43ab 20 */
rob.meades@u-blox.com 1:ed57b6ca43ab 21
rob.meades@u-blox.com 1:ed57b6ca43ab 22 // Define this to print debug information
rob.meades@u-blox.com 1:ed57b6ca43ab 23 //#define DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 24
rob.meades@u-blox.com 1:ed57b6ca43ab 25 #include <mbed.h>
rob.meades@u-blox.com 1:ed57b6ca43ab 26 #include <battery_charger_bq24295.h>
rob.meades@u-blox.com 1:ed57b6ca43ab 27
rob.meades@u-blox.com 1:ed57b6ca43ab 28 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 29 # include <stdio.h>
rob.meades@u-blox.com 1:ed57b6ca43ab 30 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 31
rob.meades@u-blox.com 1:ed57b6ca43ab 32 // ----------------------------------------------------------------
rob.meades@u-blox.com 1:ed57b6ca43ab 33 // COMPILE-TIME MACROS
rob.meades@u-blox.com 1:ed57b6ca43ab 34 // ----------------------------------------------------------------
rob.meades@u-blox.com 1:ed57b6ca43ab 35
rob.meades@u-blox.com 1:ed57b6ca43ab 36 // ----------------------------------------------------------------
rob.meades@u-blox.com 1:ed57b6ca43ab 37 // PRIVATE VARIABLES
rob.meades@u-blox.com 1:ed57b6ca43ab 38 // ----------------------------------------------------------------
rob.meades@u-blox.com 1:ed57b6ca43ab 39
rob.meades@u-blox.com 1:ed57b6ca43ab 40 // ----------------------------------------------------------------
rob.meades@u-blox.com 1:ed57b6ca43ab 41 // GENERIC PRIVATE FUNCTIONS
rob.meades@u-blox.com 1:ed57b6ca43ab 42 // ----------------------------------------------------------------
rob.meades@u-blox.com 1:ed57b6ca43ab 43
rob.meades@u-blox.com 1:ed57b6ca43ab 44 /// Read from a register.
rob.meades@u-blox.com 1:ed57b6ca43ab 45 bool BatteryChargerBq24295::getRegister(char address, char *pValue)
rob.meades@u-blox.com 1:ed57b6ca43ab 46 {
rob.meades@u-blox.com 1:ed57b6ca43ab 47 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 48
rob.meades@u-blox.com 1:ed57b6ca43ab 49 if (gpI2c != NULL) {
rob.meades@u-blox.com 1:ed57b6ca43ab 50 // Move the address pointer
rob.meades@u-blox.com 1:ed57b6ca43ab 51 if (gpI2c->write(gAddress, &address, 1) == 0) {
rob.meades@u-blox.com 1:ed57b6ca43ab 52 if (pValue != NULL) {
rob.meades@u-blox.com 1:ed57b6ca43ab 53 // Read from the address
rob.meades@u-blox.com 1:ed57b6ca43ab 54 if (gpI2c->read(gAddress, pValue, 1) == 0) {
rob.meades@u-blox.com 1:ed57b6ca43ab 55 success = true;
rob.meades@u-blox.com 1:ed57b6ca43ab 56 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 57 printf("BatteryChargerBq24295 (I2C 0x%02x): read 0x%02x from register 0x%02x.\r\n", gAddress >> 1, *pValue, address);
rob.meades@u-blox.com 1:ed57b6ca43ab 58 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 59 }
rob.meades@u-blox.com 1:ed57b6ca43ab 60 } else {
rob.meades@u-blox.com 1:ed57b6ca43ab 61 success = true;
rob.meades@u-blox.com 1:ed57b6ca43ab 62 }
rob.meades@u-blox.com 1:ed57b6ca43ab 63 }
rob.meades@u-blox.com 1:ed57b6ca43ab 64 }
rob.meades@u-blox.com 1:ed57b6ca43ab 65
rob.meades@u-blox.com 1:ed57b6ca43ab 66 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 67 }
rob.meades@u-blox.com 1:ed57b6ca43ab 68
rob.meades@u-blox.com 1:ed57b6ca43ab 69 /// Write to a register.
rob.meades@u-blox.com 1:ed57b6ca43ab 70 bool BatteryChargerBq24295::setRegister(char address, char value)
rob.meades@u-blox.com 1:ed57b6ca43ab 71 {
rob.meades@u-blox.com 1:ed57b6ca43ab 72 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 73 char data[2];
rob.meades@u-blox.com 1:ed57b6ca43ab 74
rob.meades@u-blox.com 1:ed57b6ca43ab 75 if (gpI2c != NULL) {
rob.meades@u-blox.com 1:ed57b6ca43ab 76 data[0] = address;
rob.meades@u-blox.com 1:ed57b6ca43ab 77 data[1] = value;
rob.meades@u-blox.com 1:ed57b6ca43ab 78 if (gpI2c->write(gAddress, &(data[0]), 2) == 0) {
rob.meades@u-blox.com 1:ed57b6ca43ab 79 success = true;
rob.meades@u-blox.com 1:ed57b6ca43ab 80 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 81 printf("BatteryChargerBq24295 (I2C 0x%02x): wrote 0x%02x to register 0x%02x.\r\n", gAddress >> 1, value, address);
rob.meades@u-blox.com 1:ed57b6ca43ab 82 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 83 }
rob.meades@u-blox.com 1:ed57b6ca43ab 84 }
rob.meades@u-blox.com 1:ed57b6ca43ab 85
rob.meades@u-blox.com 1:ed57b6ca43ab 86 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 87 }
rob.meades@u-blox.com 1:ed57b6ca43ab 88
rob.meades@u-blox.com 1:ed57b6ca43ab 89 /// Set a mask of bits in a register.
rob.meades@u-blox.com 1:ed57b6ca43ab 90 bool BatteryChargerBq24295::setRegisterBits(char address, char mask)
rob.meades@u-blox.com 1:ed57b6ca43ab 91 {
rob.meades@u-blox.com 1:ed57b6ca43ab 92 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 93 char value;
rob.meades@u-blox.com 1:ed57b6ca43ab 94
rob.meades@u-blox.com 1:ed57b6ca43ab 95 if (getRegister(address, &value)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 96 value |= mask;
rob.meades@u-blox.com 1:ed57b6ca43ab 97 if (setRegister(address, value)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 98 success = true;
rob.meades@u-blox.com 1:ed57b6ca43ab 99 }
rob.meades@u-blox.com 1:ed57b6ca43ab 100 }
rob.meades@u-blox.com 1:ed57b6ca43ab 101
rob.meades@u-blox.com 1:ed57b6ca43ab 102 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 103 }
rob.meades@u-blox.com 1:ed57b6ca43ab 104
rob.meades@u-blox.com 1:ed57b6ca43ab 105 /// Clear a mask of bits in a register.
rob.meades@u-blox.com 1:ed57b6ca43ab 106 bool BatteryChargerBq24295::clearRegisterBits(char address, char mask)
rob.meades@u-blox.com 1:ed57b6ca43ab 107 {
rob.meades@u-blox.com 1:ed57b6ca43ab 108 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 109 char value;
rob.meades@u-blox.com 1:ed57b6ca43ab 110
rob.meades@u-blox.com 1:ed57b6ca43ab 111 if (getRegister(address, &value)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 112 value &= ~mask;
rob.meades@u-blox.com 1:ed57b6ca43ab 113 if (setRegister(address, value)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 114 success = true;
rob.meades@u-blox.com 1:ed57b6ca43ab 115 }
rob.meades@u-blox.com 1:ed57b6ca43ab 116 }
rob.meades@u-blox.com 1:ed57b6ca43ab 117
rob.meades@u-blox.com 1:ed57b6ca43ab 118 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 119 }
rob.meades@u-blox.com 1:ed57b6ca43ab 120
rob.meades@u-blox.com 1:ed57b6ca43ab 121 //----------------------------------------------------------------
rob.meades@u-blox.com 1:ed57b6ca43ab 122 // PUBLIC FUNCTIONS
rob.meades@u-blox.com 1:ed57b6ca43ab 123 // ----------------------------------------------------------------
rob.meades@u-blox.com 1:ed57b6ca43ab 124
rob.meades@u-blox.com 1:ed57b6ca43ab 125 /// Constructor.
rob.meades@u-blox.com 1:ed57b6ca43ab 126 BatteryChargerBq24295::BatteryChargerBq24295(void)
rob.meades@u-blox.com 1:ed57b6ca43ab 127 {
rob.meades@u-blox.com 1:ed57b6ca43ab 128 gpI2c = NULL;
rob.meades@u-blox.com 1:ed57b6ca43ab 129 gReady = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 130 }
rob.meades@u-blox.com 1:ed57b6ca43ab 131
rob.meades@u-blox.com 1:ed57b6ca43ab 132 /// Destructor.
rob.meades@u-blox.com 1:ed57b6ca43ab 133 BatteryChargerBq24295::~BatteryChargerBq24295(void)
rob.meades@u-blox.com 1:ed57b6ca43ab 134 {
rob.meades@u-blox.com 1:ed57b6ca43ab 135 }
rob.meades@u-blox.com 1:ed57b6ca43ab 136
rob.meades@u-blox.com 1:ed57b6ca43ab 137 /// Initialise ourselves.
rob.meades@u-blox.com 1:ed57b6ca43ab 138 bool BatteryChargerBq24295::init (I2C * pI2c, uint8_t address)
rob.meades@u-blox.com 1:ed57b6ca43ab 139 {
rob.meades@u-blox.com 1:ed57b6ca43ab 140 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 141
rob.meades@u-blox.com 1:ed57b6ca43ab 142 gpI2c = pI2c;
rob.meades@u-blox.com 1:ed57b6ca43ab 143 gAddress = address << 1;
rob.meades@u-blox.com 1:ed57b6ca43ab 144
rob.meades@u-blox.com 1:ed57b6ca43ab 145 if (gpI2c != NULL) {
rob.meades@u-blox.com 1:ed57b6ca43ab 146 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 147
rob.meades@u-blox.com 1:ed57b6ca43ab 148 // Read the revision status register
rob.meades@u-blox.com 1:ed57b6ca43ab 149 if (getRegister(0x0a, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 150 // The expected response is 0xc0
rob.meades@u-blox.com 1:ed57b6ca43ab 151 if (reg == 0xc0) {
rob.meades@u-blox.com 1:ed57b6ca43ab 152 gReady = true;
rob.meades@u-blox.com 1:ed57b6ca43ab 153 }
rob.meades@u-blox.com 1:ed57b6ca43ab 154 }
rob.meades@u-blox.com 1:ed57b6ca43ab 155 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 156 }
rob.meades@u-blox.com 1:ed57b6ca43ab 157
rob.meades@u-blox.com 1:ed57b6ca43ab 158 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 159 if (gReady) {
rob.meades@u-blox.com 1:ed57b6ca43ab 160 printf("BatteryChargerBq24295 (I2C 0x%02x): handler initialised.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 161 } else {
rob.meades@u-blox.com 1:ed57b6ca43ab 162 printf("BatteryChargerBq24295 (I2C 0x%02x): chip NOT initialised.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 163 }
rob.meades@u-blox.com 1:ed57b6ca43ab 164 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 165
rob.meades@u-blox.com 1:ed57b6ca43ab 166 return gReady;
rob.meades@u-blox.com 1:ed57b6ca43ab 167 }
rob.meades@u-blox.com 1:ed57b6ca43ab 168
rob.meades@u-blox.com 1:ed57b6ca43ab 169 /// Get the charge state.
rob.meades@u-blox.com 1:ed57b6ca43ab 170 BatteryChargerBq24295::ChargerState BatteryChargerBq24295::getChargerState(void)
rob.meades@u-blox.com 1:ed57b6ca43ab 171 {
rob.meades@u-blox.com 1:ed57b6ca43ab 172 BatteryChargerBq24295::ChargerState chargerState = CHARGER_STATE_UNKNOWN;
rob.meades@u-blox.com 1:ed57b6ca43ab 173 char powerOnConfiguration;
rob.meades@u-blox.com 1:ed57b6ca43ab 174 char systemStatus;
rob.meades@u-blox.com 1:ed57b6ca43ab 175
rob.meades@u-blox.com 1:ed57b6ca43ab 176 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 177 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 178 // Read the power-on configuration register
rob.meades@u-blox.com 1:ed57b6ca43ab 179 if (getRegister(0x01, &powerOnConfiguration)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 180 // Read the system status register
rob.meades@u-blox.com 1:ed57b6ca43ab 181 if (getRegister(0x08, &systemStatus)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 182 // Check the charge enable bit
rob.meades@u-blox.com 1:ed57b6ca43ab 183 if ((powerOnConfiguration & (1 << 4)) == 0) {
rob.meades@u-blox.com 1:ed57b6ca43ab 184 chargerState = CHARGER_STATE_DISABLED;
rob.meades@u-blox.com 1:ed57b6ca43ab 185 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 186 printf("BatteryChargerBq24295 (I2C 0x%02x): charging is disabled.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 187 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 188 } else {
rob.meades@u-blox.com 1:ed57b6ca43ab 189 // BatteryCharger is not disabled, so see if we have
rob.meades@u-blox.com 1:ed57b6ca43ab 190 // external power (bit 3)
rob.meades@u-blox.com 1:ed57b6ca43ab 191 if ((systemStatus & 0x04) == 0) {
rob.meades@u-blox.com 1:ed57b6ca43ab 192 chargerState = CHARGER_STATE_NO_EXTERNAL_POWER;
rob.meades@u-blox.com 1:ed57b6ca43ab 193 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 194 printf("BatteryChargerBq24295 (I2C 0x%02x): no external power.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 195 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 196 } else {
rob.meades@u-blox.com 1:ed57b6ca43ab 197 // Have power, so see how we're cooking (bits 4 & 5)
rob.meades@u-blox.com 1:ed57b6ca43ab 198 switch ((systemStatus >> 4) & 0x03) {
rob.meades@u-blox.com 1:ed57b6ca43ab 199 case 0:
rob.meades@u-blox.com 1:ed57b6ca43ab 200 chargerState = CHARGER_STATE_NOT_CHARGING;
rob.meades@u-blox.com 1:ed57b6ca43ab 201 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 202 printf("BatteryChargerBq24295 (I2C 0x%02x): not charging.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 203 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 204 break;
rob.meades@u-blox.com 1:ed57b6ca43ab 205 case 1:
rob.meades@u-blox.com 1:ed57b6ca43ab 206 chargerState = CHARGER_STATE_PRECHARGE;
rob.meades@u-blox.com 1:ed57b6ca43ab 207 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 208 printf("BatteryChargerBq24295 (I2C 0x%02x): pre-charge.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 209 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 210 break;
rob.meades@u-blox.com 1:ed57b6ca43ab 211 case 2:
rob.meades@u-blox.com 1:ed57b6ca43ab 212 chargerState = CHARGER_STATE_FAST_CHARGE;
rob.meades@u-blox.com 1:ed57b6ca43ab 213 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 214 printf("BatteryChargerBq24295 (I2C 0x%02x): fast charge.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 215 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 216 break;
rob.meades@u-blox.com 1:ed57b6ca43ab 217 case 3:
rob.meades@u-blox.com 1:ed57b6ca43ab 218 chargerState = CHARGER_STATE_COMPLETE;
rob.meades@u-blox.com 1:ed57b6ca43ab 219 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 220 printf("BatteryChargerBq24295 (I2C 0x%02x): charging complete.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 221 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 222 break;
rob.meades@u-blox.com 1:ed57b6ca43ab 223 default:
rob.meades@u-blox.com 1:ed57b6ca43ab 224 break;
rob.meades@u-blox.com 1:ed57b6ca43ab 225 }
rob.meades@u-blox.com 1:ed57b6ca43ab 226 }
rob.meades@u-blox.com 1:ed57b6ca43ab 227 }
rob.meades@u-blox.com 1:ed57b6ca43ab 228 }
rob.meades@u-blox.com 1:ed57b6ca43ab 229 }
rob.meades@u-blox.com 1:ed57b6ca43ab 230 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 231 }
rob.meades@u-blox.com 1:ed57b6ca43ab 232
rob.meades@u-blox.com 1:ed57b6ca43ab 233 return chargerState;
rob.meades@u-blox.com 1:ed57b6ca43ab 234 }
rob.meades@u-blox.com 1:ed57b6ca43ab 235
rob.meades@u-blox.com 1:ed57b6ca43ab 236 /// Get whether external power is present or not.
rob.meades@u-blox.com 1:ed57b6ca43ab 237 bool BatteryChargerBq24295::isExternalPowerPresent(void)
rob.meades@u-blox.com 1:ed57b6ca43ab 238 {
rob.meades@u-blox.com 1:ed57b6ca43ab 239 bool isPresent = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 240 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 241
rob.meades@u-blox.com 1:ed57b6ca43ab 242 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 243 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 244 // Read the system status register
rob.meades@u-blox.com 1:ed57b6ca43ab 245 if (getRegister(0x08, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 246 // See if we have external power (bit 3)
rob.meades@u-blox.com 1:ed57b6ca43ab 247 if ((reg & 0x04) != 0) {
rob.meades@u-blox.com 1:ed57b6ca43ab 248 isPresent = true;
rob.meades@u-blox.com 1:ed57b6ca43ab 249 }
rob.meades@u-blox.com 1:ed57b6ca43ab 250
rob.meades@u-blox.com 1:ed57b6ca43ab 251 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 252 if (isPresent) {
rob.meades@u-blox.com 1:ed57b6ca43ab 253 printf("BatteryChargerBq24295 (I2C 0x%02x): external power is present.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 254 } else {
rob.meades@u-blox.com 1:ed57b6ca43ab 255 printf("BatteryChargerBq24295 (I2C 0x%02x): external power is NOT present.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 256 }
rob.meades@u-blox.com 1:ed57b6ca43ab 257 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 258 }
rob.meades@u-blox.com 1:ed57b6ca43ab 259 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 260 }
rob.meades@u-blox.com 1:ed57b6ca43ab 261
rob.meades@u-blox.com 1:ed57b6ca43ab 262 return isPresent;
rob.meades@u-blox.com 1:ed57b6ca43ab 263 }
rob.meades@u-blox.com 1:ed57b6ca43ab 264
rob.meades@u-blox.com 1:ed57b6ca43ab 265 /// Enable charging.
rob.meades@u-blox.com 1:ed57b6ca43ab 266 bool BatteryChargerBq24295::enableCharging (void)
rob.meades@u-blox.com 1:ed57b6ca43ab 267 {
rob.meades@u-blox.com 1:ed57b6ca43ab 268 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 269
rob.meades@u-blox.com 1:ed57b6ca43ab 270 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 271 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 272 // Charge enable is bit 4 of the power-on configuration register
rob.meades@u-blox.com 1:ed57b6ca43ab 273 success = setRegisterBits(0x01, (1 << 4));
rob.meades@u-blox.com 1:ed57b6ca43ab 274 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 275 if (success) {
rob.meades@u-blox.com 1:ed57b6ca43ab 276 printf("BatteryChargerBq24295 (I2C 0x%02x): charging now ENABLED.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 277 }
rob.meades@u-blox.com 1:ed57b6ca43ab 278 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 279 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 280 }
rob.meades@u-blox.com 1:ed57b6ca43ab 281
rob.meades@u-blox.com 1:ed57b6ca43ab 282 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 283 }
rob.meades@u-blox.com 1:ed57b6ca43ab 284
rob.meades@u-blox.com 1:ed57b6ca43ab 285 /// Disable charging.
rob.meades@u-blox.com 1:ed57b6ca43ab 286 bool BatteryChargerBq24295::disableCharging (void)
rob.meades@u-blox.com 1:ed57b6ca43ab 287 {
rob.meades@u-blox.com 1:ed57b6ca43ab 288 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 289
rob.meades@u-blox.com 1:ed57b6ca43ab 290 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 291 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 292 // Charge enable is bit 4 of the power-on configuration register
rob.meades@u-blox.com 1:ed57b6ca43ab 293 success = clearRegisterBits(0x01, (1 << 4));
rob.meades@u-blox.com 1:ed57b6ca43ab 294 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 295 if (success) {
rob.meades@u-blox.com 1:ed57b6ca43ab 296 printf("BatteryChargerBq24295 (I2C 0x%02x): charging now DISABLED.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 297 }
rob.meades@u-blox.com 1:ed57b6ca43ab 298 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 299 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 300 }
rob.meades@u-blox.com 1:ed57b6ca43ab 301
rob.meades@u-blox.com 1:ed57b6ca43ab 302 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 303 }
rob.meades@u-blox.com 1:ed57b6ca43ab 304
rob.meades@u-blox.com 1:ed57b6ca43ab 305 /// Get the whether charging is enabled or disabled.
rob.meades@u-blox.com 1:ed57b6ca43ab 306 bool BatteryChargerBq24295::isChargingEnabled (void)
rob.meades@u-blox.com 1:ed57b6ca43ab 307 {
rob.meades@u-blox.com 1:ed57b6ca43ab 308 bool isEnabled = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 309 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 310
rob.meades@u-blox.com 1:ed57b6ca43ab 311 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 312 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 313 // Read the power-on configuration register
rob.meades@u-blox.com 1:ed57b6ca43ab 314 if (getRegister(0x01, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 315 // Charge enable is bit 4 of the power-on configuration register
rob.meades@u-blox.com 1:ed57b6ca43ab 316 if ((reg & (1 << 4)) != 0) {
rob.meades@u-blox.com 1:ed57b6ca43ab 317 isEnabled = true;
rob.meades@u-blox.com 1:ed57b6ca43ab 318 }
rob.meades@u-blox.com 1:ed57b6ca43ab 319 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 320 if (isEnabled) {
rob.meades@u-blox.com 1:ed57b6ca43ab 321 printf("BatteryChargerBq24295 (I2C 0x%02x): charging is ENABLED.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 322 } else {
rob.meades@u-blox.com 1:ed57b6ca43ab 323 printf("BatteryChargerBq24295 (I2C 0x%02x): charging is DISABLED.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 324 }
rob.meades@u-blox.com 1:ed57b6ca43ab 325 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 326 }
rob.meades@u-blox.com 1:ed57b6ca43ab 327 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 328 }
rob.meades@u-blox.com 1:ed57b6ca43ab 329
rob.meades@u-blox.com 1:ed57b6ca43ab 330 return isEnabled;
rob.meades@u-blox.com 1:ed57b6ca43ab 331 }
rob.meades@u-blox.com 1:ed57b6ca43ab 332
rob.meades@u-blox.com 1:ed57b6ca43ab 333 /// Enable OTG charging.
rob.meades@u-blox.com 1:ed57b6ca43ab 334 bool BatteryChargerBq24295::enableOtg (void)
rob.meades@u-blox.com 1:ed57b6ca43ab 335 {
rob.meades@u-blox.com 1:ed57b6ca43ab 336 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 337
rob.meades@u-blox.com 1:ed57b6ca43ab 338 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 339 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 340 // OTG enable is bit 5 of the power-on configuration register
rob.meades@u-blox.com 1:ed57b6ca43ab 341 success = setRegisterBits(0x01, (1 << 5));
rob.meades@u-blox.com 1:ed57b6ca43ab 342 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 343 if (success) {
rob.meades@u-blox.com 1:ed57b6ca43ab 344 printf("BatteryChargerBq24295 (I2C 0x%02x): OTG charging now ENABLED.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 345 }
rob.meades@u-blox.com 1:ed57b6ca43ab 346 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 347 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 348 }
rob.meades@u-blox.com 1:ed57b6ca43ab 349
rob.meades@u-blox.com 1:ed57b6ca43ab 350 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 351 }
rob.meades@u-blox.com 1:ed57b6ca43ab 352
rob.meades@u-blox.com 1:ed57b6ca43ab 353 /// Disable OTG charging.
rob.meades@u-blox.com 1:ed57b6ca43ab 354 bool BatteryChargerBq24295::disableOtg (void)
rob.meades@u-blox.com 1:ed57b6ca43ab 355 {
rob.meades@u-blox.com 1:ed57b6ca43ab 356 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 357
rob.meades@u-blox.com 1:ed57b6ca43ab 358 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 359 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 360 // OTG enable is bit 5 of the power-on configuration register
rob.meades@u-blox.com 1:ed57b6ca43ab 361 success = clearRegisterBits(0x01, (1 << 5));
rob.meades@u-blox.com 1:ed57b6ca43ab 362 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 363 if (success) {
rob.meades@u-blox.com 1:ed57b6ca43ab 364 printf("BatteryChargerBq24295 (I2C 0x%02x): OTG charging now DISABLED.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 365 }
rob.meades@u-blox.com 1:ed57b6ca43ab 366 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 367 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 368 }
rob.meades@u-blox.com 1:ed57b6ca43ab 369
rob.meades@u-blox.com 1:ed57b6ca43ab 370 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 371 }
rob.meades@u-blox.com 1:ed57b6ca43ab 372
rob.meades@u-blox.com 1:ed57b6ca43ab 373 /// Get whether OTG charging is enabled or not.
rob.meades@u-blox.com 1:ed57b6ca43ab 374 bool BatteryChargerBq24295::isOtgEnabled (void)
rob.meades@u-blox.com 1:ed57b6ca43ab 375 {
rob.meades@u-blox.com 1:ed57b6ca43ab 376 bool isEnabled = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 377 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 378
rob.meades@u-blox.com 1:ed57b6ca43ab 379 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 380 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 381 // Read the power-on configuration register
rob.meades@u-blox.com 1:ed57b6ca43ab 382 if (getRegister(0x01, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 383 // OTG enable is bit 5 of the power-on configuration register
rob.meades@u-blox.com 1:ed57b6ca43ab 384 if ((reg & (1 << 5)) != 0) {
rob.meades@u-blox.com 1:ed57b6ca43ab 385 isEnabled = true;
rob.meades@u-blox.com 1:ed57b6ca43ab 386 }
rob.meades@u-blox.com 1:ed57b6ca43ab 387 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 388 if (isEnabled) {
rob.meades@u-blox.com 1:ed57b6ca43ab 389 printf("BatteryChargerBq24295 (I2C 0x%02x): OTG charging is ENABLED.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 390 } else {
rob.meades@u-blox.com 1:ed57b6ca43ab 391 printf("BatteryChargerBq24295 (I2C 0x%02x): OTG charging is DISABLED.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 392 }
rob.meades@u-blox.com 1:ed57b6ca43ab 393 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 394 }
rob.meades@u-blox.com 1:ed57b6ca43ab 395 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 396 }
rob.meades@u-blox.com 1:ed57b6ca43ab 397
rob.meades@u-blox.com 1:ed57b6ca43ab 398 return isEnabled;
rob.meades@u-blox.com 1:ed57b6ca43ab 399 }
rob.meades@u-blox.com 1:ed57b6ca43ab 400
rob.meades@u-blox.com 1:ed57b6ca43ab 401 /// Set the system voltage.
rob.meades@u-blox.com 1:ed57b6ca43ab 402 bool BatteryChargerBq24295::setSystemVoltage (int32_t voltageMV)
rob.meades@u-blox.com 1:ed57b6ca43ab 403 {
rob.meades@u-blox.com 1:ed57b6ca43ab 404 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 405 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 406 int32_t codedValue;
rob.meades@u-blox.com 1:ed57b6ca43ab 407
rob.meades@u-blox.com 1:ed57b6ca43ab 408 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 409 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 410 // Read the power-on configuration register
rob.meades@u-blox.com 1:ed57b6ca43ab 411 if (getRegister(0x01, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 412 // System voltage is in bits 1 to 3,
rob.meades@u-blox.com 1:ed57b6ca43ab 413 // coded to base "100 mV" with
rob.meades@u-blox.com 1:ed57b6ca43ab 414 // an offset of 3000 mV.
rob.meades@u-blox.com 1:ed57b6ca43ab 415 if ((voltageMV >= 3000) && (voltageMV <= 3700)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 416 codedValue = voltageMV;
rob.meades@u-blox.com 1:ed57b6ca43ab 417 codedValue = (codedValue - 3000) / 100;
rob.meades@u-blox.com 1:ed57b6ca43ab 418 // If the voltage minus the base is not an exact multiple of 100,
rob.meades@u-blox.com 1:ed57b6ca43ab 419 // add one to the coded value to make sure we don't
rob.meades@u-blox.com 1:ed57b6ca43ab 420 // go under the requested system voltage
rob.meades@u-blox.com 1:ed57b6ca43ab 421 if ((voltageMV - 3000) % 100 != 0) {
rob.meades@u-blox.com 1:ed57b6ca43ab 422 codedValue++;
rob.meades@u-blox.com 1:ed57b6ca43ab 423 }
rob.meades@u-blox.com 1:ed57b6ca43ab 424
rob.meades@u-blox.com 1:ed57b6ca43ab 425 reg &= ~(0x07 << 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 426 reg |= (char) ((codedValue & 0x07) << 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 427
rob.meades@u-blox.com 1:ed57b6ca43ab 428 // Write to the power-on configuration register
rob.meades@u-blox.com 1:ed57b6ca43ab 429 success = setRegister (0x01, reg);
rob.meades@u-blox.com 1:ed57b6ca43ab 430 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 431 if (success) {
rob.meades@u-blox.com 1:ed57b6ca43ab 432 printf("BatteryChargerBq24295 (I2C 0x%02x): system voltage now set to %.3f V.\r\n", gAddress >> 1, (float) voltageMV / 1000);
rob.meades@u-blox.com 1:ed57b6ca43ab 433 }
rob.meades@u-blox.com 1:ed57b6ca43ab 434 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 435 }
rob.meades@u-blox.com 1:ed57b6ca43ab 436 }
rob.meades@u-blox.com 1:ed57b6ca43ab 437 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 438 }
rob.meades@u-blox.com 1:ed57b6ca43ab 439
rob.meades@u-blox.com 1:ed57b6ca43ab 440 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 441 }
rob.meades@u-blox.com 1:ed57b6ca43ab 442
rob.meades@u-blox.com 1:ed57b6ca43ab 443 /// Get the system voltage.
rob.meades@u-blox.com 1:ed57b6ca43ab 444 bool BatteryChargerBq24295::getSystemVoltage (int32_t *pVoltageMV)
rob.meades@u-blox.com 1:ed57b6ca43ab 445 {
rob.meades@u-blox.com 1:ed57b6ca43ab 446 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 447 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 448
rob.meades@u-blox.com 1:ed57b6ca43ab 449 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 450 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 451 // Read the power-on configuration register
rob.meades@u-blox.com 1:ed57b6ca43ab 452 if (getRegister(0x01, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 453 success = true;
rob.meades@u-blox.com 1:ed57b6ca43ab 454 if (pVoltageMV != NULL) {
rob.meades@u-blox.com 1:ed57b6ca43ab 455 // Input voltage limit is in bits 1 to 3
rob.meades@u-blox.com 1:ed57b6ca43ab 456 // Base voltage
rob.meades@u-blox.com 1:ed57b6ca43ab 457 *pVoltageMV = 3000;
rob.meades@u-blox.com 1:ed57b6ca43ab 458 // Shift reg down and add the number of multiples
rob.meades@u-blox.com 1:ed57b6ca43ab 459 // of 100 mV
rob.meades@u-blox.com 1:ed57b6ca43ab 460 reg = (reg >> 1) & 0x07;
rob.meades@u-blox.com 1:ed57b6ca43ab 461 *pVoltageMV += ((int32_t) reg) * 100;
rob.meades@u-blox.com 1:ed57b6ca43ab 462 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 463 printf("BatteryChargerBq24295 (I2C 0x%02x): system voltage is %.3f V.\r\n", gAddress >> 1, (float) *pVoltageMV / 1000);
rob.meades@u-blox.com 1:ed57b6ca43ab 464 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 465 }
rob.meades@u-blox.com 1:ed57b6ca43ab 466 }
rob.meades@u-blox.com 1:ed57b6ca43ab 467 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 468 }
rob.meades@u-blox.com 1:ed57b6ca43ab 469
rob.meades@u-blox.com 1:ed57b6ca43ab 470 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 471 }
rob.meades@u-blox.com 1:ed57b6ca43ab 472
rob.meades@u-blox.com 1:ed57b6ca43ab 473 /// Set the fast charging current limit.
rob.meades@u-blox.com 1:ed57b6ca43ab 474 bool BatteryChargerBq24295::setFastChargingCurrentLimit (int32_t currentMA)
rob.meades@u-blox.com 1:ed57b6ca43ab 475 {
rob.meades@u-blox.com 1:ed57b6ca43ab 476 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 477 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 478 int32_t codedValue;
rob.meades@u-blox.com 1:ed57b6ca43ab 479
rob.meades@u-blox.com 1:ed57b6ca43ab 480 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 481 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 482 // Read the charge current control register
rob.meades@u-blox.com 1:ed57b6ca43ab 483 if (getRegister(0x02, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 484 // Fast charging current limit is in
rob.meades@u-blox.com 1:ed57b6ca43ab 485 // bits 2 to 7, coded to base "64 mA" with
rob.meades@u-blox.com 1:ed57b6ca43ab 486 // an offset of 512 mA.
rob.meades@u-blox.com 1:ed57b6ca43ab 487 if ((currentMA >= 512) && (currentMA <= 3008)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 488 codedValue = currentMA;
rob.meades@u-blox.com 1:ed57b6ca43ab 489 codedValue = (codedValue - 512) / 64;
rob.meades@u-blox.com 1:ed57b6ca43ab 490
rob.meades@u-blox.com 1:ed57b6ca43ab 491 reg &= ~(0x3f << 2);
rob.meades@u-blox.com 1:ed57b6ca43ab 492 reg |= (char) ((codedValue & 0x3f) << 2);
rob.meades@u-blox.com 1:ed57b6ca43ab 493
rob.meades@u-blox.com 1:ed57b6ca43ab 494 // Write to the charge current control register
rob.meades@u-blox.com 1:ed57b6ca43ab 495 success = setRegister (0x02, reg);
rob.meades@u-blox.com 1:ed57b6ca43ab 496 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 497 if (success) {
rob.meades@u-blox.com 1:ed57b6ca43ab 498 printf("BatteryChargerBq24295 (I2C 0x%02x): fast charging current limit now set to %.3f A.\r\n", gAddress >> 1, (float) currentMA / 1000);
rob.meades@u-blox.com 1:ed57b6ca43ab 499 }
rob.meades@u-blox.com 1:ed57b6ca43ab 500 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 501 }
rob.meades@u-blox.com 1:ed57b6ca43ab 502 }
rob.meades@u-blox.com 1:ed57b6ca43ab 503 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 504 }
rob.meades@u-blox.com 1:ed57b6ca43ab 505
rob.meades@u-blox.com 1:ed57b6ca43ab 506 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 507 }
rob.meades@u-blox.com 1:ed57b6ca43ab 508
rob.meades@u-blox.com 1:ed57b6ca43ab 509 /// Get the fast charging current limit.
rob.meades@u-blox.com 1:ed57b6ca43ab 510 bool BatteryChargerBq24295::getFastChargingCurrentLimit (int32_t *pCurrentMA)
rob.meades@u-blox.com 1:ed57b6ca43ab 511 {
rob.meades@u-blox.com 1:ed57b6ca43ab 512 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 513 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 514
rob.meades@u-blox.com 1:ed57b6ca43ab 515 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 516 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 517 // Read the charge current control register
rob.meades@u-blox.com 1:ed57b6ca43ab 518 if (getRegister(0x02, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 519 success = true;
rob.meades@u-blox.com 1:ed57b6ca43ab 520 if (pCurrentMA != NULL) {
rob.meades@u-blox.com 1:ed57b6ca43ab 521 // Fast charging current limit is in bits 2 to 7
rob.meades@u-blox.com 1:ed57b6ca43ab 522 // Base current
rob.meades@u-blox.com 1:ed57b6ca43ab 523 *pCurrentMA = 512;
rob.meades@u-blox.com 1:ed57b6ca43ab 524 // Shift reg down and add the number of multiples
rob.meades@u-blox.com 1:ed57b6ca43ab 525 // of 64 mA
rob.meades@u-blox.com 1:ed57b6ca43ab 526 reg = (reg >> 2) & 0x3f;
rob.meades@u-blox.com 1:ed57b6ca43ab 527 *pCurrentMA += ((int32_t) reg) * 64;
rob.meades@u-blox.com 1:ed57b6ca43ab 528 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 529 printf("BatteryChargerBq24295 (I2C 0x%02x): fast charge current limit is %.3f A.\r\n", gAddress >> 1, (float) *pCurrentMA / 1000);
rob.meades@u-blox.com 1:ed57b6ca43ab 530 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 531 }
rob.meades@u-blox.com 1:ed57b6ca43ab 532 }
rob.meades@u-blox.com 1:ed57b6ca43ab 533 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 534 }
rob.meades@u-blox.com 1:ed57b6ca43ab 535
rob.meades@u-blox.com 1:ed57b6ca43ab 536 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 537 }
rob.meades@u-blox.com 1:ed57b6ca43ab 538
rob.meades@u-blox.com 1:ed57b6ca43ab 539 /// Enable the ICHG/IPRECH margin.
rob.meades@u-blox.com 1:ed57b6ca43ab 540 bool BatteryChargerBq24295::enableIcghIprechMargin (void)
rob.meades@u-blox.com 1:ed57b6ca43ab 541 {
rob.meades@u-blox.com 1:ed57b6ca43ab 542 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 543
rob.meades@u-blox.com 1:ed57b6ca43ab 544 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 545 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 546 // FORCE_20PCT is bit 0 of the charge current control register
rob.meades@u-blox.com 1:ed57b6ca43ab 547 success = setRegisterBits(0x02, (1 << 0));
rob.meades@u-blox.com 1:ed57b6ca43ab 548 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 549 if (success) {
rob.meades@u-blox.com 1:ed57b6ca43ab 550 printf("BatteryChargerBq24295 (I2C 0x%02x): ICGH/IPRECH margin now ENABLED.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 551 }
rob.meades@u-blox.com 1:ed57b6ca43ab 552 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 553 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 554 }
rob.meades@u-blox.com 1:ed57b6ca43ab 555
rob.meades@u-blox.com 1:ed57b6ca43ab 556 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 557 }
rob.meades@u-blox.com 1:ed57b6ca43ab 558
rob.meades@u-blox.com 1:ed57b6ca43ab 559 /// Disable the ICHG/IPRECH margin.
rob.meades@u-blox.com 1:ed57b6ca43ab 560 bool BatteryChargerBq24295::disableIcghIprechMargin (void)
rob.meades@u-blox.com 1:ed57b6ca43ab 561 {
rob.meades@u-blox.com 1:ed57b6ca43ab 562 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 563
rob.meades@u-blox.com 1:ed57b6ca43ab 564 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 565 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 566 // FORCE_20PCT is bit 0 of the charge current control register
rob.meades@u-blox.com 1:ed57b6ca43ab 567 success = clearRegisterBits(0x02, (1 << 0));
rob.meades@u-blox.com 1:ed57b6ca43ab 568 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 569 if (success) {
rob.meades@u-blox.com 1:ed57b6ca43ab 570 printf("BatteryChargerBq24295 (I2C 0x%02x): ICGH/IPRECH margin now DISABLED.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 571 }
rob.meades@u-blox.com 1:ed57b6ca43ab 572 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 573 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 574 }
rob.meades@u-blox.com 1:ed57b6ca43ab 575
rob.meades@u-blox.com 1:ed57b6ca43ab 576 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 577 }
rob.meades@u-blox.com 1:ed57b6ca43ab 578
rob.meades@u-blox.com 1:ed57b6ca43ab 579 /// Check if the ICHG/IPRECH margin is set.
rob.meades@u-blox.com 1:ed57b6ca43ab 580 bool BatteryChargerBq24295::isIcghIprechMarginEnabled (void)
rob.meades@u-blox.com 1:ed57b6ca43ab 581 {
rob.meades@u-blox.com 1:ed57b6ca43ab 582 bool isEnabled = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 583 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 584
rob.meades@u-blox.com 1:ed57b6ca43ab 585 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 586 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 587 // Read the charge current control register
rob.meades@u-blox.com 1:ed57b6ca43ab 588 if (getRegister(0x02, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 589 // FORCE_20PCT is bit 0
rob.meades@u-blox.com 1:ed57b6ca43ab 590 if ((reg & (1 << 0)) != 0) {
rob.meades@u-blox.com 1:ed57b6ca43ab 591 isEnabled = true;
rob.meades@u-blox.com 1:ed57b6ca43ab 592 }
rob.meades@u-blox.com 1:ed57b6ca43ab 593 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 594 if (isEnabled) {
rob.meades@u-blox.com 1:ed57b6ca43ab 595 printf("BatteryChargerBq24295 (I2C 0x%02x): ICGH/IPRECH margin is ENABLED.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 596 } else {
rob.meades@u-blox.com 1:ed57b6ca43ab 597 printf("BatteryChargerBq24295 (I2C 0x%02x): ICGH/IPRECH margin is DISABLED.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 598 }
rob.meades@u-blox.com 1:ed57b6ca43ab 599 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 600 }
rob.meades@u-blox.com 1:ed57b6ca43ab 601 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 602 }
rob.meades@u-blox.com 1:ed57b6ca43ab 603
rob.meades@u-blox.com 1:ed57b6ca43ab 604 return isEnabled;
rob.meades@u-blox.com 1:ed57b6ca43ab 605 }
rob.meades@u-blox.com 1:ed57b6ca43ab 606
rob.meades@u-blox.com 1:ed57b6ca43ab 607 /// Set the fast charging safety timer.
rob.meades@u-blox.com 1:ed57b6ca43ab 608 bool BatteryChargerBq24295::setFastChargingSafetyTimer (int32_t timerHours)
rob.meades@u-blox.com 1:ed57b6ca43ab 609 {
rob.meades@u-blox.com 1:ed57b6ca43ab 610 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 611 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 612 int32_t codedValue;
rob.meades@u-blox.com 1:ed57b6ca43ab 613
rob.meades@u-blox.com 1:ed57b6ca43ab 614 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 615 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 616 // Mustn't be silly
rob.meades@u-blox.com 1:ed57b6ca43ab 617 if (timerHours >= 0) {
rob.meades@u-blox.com 1:ed57b6ca43ab 618 // Read the charge termination/timer control register
rob.meades@u-blox.com 1:ed57b6ca43ab 619 if (getRegister(0x05, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 620 // Timer setting is in bits 1 & 2, enable is in bit 3
rob.meades@u-blox.com 1:ed57b6ca43ab 621 if (timerHours == 0) {
rob.meades@u-blox.com 1:ed57b6ca43ab 622 reg &= ~(1 << 3);
rob.meades@u-blox.com 1:ed57b6ca43ab 623 } else {
rob.meades@u-blox.com 1:ed57b6ca43ab 624 reg |= (1 << 3);
rob.meades@u-blox.com 1:ed57b6ca43ab 625 if (timerHours < 8) {
rob.meades@u-blox.com 1:ed57b6ca43ab 626 codedValue = 0;
rob.meades@u-blox.com 1:ed57b6ca43ab 627 } else if (timerHours < 12) {
rob.meades@u-blox.com 1:ed57b6ca43ab 628 codedValue = 1;
rob.meades@u-blox.com 1:ed57b6ca43ab 629 } else if (timerHours < 20) {
rob.meades@u-blox.com 1:ed57b6ca43ab 630 codedValue = 2;
rob.meades@u-blox.com 1:ed57b6ca43ab 631 } else {
rob.meades@u-blox.com 1:ed57b6ca43ab 632 codedValue = 3;
rob.meades@u-blox.com 1:ed57b6ca43ab 633 }
rob.meades@u-blox.com 1:ed57b6ca43ab 634 reg &= ~(0x03 << 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 635 reg |= (char) (codedValue << 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 636 }
rob.meades@u-blox.com 1:ed57b6ca43ab 637 // Write to the charge termination/timer control register
rob.meades@u-blox.com 1:ed57b6ca43ab 638 success = setRegister (0x05, reg);
rob.meades@u-blox.com 1:ed57b6ca43ab 639 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 640 if (success) {
rob.meades@u-blox.com 1:ed57b6ca43ab 641 printf("BatteryChargerBq24295 (I2C 0x%02x): fast charging safety timer now set to %d hours.\r\n", gAddress >> 1, timerHours);
rob.meades@u-blox.com 1:ed57b6ca43ab 642 }
rob.meades@u-blox.com 1:ed57b6ca43ab 643 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 644 }
rob.meades@u-blox.com 1:ed57b6ca43ab 645 }
rob.meades@u-blox.com 1:ed57b6ca43ab 646 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 647 }
rob.meades@u-blox.com 1:ed57b6ca43ab 648
rob.meades@u-blox.com 1:ed57b6ca43ab 649 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 650 }
rob.meades@u-blox.com 1:ed57b6ca43ab 651
rob.meades@u-blox.com 1:ed57b6ca43ab 652 /// Get the value of the fast charging safety timer.
rob.meades@u-blox.com 1:ed57b6ca43ab 653 bool BatteryChargerBq24295::getFastChargingSafetyTimer (int32_t *pTimerHours)
rob.meades@u-blox.com 1:ed57b6ca43ab 654 {
rob.meades@u-blox.com 1:ed57b6ca43ab 655 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 656 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 657
rob.meades@u-blox.com 1:ed57b6ca43ab 658 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 659 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 660 // Read the charge termination/timer control register
rob.meades@u-blox.com 1:ed57b6ca43ab 661 if (getRegister(0x05, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 662 success = true;
rob.meades@u-blox.com 1:ed57b6ca43ab 663 if (pTimerHours != NULL) {
rob.meades@u-blox.com 1:ed57b6ca43ab 664 *pTimerHours = 0;
rob.meades@u-blox.com 1:ed57b6ca43ab 665 // Timer enable is in bit 3
rob.meades@u-blox.com 1:ed57b6ca43ab 666 if ((reg & (1 << 3)) != 0) {
rob.meades@u-blox.com 1:ed57b6ca43ab 667 // Timer value is in bits 1 & 2
rob.meades@u-blox.com 1:ed57b6ca43ab 668 switch ((reg >> 1) & 0x03) {
rob.meades@u-blox.com 1:ed57b6ca43ab 669 case 0:
rob.meades@u-blox.com 1:ed57b6ca43ab 670 *pTimerHours = 5;
rob.meades@u-blox.com 1:ed57b6ca43ab 671 break;
rob.meades@u-blox.com 1:ed57b6ca43ab 672 case 1:
rob.meades@u-blox.com 1:ed57b6ca43ab 673 *pTimerHours = 8;
rob.meades@u-blox.com 1:ed57b6ca43ab 674 break;
rob.meades@u-blox.com 1:ed57b6ca43ab 675 case 2:
rob.meades@u-blox.com 1:ed57b6ca43ab 676 *pTimerHours = 12;
rob.meades@u-blox.com 1:ed57b6ca43ab 677 break;
rob.meades@u-blox.com 1:ed57b6ca43ab 678 case 3:
rob.meades@u-blox.com 1:ed57b6ca43ab 679 *pTimerHours = 20;
rob.meades@u-blox.com 1:ed57b6ca43ab 680 break;
rob.meades@u-blox.com 1:ed57b6ca43ab 681 default:
rob.meades@u-blox.com 1:ed57b6ca43ab 682 MBED_ASSERT(false);
rob.meades@u-blox.com 1:ed57b6ca43ab 683 break;
rob.meades@u-blox.com 1:ed57b6ca43ab 684 }
rob.meades@u-blox.com 1:ed57b6ca43ab 685 }
rob.meades@u-blox.com 1:ed57b6ca43ab 686 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 687 printf("BatteryChargerBq24295 (I2C 0x%02x): fast charging safety timer is %d hours.\r\n", gAddress >> 1, *pTimerHours);
rob.meades@u-blox.com 1:ed57b6ca43ab 688 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 689 }
rob.meades@u-blox.com 1:ed57b6ca43ab 690 }
rob.meades@u-blox.com 1:ed57b6ca43ab 691 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 692 }
rob.meades@u-blox.com 1:ed57b6ca43ab 693
rob.meades@u-blox.com 1:ed57b6ca43ab 694 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 695 }
rob.meades@u-blox.com 1:ed57b6ca43ab 696
rob.meades@u-blox.com 1:ed57b6ca43ab 697 /// Set the charging termination current.
rob.meades@u-blox.com 1:ed57b6ca43ab 698 bool BatteryChargerBq24295::setChargingTerminationCurrent (int32_t currentMA)
rob.meades@u-blox.com 1:ed57b6ca43ab 699 {
rob.meades@u-blox.com 1:ed57b6ca43ab 700 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 701 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 702 int32_t codedValue;
rob.meades@u-blox.com 1:ed57b6ca43ab 703
rob.meades@u-blox.com 1:ed57b6ca43ab 704 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 705 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 706 // Read the pre-charge/termination current control register
rob.meades@u-blox.com 1:ed57b6ca43ab 707 if (getRegister(0x03, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 708 // Charging termination current limit is in
rob.meades@u-blox.com 1:ed57b6ca43ab 709 // bits 0 to 3, coded to base "128 mA" with
rob.meades@u-blox.com 1:ed57b6ca43ab 710 // an offset of 128 mA.
rob.meades@u-blox.com 1:ed57b6ca43ab 711 if ((currentMA >= 128) && (currentMA <= 2048)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 712 codedValue = currentMA;
rob.meades@u-blox.com 1:ed57b6ca43ab 713 codedValue = (codedValue - 128) / 128;
rob.meades@u-blox.com 1:ed57b6ca43ab 714
rob.meades@u-blox.com 1:ed57b6ca43ab 715 reg &= ~0x0f;
rob.meades@u-blox.com 1:ed57b6ca43ab 716 reg |= (char) (codedValue & 0x0f);
rob.meades@u-blox.com 1:ed57b6ca43ab 717
rob.meades@u-blox.com 1:ed57b6ca43ab 718 // Write to the pre-charge/termination current control register
rob.meades@u-blox.com 1:ed57b6ca43ab 719 success = setRegister (0x03, reg);
rob.meades@u-blox.com 1:ed57b6ca43ab 720 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 721 if (success) {
rob.meades@u-blox.com 1:ed57b6ca43ab 722 printf("BatteryChargerBq24295 (I2C 0x%02x): charging termination current now set to %.3f A.\r\n", gAddress >> 1, (float) currentMA / 1000);
rob.meades@u-blox.com 1:ed57b6ca43ab 723 }
rob.meades@u-blox.com 1:ed57b6ca43ab 724 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 725 }
rob.meades@u-blox.com 1:ed57b6ca43ab 726 }
rob.meades@u-blox.com 1:ed57b6ca43ab 727 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 728 }
rob.meades@u-blox.com 1:ed57b6ca43ab 729
rob.meades@u-blox.com 1:ed57b6ca43ab 730 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 731 }
rob.meades@u-blox.com 1:ed57b6ca43ab 732
rob.meades@u-blox.com 1:ed57b6ca43ab 733 /// Get the charging termination current.
rob.meades@u-blox.com 1:ed57b6ca43ab 734 bool BatteryChargerBq24295::getChargingTerminationCurrent (int32_t *pCurrentMA)
rob.meades@u-blox.com 1:ed57b6ca43ab 735 {
rob.meades@u-blox.com 1:ed57b6ca43ab 736 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 737 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 738
rob.meades@u-blox.com 1:ed57b6ca43ab 739 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 740 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 741 // Read the pre-charge/termination current control register
rob.meades@u-blox.com 1:ed57b6ca43ab 742 if (getRegister(0x03, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 743 success = true;
rob.meades@u-blox.com 1:ed57b6ca43ab 744 if (pCurrentMA != NULL) {
rob.meades@u-blox.com 1:ed57b6ca43ab 745 // Pre-charging current limit is in bits 0 to 3
rob.meades@u-blox.com 1:ed57b6ca43ab 746 // Base current
rob.meades@u-blox.com 1:ed57b6ca43ab 747 *pCurrentMA = 128;
rob.meades@u-blox.com 1:ed57b6ca43ab 748 // Add the number of multiples of 128 mA
rob.meades@u-blox.com 1:ed57b6ca43ab 749 reg = reg & 0x0f;
rob.meades@u-blox.com 1:ed57b6ca43ab 750 *pCurrentMA += ((int32_t) reg) * 128;
rob.meades@u-blox.com 1:ed57b6ca43ab 751 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 752 printf("BatteryChargerBq24295 (I2C 0x%02x): charging termination current is %.3f A.\r\n", gAddress >> 1, (float) *pCurrentMA / 1000);
rob.meades@u-blox.com 1:ed57b6ca43ab 753 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 754 }
rob.meades@u-blox.com 1:ed57b6ca43ab 755 }
rob.meades@u-blox.com 1:ed57b6ca43ab 756 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 757 }
rob.meades@u-blox.com 1:ed57b6ca43ab 758
rob.meades@u-blox.com 1:ed57b6ca43ab 759 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 760 }
rob.meades@u-blox.com 1:ed57b6ca43ab 761
rob.meades@u-blox.com 1:ed57b6ca43ab 762 /// Enable charging termination.
rob.meades@u-blox.com 1:ed57b6ca43ab 763 bool BatteryChargerBq24295::enableChargingTermination (void)
rob.meades@u-blox.com 1:ed57b6ca43ab 764 {
rob.meades@u-blox.com 1:ed57b6ca43ab 765 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 766
rob.meades@u-blox.com 1:ed57b6ca43ab 767 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 768 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 769 // EN_TERM is bit 7 of the charge termination/timer control register
rob.meades@u-blox.com 1:ed57b6ca43ab 770 success = setRegisterBits(0x05, (1 << 7));
rob.meades@u-blox.com 1:ed57b6ca43ab 771 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 772 if (success) {
rob.meades@u-blox.com 1:ed57b6ca43ab 773 printf("BatteryChargerBq24295 (I2C 0x%02x): charging termination now ENABLED.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 774 }
rob.meades@u-blox.com 1:ed57b6ca43ab 775 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 776 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 777 }
rob.meades@u-blox.com 1:ed57b6ca43ab 778
rob.meades@u-blox.com 1:ed57b6ca43ab 779 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 780 }
rob.meades@u-blox.com 1:ed57b6ca43ab 781
rob.meades@u-blox.com 1:ed57b6ca43ab 782 /// Disable charging termination.
rob.meades@u-blox.com 1:ed57b6ca43ab 783 bool BatteryChargerBq24295::disableChargingTermination (void)
rob.meades@u-blox.com 1:ed57b6ca43ab 784 {
rob.meades@u-blox.com 1:ed57b6ca43ab 785 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 786
rob.meades@u-blox.com 1:ed57b6ca43ab 787 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 788 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 789 // EN_TERM is bit 7 of the charge termination/timer control register
rob.meades@u-blox.com 1:ed57b6ca43ab 790 success = clearRegisterBits(0x05, (1 << 7));
rob.meades@u-blox.com 1:ed57b6ca43ab 791 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 792 if (success) {
rob.meades@u-blox.com 1:ed57b6ca43ab 793 printf("BatteryChargerBq24295 (I2C 0x%02x): charging termination now DISABLED.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 794 }
rob.meades@u-blox.com 1:ed57b6ca43ab 795 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 796 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 797 }
rob.meades@u-blox.com 1:ed57b6ca43ab 798
rob.meades@u-blox.com 1:ed57b6ca43ab 799 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 800 }
rob.meades@u-blox.com 1:ed57b6ca43ab 801
rob.meades@u-blox.com 1:ed57b6ca43ab 802 /// Get the state of charging termination (enabled or disabled)
rob.meades@u-blox.com 1:ed57b6ca43ab 803 bool BatteryChargerBq24295::isChargingTerminationEnabled (void)
rob.meades@u-blox.com 1:ed57b6ca43ab 804 {
rob.meades@u-blox.com 1:ed57b6ca43ab 805 bool isEnabled = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 806 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 807
rob.meades@u-blox.com 1:ed57b6ca43ab 808 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 809 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 810 // Read the charge termination/timer control register
rob.meades@u-blox.com 1:ed57b6ca43ab 811 if (getRegister(0x05, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 812 // EN_TERM is bit 7
rob.meades@u-blox.com 1:ed57b6ca43ab 813 if ((reg & (1 << 7)) != 0) {
rob.meades@u-blox.com 1:ed57b6ca43ab 814 isEnabled = true;
rob.meades@u-blox.com 1:ed57b6ca43ab 815 }
rob.meades@u-blox.com 1:ed57b6ca43ab 816 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 817 if (isEnabled) {
rob.meades@u-blox.com 1:ed57b6ca43ab 818 printf("BatteryChargerBq24295 (I2C 0x%02x): charging termination is ENABLED.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 819 } else {
rob.meades@u-blox.com 1:ed57b6ca43ab 820 printf("BatteryChargerBq24295 (I2C 0x%02x): charging termination is DISABLED.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 821 }
rob.meades@u-blox.com 1:ed57b6ca43ab 822 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 823 }
rob.meades@u-blox.com 1:ed57b6ca43ab 824 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 825 }
rob.meades@u-blox.com 1:ed57b6ca43ab 826
rob.meades@u-blox.com 1:ed57b6ca43ab 827 return isEnabled;
rob.meades@u-blox.com 1:ed57b6ca43ab 828 }
rob.meades@u-blox.com 1:ed57b6ca43ab 829
rob.meades@u-blox.com 1:ed57b6ca43ab 830 /// Set the pre-charging current limit.
rob.meades@u-blox.com 1:ed57b6ca43ab 831 bool BatteryChargerBq24295::setPrechargingCurrentLimit (int32_t currentMA)
rob.meades@u-blox.com 1:ed57b6ca43ab 832 {
rob.meades@u-blox.com 1:ed57b6ca43ab 833 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 834 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 835 int32_t codedValue;
rob.meades@u-blox.com 1:ed57b6ca43ab 836
rob.meades@u-blox.com 1:ed57b6ca43ab 837 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 838 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 839 // Read the pre-charge/termination current control register
rob.meades@u-blox.com 1:ed57b6ca43ab 840 if (getRegister(0x03, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 841 // Pre-charging current limit is in
rob.meades@u-blox.com 1:ed57b6ca43ab 842 // bits 4 to 7, coded to base "128 mA" with
rob.meades@u-blox.com 1:ed57b6ca43ab 843 // an offset of 128 mA.
rob.meades@u-blox.com 1:ed57b6ca43ab 844 if ((currentMA >= 128) && (currentMA <= 2048)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 845 codedValue = currentMA;
rob.meades@u-blox.com 1:ed57b6ca43ab 846 codedValue = (codedValue - 128) / 128;
rob.meades@u-blox.com 1:ed57b6ca43ab 847
rob.meades@u-blox.com 1:ed57b6ca43ab 848 reg &= ~(0x0f << 4);
rob.meades@u-blox.com 1:ed57b6ca43ab 849 reg |= (char) ((codedValue & 0x0f) << 4);
rob.meades@u-blox.com 1:ed57b6ca43ab 850
rob.meades@u-blox.com 1:ed57b6ca43ab 851 // Write to the pre-charge/termination current control register
rob.meades@u-blox.com 1:ed57b6ca43ab 852 success = setRegister (0x03, reg);
rob.meades@u-blox.com 1:ed57b6ca43ab 853 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 854 if (success) {
rob.meades@u-blox.com 1:ed57b6ca43ab 855 printf("BatteryChargerBq24295 (I2C 0x%02x): pre-charging current limit now set to %.3f A.\r\n", gAddress >> 1, (float) currentMA / 1000);
rob.meades@u-blox.com 1:ed57b6ca43ab 856 }
rob.meades@u-blox.com 1:ed57b6ca43ab 857 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 858 }
rob.meades@u-blox.com 1:ed57b6ca43ab 859 }
rob.meades@u-blox.com 1:ed57b6ca43ab 860 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 861 }
rob.meades@u-blox.com 1:ed57b6ca43ab 862
rob.meades@u-blox.com 1:ed57b6ca43ab 863 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 864 }
rob.meades@u-blox.com 1:ed57b6ca43ab 865
rob.meades@u-blox.com 1:ed57b6ca43ab 866 /// Get the pre-charging current limit.
rob.meades@u-blox.com 1:ed57b6ca43ab 867 bool BatteryChargerBq24295::getPrechargingCurrentLimit (int32_t *pCurrentMA)
rob.meades@u-blox.com 1:ed57b6ca43ab 868 {
rob.meades@u-blox.com 1:ed57b6ca43ab 869 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 870 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 871
rob.meades@u-blox.com 1:ed57b6ca43ab 872 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 873 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 874 // Read the pre-charge/termination current control register
rob.meades@u-blox.com 1:ed57b6ca43ab 875 if (getRegister(0x03, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 876 success = true;
rob.meades@u-blox.com 1:ed57b6ca43ab 877 if (pCurrentMA != NULL) {
rob.meades@u-blox.com 1:ed57b6ca43ab 878 // Pre-charging current limit is in bits 4 to 7
rob.meades@u-blox.com 1:ed57b6ca43ab 879 // Base current
rob.meades@u-blox.com 1:ed57b6ca43ab 880 *pCurrentMA = 128;
rob.meades@u-blox.com 1:ed57b6ca43ab 881 // Shift reg down and add the number of multiples
rob.meades@u-blox.com 1:ed57b6ca43ab 882 // of 128 mA
rob.meades@u-blox.com 1:ed57b6ca43ab 883 reg = (reg >> 4) & 0x0f;
rob.meades@u-blox.com 1:ed57b6ca43ab 884 *pCurrentMA += ((int32_t) reg) * 128;
rob.meades@u-blox.com 1:ed57b6ca43ab 885 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 886 printf("BatteryChargerBq24295 (I2C 0x%02x): pre-charging current limit is %.3f A.\r\n", gAddress >> 1, (float) *pCurrentMA / 1000);
rob.meades@u-blox.com 1:ed57b6ca43ab 887 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 888 }
rob.meades@u-blox.com 1:ed57b6ca43ab 889 }
rob.meades@u-blox.com 1:ed57b6ca43ab 890 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 891 }
rob.meades@u-blox.com 1:ed57b6ca43ab 892
rob.meades@u-blox.com 1:ed57b6ca43ab 893 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 894 }
rob.meades@u-blox.com 1:ed57b6ca43ab 895
rob.meades@u-blox.com 1:ed57b6ca43ab 896 /// Set the charging voltage limit.
rob.meades@u-blox.com 1:ed57b6ca43ab 897 bool BatteryChargerBq24295::setChargingVoltageLimit (int32_t voltageMV)
rob.meades@u-blox.com 1:ed57b6ca43ab 898 {
rob.meades@u-blox.com 1:ed57b6ca43ab 899 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 900 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 901 int32_t codedLimit;
rob.meades@u-blox.com 1:ed57b6ca43ab 902
rob.meades@u-blox.com 1:ed57b6ca43ab 903 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 904 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 905 // Read the charging voltage control register
rob.meades@u-blox.com 1:ed57b6ca43ab 906 if (getRegister(0x04, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 907 // Charging voltage limit is in bits 2 to 7
rob.meades@u-blox.com 1:ed57b6ca43ab 908 // but it is coded to base "16 mV" with
rob.meades@u-blox.com 1:ed57b6ca43ab 909 // an offset of 3504 mV.
rob.meades@u-blox.com 1:ed57b6ca43ab 910 if ((voltageMV >= 3504) && (voltageMV <= 4400)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 911 codedLimit = voltageMV;
rob.meades@u-blox.com 1:ed57b6ca43ab 912 codedLimit = (codedLimit - 3504) / 16;
rob.meades@u-blox.com 1:ed57b6ca43ab 913
rob.meades@u-blox.com 1:ed57b6ca43ab 914 reg &= ~(0x3f << 2);
rob.meades@u-blox.com 1:ed57b6ca43ab 915 reg |= (char) ((codedLimit & 0x3f) << 2);
rob.meades@u-blox.com 1:ed57b6ca43ab 916
rob.meades@u-blox.com 1:ed57b6ca43ab 917 // Write to the charging voltage control register
rob.meades@u-blox.com 1:ed57b6ca43ab 918 success = setRegister (0x04, reg);
rob.meades@u-blox.com 1:ed57b6ca43ab 919 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 920 if (success) {
rob.meades@u-blox.com 1:ed57b6ca43ab 921 printf("BatteryChargerBq24295 (I2C 0x%02x): charging voltage limit now set to %.3f V.\r\n", gAddress >> 1, (float) voltageMV / 1000);
rob.meades@u-blox.com 1:ed57b6ca43ab 922 }
rob.meades@u-blox.com 1:ed57b6ca43ab 923 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 924 }
rob.meades@u-blox.com 1:ed57b6ca43ab 925 }
rob.meades@u-blox.com 1:ed57b6ca43ab 926 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 927 }
rob.meades@u-blox.com 1:ed57b6ca43ab 928
rob.meades@u-blox.com 1:ed57b6ca43ab 929 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 930 }
rob.meades@u-blox.com 1:ed57b6ca43ab 931
rob.meades@u-blox.com 1:ed57b6ca43ab 932 /// Get the charging voltage limit.
rob.meades@u-blox.com 1:ed57b6ca43ab 933 bool BatteryChargerBq24295::getChargingVoltageLimit (int32_t *pVoltageMV)
rob.meades@u-blox.com 1:ed57b6ca43ab 934 {
rob.meades@u-blox.com 1:ed57b6ca43ab 935 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 936 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 937
rob.meades@u-blox.com 1:ed57b6ca43ab 938 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 939 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 940 // Read the charging voltage control register
rob.meades@u-blox.com 1:ed57b6ca43ab 941 if (getRegister(0x04, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 942 success = true;
rob.meades@u-blox.com 1:ed57b6ca43ab 943 if (pVoltageMV != NULL) {
rob.meades@u-blox.com 1:ed57b6ca43ab 944 // Charging voltage limit is in bits 2 to 7
rob.meades@u-blox.com 1:ed57b6ca43ab 945 // Base voltage
rob.meades@u-blox.com 1:ed57b6ca43ab 946 *pVoltageMV = 3504;
rob.meades@u-blox.com 1:ed57b6ca43ab 947 // Shift reg down and add the number of multiples
rob.meades@u-blox.com 1:ed57b6ca43ab 948 // of 16 mV
rob.meades@u-blox.com 1:ed57b6ca43ab 949 reg = (reg >> 2) & 0x3f;
rob.meades@u-blox.com 1:ed57b6ca43ab 950 *pVoltageMV += ((int32_t) reg) * 16;
rob.meades@u-blox.com 1:ed57b6ca43ab 951 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 952 printf("BatteryChargerBq24295 (I2C 0x%02x): charging voltage limit is %.3f V.\r\n", gAddress >> 1, (float) *pVoltageMV / 1000);
rob.meades@u-blox.com 1:ed57b6ca43ab 953 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 954 }
rob.meades@u-blox.com 1:ed57b6ca43ab 955 }
rob.meades@u-blox.com 1:ed57b6ca43ab 956 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 957 }
rob.meades@u-blox.com 1:ed57b6ca43ab 958
rob.meades@u-blox.com 1:ed57b6ca43ab 959 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 960 }
rob.meades@u-blox.com 1:ed57b6ca43ab 961
rob.meades@u-blox.com 1:ed57b6ca43ab 962 /// Set the pre-charge to fast-charge voltage threshold.
rob.meades@u-blox.com 1:ed57b6ca43ab 963 bool BatteryChargerBq24295::setFastChargingVoltageThreshold (int32_t voltageMV)
rob.meades@u-blox.com 1:ed57b6ca43ab 964 {
rob.meades@u-blox.com 1:ed57b6ca43ab 965 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 966
rob.meades@u-blox.com 1:ed57b6ca43ab 967 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 968 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 969 // There are only two possible values, 2.8 V and 3.0 V.
rob.meades@u-blox.com 1:ed57b6ca43ab 970 // BATLOWV is bit 1 of the charging voltage control register
rob.meades@u-blox.com 1:ed57b6ca43ab 971 if (voltageMV > 2800) {
rob.meades@u-blox.com 1:ed57b6ca43ab 972 success = setRegisterBits(0x04, (1 << 1));
rob.meades@u-blox.com 1:ed57b6ca43ab 973 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 974 printf("BatteryChargerBq24295 (I2C 0x%02x): recharge voltage threshold now set to 3.000 V.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 975 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 976 } else {
rob.meades@u-blox.com 1:ed57b6ca43ab 977 success = clearRegisterBits(0x04, (1 << 1));
rob.meades@u-blox.com 1:ed57b6ca43ab 978 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 979 printf("BatteryChargerBq24295 (I2C 0x%02x): recharge voltage threshold now set to 2.800 V.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 980 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 981 }
rob.meades@u-blox.com 1:ed57b6ca43ab 982 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 983 }
rob.meades@u-blox.com 1:ed57b6ca43ab 984
rob.meades@u-blox.com 1:ed57b6ca43ab 985 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 986 }
rob.meades@u-blox.com 1:ed57b6ca43ab 987
rob.meades@u-blox.com 1:ed57b6ca43ab 988 /// Get the pre-charge to fast-charge voltage threshold.
rob.meades@u-blox.com 1:ed57b6ca43ab 989 bool BatteryChargerBq24295::getFastChargingVoltageThreshold (int32_t *pVoltageMV)
rob.meades@u-blox.com 1:ed57b6ca43ab 990 {
rob.meades@u-blox.com 1:ed57b6ca43ab 991 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 992 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 993
rob.meades@u-blox.com 1:ed57b6ca43ab 994 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 995 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 996 // BATLOWV is bit 1 of the charging voltage control register
rob.meades@u-blox.com 1:ed57b6ca43ab 997 if (getRegister(0x04, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 998 success = true;
rob.meades@u-blox.com 1:ed57b6ca43ab 999 if (pVoltageMV != NULL) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1000 *pVoltageMV = 2800;
rob.meades@u-blox.com 1:ed57b6ca43ab 1001 if ((reg & (1 << 1)) != 0) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1002 *pVoltageMV = 3000;
rob.meades@u-blox.com 1:ed57b6ca43ab 1003 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1004 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1005 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1006
rob.meades@u-blox.com 1:ed57b6ca43ab 1007 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 1008 if (reg & (1 << 1)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1009 printf("BatteryChargerBq24295 (I2C 0x%02x): recharge voltage threshold is 3.000 V.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 1010 } else {
rob.meades@u-blox.com 1:ed57b6ca43ab 1011 printf("BatteryChargerBq24295 (I2C 0x%02x): recharge voltage threshold is 2.800 V.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 1012 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1013 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 1014 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1015 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1016
rob.meades@u-blox.com 1:ed57b6ca43ab 1017 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 1018 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1019
rob.meades@u-blox.com 1:ed57b6ca43ab 1020 /// Set the recharging voltage threshold.
rob.meades@u-blox.com 1:ed57b6ca43ab 1021 bool BatteryChargerBq24295::setRechargingVoltageThreshold (int32_t voltageMV)
rob.meades@u-blox.com 1:ed57b6ca43ab 1022 {
rob.meades@u-blox.com 1:ed57b6ca43ab 1023 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 1024
rob.meades@u-blox.com 1:ed57b6ca43ab 1025 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1026 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1027 // There are only two possible values, 100 mV and 300 mV.
rob.meades@u-blox.com 1:ed57b6ca43ab 1028 // VRECHG is bit 0 of the charging voltage control register
rob.meades@u-blox.com 1:ed57b6ca43ab 1029 if (voltageMV > 100) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1030 success = setRegisterBits(0x04, (1 << 0));
rob.meades@u-blox.com 1:ed57b6ca43ab 1031 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 1032 printf("BatteryChargerBq24295 (I2C 0x%02x): recharge voltage threshold now set to 0.300 V.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 1033 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 1034 } else {
rob.meades@u-blox.com 1:ed57b6ca43ab 1035 success = clearRegisterBits(0x04, (1 << 0));
rob.meades@u-blox.com 1:ed57b6ca43ab 1036 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 1037 printf("BatteryChargerBq24295 (I2C 0x%02x): recharge voltage threshold now set to 0.100 V.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 1038 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 1039 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1040 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1041 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1042
rob.meades@u-blox.com 1:ed57b6ca43ab 1043 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 1044 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1045
rob.meades@u-blox.com 1:ed57b6ca43ab 1046 /// Get the recharging voltage threshold.
rob.meades@u-blox.com 1:ed57b6ca43ab 1047 bool BatteryChargerBq24295::getRechargingVoltageThreshold (int32_t *pVoltageMV)
rob.meades@u-blox.com 1:ed57b6ca43ab 1048 {
rob.meades@u-blox.com 1:ed57b6ca43ab 1049 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 1050 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 1051
rob.meades@u-blox.com 1:ed57b6ca43ab 1052 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1053 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1054 // VRECHG is bit 0 of the charging voltage control register
rob.meades@u-blox.com 1:ed57b6ca43ab 1055 if (getRegister(0x04, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1056 success = true;
rob.meades@u-blox.com 1:ed57b6ca43ab 1057 if (pVoltageMV != NULL) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1058 *pVoltageMV = 100;
rob.meades@u-blox.com 1:ed57b6ca43ab 1059 if ((reg & (1 << 0)) != 0) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1060 *pVoltageMV = 300;
rob.meades@u-blox.com 1:ed57b6ca43ab 1061 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1062 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1063 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1064
rob.meades@u-blox.com 1:ed57b6ca43ab 1065 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 1066 if (reg & (1 << 1)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1067 printf("BatteryChargerBq24295 (I2C 0x%02x): recharge voltage threshold is 0.300 V.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 1068 } else {
rob.meades@u-blox.com 1:ed57b6ca43ab 1069 printf("BatteryChargerBq24295 (I2C 0x%02x): recharge voltage threshold is 0.100 V.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 1070 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1071 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 1072 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1073 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1074
rob.meades@u-blox.com 1:ed57b6ca43ab 1075 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 1076 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1077
rob.meades@u-blox.com 1:ed57b6ca43ab 1078 /// Set the boost voltage.
rob.meades@u-blox.com 1:ed57b6ca43ab 1079 bool BatteryChargerBq24295::setBoostVoltage (int32_t voltageMV)
rob.meades@u-blox.com 1:ed57b6ca43ab 1080 {
rob.meades@u-blox.com 1:ed57b6ca43ab 1081 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 1082 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 1083 int32_t codedValue;
rob.meades@u-blox.com 1:ed57b6ca43ab 1084
rob.meades@u-blox.com 1:ed57b6ca43ab 1085 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1086 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1087 // Read the boost voltage/thermal regulation control register
rob.meades@u-blox.com 1:ed57b6ca43ab 1088 if (getRegister(0x06, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1089 // Boost voltage is in bits 4 to 7, coded to base "64 mV"
rob.meades@u-blox.com 1:ed57b6ca43ab 1090 // with an offset of 4550 mV.
rob.meades@u-blox.com 1:ed57b6ca43ab 1091 if ((voltageMV >= 4550) && (voltageMV <= 5510)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1092 codedValue = voltageMV;
rob.meades@u-blox.com 1:ed57b6ca43ab 1093 codedValue = (codedValue - 4550) / 64;
rob.meades@u-blox.com 1:ed57b6ca43ab 1094 // If the voltage minus the base is not an exact multiple of 64,
rob.meades@u-blox.com 1:ed57b6ca43ab 1095 // add one to the coded value to make sure we don't
rob.meades@u-blox.com 1:ed57b6ca43ab 1096 // go under the requested boost voltage
rob.meades@u-blox.com 1:ed57b6ca43ab 1097 if ((voltageMV - 4550) % 64 != 0) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1098 codedValue++;
rob.meades@u-blox.com 1:ed57b6ca43ab 1099 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1100
rob.meades@u-blox.com 1:ed57b6ca43ab 1101 reg &= ~(0x0f << 4);
rob.meades@u-blox.com 1:ed57b6ca43ab 1102 reg |= (char) ((codedValue & 0x0f) << 4);
rob.meades@u-blox.com 1:ed57b6ca43ab 1103
rob.meades@u-blox.com 1:ed57b6ca43ab 1104 // Write to the boost voltage/thermal regulation control register
rob.meades@u-blox.com 1:ed57b6ca43ab 1105 success = setRegister (0x06, reg);
rob.meades@u-blox.com 1:ed57b6ca43ab 1106 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 1107 if (success) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1108 printf("BatteryChargerBq24295 (I2C 0x%02x): boost voltage now set to %.3f V.\r\n", gAddress >> 1, (float) voltageMV / 1000);
rob.meades@u-blox.com 1:ed57b6ca43ab 1109 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1110 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 1111 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1112 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1113 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1114 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1115
rob.meades@u-blox.com 1:ed57b6ca43ab 1116 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 1117 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1118
rob.meades@u-blox.com 1:ed57b6ca43ab 1119 /// Get the boost voltage.
rob.meades@u-blox.com 1:ed57b6ca43ab 1120 bool BatteryChargerBq24295::getBoostVoltage (int32_t *pVoltageMV)
rob.meades@u-blox.com 1:ed57b6ca43ab 1121 {
rob.meades@u-blox.com 1:ed57b6ca43ab 1122 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 1123 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 1124
rob.meades@u-blox.com 1:ed57b6ca43ab 1125 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1126 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1127 // Read the boost voltage/thermal regulation control register
rob.meades@u-blox.com 1:ed57b6ca43ab 1128 if (getRegister(0x06, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1129 success = true;
rob.meades@u-blox.com 1:ed57b6ca43ab 1130 if (pVoltageMV != NULL) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1131 // Boost voltage is in bits 4 to 7
rob.meades@u-blox.com 1:ed57b6ca43ab 1132 // Base voltage
rob.meades@u-blox.com 1:ed57b6ca43ab 1133 *pVoltageMV = 4550;
rob.meades@u-blox.com 1:ed57b6ca43ab 1134 // Shift reg down and add the number of multiples
rob.meades@u-blox.com 1:ed57b6ca43ab 1135 // of 64 mV
rob.meades@u-blox.com 1:ed57b6ca43ab 1136 reg = (reg >> 4) & 0x0f;
rob.meades@u-blox.com 1:ed57b6ca43ab 1137 *pVoltageMV += ((int32_t) reg) * 64;
rob.meades@u-blox.com 1:ed57b6ca43ab 1138 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 1139 printf("BatteryChargerBq24295 (I2C 0x%02x): boost voltage is %.3f V.\r\n", gAddress >> 1, (float) *pVoltageMV / 1000);
rob.meades@u-blox.com 1:ed57b6ca43ab 1140 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 1141 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1142 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1143 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1144 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1145
rob.meades@u-blox.com 1:ed57b6ca43ab 1146 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 1147 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1148
rob.meades@u-blox.com 1:ed57b6ca43ab 1149 /// Set the boost mode low temperature limit.
rob.meades@u-blox.com 1:ed57b6ca43ab 1150 bool BatteryChargerBq24295::setBoostUpperTemperatureLimit (int32_t temperatureC)
rob.meades@u-blox.com 1:ed57b6ca43ab 1151 {
rob.meades@u-blox.com 1:ed57b6ca43ab 1152 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 1153 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 1154 char codedValue;
rob.meades@u-blox.com 1:ed57b6ca43ab 1155
rob.meades@u-blox.com 1:ed57b6ca43ab 1156 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1157 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1158 // Read the boost voltage/thermal regulation control register
rob.meades@u-blox.com 1:ed57b6ca43ab 1159 if (getRegister(0x06, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1160 // BHOT is in bits 2 & 3
rob.meades@u-blox.com 1:ed57b6ca43ab 1161 if (temperatureC < 60) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1162 codedValue = 0;
rob.meades@u-blox.com 1:ed57b6ca43ab 1163 } else if (temperatureC < 65) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1164 codedValue = 1;
rob.meades@u-blox.com 1:ed57b6ca43ab 1165 } else {
rob.meades@u-blox.com 1:ed57b6ca43ab 1166 codedValue = 2;
rob.meades@u-blox.com 1:ed57b6ca43ab 1167 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1168 reg &= ~(0x03 << 2);
rob.meades@u-blox.com 1:ed57b6ca43ab 1169 reg |= (char) (codedValue << 2);
rob.meades@u-blox.com 1:ed57b6ca43ab 1170 // Write to boost voltage/thermal regulation control register
rob.meades@u-blox.com 1:ed57b6ca43ab 1171 success = setRegister (0x06, reg);
rob.meades@u-blox.com 1:ed57b6ca43ab 1172 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 1173 if (success) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1174 printf("BatteryChargerBq24295 (I2C 0x%02x): boost mode lower temperature limit now set to %d C.\r\n", gAddress >> 1, temperatureC);
rob.meades@u-blox.com 1:ed57b6ca43ab 1175 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1176 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 1177 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1178 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1179 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1180
rob.meades@u-blox.com 1:ed57b6ca43ab 1181 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 1182 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1183
rob.meades@u-blox.com 1:ed57b6ca43ab 1184 /// Get the boost mode upper temperature limit.
rob.meades@u-blox.com 1:ed57b6ca43ab 1185 bool BatteryChargerBq24295::getBoostUpperTemperatureLimit (int32_t *pTemperatureC)
rob.meades@u-blox.com 1:ed57b6ca43ab 1186 {
rob.meades@u-blox.com 1:ed57b6ca43ab 1187 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 1188 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 1189
rob.meades@u-blox.com 1:ed57b6ca43ab 1190 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1191 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1192 // BHOT is in bits 2 & 3 of the boost voltage/thermal regulation control register
rob.meades@u-blox.com 1:ed57b6ca43ab 1193 if (getRegister(0x06, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1194 // Only proceed (and return true) if the limit is enabled
rob.meades@u-blox.com 1:ed57b6ca43ab 1195 if (((reg >> 2) & 0x03) != 0x03) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1196 success = true;
rob.meades@u-blox.com 1:ed57b6ca43ab 1197 if (pTemperatureC != NULL) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1198 switch ((reg >> 2) & 0x03) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1199 case 0:
rob.meades@u-blox.com 1:ed57b6ca43ab 1200 *pTemperatureC = 55;
rob.meades@u-blox.com 1:ed57b6ca43ab 1201 break;
rob.meades@u-blox.com 1:ed57b6ca43ab 1202 case 1:
rob.meades@u-blox.com 1:ed57b6ca43ab 1203 *pTemperatureC = 60;
rob.meades@u-blox.com 1:ed57b6ca43ab 1204 break;
rob.meades@u-blox.com 1:ed57b6ca43ab 1205 case 2:
rob.meades@u-blox.com 1:ed57b6ca43ab 1206 *pTemperatureC = 65;
rob.meades@u-blox.com 1:ed57b6ca43ab 1207 break;
rob.meades@u-blox.com 1:ed57b6ca43ab 1208 default:
rob.meades@u-blox.com 1:ed57b6ca43ab 1209 MBED_ASSERT(false);
rob.meades@u-blox.com 1:ed57b6ca43ab 1210 break;
rob.meades@u-blox.com 1:ed57b6ca43ab 1211 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1212 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 1213 printf("BatteryChargerBq24295 (I2C 0x%02x): boost mode upper temperature limit is %d C.\r\n", gAddress >> 1, *pTemperatureC);
rob.meades@u-blox.com 1:ed57b6ca43ab 1214 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 1215 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1216 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1217 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1218 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1219 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1220
rob.meades@u-blox.com 1:ed57b6ca43ab 1221 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 1222 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1223
rob.meades@u-blox.com 1:ed57b6ca43ab 1224 /// Check whether the boost mode upper temperature limit is enabled.
rob.meades@u-blox.com 1:ed57b6ca43ab 1225 bool BatteryChargerBq24295::isBoostUpperTemperatureLimitEnabled (void)
rob.meades@u-blox.com 1:ed57b6ca43ab 1226 {
rob.meades@u-blox.com 1:ed57b6ca43ab 1227 bool isEnabled = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 1228 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 1229
rob.meades@u-blox.com 1:ed57b6ca43ab 1230 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1231 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1232 // BHOT is in bits 2 & 3 of the boost voltage/thermal regulation control register
rob.meades@u-blox.com 1:ed57b6ca43ab 1233 // and it is enabled if any bit is 0
rob.meades@u-blox.com 1:ed57b6ca43ab 1234 if (getRegister(0x06, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1235 if (((reg >> 2) & 3) != 3) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1236 isEnabled = true;
rob.meades@u-blox.com 1:ed57b6ca43ab 1237 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1238 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 1239 if (isEnabled) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1240 printf("BatteryChargerBq24295 (I2C 0x%02x): boost mode upper temperature limit is ENABLED.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 1241 } else {
rob.meades@u-blox.com 1:ed57b6ca43ab 1242 printf("BatteryChargerBq24295 (I2C 0x%02x): boost mode upper temperature limit is DISABLED.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 1243 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1244 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 1245 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1246 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1247 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1248
rob.meades@u-blox.com 1:ed57b6ca43ab 1249 return isEnabled;
rob.meades@u-blox.com 1:ed57b6ca43ab 1250 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1251
rob.meades@u-blox.com 1:ed57b6ca43ab 1252 /// Disable the boost mode upper temperature limit.
rob.meades@u-blox.com 1:ed57b6ca43ab 1253 bool BatteryChargerBq24295::disableBoostUpperTemperatureLimit (void)
rob.meades@u-blox.com 1:ed57b6ca43ab 1254 {
rob.meades@u-blox.com 1:ed57b6ca43ab 1255 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 1256
rob.meades@u-blox.com 1:ed57b6ca43ab 1257 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1258 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1259 // BHOT is in bits 2 & 3 of the boost voltage/thermal regulation control register
rob.meades@u-blox.com 1:ed57b6ca43ab 1260 // and setting all the bits indicates disabled
rob.meades@u-blox.com 1:ed57b6ca43ab 1261 success = setRegisterBits(0x06, (3 << 2));
rob.meades@u-blox.com 1:ed57b6ca43ab 1262 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 1263 if (success) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1264 printf("BatteryChargerBq24295 (I2C 0x%02x): boost mode upper temperature limit now DISABLED.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 1265 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1266 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 1267 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1268 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1269
rob.meades@u-blox.com 1:ed57b6ca43ab 1270 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 1271 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1272
rob.meades@u-blox.com 1:ed57b6ca43ab 1273 /// Set the boost mode upper temperature limit.
rob.meades@u-blox.com 1:ed57b6ca43ab 1274 bool BatteryChargerBq24295::setBoostLowerTemperatureLimit (int32_t temperatureC)
rob.meades@u-blox.com 1:ed57b6ca43ab 1275 {
rob.meades@u-blox.com 1:ed57b6ca43ab 1276 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 1277
rob.meades@u-blox.com 1:ed57b6ca43ab 1278 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1279 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1280 // There are only two possible values, -10 C and -20 C.
rob.meades@u-blox.com 1:ed57b6ca43ab 1281 // BCOLD is bit 1 of the charge current control register
rob.meades@u-blox.com 1:ed57b6ca43ab 1282 if (temperatureC < -10) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1283 success = setRegisterBits(0x02, (1 << 1));
rob.meades@u-blox.com 1:ed57b6ca43ab 1284 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 1285 printf("BatteryChargerBq24295 (I2C 0x%02x): boost mode lower temperature limit now set to -20 C.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 1286 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 1287 } else {
rob.meades@u-blox.com 1:ed57b6ca43ab 1288 success = clearRegisterBits(0x02, (1 << 1));
rob.meades@u-blox.com 1:ed57b6ca43ab 1289 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 1290 printf("BatteryChargerBq24295 (I2C 0x%02x): boost mode lower temperature limit now set to -10 C.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 1291 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 1292 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1293 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1294 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1295
rob.meades@u-blox.com 1:ed57b6ca43ab 1296 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 1297 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1298
rob.meades@u-blox.com 1:ed57b6ca43ab 1299 /// Get the boost mode low temperature limit.
rob.meades@u-blox.com 1:ed57b6ca43ab 1300 bool BatteryChargerBq24295::getBoostLowerTemperatureLimit (int32_t *pTemperatureC)
rob.meades@u-blox.com 1:ed57b6ca43ab 1301 {
rob.meades@u-blox.com 1:ed57b6ca43ab 1302 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 1303 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 1304
rob.meades@u-blox.com 1:ed57b6ca43ab 1305 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1306 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1307 // BCOLD is bit 1 of the charge current control register
rob.meades@u-blox.com 1:ed57b6ca43ab 1308 if (getRegister(0x02, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1309 success = true;
rob.meades@u-blox.com 1:ed57b6ca43ab 1310 if (pTemperatureC != NULL) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1311 *pTemperatureC = -10;
rob.meades@u-blox.com 1:ed57b6ca43ab 1312 if ((reg & (1 << 1)) != 0) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1313 *pTemperatureC = -20;
rob.meades@u-blox.com 1:ed57b6ca43ab 1314 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1315 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1316 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1317
rob.meades@u-blox.com 1:ed57b6ca43ab 1318 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 1319 if (reg & (1 << 1)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1320 printf("BatteryChargerBq24295 (I2C 0x%02x): boost mode lower temperature limit is -20 C.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 1321 } else {
rob.meades@u-blox.com 1:ed57b6ca43ab 1322 printf("BatteryChargerBq24295 (I2C 0x%02x): boost mode lower temperature limit is -10 C.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 1323 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1324 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 1325 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1326 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1327
rob.meades@u-blox.com 1:ed57b6ca43ab 1328 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 1329 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1330
rob.meades@u-blox.com 1:ed57b6ca43ab 1331 /// Set the input voltage limit.
rob.meades@u-blox.com 1:ed57b6ca43ab 1332 bool BatteryChargerBq24295::setInputVoltageLimit (int32_t voltageMV)
rob.meades@u-blox.com 1:ed57b6ca43ab 1333 {
rob.meades@u-blox.com 1:ed57b6ca43ab 1334 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 1335 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 1336 int32_t codedValue;
rob.meades@u-blox.com 1:ed57b6ca43ab 1337
rob.meades@u-blox.com 1:ed57b6ca43ab 1338 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1339 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1340 // Read the input source control register
rob.meades@u-blox.com 1:ed57b6ca43ab 1341 if (getRegister(0x00, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1342 // Input voltage limit is in bits 3 to 6
rob.meades@u-blox.com 1:ed57b6ca43ab 1343 // but it is coded to base "80 mV" with
rob.meades@u-blox.com 1:ed57b6ca43ab 1344 // an offset of 3880 mV.
rob.meades@u-blox.com 1:ed57b6ca43ab 1345 if ((voltageMV >= 3880) && (voltageMV <= 5080)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1346 codedValue = voltageMV;
rob.meades@u-blox.com 1:ed57b6ca43ab 1347 codedValue = (codedValue - 3880) / 80;
rob.meades@u-blox.com 1:ed57b6ca43ab 1348
rob.meades@u-blox.com 1:ed57b6ca43ab 1349 reg &= ~(0x0f << 3);
rob.meades@u-blox.com 1:ed57b6ca43ab 1350 reg |= (char) ((codedValue & 0x0f) << 3);
rob.meades@u-blox.com 1:ed57b6ca43ab 1351
rob.meades@u-blox.com 1:ed57b6ca43ab 1352 // Write to the input source control register
rob.meades@u-blox.com 1:ed57b6ca43ab 1353 success = setRegister (0x00, reg);
rob.meades@u-blox.com 1:ed57b6ca43ab 1354 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 1355 if (success) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1356 printf("BatteryChargerBq24295 (I2C 0x%02x): input voltage limit now set to %.3f V.\r\n", gAddress >> 1, (float) voltageMV / 1000);
rob.meades@u-blox.com 1:ed57b6ca43ab 1357 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1358 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 1359 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1360 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1361 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1362 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1363
rob.meades@u-blox.com 1:ed57b6ca43ab 1364 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 1365 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1366
rob.meades@u-blox.com 1:ed57b6ca43ab 1367 /// Get the input voltage limit.
rob.meades@u-blox.com 1:ed57b6ca43ab 1368 bool BatteryChargerBq24295::getInputVoltageLimit (int32_t *pVoltageMV)
rob.meades@u-blox.com 1:ed57b6ca43ab 1369 {
rob.meades@u-blox.com 1:ed57b6ca43ab 1370 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 1371 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 1372
rob.meades@u-blox.com 1:ed57b6ca43ab 1373 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1374 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1375 // Read the input source control register
rob.meades@u-blox.com 1:ed57b6ca43ab 1376 if (getRegister(0x00, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1377 success = true;
rob.meades@u-blox.com 1:ed57b6ca43ab 1378 if (pVoltageMV != NULL) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1379 // Input voltage limit is in bits 3 to 6
rob.meades@u-blox.com 1:ed57b6ca43ab 1380 // Base voltage
rob.meades@u-blox.com 1:ed57b6ca43ab 1381 *pVoltageMV = 3880;
rob.meades@u-blox.com 1:ed57b6ca43ab 1382 // Shift reg down and add the number of multiples
rob.meades@u-blox.com 1:ed57b6ca43ab 1383 // of 80 mV
rob.meades@u-blox.com 1:ed57b6ca43ab 1384 reg = (reg >> 3) & 0x0f;
rob.meades@u-blox.com 1:ed57b6ca43ab 1385 *pVoltageMV += ((int32_t) reg) * 80;
rob.meades@u-blox.com 1:ed57b6ca43ab 1386 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 1387 printf("BatteryChargerBq24295 (I2C 0x%02x): input voltage limit is %.3f V.\r\n", gAddress >> 1, (float) *pVoltageMV / 1000);
rob.meades@u-blox.com 1:ed57b6ca43ab 1388 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 1389 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1390 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1391 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1392 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1393
rob.meades@u-blox.com 1:ed57b6ca43ab 1394 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 1395 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1396
rob.meades@u-blox.com 1:ed57b6ca43ab 1397 /// Set the input current limit.
rob.meades@u-blox.com 1:ed57b6ca43ab 1398 bool BatteryChargerBq24295::setInputCurrentLimit (int32_t currentMA)
rob.meades@u-blox.com 1:ed57b6ca43ab 1399 {
rob.meades@u-blox.com 1:ed57b6ca43ab 1400 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 1401 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 1402 char codedValue;
rob.meades@u-blox.com 1:ed57b6ca43ab 1403
rob.meades@u-blox.com 1:ed57b6ca43ab 1404 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1405 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1406 // Read the input source control register
rob.meades@u-blox.com 1:ed57b6ca43ab 1407 if (getRegister(0x00, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1408 // Input current limit is in bits 0 to 2, coded
rob.meades@u-blox.com 1:ed57b6ca43ab 1409 // such that the smallest limit is applied for
rob.meades@u-blox.com 1:ed57b6ca43ab 1410 // a range (e.g. 120 mA ends up as 100 mA rather
rob.meades@u-blox.com 1:ed57b6ca43ab 1411 // than 150 mA)
rob.meades@u-blox.com 1:ed57b6ca43ab 1412 if ((currentMA >= 100) && (currentMA <= 3000)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1413 if (currentMA < 150) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1414 codedValue = 0;
rob.meades@u-blox.com 1:ed57b6ca43ab 1415 } else if (currentMA < 500) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1416 codedValue = 1;
rob.meades@u-blox.com 1:ed57b6ca43ab 1417 } else if (currentMA < 900) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1418 codedValue = 2;
rob.meades@u-blox.com 1:ed57b6ca43ab 1419 } else if (currentMA < 1000) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1420 codedValue = 3;
rob.meades@u-blox.com 1:ed57b6ca43ab 1421 } else if (currentMA < 1500) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1422 codedValue = 4;
rob.meades@u-blox.com 1:ed57b6ca43ab 1423 } else if (currentMA < 2000) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1424 codedValue = 5;
rob.meades@u-blox.com 1:ed57b6ca43ab 1425 } else if (currentMA < 3000) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1426 codedValue = 6;
rob.meades@u-blox.com 1:ed57b6ca43ab 1427 } else {
rob.meades@u-blox.com 1:ed57b6ca43ab 1428 codedValue = 7;
rob.meades@u-blox.com 1:ed57b6ca43ab 1429 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1430 reg &= ~(0x07 << 0);
rob.meades@u-blox.com 1:ed57b6ca43ab 1431 reg |= codedValue;
rob.meades@u-blox.com 1:ed57b6ca43ab 1432
rob.meades@u-blox.com 1:ed57b6ca43ab 1433 // Write to the input source control register
rob.meades@u-blox.com 1:ed57b6ca43ab 1434 success = setRegister (0x00, reg);
rob.meades@u-blox.com 1:ed57b6ca43ab 1435 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 1436 if (success) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1437 printf("BatteryChargerBq24295 (I2C 0x%02x): input current limit now set to %.3f A.\r\n", gAddress >> 1, (float) currentMA / 1000);
rob.meades@u-blox.com 1:ed57b6ca43ab 1438 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1439 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 1440 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1441 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1442 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1443 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1444
rob.meades@u-blox.com 1:ed57b6ca43ab 1445 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 1446 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1447
rob.meades@u-blox.com 1:ed57b6ca43ab 1448 /// Get the input current limit.
rob.meades@u-blox.com 1:ed57b6ca43ab 1449 bool BatteryChargerBq24295::getInputCurrentLimit (int32_t *pCurrentMA)
rob.meades@u-blox.com 1:ed57b6ca43ab 1450 {
rob.meades@u-blox.com 1:ed57b6ca43ab 1451 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 1452 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 1453
rob.meades@u-blox.com 1:ed57b6ca43ab 1454 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1455 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1456 // Read the input source control register
rob.meades@u-blox.com 1:ed57b6ca43ab 1457 if (getRegister(0x00, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1458 success = true;
rob.meades@u-blox.com 1:ed57b6ca43ab 1459 if (pCurrentMA != NULL) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1460 *pCurrentMA = 0;
rob.meades@u-blox.com 1:ed57b6ca43ab 1461 // Input current limit is in bits 0 to 2
rob.meades@u-blox.com 1:ed57b6ca43ab 1462 switch (reg & 0x07) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1463 case 0:
rob.meades@u-blox.com 1:ed57b6ca43ab 1464 *pCurrentMA = 100;
rob.meades@u-blox.com 1:ed57b6ca43ab 1465 break;
rob.meades@u-blox.com 1:ed57b6ca43ab 1466 case 1:
rob.meades@u-blox.com 1:ed57b6ca43ab 1467 *pCurrentMA = 150;
rob.meades@u-blox.com 1:ed57b6ca43ab 1468 break;
rob.meades@u-blox.com 1:ed57b6ca43ab 1469 case 2:
rob.meades@u-blox.com 1:ed57b6ca43ab 1470 *pCurrentMA = 500;
rob.meades@u-blox.com 1:ed57b6ca43ab 1471 break;
rob.meades@u-blox.com 1:ed57b6ca43ab 1472 case 3:
rob.meades@u-blox.com 1:ed57b6ca43ab 1473 *pCurrentMA = 900;
rob.meades@u-blox.com 1:ed57b6ca43ab 1474 break;
rob.meades@u-blox.com 1:ed57b6ca43ab 1475 case 4:
rob.meades@u-blox.com 1:ed57b6ca43ab 1476 *pCurrentMA = 1000;
rob.meades@u-blox.com 1:ed57b6ca43ab 1477 break;
rob.meades@u-blox.com 1:ed57b6ca43ab 1478 case 5:
rob.meades@u-blox.com 1:ed57b6ca43ab 1479 *pCurrentMA = 1500;
rob.meades@u-blox.com 1:ed57b6ca43ab 1480 break;
rob.meades@u-blox.com 1:ed57b6ca43ab 1481 case 6:
rob.meades@u-blox.com 1:ed57b6ca43ab 1482 *pCurrentMA = 2000;
rob.meades@u-blox.com 1:ed57b6ca43ab 1483 break;
rob.meades@u-blox.com 1:ed57b6ca43ab 1484 case 7:
rob.meades@u-blox.com 1:ed57b6ca43ab 1485 *pCurrentMA = 3000;
rob.meades@u-blox.com 1:ed57b6ca43ab 1486 break;
rob.meades@u-blox.com 1:ed57b6ca43ab 1487 default:
rob.meades@u-blox.com 1:ed57b6ca43ab 1488 MBED_ASSERT(false);
rob.meades@u-blox.com 1:ed57b6ca43ab 1489 break;
rob.meades@u-blox.com 1:ed57b6ca43ab 1490 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1491 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 1492 printf("BatteryChargerBq24295 (I2C 0x%02x): input current limit is %.3f A.\r\n", gAddress >> 1, (float) *pCurrentMA / 1000);
rob.meades@u-blox.com 1:ed57b6ca43ab 1493 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 1494 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1495 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1496 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1497 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1498
rob.meades@u-blox.com 1:ed57b6ca43ab 1499 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 1500 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1501
rob.meades@u-blox.com 1:ed57b6ca43ab 1502 /// Enable input voltage or current limits.
rob.meades@u-blox.com 1:ed57b6ca43ab 1503 bool BatteryChargerBq24295::enableInputLimits (void)
rob.meades@u-blox.com 1:ed57b6ca43ab 1504 {
rob.meades@u-blox.com 1:ed57b6ca43ab 1505 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 1506
rob.meades@u-blox.com 1:ed57b6ca43ab 1507 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1508 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1509 // Input limit enable is bit 7 of the source control register
rob.meades@u-blox.com 1:ed57b6ca43ab 1510 success = setRegisterBits(0x00, (1 << 7));
rob.meades@u-blox.com 1:ed57b6ca43ab 1511 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 1512 if (success) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1513 printf("BatteryChargerBq24295 (I2C 0x%02x): input limits now ENABLED.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 1514 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1515 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 1516 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1517 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1518
rob.meades@u-blox.com 1:ed57b6ca43ab 1519 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 1520 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1521
rob.meades@u-blox.com 1:ed57b6ca43ab 1522 /// Remove any input voltage or current limits.
rob.meades@u-blox.com 1:ed57b6ca43ab 1523 bool BatteryChargerBq24295::disableInputLimits (void)
rob.meades@u-blox.com 1:ed57b6ca43ab 1524 {
rob.meades@u-blox.com 1:ed57b6ca43ab 1525 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 1526
rob.meades@u-blox.com 1:ed57b6ca43ab 1527 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1528 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1529 // Input limit enable is bit 7 of the source control register
rob.meades@u-blox.com 1:ed57b6ca43ab 1530 success = clearRegisterBits(0x00, (1 << 7));
rob.meades@u-blox.com 1:ed57b6ca43ab 1531 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 1532 if (success) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1533 printf("BatteryChargerBq24295 (I2C 0x%02x): input limits now DISABLED.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 1534 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1535 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 1536 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1537 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1538
rob.meades@u-blox.com 1:ed57b6ca43ab 1539 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 1540 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1541
rob.meades@u-blox.com 1:ed57b6ca43ab 1542 /// Check if input limits are enabled.
rob.meades@u-blox.com 1:ed57b6ca43ab 1543 bool BatteryChargerBq24295::areInputLimitsEnabled (void)
rob.meades@u-blox.com 1:ed57b6ca43ab 1544 {
rob.meades@u-blox.com 1:ed57b6ca43ab 1545 bool areEnabled = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 1546 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 1547
rob.meades@u-blox.com 1:ed57b6ca43ab 1548 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1549 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1550 // Read the input source control register
rob.meades@u-blox.com 1:ed57b6ca43ab 1551 if (getRegister(0x00, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1552 // Input limit enable is bit 7 of the source control register
rob.meades@u-blox.com 1:ed57b6ca43ab 1553 if ((reg & (1 << 7)) != 0) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1554 areEnabled = true;
rob.meades@u-blox.com 1:ed57b6ca43ab 1555 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1556 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 1557 if (areEnabled) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1558 printf("BatteryChargerBq24295 (I2C 0x%02x): input limits are ENABLED.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 1559 } else {
rob.meades@u-blox.com 1:ed57b6ca43ab 1560 printf("BatteryChargerBq24295 (I2C 0x%02x): input limits are DISABLED.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 1561 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1562 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 1563 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1564 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1565 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1566
rob.meades@u-blox.com 1:ed57b6ca43ab 1567 return areEnabled;
rob.meades@u-blox.com 1:ed57b6ca43ab 1568 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1569
rob.meades@u-blox.com 1:ed57b6ca43ab 1570 /// Set the thermal regulation threshold for the chip.
rob.meades@u-blox.com 1:ed57b6ca43ab 1571 bool BatteryChargerBq24295::setChipThermalRegulationThreshold (int32_t temperatureC)
rob.meades@u-blox.com 1:ed57b6ca43ab 1572 {
rob.meades@u-blox.com 1:ed57b6ca43ab 1573 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 1574 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 1575 char codedValue;
rob.meades@u-blox.com 1:ed57b6ca43ab 1576
rob.meades@u-blox.com 1:ed57b6ca43ab 1577 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1578 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1579 // Read the boost voltage/thermal regulation control register
rob.meades@u-blox.com 1:ed57b6ca43ab 1580 if (getRegister(0x06, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1581 // TREG is in bits 0 & 1
rob.meades@u-blox.com 1:ed57b6ca43ab 1582 if (temperatureC < 80) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1583 codedValue = 0;
rob.meades@u-blox.com 1:ed57b6ca43ab 1584 } else if (temperatureC < 100) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1585 codedValue = 1;
rob.meades@u-blox.com 1:ed57b6ca43ab 1586 } else if (temperatureC < 120) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1587 codedValue = 2;
rob.meades@u-blox.com 1:ed57b6ca43ab 1588 } else {
rob.meades@u-blox.com 1:ed57b6ca43ab 1589 codedValue = 3;
rob.meades@u-blox.com 1:ed57b6ca43ab 1590 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1591 reg &= ~0x03;
rob.meades@u-blox.com 1:ed57b6ca43ab 1592 reg |= (char) codedValue;
rob.meades@u-blox.com 1:ed57b6ca43ab 1593 // Write to boost voltage/thermal regulation control register
rob.meades@u-blox.com 1:ed57b6ca43ab 1594 success = setRegister (0x06, reg);
rob.meades@u-blox.com 1:ed57b6ca43ab 1595 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 1596 if (success) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1597 printf("BatteryChargerBq24295 (I2C 0x%02x): chip thermal regulation threshold now set to %d C.\r\n", gAddress >> 1, temperatureC);
rob.meades@u-blox.com 1:ed57b6ca43ab 1598 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1599 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 1600 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1601 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1602 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1603
rob.meades@u-blox.com 1:ed57b6ca43ab 1604 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 1605 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1606
rob.meades@u-blox.com 1:ed57b6ca43ab 1607 /// Get the thermal regulation threshold for the chip.
rob.meades@u-blox.com 1:ed57b6ca43ab 1608 bool BatteryChargerBq24295::getChipThermalRegulationThreshold (int32_t *pTemperatureC)
rob.meades@u-blox.com 1:ed57b6ca43ab 1609 {
rob.meades@u-blox.com 1:ed57b6ca43ab 1610 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 1611 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 1612
rob.meades@u-blox.com 1:ed57b6ca43ab 1613 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1614 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1615 /// TREG is in bits 0 & 1 of the boost voltage/thermal regulation control register
rob.meades@u-blox.com 1:ed57b6ca43ab 1616 if (getRegister(0x06, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1617 success = true;
rob.meades@u-blox.com 1:ed57b6ca43ab 1618 if (pTemperatureC != NULL) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1619 switch (reg & 0x03) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1620 case 0:
rob.meades@u-blox.com 1:ed57b6ca43ab 1621 *pTemperatureC = 60;
rob.meades@u-blox.com 1:ed57b6ca43ab 1622 break;
rob.meades@u-blox.com 1:ed57b6ca43ab 1623 case 1:
rob.meades@u-blox.com 1:ed57b6ca43ab 1624 *pTemperatureC = 80;
rob.meades@u-blox.com 1:ed57b6ca43ab 1625 break;
rob.meades@u-blox.com 1:ed57b6ca43ab 1626 case 2:
rob.meades@u-blox.com 1:ed57b6ca43ab 1627 *pTemperatureC = 100;
rob.meades@u-blox.com 1:ed57b6ca43ab 1628 break;
rob.meades@u-blox.com 1:ed57b6ca43ab 1629 case 3:
rob.meades@u-blox.com 1:ed57b6ca43ab 1630 *pTemperatureC = 120;
rob.meades@u-blox.com 1:ed57b6ca43ab 1631 break;
rob.meades@u-blox.com 1:ed57b6ca43ab 1632 default:
rob.meades@u-blox.com 1:ed57b6ca43ab 1633 MBED_ASSERT(false);
rob.meades@u-blox.com 1:ed57b6ca43ab 1634 break;
rob.meades@u-blox.com 1:ed57b6ca43ab 1635 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1636 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 1637 printf("BatteryChargerBq24295 (I2C 0x%02x): chip thermal regulation threshold is %d C.\r\n", gAddress >> 1, *pTemperatureC);
rob.meades@u-blox.com 1:ed57b6ca43ab 1638 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 1639 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1640 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1641 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1642 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1643
rob.meades@u-blox.com 1:ed57b6ca43ab 1644 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 1645 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1646
rob.meades@u-blox.com 1:ed57b6ca43ab 1647 /// Get the charger fault status as a bitmap.
rob.meades@u-blox.com 1:ed57b6ca43ab 1648 char BatteryChargerBq24295::getChargerFaults(void)
rob.meades@u-blox.com 1:ed57b6ca43ab 1649 {
rob.meades@u-blox.com 1:ed57b6ca43ab 1650 char bitmap = (char) CHARGER_FAULT_NONE;
rob.meades@u-blox.com 1:ed57b6ca43ab 1651 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 1652
rob.meades@u-blox.com 1:ed57b6ca43ab 1653 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1654 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1655 // Read the fault register
rob.meades@u-blox.com 1:ed57b6ca43ab 1656 if (getRegister(0x09, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1657 bitmap = reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 1658 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 1659 printf("BatteryChargerBq24295 (I2C 0x%02x): charge fault register 0x%02x.\r\n", gAddress >> 1, bitmap);
rob.meades@u-blox.com 1:ed57b6ca43ab 1660 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 1661 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1662 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1663 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1664
rob.meades@u-blox.com 1:ed57b6ca43ab 1665 return bitmap;
rob.meades@u-blox.com 1:ed57b6ca43ab 1666 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1667
rob.meades@u-blox.com 1:ed57b6ca43ab 1668 /// Enable shipping mode.
rob.meades@u-blox.com 1:ed57b6ca43ab 1669 bool BatteryChargerBq24295::enableShippingMode (void)
rob.meades@u-blox.com 1:ed57b6ca43ab 1670 {
rob.meades@u-blox.com 1:ed57b6ca43ab 1671 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 1672
rob.meades@u-blox.com 1:ed57b6ca43ab 1673 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1674 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1675 // Have to disable the watchdog (bits 4 & 5 of charge termination/timer control register)
rob.meades@u-blox.com 1:ed57b6ca43ab 1676 if (clearRegisterBits(0x05, (1 << 4) || (1 << 5))) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1677 // Now disable the BATFET, bit 5 of the misc operation control register
rob.meades@u-blox.com 1:ed57b6ca43ab 1678 success = setRegisterBits(0x07, (1 << 5));
rob.meades@u-blox.com 1:ed57b6ca43ab 1679 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 1680 if (success) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1681 printf("BatteryChargerBq24295 (I2C 0x%02x): shipping mode is now ENABLED.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 1682 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1683 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 1684 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1685 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1686 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1687
rob.meades@u-blox.com 1:ed57b6ca43ab 1688 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 1689 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1690
rob.meades@u-blox.com 1:ed57b6ca43ab 1691 /// Disable shipping mode.
rob.meades@u-blox.com 1:ed57b6ca43ab 1692 bool BatteryChargerBq24295::disableShippingMode (void)
rob.meades@u-blox.com 1:ed57b6ca43ab 1693 {
rob.meades@u-blox.com 1:ed57b6ca43ab 1694 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 1695
rob.meades@u-blox.com 1:ed57b6ca43ab 1696 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1697 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1698 // Set the watchdog timer back to default (bit 4 of charge termination/timer control register)
rob.meades@u-blox.com 1:ed57b6ca43ab 1699 if (setRegisterBits(0x05, (1 << 4))) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1700 // Now enable the BATFET, bit 5 of the misc operation control register
rob.meades@u-blox.com 1:ed57b6ca43ab 1701 success = clearRegisterBits(0x07, (1 << 5));
rob.meades@u-blox.com 1:ed57b6ca43ab 1702 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 1703 if (success) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1704 printf("BatteryChargerBq24295 (I2C 0x%02x): shipping mode is now DISABLED.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 1705 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1706 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 1707 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1708 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1709 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1710
rob.meades@u-blox.com 1:ed57b6ca43ab 1711 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 1712 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1713
rob.meades@u-blox.com 1:ed57b6ca43ab 1714 /// Check if shipping mode is enabled.
rob.meades@u-blox.com 1:ed57b6ca43ab 1715 bool BatteryChargerBq24295::isShippingModeEnabled (void)
rob.meades@u-blox.com 1:ed57b6ca43ab 1716 {
rob.meades@u-blox.com 1:ed57b6ca43ab 1717 bool isEnabled = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 1718 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 1719
rob.meades@u-blox.com 1:ed57b6ca43ab 1720 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1721 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1722 // To be in shipping mode the watchdog has to be disabled
rob.meades@u-blox.com 1:ed57b6ca43ab 1723 if (getRegister(0x05, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1724 // Check bits 4 & 5 of the charge termination/timer control register for zero
rob.meades@u-blox.com 1:ed57b6ca43ab 1725 if ((reg & ((1 << 4) || (1 << 5))) == 0) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1726 // Now see if the BATFET is disabled (bit 5 of the misc operation control register)
rob.meades@u-blox.com 1:ed57b6ca43ab 1727 if (getRegister(0x07, &reg) && ((reg & (1 << 5)) != 0)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1728 isEnabled = true;
rob.meades@u-blox.com 1:ed57b6ca43ab 1729 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1730 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1731 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 1732 if (isEnabled) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1733 printf("BatteryChargerBq24295 (I2C 0x%02x): shipping mode is ENABLED.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 1734 } else {
rob.meades@u-blox.com 1:ed57b6ca43ab 1735 printf("BatteryChargerBq24295 (I2C 0x%02x): shipping mode is DISABLED.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 1736 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1737 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 1738 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1739 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1740 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1741
rob.meades@u-blox.com 1:ed57b6ca43ab 1742 return isEnabled;
rob.meades@u-blox.com 1:ed57b6ca43ab 1743 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1744
rob.meades@u-blox.com 1:ed57b6ca43ab 1745 /// Read a register on the chip.
rob.meades@u-blox.com 1:ed57b6ca43ab 1746 bool BatteryChargerBq24295::advancedGet(char address, char *pValue)
rob.meades@u-blox.com 1:ed57b6ca43ab 1747 {
rob.meades@u-blox.com 1:ed57b6ca43ab 1748 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 1749 char value;
rob.meades@u-blox.com 1:ed57b6ca43ab 1750
rob.meades@u-blox.com 1:ed57b6ca43ab 1751 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1752 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1753 // Read the register
rob.meades@u-blox.com 1:ed57b6ca43ab 1754 if (getRegister(address, &value)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1755 success = true;
rob.meades@u-blox.com 1:ed57b6ca43ab 1756 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 1757 printf("BatteryChargerBq24295 (I2C 0x%02x): read 0x%02x from address 0x%02x.\n", gAddress >> 1, value, address);
rob.meades@u-blox.com 1:ed57b6ca43ab 1758 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 1759 if (pValue != NULL) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1760 *pValue = value;
rob.meades@u-blox.com 1:ed57b6ca43ab 1761 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1762 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1763 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1764 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1765
rob.meades@u-blox.com 1:ed57b6ca43ab 1766 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 1767 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1768
rob.meades@u-blox.com 1:ed57b6ca43ab 1769 /// Set a register on the chip.
rob.meades@u-blox.com 1:ed57b6ca43ab 1770 // TODO test
rob.meades@u-blox.com 1:ed57b6ca43ab 1771 bool BatteryChargerBq24295::advancedSet(char address, char value)
rob.meades@u-blox.com 1:ed57b6ca43ab 1772 {
rob.meades@u-blox.com 1:ed57b6ca43ab 1773 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 1774
rob.meades@u-blox.com 1:ed57b6ca43ab 1775 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1776 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1777 // Set the register
rob.meades@u-blox.com 1:ed57b6ca43ab 1778 success = setRegister (address, value);
rob.meades@u-blox.com 1:ed57b6ca43ab 1779 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 1780 if (success) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1781 printf("BatteryChargerBq24295 (I2C 0x%02x): wrote 0x%02x to address 0x%02x.\n", gAddress >> 1, value, address);
rob.meades@u-blox.com 1:ed57b6ca43ab 1782 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1783 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 1784 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1785 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1786
rob.meades@u-blox.com 1:ed57b6ca43ab 1787 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 1788 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1789
rob.meades@u-blox.com 1:ed57b6ca43ab 1790 // End Of File