This class provides APIs to all of the registers of the TI BQ35100 battery gauge, as used on the u-blox C030 primary battery shield.

Dependents:   example-battery-gauge-bq35100

Committer:
RobMeades
Date:
Mon Jul 03 16:12:22 2017 +0000
Revision:
0:cec745c014b7
Child:
1:ee7cc8d75283
Initial commit, work in progress.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RobMeades 0:cec745c014b7 1 /* mbed Microcontroller Library
RobMeades 0:cec745c014b7 2 * Copyright (c) 2017 u-blox
RobMeades 0:cec745c014b7 3 *
RobMeades 0:cec745c014b7 4 * Licensed under the Apache License, Version 2.0 (the "License");
RobMeades 0:cec745c014b7 5 * you may not use this file except in compliance with the License.
RobMeades 0:cec745c014b7 6 * You may obtain a copy of the License at
RobMeades 0:cec745c014b7 7 *
RobMeades 0:cec745c014b7 8 * http://www.apache.org/licenses/LICENSE-2.0
RobMeades 0:cec745c014b7 9 *
RobMeades 0:cec745c014b7 10 * Unless required by applicable law or agreed to in writing, software
RobMeades 0:cec745c014b7 11 * distributed under the License is distributed on an "AS IS" BASIS,
RobMeades 0:cec745c014b7 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
RobMeades 0:cec745c014b7 13 * See the License for the specific language governing permissions and
RobMeades 0:cec745c014b7 14 * limitations under the License.
RobMeades 0:cec745c014b7 15 */
RobMeades 0:cec745c014b7 16
RobMeades 0:cec745c014b7 17 /**
RobMeades 0:cec745c014b7 18 * @file bq35100.cpp
RobMeades 0:cec745c014b7 19 * This file defines the API to the TI BQ35100 battery gauge chip.
RobMeades 0:cec745c014b7 20 */
RobMeades 0:cec745c014b7 21
RobMeades 0:cec745c014b7 22 /** Define these to print debug information. */
RobMeades 0:cec745c014b7 23 //#define DEBUG_BQ35100
RobMeades 0:cec745c014b7 24
RobMeades 0:cec745c014b7 25 #include <mbed.h>
RobMeades 0:cec745c014b7 26 #include <battery_gauge_bq35100.h>
RobMeades 0:cec745c014b7 27
RobMeades 0:cec745c014b7 28 #ifdef DEBUG_BQ35100
RobMeades 0:cec745c014b7 29 # include <stdio.h>
RobMeades 0:cec745c014b7 30 #endif
RobMeades 0:cec745c014b7 31
RobMeades 0:cec745c014b7 32 // ----------------------------------------------------------------
RobMeades 0:cec745c014b7 33 // COMPILE-TIME MACROS
RobMeades 0:cec745c014b7 34 // ----------------------------------------------------------------
RobMeades 0:cec745c014b7 35
RobMeades 0:cec745c014b7 36 // ----------------------------------------------------------------
RobMeades 0:cec745c014b7 37 // PRIVATE VARIABLES
RobMeades 0:cec745c014b7 38 // ----------------------------------------------------------------
RobMeades 0:cec745c014b7 39
RobMeades 0:cec745c014b7 40 // ----------------------------------------------------------------
RobMeades 0:cec745c014b7 41 // GENERIC PRIVATE FUNCTIONS
RobMeades 0:cec745c014b7 42 // ----------------------------------------------------------------
RobMeades 0:cec745c014b7 43
RobMeades 0:cec745c014b7 44 // Read two bytes from an address.
RobMeades 0:cec745c014b7 45 // Note: gpI2c should be locked before this is called.
RobMeades 0:cec745c014b7 46 bool BatteryGaugeBq35100::getTwoBytes (uint8_t registerAddress, uint16_t *pBytes)
RobMeades 0:cec745c014b7 47 {
RobMeades 0:cec745c014b7 48 bool success = false;
RobMeades 0:cec745c014b7 49 char data[3];
RobMeades 0:cec745c014b7 50
RobMeades 0:cec745c014b7 51 if (gpI2c != NULL) {
RobMeades 0:cec745c014b7 52 // Send a command to read from registerAddress
RobMeades 0:cec745c014b7 53 data[0] = registerAddress;
RobMeades 0:cec745c014b7 54 data[1] = 0;
RobMeades 0:cec745c014b7 55 data[2] = 0;
RobMeades 0:cec745c014b7 56
RobMeades 0:cec745c014b7 57 if ((gpI2c->write(gAddress, &(data[0]), 1) == 0) &&
RobMeades 0:cec745c014b7 58 (gpI2c->read(gAddress, &(data[1]), 2) == 0)) {
RobMeades 0:cec745c014b7 59 success = true;
RobMeades 0:cec745c014b7 60 if (pBytes) {
RobMeades 0:cec745c014b7 61 *pBytes = (((uint16_t) data[2]) << 8) + data[1];
RobMeades 0:cec745c014b7 62 }
RobMeades 0:cec745c014b7 63 }
RobMeades 0:cec745c014b7 64 }
RobMeades 0:cec745c014b7 65
RobMeades 0:cec745c014b7 66 return success;
RobMeades 0:cec745c014b7 67 }
RobMeades 0:cec745c014b7 68
RobMeades 0:cec745c014b7 69 //----------------------------------------------------------------
RobMeades 0:cec745c014b7 70 // PUBLIC FUNCTIONS
RobMeades 0:cec745c014b7 71 // ----------------------------------------------------------------
RobMeades 0:cec745c014b7 72
RobMeades 0:cec745c014b7 73 // Constructor.
RobMeades 0:cec745c014b7 74 BatteryGaugeBq35100::BatteryGaugeBq35100(void)
RobMeades 0:cec745c014b7 75 {
RobMeades 0:cec745c014b7 76 gpI2c = NULL;
RobMeades 0:cec745c014b7 77 gReady = false;
RobMeades 0:cec745c014b7 78 gGaugeOn = false;
RobMeades 0:cec745c014b7 79 gSealCode = 0;
RobMeades 0:cec745c014b7 80 }
RobMeades 0:cec745c014b7 81
RobMeades 0:cec745c014b7 82 // Destructor.
RobMeades 0:cec745c014b7 83 BatteryGaugeBq35100::~BatteryGaugeBq35100(void)
RobMeades 0:cec745c014b7 84 {
RobMeades 0:cec745c014b7 85 }
RobMeades 0:cec745c014b7 86
RobMeades 0:cec745c014b7 87 // Initialise ourselves.
RobMeades 0:cec745c014b7 88 bool BatteryGaugeBq35100::init (I2C * pI2c, uint8_t address, uint16_t sealCode)
RobMeades 0:cec745c014b7 89 {
RobMeades 0:cec745c014b7 90 uint16_t answer;
RobMeades 0:cec745c014b7 91 char data[4];
RobMeades 0:cec745c014b7 92
RobMeades 0:cec745c014b7 93 gpI2c = pI2c;
RobMeades 0:cec745c014b7 94 gAddress = address << 1;
RobMeades 0:cec745c014b7 95 gSealCode = sealCode;
RobMeades 0:cec745c014b7 96
RobMeades 0:cec745c014b7 97 if (gpI2c != NULL) {
RobMeades 0:cec745c014b7 98 gpI2c->lock();
RobMeades 0:cec745c014b7 99
RobMeades 0:cec745c014b7 100 // Send a control command to read the firmware version
RobMeades 0:cec745c014b7 101 data[0] = 0x00; // Set address to first register for control
RobMeades 0:cec745c014b7 102 data[1] = 0x02; // First byte of FW_VERSION sub-command (0x02)
RobMeades 0:cec745c014b7 103 data[2] = 0x00; // Second byte of FW_VERSION sub-command (0x00) (register address will auto-increment)
RobMeades 0:cec745c014b7 104
RobMeades 0:cec745c014b7 105 if (gpI2c->write(gAddress, &(data[0]), 3) == 0) {
RobMeades 0:cec745c014b7 106 if (getTwoBytes (0, &answer)) {
RobMeades 0:cec745c014b7 107 #ifdef DEBUG_BQ35100
RobMeades 0:cec745c014b7 108 printf("BatteryGaugeBq35100 (I2C 0x%02x): read 0x%04x as FW_VERSION, expected 0x0109.\n", gAddress >> 1, answer);
RobMeades 0:cec745c014b7 109 #endif
RobMeades 0:cec745c014b7 110 }
RobMeades 0:cec745c014b7 111 }
RobMeades 0:cec745c014b7 112 gpI2c->unlock();
RobMeades 0:cec745c014b7 113 }
RobMeades 0:cec745c014b7 114
RobMeades 0:cec745c014b7 115 #ifdef DEBUG_BQ35100
RobMeades 0:cec745c014b7 116 if (gReady) {
RobMeades 0:cec745c014b7 117 printf("BatteryGaugeBq35100 (I2C 0x%02x): handler initialised.\r\n", gAddress >> 1);
RobMeades 0:cec745c014b7 118 } else {
RobMeades 0:cec745c014b7 119 printf("BatteryGaugeBq35100 (I2C 0x%02x): init NOT successful.\r\n", gAddress >> 1);
RobMeades 0:cec745c014b7 120 }
RobMeades 0:cec745c014b7 121 #endif
RobMeades 0:cec745c014b7 122
RobMeades 0:cec745c014b7 123 return gReady;
RobMeades 0:cec745c014b7 124 }
RobMeades 0:cec745c014b7 125
RobMeades 0:cec745c014b7 126 /* End Of File */