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:
Wed Aug 02 13:33:58 2017 +0100
Revision:
8:2a758bf86bb7
Parent:
7:cc08662947cd
Add comment concerning the response to getChargerState() on a C030 board and removed spurious "/".

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
RobMeades 2:f0bbe0269d67 32 /* ----------------------------------------------------------------
RobMeades 2:f0bbe0269d67 33 * COMPILE-TIME MACROS
RobMeades 2:f0bbe0269d67 34 * -------------------------------------------------------------- */
rob.meades@u-blox.com 1:ed57b6ca43ab 35
RobMeades 2:f0bbe0269d67 36 /* ----------------------------------------------------------------
RobMeades 2:f0bbe0269d67 37 * PRIVATE VARIABLES
RobMeades 2:f0bbe0269d67 38 * -------------------------------------------------------------- */
rob.meades@u-blox.com 1:ed57b6ca43ab 39
RobMeades 2:f0bbe0269d67 40 /* ----------------------------------------------------------------
RobMeades 2:f0bbe0269d67 41 * GENERIC PRIVATE FUNCTIONS
RobMeades 2:f0bbe0269d67 42 * -------------------------------------------------------------- */
rob.meades@u-blox.com 1:ed57b6ca43ab 43
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 121 /* ----------------------------------------------------------------
RobMeades 2:f0bbe0269d67 122 * PUBLIC FUNCTIONS
RobMeades 2:f0bbe0269d67 123 * -------------------------------------------------------------- */
rob.meades@u-blox.com 1:ed57b6ca43ab 124
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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 8:2a758bf86bb7 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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 7:cc08662947cd 641 printf("BatteryChargerBq24295 (I2C 0x%02x): fast charging safety timer now set to %d hours.\r\n", gAddress >> 1, (int) 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
RobMeades 2:f0bbe0269d67 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 7:cc08662947cd 687 printf("BatteryChargerBq24295 (I2C 0x%02x): fast charging safety timer is %d hours.\r\n", gAddress >> 1, (int) *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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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 7:cc08662947cd 1174 printf("BatteryChargerBq24295 (I2C 0x%02x): boost mode lower temperature limit now set to %d C.\r\n", gAddress >> 1, (int) 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
RobMeades 2:f0bbe0269d67 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 7:cc08662947cd 1213 printf("BatteryChargerBq24295 (I2C 0x%02x): boost mode upper temperature limit is %d C.\r\n", gAddress >> 1, (int) *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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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
RobMeades 2:f0bbe0269d67 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 7:cc08662947cd 1597 printf("BatteryChargerBq24295 (I2C 0x%02x): chip thermal regulation threshold now set to %d C.\r\n", gAddress >> 1, (int) 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
RobMeades 2:f0bbe0269d67 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 7:cc08662947cd 1637 printf("BatteryChargerBq24295 (I2C 0x%02x): chip thermal regulation threshold is %d C.\r\n", gAddress >> 1, (int) *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
RobMeades 2:f0bbe0269d67 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 3:340d65a1a133 1668 // Feed the watchdog timer of the BQ24295 chip.
rob.meades@u-blox.com 3:340d65a1a133 1669 bool BatteryChargerBq24295::feedWatchdog (void)
rob.meades@u-blox.com 3:340d65a1a133 1670 {
rob.meades@u-blox.com 3:340d65a1a133 1671 bool success = false;
rob.meades@u-blox.com 3:340d65a1a133 1672
rob.meades@u-blox.com 3:340d65a1a133 1673 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 3:340d65a1a133 1674 gpI2c->lock();
rob.meades@u-blox.com 3:340d65a1a133 1675 // Watchdog reset is done by setting bit 6 of the power on control register
rob.meades@u-blox.com 3:340d65a1a133 1676 // to 1
rob.meades@u-blox.com 3:340d65a1a133 1677 success = setRegisterBits(0x01, (1 << 6));
rob.meades@u-blox.com 3:340d65a1a133 1678 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 3:340d65a1a133 1679 if (success) {
rob.meades@u-blox.com 3:340d65a1a133 1680 printf("BatteryChargerBq24295 (I2C 0x%02x): watchdog fed.\r\n", gAddress >> 1);
rob.meades@u-blox.com 3:340d65a1a133 1681 }
rob.meades@u-blox.com 3:340d65a1a133 1682 #endif
rob.meades@u-blox.com 3:340d65a1a133 1683 gpI2c->unlock();
rob.meades@u-blox.com 3:340d65a1a133 1684 }
rob.meades@u-blox.com 3:340d65a1a133 1685
rob.meades@u-blox.com 3:340d65a1a133 1686 return success;
rob.meades@u-blox.com 3:340d65a1a133 1687 }
rob.meades@u-blox.com 3:340d65a1a133 1688
rob.meades@u-blox.com 3:340d65a1a133 1689 // Get the watchdog timer of the BQ24295 chip.
rob.meades@u-blox.com 3:340d65a1a133 1690 bool BatteryChargerBq24295::getWatchdog (int32_t *pWatchdogS)
rob.meades@u-blox.com 3:340d65a1a133 1691 {
rob.meades@u-blox.com 3:340d65a1a133 1692 bool success = false;
rob.meades@u-blox.com 3:340d65a1a133 1693 char reg;
rob.meades@u-blox.com 3:340d65a1a133 1694
rob.meades@u-blox.com 3:340d65a1a133 1695 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 3:340d65a1a133 1696 gpI2c->lock();
rob.meades@u-blox.com 3:340d65a1a133 1697 // Watchdog timer is in bits 4 and 5 of the charger termination/timer control
rob.meades@u-blox.com 3:340d65a1a133 1698 // register, where 0 is disabled 01 is 40 secs, 10 is 80 secs and 11 is 160 secs
rob.meades@u-blox.com 3:340d65a1a133 1699 success = getRegister(0x05, &reg);
rob.meades@u-blox.com 3:340d65a1a133 1700 if (pWatchdogS != NULL) {
rob.meades@u-blox.com 3:340d65a1a133 1701 switch ((reg >> 4) & 0x03) {
rob.meades@u-blox.com 3:340d65a1a133 1702 case 0x00:
rob.meades@u-blox.com 3:340d65a1a133 1703 *pWatchdogS = 0;
rob.meades@u-blox.com 3:340d65a1a133 1704 break;
rob.meades@u-blox.com 3:340d65a1a133 1705 case 0x01:
rob.meades@u-blox.com 3:340d65a1a133 1706 *pWatchdogS = 40;
rob.meades@u-blox.com 3:340d65a1a133 1707 break;
rob.meades@u-blox.com 3:340d65a1a133 1708 case 0x02:
rob.meades@u-blox.com 3:340d65a1a133 1709 *pWatchdogS = 80;
rob.meades@u-blox.com 3:340d65a1a133 1710 break;
rob.meades@u-blox.com 3:340d65a1a133 1711 case 0x03:
rob.meades@u-blox.com 3:340d65a1a133 1712 *pWatchdogS = 160;
rob.meades@u-blox.com 3:340d65a1a133 1713 break;
rob.meades@u-blox.com 3:340d65a1a133 1714 default:
rob.meades@u-blox.com 3:340d65a1a133 1715 MBED_ASSERT(false);
rob.meades@u-blox.com 3:340d65a1a133 1716 break;
rob.meades@u-blox.com 3:340d65a1a133 1717 }
rob.meades@u-blox.com 3:340d65a1a133 1718 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 3:340d65a1a133 1719 if (success) {
rob.meades@u-blox.com 7:cc08662947cd 1720 printf("BatteryChargerBq24295 (I2C 0x%02x): watchdog is %d seconds.\r\n", gAddress >> 1, (int) *pWatchdogS);
rob.meades@u-blox.com 3:340d65a1a133 1721 }
rob.meades@u-blox.com 3:340d65a1a133 1722 #endif
rob.meades@u-blox.com 3:340d65a1a133 1723 }
rob.meades@u-blox.com 3:340d65a1a133 1724 gpI2c->unlock();
rob.meades@u-blox.com 3:340d65a1a133 1725 }
rob.meades@u-blox.com 3:340d65a1a133 1726
rob.meades@u-blox.com 3:340d65a1a133 1727 return success;
rob.meades@u-blox.com 3:340d65a1a133 1728 }
rob.meades@u-blox.com 3:340d65a1a133 1729
rob.meades@u-blox.com 3:340d65a1a133 1730 // Set the watchdog timer of the BQ24295 chip.
rob.meades@u-blox.com 3:340d65a1a133 1731 bool BatteryChargerBq24295::setWatchdog (int32_t watchdogS)
rob.meades@u-blox.com 3:340d65a1a133 1732 {
rob.meades@u-blox.com 3:340d65a1a133 1733 bool success = false;
rob.meades@u-blox.com 3:340d65a1a133 1734 char reg;
rob.meades@u-blox.com 3:340d65a1a133 1735 char regValue = 0;
rob.meades@u-blox.com 3:340d65a1a133 1736
rob.meades@u-blox.com 3:340d65a1a133 1737 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 3:340d65a1a133 1738 gpI2c->lock();
rob.meades@u-blox.com 3:340d65a1a133 1739 // Watchdog timer is in bits 4 and 5 of the charger termination/timer control
rob.meades@u-blox.com 3:340d65a1a133 1740 // register, where 0 is disabled 01 is 40 secs, 10 is 80 secs and 11 is 160 secs
rob.meades@u-blox.com 3:340d65a1a133 1741 if (watchdogS > 80) {
rob.meades@u-blox.com 3:340d65a1a133 1742 regValue = 0x03;
rob.meades@u-blox.com 3:340d65a1a133 1743 } else if (watchdogS > 40) {
rob.meades@u-blox.com 3:340d65a1a133 1744 regValue = 0x02;
rob.meades@u-blox.com 3:340d65a1a133 1745 } else if (watchdogS > 0) {
rob.meades@u-blox.com 3:340d65a1a133 1746 regValue = 0x01;
rob.meades@u-blox.com 3:340d65a1a133 1747 }
rob.meades@u-blox.com 3:340d65a1a133 1748 if (getRegister(0x05, &reg)) {
rob.meades@u-blox.com 3:340d65a1a133 1749 // Clear the bits then set them
rob.meades@u-blox.com 3:340d65a1a133 1750 reg &= ~(0x03 << 4);
rob.meades@u-blox.com 3:340d65a1a133 1751 reg |= regValue << 4;
rob.meades@u-blox.com 3:340d65a1a133 1752 success = setRegister(0x05, reg);
rob.meades@u-blox.com 3:340d65a1a133 1753 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 3:340d65a1a133 1754 if (success) {
rob.meades@u-blox.com 7:cc08662947cd 1755 printf("BatteryChargerBq24295 (I2C 0x%02x): watchdog set to %d seconds.\r\n", gAddress >> 1, (int) watchdogS);
rob.meades@u-blox.com 3:340d65a1a133 1756 }
rob.meades@u-blox.com 3:340d65a1a133 1757 #endif
rob.meades@u-blox.com 3:340d65a1a133 1758 }
rob.meades@u-blox.com 3:340d65a1a133 1759 gpI2c->unlock();
rob.meades@u-blox.com 3:340d65a1a133 1760 }
rob.meades@u-blox.com 3:340d65a1a133 1761
rob.meades@u-blox.com 3:340d65a1a133 1762 return success;
rob.meades@u-blox.com 3:340d65a1a133 1763 }
rob.meades@u-blox.com 3:340d65a1a133 1764
RobMeades 2:f0bbe0269d67 1765 // Enable shipping mode.
rob.meades@u-blox.com 1:ed57b6ca43ab 1766 bool BatteryChargerBq24295::enableShippingMode (void)
rob.meades@u-blox.com 1:ed57b6ca43ab 1767 {
rob.meades@u-blox.com 1:ed57b6ca43ab 1768 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 1769
rob.meades@u-blox.com 1:ed57b6ca43ab 1770 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1771 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1772 // Have to disable the watchdog (bits 4 & 5 of charge termination/timer control register)
rob.meades@u-blox.com 1:ed57b6ca43ab 1773 if (clearRegisterBits(0x05, (1 << 4) || (1 << 5))) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1774 // Now disable the BATFET, bit 5 of the misc operation control register
rob.meades@u-blox.com 1:ed57b6ca43ab 1775 success = setRegisterBits(0x07, (1 << 5));
rob.meades@u-blox.com 1:ed57b6ca43ab 1776 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 1777 if (success) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1778 printf("BatteryChargerBq24295 (I2C 0x%02x): shipping mode is now ENABLED.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 1779 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1780 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 1781 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1782 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1783 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1784
rob.meades@u-blox.com 1:ed57b6ca43ab 1785 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 1786 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1787
RobMeades 2:f0bbe0269d67 1788 // Disable shipping mode.
rob.meades@u-blox.com 1:ed57b6ca43ab 1789 bool BatteryChargerBq24295::disableShippingMode (void)
rob.meades@u-blox.com 1:ed57b6ca43ab 1790 {
rob.meades@u-blox.com 1:ed57b6ca43ab 1791 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 1792
rob.meades@u-blox.com 1:ed57b6ca43ab 1793 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1794 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1795 // Set the watchdog timer back to default (bit 4 of charge termination/timer control register)
rob.meades@u-blox.com 1:ed57b6ca43ab 1796 if (setRegisterBits(0x05, (1 << 4))) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1797 // Now enable the BATFET, bit 5 of the misc operation control register
rob.meades@u-blox.com 1:ed57b6ca43ab 1798 success = clearRegisterBits(0x07, (1 << 5));
rob.meades@u-blox.com 1:ed57b6ca43ab 1799 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 1800 if (success) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1801 printf("BatteryChargerBq24295 (I2C 0x%02x): shipping mode is now DISABLED.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 1802 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1803 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 1804 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1805 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1806 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1807
rob.meades@u-blox.com 1:ed57b6ca43ab 1808 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 1809 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1810
RobMeades 2:f0bbe0269d67 1811 // Check if shipping mode is enabled.
rob.meades@u-blox.com 1:ed57b6ca43ab 1812 bool BatteryChargerBq24295::isShippingModeEnabled (void)
rob.meades@u-blox.com 1:ed57b6ca43ab 1813 {
rob.meades@u-blox.com 1:ed57b6ca43ab 1814 bool isEnabled = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 1815 char reg;
rob.meades@u-blox.com 1:ed57b6ca43ab 1816
rob.meades@u-blox.com 1:ed57b6ca43ab 1817 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1818 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1819 // To be in shipping mode the watchdog has to be disabled
rob.meades@u-blox.com 1:ed57b6ca43ab 1820 if (getRegister(0x05, &reg)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1821 // Check bits 4 & 5 of the charge termination/timer control register for zero
rob.meades@u-blox.com 1:ed57b6ca43ab 1822 if ((reg & ((1 << 4) || (1 << 5))) == 0) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1823 // Now see if the BATFET is disabled (bit 5 of the misc operation control register)
rob.meades@u-blox.com 1:ed57b6ca43ab 1824 if (getRegister(0x07, &reg) && ((reg & (1 << 5)) != 0)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1825 isEnabled = true;
rob.meades@u-blox.com 1:ed57b6ca43ab 1826 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1827 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1828 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 1829 if (isEnabled) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1830 printf("BatteryChargerBq24295 (I2C 0x%02x): shipping mode is ENABLED.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 1831 } else {
rob.meades@u-blox.com 1:ed57b6ca43ab 1832 printf("BatteryChargerBq24295 (I2C 0x%02x): shipping mode is DISABLED.\r\n", gAddress >> 1);
rob.meades@u-blox.com 1:ed57b6ca43ab 1833 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1834 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 1835 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1836 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1837 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1838
rob.meades@u-blox.com 1:ed57b6ca43ab 1839 return isEnabled;
rob.meades@u-blox.com 1:ed57b6ca43ab 1840 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1841
RobMeades 2:f0bbe0269d67 1842 // Read a register on the chip.
rob.meades@u-blox.com 1:ed57b6ca43ab 1843 bool BatteryChargerBq24295::advancedGet(char address, char *pValue)
rob.meades@u-blox.com 1:ed57b6ca43ab 1844 {
rob.meades@u-blox.com 1:ed57b6ca43ab 1845 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 1846 char value;
rob.meades@u-blox.com 1:ed57b6ca43ab 1847
rob.meades@u-blox.com 1:ed57b6ca43ab 1848 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1849 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1850 // Read the register
rob.meades@u-blox.com 1:ed57b6ca43ab 1851 if (getRegister(address, &value)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1852 success = true;
rob.meades@u-blox.com 1:ed57b6ca43ab 1853 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 1854 printf("BatteryChargerBq24295 (I2C 0x%02x): read 0x%02x from address 0x%02x.\n", gAddress >> 1, value, address);
rob.meades@u-blox.com 1:ed57b6ca43ab 1855 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 1856 if (pValue != NULL) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1857 *pValue = value;
rob.meades@u-blox.com 1:ed57b6ca43ab 1858 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1859 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1860 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1861 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1862
rob.meades@u-blox.com 1:ed57b6ca43ab 1863 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 1864 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1865
RobMeades 2:f0bbe0269d67 1866 // Set a register on the chip.
rob.meades@u-blox.com 1:ed57b6ca43ab 1867 // TODO test
rob.meades@u-blox.com 1:ed57b6ca43ab 1868 bool BatteryChargerBq24295::advancedSet(char address, char value)
rob.meades@u-blox.com 1:ed57b6ca43ab 1869 {
rob.meades@u-blox.com 1:ed57b6ca43ab 1870 bool success = false;
rob.meades@u-blox.com 1:ed57b6ca43ab 1871
rob.meades@u-blox.com 1:ed57b6ca43ab 1872 if (gReady && (gpI2c != NULL)) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1873 gpI2c->lock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1874 // Set the register
rob.meades@u-blox.com 1:ed57b6ca43ab 1875 success = setRegister (address, value);
rob.meades@u-blox.com 1:ed57b6ca43ab 1876 #ifdef DEBUG_BQ24295
rob.meades@u-blox.com 1:ed57b6ca43ab 1877 if (success) {
rob.meades@u-blox.com 1:ed57b6ca43ab 1878 printf("BatteryChargerBq24295 (I2C 0x%02x): wrote 0x%02x to address 0x%02x.\n", gAddress >> 1, value, address);
rob.meades@u-blox.com 1:ed57b6ca43ab 1879 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1880 #endif
rob.meades@u-blox.com 1:ed57b6ca43ab 1881 gpI2c->unlock();
rob.meades@u-blox.com 1:ed57b6ca43ab 1882 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1883
rob.meades@u-blox.com 1:ed57b6ca43ab 1884 return success;
rob.meades@u-blox.com 1:ed57b6ca43ab 1885 }
rob.meades@u-blox.com 1:ed57b6ca43ab 1886
RobMeades 2:f0bbe0269d67 1887 /* End Of File */