This is a library for the MAX17055 Li+ Battery Fuel Gauge.
Dependents: Low_Power_Long_Distance_IR_Vision_Robot MAX17055_EZconfig MAX17055_EZconfig_Sample Low_Power_Long_Distance_IR_Vision_Robot
Fork of max17055 by
max17055.cpp@22:607f6917832a, 2018-10-23 (annotated)
- Committer:
- fneirab
- Date:
- Tue Oct 23 23:07:56 2018 +0000
- Revision:
- 22:607f6917832a
- Parent:
- 20:dcb0e5893677
spelling check
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
fneirab | 9:f29d5e49b190 | 1 | /******************************************************************************* |
fneirab | 9:f29d5e49b190 | 2 | * Copyright (C) 2018 Maxim Integrated Products, Inc., All Rights Reserved. |
fneirab | 4:a4d6ae2182c2 | 3 | * |
fneirab | 4:a4d6ae2182c2 | 4 | * Permission is hereby granted, free of charge, to any person obtaining a |
fneirab | 4:a4d6ae2182c2 | 5 | * copy of this software and associated documentation files (the "Software"), |
fneirab | 4:a4d6ae2182c2 | 6 | * to deal in the Software without restriction, including without limitation |
fneirab | 4:a4d6ae2182c2 | 7 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
fneirab | 4:a4d6ae2182c2 | 8 | * and/or sell copies of the Software, and to permit persons to whom the |
fneirab | 4:a4d6ae2182c2 | 9 | * Software is furnished to do so, subject to the following conditions: |
fneirab | 4:a4d6ae2182c2 | 10 | * |
fneirab | 4:a4d6ae2182c2 | 11 | * The above copyright notice and this permission notice shall be included |
fneirab | 4:a4d6ae2182c2 | 12 | * in all copies or substantial portions of the Software. |
fneirab | 4:a4d6ae2182c2 | 13 | * |
fneirab | 4:a4d6ae2182c2 | 14 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
fneirab | 4:a4d6ae2182c2 | 15 | * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
fneirab | 4:a4d6ae2182c2 | 16 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
fneirab | 4:a4d6ae2182c2 | 17 | * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES |
fneirab | 4:a4d6ae2182c2 | 18 | * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
fneirab | 4:a4d6ae2182c2 | 19 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
fneirab | 4:a4d6ae2182c2 | 20 | * OTHER DEALINGS IN THE SOFTWARE. |
fneirab | 4:a4d6ae2182c2 | 21 | * |
fneirab | 4:a4d6ae2182c2 | 22 | * Except as contained in this notice, the name of Maxim Integrated |
fneirab | 4:a4d6ae2182c2 | 23 | * Products, Inc. shall not be used except as stated in the Maxim Integrated |
fneirab | 4:a4d6ae2182c2 | 24 | * Products, Inc. Branding Policy. |
fneirab | 4:a4d6ae2182c2 | 25 | * |
fneirab | 4:a4d6ae2182c2 | 26 | * The mere transfer of this software does not imply any licenses |
fneirab | 4:a4d6ae2182c2 | 27 | * of trade secrets, proprietary technology, copyrights, patents, |
fneirab | 4:a4d6ae2182c2 | 28 | * trademarks, maskwork rights, or any other form of intellectual |
fneirab | 4:a4d6ae2182c2 | 29 | * property whatsoever. Maxim Integrated Products, Inc. retains all |
fneirab | 4:a4d6ae2182c2 | 30 | * ownership rights. |
fneirab | 9:f29d5e49b190 | 31 | ******************************************************************************* |
fneirab | 9:f29d5e49b190 | 32 | */ |
fneirab | 0:80c39eb8f3ba | 33 | |
fneirab | 0:80c39eb8f3ba | 34 | #include "mbed.h" |
fneirab | 0:80c39eb8f3ba | 35 | #include "max17055.h" |
fneirab | 0:80c39eb8f3ba | 36 | |
fneirab | 9:f29d5e49b190 | 37 | /* POR Mask */ |
fneirab | 9:f29d5e49b190 | 38 | #define MAX17055_POR_MASK (0xFFFD) |
fneirab | 17:7447aaa9c121 | 39 | #define MAX17055_CYCLE_MASK (0x0002) |
fneirab | 17:7447aaa9c121 | 40 | |
fneirab | 9:f29d5e49b190 | 41 | |
fneirab | 5:a18a189588dc | 42 | /* MODELCFG register bits */ |
fneirab | 5:a18a189588dc | 43 | #define MAX17055_MODELCFG_REFRESH (1 << 15) |
fneirab | 5:a18a189588dc | 44 | |
fneirab | 5:a18a189588dc | 45 | |
fneirab | 5:a18a189588dc | 46 | /* FSTAT register bits */ |
fneirab | 5:a18a189588dc | 47 | #define MAX17055_FSTAT_DNR (1) |
fneirab | 5:a18a189588dc | 48 | |
fneirab | 11:bdbd3104995b | 49 | /* LIBRARY FUNCTION SUCCESS*/ |
fneirab | 11:bdbd3104995b | 50 | #define F_SUCCESS_0 0 |
fneirab | 11:bdbd3104995b | 51 | |
fneirab | 17:7447aaa9c121 | 52 | /* LIBRARY FUNCTION ERROR CODES */ |
fneirab | 12:519a18fc3b28 | 53 | #define F_ERROR_1 -1 //-1 if I2C read/write errors exist |
fneirab | 11:bdbd3104995b | 54 | #define F_ERROR_2 -2 //-2 if device is not present |
fneirab | 11:bdbd3104995b | 55 | #define F_ERROR_3 -3 //-3 if function error |
fneirab | 11:bdbd3104995b | 56 | #define F_ERROR_4 -4 //-4 if other error |
fneirab | 11:bdbd3104995b | 57 | #define F_ERROR_5 -5 //-5 if POR not detected |
fneirab | 4:a4d6ae2182c2 | 58 | |
fneirab | 0:80c39eb8f3ba | 59 | |
fneirab | 5:a18a189588dc | 60 | |
fneirab | 11:bdbd3104995b | 61 | /** |
fneirab | 11:bdbd3104995b | 62 | * @brief max17055 Constructor |
fneirab | 11:bdbd3104995b | 63 | * @details max17055 Constructor with battery and i2c as parameters |
fneirab | 11:bdbd3104995b | 64 | */ |
fneirab | 5:a18a189588dc | 65 | MAX17055::MAX17055(I2C &i2c): |
fneirab | 5:a18a189588dc | 66 | m_i2cBus(i2c) |
fneirab | 0:80c39eb8f3ba | 67 | { |
fneirab | 5:a18a189588dc | 68 | //empty block |
fneirab | 0:80c39eb8f3ba | 69 | } |
fneirab | 0:80c39eb8f3ba | 70 | |
fneirab | 11:bdbd3104995b | 71 | /** |
fneirab | 11:bdbd3104995b | 72 | * @brief Fuel Gauge Destructor |
fneirab | 11:bdbd3104995b | 73 | */ |
fneirab | 0:80c39eb8f3ba | 74 | MAX17055::~MAX17055() |
fneirab | 0:80c39eb8f3ba | 75 | { |
fneirab | 0:80c39eb8f3ba | 76 | //empty block |
fneirab | 0:80c39eb8f3ba | 77 | } |
fneirab | 5:a18a189588dc | 78 | |
fneirab | 0:80c39eb8f3ba | 79 | /** |
fneirab | 11:bdbd3104995b | 80 | * @brief Writes a register. |
fneirab | 11:bdbd3104995b | 81 | * |
fneirab | 11:bdbd3104995b | 82 | * @param[in] reg_addr The register address |
fneirab | 11:bdbd3104995b | 83 | * @param[in] reg_data The register data |
fneirab | 11:bdbd3104995b | 84 | * |
fneirab | 11:bdbd3104995b | 85 | * @retval 0 on success |
fneirab | 11:bdbd3104995b | 86 | * @retval non-0 for errors |
fneirab | 11:bdbd3104995b | 87 | */ |
fneirab | 0:80c39eb8f3ba | 88 | int MAX17055::writeReg(Registers_e reg_addr, uint16_t reg_data) |
fneirab | 0:80c39eb8f3ba | 89 | { |
fneirab | 0:80c39eb8f3ba | 90 | |
fneirab | 7:479a36909ced | 91 | uint16_t mask = 0x00FF; |
fneirab | 1:a031f0c6a71e | 92 | uint8_t dataLSB; |
fneirab | 1:a031f0c6a71e | 93 | uint8_t dataMSB; |
fneirab | 5:a18a189588dc | 94 | |
fneirab | 7:479a36909ced | 95 | dataLSB = reg_data & mask; |
fneirab | 7:479a36909ced | 96 | dataMSB = (reg_data >> 8) & mask; |
fneirab | 5:a18a189588dc | 97 | |
fneirab | 7:479a36909ced | 98 | char addr_plus_data[3] = {reg_addr, dataLSB, dataMSB}; |
fneirab | 5:a18a189588dc | 99 | |
fneirab | 11:bdbd3104995b | 100 | if ( m_i2cBus.write(I2C_W_ADRS, addr_plus_data, 3, false) == F_SUCCESS_0) |
fneirab | 11:bdbd3104995b | 101 | return F_SUCCESS_0; |
fneirab | 0:80c39eb8f3ba | 102 | else |
fneirab | 11:bdbd3104995b | 103 | return F_ERROR_1; |
fneirab | 11:bdbd3104995b | 104 | } |
fneirab | 0:80c39eb8f3ba | 105 | |
fneirab | 0:80c39eb8f3ba | 106 | /** |
fneirab | 11:bdbd3104995b | 107 | * @brief Reads from MAX17055 register. |
fneirab | 11:bdbd3104995b | 108 | * |
fneirab | 11:bdbd3104995b | 109 | * @param[in] reg_addr The register address |
fneirab | 11:bdbd3104995b | 110 | * @param value The value |
fneirab | 11:bdbd3104995b | 111 | * |
fneirab | 11:bdbd3104995b | 112 | * @retval 0 on success |
fneirab | 11:bdbd3104995b | 113 | * @retval non-0 for errors |
fneirab | 11:bdbd3104995b | 114 | */ |
fneirab | 1:a031f0c6a71e | 115 | int32_t MAX17055::readReg(Registers_e reg_addr, uint16_t &value) |
fneirab | 0:80c39eb8f3ba | 116 | { |
fneirab | 0:80c39eb8f3ba | 117 | int32_t result; |
fneirab | 7:479a36909ced | 118 | uint16_t mask = 0x00FF; |
fneirab | 1:a031f0c6a71e | 119 | char local_data[1]; |
fneirab | 0:80c39eb8f3ba | 120 | local_data[0] = reg_addr; |
fneirab | 1:a031f0c6a71e | 121 | char read_data[2]; |
fneirab | 5:a18a189588dc | 122 | |
fneirab | 0:80c39eb8f3ba | 123 | result = m_i2cBus.write(I2C_W_ADRS, local_data, 1); |
fneirab | 11:bdbd3104995b | 124 | if(result == F_SUCCESS_0) { |
fneirab | 1:a031f0c6a71e | 125 | result = m_i2cBus.read(I2C_R_ADRS, read_data , 2, false); |
fneirab | 11:bdbd3104995b | 126 | if (result == F_SUCCESS_0) { |
fneirab | 7:479a36909ced | 127 | value = ( ((read_data[1] & mask) << 8) + (read_data[0])); |
fneirab | 11:bdbd3104995b | 128 | result = F_SUCCESS_0; |
fneirab | 5:a18a189588dc | 129 | } |
fneirab | 0:80c39eb8f3ba | 130 | } |
fneirab | 0:80c39eb8f3ba | 131 | return result; |
fneirab | 0:80c39eb8f3ba | 132 | } |
fneirab | 0:80c39eb8f3ba | 133 | |
fneirab | 1:a031f0c6a71e | 134 | /** |
fneirab | 17:7447aaa9c121 | 135 | * @brief Reads an specified register from the MAX17055 register. |
fneirab | 17:7447aaa9c121 | 136 | * |
fneirab | 17:7447aaa9c121 | 137 | * @param[in] reg_addr The register address |
fneirab | 17:7447aaa9c121 | 138 | * @param value The value |
fneirab | 17:7447aaa9c121 | 139 | * |
fneirab | 17:7447aaa9c121 | 140 | * @retval reg_data register data |
fneirab | 17:7447aaa9c121 | 141 | * @retval statusRead non-0 for errors |
fneirab | 17:7447aaa9c121 | 142 | */ |
fneirab | 17:7447aaa9c121 | 143 | |
fneirab | 17:7447aaa9c121 | 144 | int16_t MAX17055::get_regInfo(Registers_e reg_addr) |
fneirab | 17:7447aaa9c121 | 145 | { |
fneirab | 17:7447aaa9c121 | 146 | uint16_t read_data; |
fneirab | 17:7447aaa9c121 | 147 | int statusRead; |
fneirab | 17:7447aaa9c121 | 148 | |
fneirab | 17:7447aaa9c121 | 149 | statusRead = readReg(reg_addr, read_data); |
fneirab | 17:7447aaa9c121 | 150 | if (statusRead != F_SUCCESS_0) |
fneirab | 17:7447aaa9c121 | 151 | return statusRead; |
fneirab | 17:7447aaa9c121 | 152 | else |
fneirab | 17:7447aaa9c121 | 153 | return read_data; |
fneirab | 17:7447aaa9c121 | 154 | |
fneirab | 17:7447aaa9c121 | 155 | } |
fneirab | 17:7447aaa9c121 | 156 | |
fneirab | 17:7447aaa9c121 | 157 | /** |
fneirab | 11:bdbd3104995b | 158 | * @brief Write and Verify a MAX17055 register |
fneirab | 11:bdbd3104995b | 159 | * @par Details |
fneirab | 12:519a18fc3b28 | 160 | * This function writes and verifies if the writing process was successful |
fneirab | 17:7447aaa9c121 | 161 | * |
fneirab | 11:bdbd3104995b | 162 | * @param[in] reg_addr - register address |
fneirab | 11:bdbd3104995b | 163 | * @param[out] reg_data - the variable that contains the data to write |
fneirab | 11:bdbd3104995b | 164 | * to the register address |
fneirab | 11:bdbd3104995b | 165 | * |
fneirab | 11:bdbd3104995b | 166 | * @retval 0 on success |
fneirab | 12:519a18fc3b28 | 167 | * @retval non-0 for errors |
fneirab | 11:bdbd3104995b | 168 | */ |
fneirab | 19:20590e00feab | 169 | int MAX17055::write_and_verify_reg(Registers_e reg_addr, uint16_t reg_data2write) |
fneirab | 5:a18a189588dc | 170 | { |
fneirab | 19:20590e00feab | 171 | int retries = 0; |
fneirab | 1:a031f0c6a71e | 172 | int ret; |
fneirab | 1:a031f0c6a71e | 173 | int statusRead; |
fneirab | 1:a031f0c6a71e | 174 | int statusWrite; |
fneirab | 1:a031f0c6a71e | 175 | uint16_t read_data; |
fneirab | 5:a18a189588dc | 176 | |
fneirab | 19:20590e00feab | 177 | |
fneirab | 1:a031f0c6a71e | 178 | do { |
fneirab | 19:20590e00feab | 179 | statusWrite = writeReg(reg_addr, reg_data2write); |
fneirab | 11:bdbd3104995b | 180 | if (statusWrite != F_SUCCESS_0) |
fneirab | 19:20590e00feab | 181 | return F_ERROR_1; |
fneirab | 19:20590e00feab | 182 | wait_ms(1); |
fneirab | 5:a18a189588dc | 183 | statusRead = readReg(reg_addr, read_data); |
fneirab | 11:bdbd3104995b | 184 | if (statusRead != F_SUCCESS_0) |
fneirab | 19:20590e00feab | 185 | return F_ERROR_1; |
fneirab | 19:20590e00feab | 186 | } while (reg_data2write != read_data && retries++<3); |
fneirab | 19:20590e00feab | 187 | |
fneirab | 19:20590e00feab | 188 | return F_SUCCESS_0; |
fneirab | 1:a031f0c6a71e | 189 | } |
fneirab | 2:ff7db397b70f | 190 | |
fneirab | 2:ff7db397b70f | 191 | /** |
fneirab | 11:bdbd3104995b | 192 | * @brief Initialization Function for MAX17055. |
fneirab | 11:bdbd3104995b | 193 | * @par Details |
fneirab | 12:519a18fc3b28 | 194 | * This function initializes the MAX17055 for the implementation of the EZconfig model.\n |
fneirab | 17:7447aaa9c121 | 195 | * The library needs to be customized for the implementation of customize model.\n |
fneirab | 17:7447aaa9c121 | 196 | * |
fneirab | 17:7447aaa9c121 | 197 | * @retval 0 on success |
fneirab | 11:bdbd3104995b | 198 | * @retval non-0 for errors |
fneirab | 11:bdbd3104995b | 199 | */ |
fneirab | 7:479a36909ced | 200 | int MAX17055::init(platform_data des_data) |
fneirab | 2:ff7db397b70f | 201 | { |
fneirab | 6:5ced10109ebf | 202 | |
fneirab | 17:7447aaa9c121 | 203 | int ret; |
fneirab | 9:f29d5e49b190 | 204 | int time_out = 10; |
fneirab | 19:20590e00feab | 205 | int32_t status; |
fneirab | 17:7447aaa9c121 | 206 | uint16_t hibcfg_value; |
fneirab | 19:20590e00feab | 207 | uint16_t read_data; |
fneirab | 5:a18a189588dc | 208 | |
fneirab | 5:a18a189588dc | 209 | |
fneirab | 19:20590e00feab | 210 | status = readReg(VERSION_REG, read_data); |
fneirab | 19:20590e00feab | 211 | if (status != F_SUCCESS_0) |
fneirab | 19:20590e00feab | 212 | return status; |
fneirab | 20:dcb0e5893677 | 213 | |
fneirab | 12:519a18fc3b28 | 214 | ///STEP 0. Check for POR (Skip load model if POR bit is cleared) |
fneirab | 5:a18a189588dc | 215 | |
fneirab | 11:bdbd3104995b | 216 | if (check_POR_func() == F_ERROR_5) |
fneirab | 11:bdbd3104995b | 217 | return F_ERROR_5; //POR not detected. Skip Initialization. |
fneirab | 2:ff7db397b70f | 218 | |
fneirab | 12:519a18fc3b28 | 219 | ///STEP 1. Check if FStat.DNR == 0 (Do not continue until FSTAT.DNR == 0) |
fneirab | 7:479a36909ced | 220 | ret = poll_flag_clear(FSTAT_REG, MAX17055_FSTAT_DNR, time_out); |
fneirab | 11:bdbd3104995b | 221 | if (ret < F_SUCCESS_0) { |
fneirab | 6:5ced10109ebf | 222 | return ret; |
fneirab | 3:f77a8345b0e3 | 223 | } |
fneirab | 5:a18a189588dc | 224 | |
fneirab | 12:519a18fc3b28 | 225 | ///STEP 1.2. Force exit from hibernate |
fneirab | 12:519a18fc3b28 | 226 | hibcfg_value = forcedExitHiberMode(); |
fneirab | 7:479a36909ced | 227 | |
fneirab | 5:a18a189588dc | 228 | |
fneirab | 12:519a18fc3b28 | 229 | ///STEP 2. Initialize configuration |
fneirab | 17:7447aaa9c121 | 230 | ///STEP 2.1. Load EZ Config |
fneirab | 17:7447aaa9c121 | 231 | EZconfig(des_data); |
fneirab | 5:a18a189588dc | 232 | |
fneirab | 17:7447aaa9c121 | 233 | ///STEP 2.2. Poll ModelCFG.ModelRefresh bit for clear |
fneirab | 17:7447aaa9c121 | 234 | ret = poll_flag_clear(MODELCFG_REG, MAX17055_MODELCFG_REFRESH, time_out); |
fneirab | 17:7447aaa9c121 | 235 | if(ret < F_SUCCESS_0) { |
fneirab | 17:7447aaa9c121 | 236 | return ret; |
fneirab | 5:a18a189588dc | 237 | } |
fneirab | 12:519a18fc3b28 | 238 | ///STEP3. Restore original HibCfg |
fneirab | 7:479a36909ced | 239 | writeReg(HIBCFG_REG, hibcfg_value); |
fneirab | 20:dcb0e5893677 | 240 | |
fneirab | 5:a18a189588dc | 241 | |
fneirab | 5:a18a189588dc | 242 | /* Clear Status.POR */ |
fneirab | 9:f29d5e49b190 | 243 | ret = clear_POR_bit(); |
fneirab | 11:bdbd3104995b | 244 | if (ret < F_SUCCESS_0) |
fneirab | 17:7447aaa9c121 | 245 | return ret; //See errors |
fneirab | 11:bdbd3104995b | 246 | return F_SUCCESS_0; |
fneirab | 19:20590e00feab | 247 | |
fneirab | 5:a18a189588dc | 248 | } |
fneirab | 5:a18a189588dc | 249 | |
fneirab | 9:f29d5e49b190 | 250 | /** |
fneirab | 11:bdbd3104995b | 251 | * @brief Check POR function |
fneirab | 11:bdbd3104995b | 252 | * @par Details |
fneirab | 11:bdbd3104995b | 253 | * This function check is there was a power on reset event for the |
fneirab | 11:bdbd3104995b | 254 | * MAX17055 |
fneirab | 11:bdbd3104995b | 255 | * |
fneirab | 11:bdbd3104995b | 256 | * @retval 0 on success (POR detected) |
fneirab | 11:bdbd3104995b | 257 | * @retval non-0 for errors (POR not detected) |
fneirab | 17:7447aaa9c121 | 258 | * |
fneirab | 11:bdbd3104995b | 259 | */ |
fneirab | 9:f29d5e49b190 | 260 | int MAX17055::check_POR_func() |
fneirab | 9:f29d5e49b190 | 261 | { |
fneirab | 9:f29d5e49b190 | 262 | uint16_t read_data; |
fneirab | 17:7447aaa9c121 | 263 | |
fneirab | 9:f29d5e49b190 | 264 | readReg(STATUS_REG, read_data); |
fneirab | 19:20590e00feab | 265 | // printf("STATUS REF = %X \r\n", read_data); |
fneirab | 17:7447aaa9c121 | 266 | if (!(read_data & MAX17055_STATUS_POR ) ) { |
fneirab | 11:bdbd3104995b | 267 | return F_ERROR_5; //POR not detected. |
fneirab | 17:7447aaa9c121 | 268 | } else |
fneirab | 11:bdbd3104995b | 269 | return F_SUCCESS_0; |
fneirab | 9:f29d5e49b190 | 270 | } |
fneirab | 9:f29d5e49b190 | 271 | |
fneirab | 9:f29d5e49b190 | 272 | /** |
fneirab | 11:bdbd3104995b | 273 | * @brief clear POR bit function |
fneirab | 11:bdbd3104995b | 274 | * @par Details |
fneirab | 12:519a18fc3b28 | 275 | * This function clear the indicating bit for POR - MAX17055 |
fneirab | 11:bdbd3104995b | 276 | * |
fneirab | 11:bdbd3104995b | 277 | * @retval 0 for Success |
fneirab | 11:bdbd3104995b | 278 | * @retval non-0 for errors |
fneirab | 11:bdbd3104995b | 279 | */ |
fneirab | 9:f29d5e49b190 | 280 | int MAX17055::clear_POR_bit() |
fneirab | 9:f29d5e49b190 | 281 | { |
fneirab | 17:7447aaa9c121 | 282 | int status; |
fneirab | 17:7447aaa9c121 | 283 | uint16_t read_data; |
fneirab | 9:f29d5e49b190 | 284 | |
fneirab | 9:f29d5e49b190 | 285 | |
fneirab | 9:f29d5e49b190 | 286 | status = readReg(STATUS_REG, read_data); |
fneirab | 11:bdbd3104995b | 287 | if (status != F_SUCCESS_0) |
fneirab | 11:bdbd3104995b | 288 | return F_ERROR_2; //Device is not present in the i2c Bus |
fneirab | 9:f29d5e49b190 | 289 | status = write_and_verify_reg(STATUS_REG, (read_data & MAX17055_POR_MASK)); |
fneirab | 11:bdbd3104995b | 290 | if (status != F_SUCCESS_0) |
fneirab | 11:bdbd3104995b | 291 | return F_ERROR_1; //read or write error |
fneirab | 17:7447aaa9c121 | 292 | else |
fneirab | 11:bdbd3104995b | 293 | return F_SUCCESS_0; |
fneirab | 9:f29d5e49b190 | 294 | } |
fneirab | 5:a18a189588dc | 295 | |
fneirab | 5:a18a189588dc | 296 | /** |
fneirab | 17:7447aaa9c121 | 297 | * @brief Poll Flag clear Function. |
fneirab | 11:bdbd3104995b | 298 | * @par Details |
fneirab | 11:bdbd3104995b | 299 | * This function clears status flags for the MAX17055 |
fneirab | 11:bdbd3104995b | 300 | * |
fneirab | 11:bdbd3104995b | 301 | * @param[in] reg_addr - register address |
fneirab | 11:bdbd3104995b | 302 | * @param[in] mask - register address |
fneirab | 11:bdbd3104995b | 303 | * @param[in] timeout - register data |
fneirab | 11:bdbd3104995b | 304 | * |
fneirab | 17:7447aaa9c121 | 305 | * @retval 0 on success |
fneirab | 11:bdbd3104995b | 306 | * @retval non-0 negative for errors |
fneirab | 11:bdbd3104995b | 307 | */ |
fneirab | 7:479a36909ced | 308 | int MAX17055::poll_flag_clear (Registers_e reg_addr, int mask, int timeout) |
fneirab | 5:a18a189588dc | 309 | { |
fneirab | 5:a18a189588dc | 310 | uint16_t data; |
fneirab | 5:a18a189588dc | 311 | int ret; |
fneirab | 5:a18a189588dc | 312 | |
fneirab | 5:a18a189588dc | 313 | do { |
fneirab | 19:20590e00feab | 314 | wait_ms(50); |
fneirab | 6:5ced10109ebf | 315 | ret = readReg(reg_addr, data); |
fneirab | 19:20590e00feab | 316 | // printf("read reg %X\r\n", data); |
fneirab | 19:20590e00feab | 317 | // printf("mask %X\r\n", mask); |
fneirab | 11:bdbd3104995b | 318 | if(ret < F_SUCCESS_0) |
fneirab | 11:bdbd3104995b | 319 | return F_ERROR_1; |
fneirab | 19:20590e00feab | 320 | |
fneirab | 5:a18a189588dc | 321 | |
fneirab | 5:a18a189588dc | 322 | if(!(data & mask)) |
fneirab | 11:bdbd3104995b | 323 | return F_SUCCESS_0; |
fneirab | 5:a18a189588dc | 324 | |
fneirab | 9:f29d5e49b190 | 325 | timeout -= 1; |
fneirab | 19:20590e00feab | 326 | // printf("end timeout %d \r\n", timeout); |
fneirab | 5:a18a189588dc | 327 | } while(timeout > 0); |
fneirab | 5:a18a189588dc | 328 | |
fneirab | 11:bdbd3104995b | 329 | return F_ERROR_4; |
fneirab | 5:a18a189588dc | 330 | } |
fneirab | 5:a18a189588dc | 331 | |
fneirab | 2:ff7db397b70f | 332 | /** |
fneirab | 11:bdbd3104995b | 333 | * @brief Get Temperature Function from the MAX17055 TEMP register. |
fneirab | 11:bdbd3104995b | 334 | * @par Details |
fneirab | 11:bdbd3104995b | 335 | * This function sends a request to access the TEMP register |
fneirab | 17:7447aaa9c121 | 336 | * of the MAX17055, which reflects the temperature measured for the fuel gauge. |
fneirab | 11:bdbd3104995b | 337 | * The temperature values will reflect the Config Register (0x1D) selections for Tsel bit (D15). |
fneirab | 11:bdbd3104995b | 338 | * For this library the setting are for die temperature. |
fneirab | 11:bdbd3104995b | 339 | * The MAX32620FTHR thermistor bias pin is not connected. The biasing of the thermistor is |
fneirab | 17:7447aaa9c121 | 340 | * done by the MAX77650. See MAX77650 library for how to enable the thermistor biasing. |
fneirab | 11:bdbd3104995b | 341 | * |
fneirab | 17:7447aaa9c121 | 342 | * |
fneirab | 11:bdbd3104995b | 343 | * @retval temp - Temperature value from TEMP register in °C |
fneirab | 11:bdbd3104995b | 344 | * @retval non-0 negative values check for errors |
fneirab | 11:bdbd3104995b | 345 | */ |
fneirab | 7:479a36909ced | 346 | int MAX17055::get_temperature() |
fneirab | 2:ff7db397b70f | 347 | { |
fneirab | 5:a18a189588dc | 348 | |
fneirab | 2:ff7db397b70f | 349 | int ret; |
fneirab | 11:bdbd3104995b | 350 | uint16_t temp; |
fneirab | 5:a18a189588dc | 351 | |
fneirab | 11:bdbd3104995b | 352 | ret = readReg(TEMP_REG, temp); |
fneirab | 11:bdbd3104995b | 353 | if (ret < F_SUCCESS_0) |
fneirab | 2:ff7db397b70f | 354 | return ret; |
fneirab | 2:ff7db397b70f | 355 | |
fneirab | 2:ff7db397b70f | 356 | /* The value is signed. */ |
fneirab | 11:bdbd3104995b | 357 | if (temp & 0x8000) |
fneirab | 11:bdbd3104995b | 358 | temp |= 0xFFFF0000; |
fneirab | 2:ff7db397b70f | 359 | |
fneirab | 2:ff7db397b70f | 360 | /* The value is converted into centigrade scale */ |
fneirab | 2:ff7db397b70f | 361 | /* Units of LSB = 1 / 256 degree Celsius */ |
fneirab | 11:bdbd3104995b | 362 | temp >>= 8; |
fneirab | 2:ff7db397b70f | 363 | |
fneirab | 11:bdbd3104995b | 364 | return temp; |
fneirab | 5:a18a189588dc | 365 | } |
fneirab | 3:f77a8345b0e3 | 366 | |
fneirab | 3:f77a8345b0e3 | 367 | /** |
fneirab | 11:bdbd3104995b | 368 | * @brief Forced Exit Hibernate Mode Function for MAX17055 |
fneirab | 11:bdbd3104995b | 369 | * @par Details |
fneirab | 11:bdbd3104995b | 370 | * This function executes a force exit from hibernate mode. |
fneirab | 11:bdbd3104995b | 371 | * |
fneirab | 12:519a18fc3b28 | 372 | * @retval HibCFG original value before forced Exit Hibernate mode * |
fneirab | 11:bdbd3104995b | 373 | */ |
fneirab | 12:519a18fc3b28 | 374 | uint16_t MAX17055::forcedExitHiberMode() |
fneirab | 3:f77a8345b0e3 | 375 | { |
fneirab | 3:f77a8345b0e3 | 376 | uint16_t hibcfg; |
fneirab | 5:a18a189588dc | 377 | |
fneirab | 5:a18a189588dc | 378 | /* Force exit from hibernate */ |
fneirab | 3:f77a8345b0e3 | 379 | //STEP 0: Store original HibCFG value |
fneirab | 7:479a36909ced | 380 | readReg(HIBCFG_REG, hibcfg); |
fneirab | 3:f77a8345b0e3 | 381 | |
fneirab | 12:519a18fc3b28 | 382 | //STEP 1: Write to Soft-Wakeup Command Register |
fneirab | 12:519a18fc3b28 | 383 | writeReg(VFSOC0_QH0_LOCK_REG, 0x90); //Soft-Wakeup from hibernate |
fneirab | 5:a18a189588dc | 384 | |
fneirab | 3:f77a8345b0e3 | 385 | //STEP 2: Write to Hibernate Configuration register |
fneirab | 7:479a36909ced | 386 | writeReg(HIBCFG_REG, 0x0); //disable hibernate mode |
fneirab | 5:a18a189588dc | 387 | |
fneirab | 12:519a18fc3b28 | 388 | //STEP 3:Write to Soft-Wakeup Command Register |
fneirab | 12:519a18fc3b28 | 389 | writeReg(VFSOC0_QH0_LOCK_REG, 0x0); //Clear All commands |
fneirab | 5:a18a189588dc | 390 | |
fneirab | 3:f77a8345b0e3 | 391 | return hibcfg; |
fneirab | 5:a18a189588dc | 392 | } |
fneirab | 7:479a36909ced | 393 | |
fneirab | 7:479a36909ced | 394 | /** |
fneirab | 14:519754351400 | 395 | * @brief EZ Config function |
fneirab | 11:bdbd3104995b | 396 | * @par Details |
fneirab | 12:519a18fc3b28 | 397 | * This function implements the steps for the EZ config m5 FuelGauge |
fneirab | 12:519a18fc3b28 | 398 | * @param[in] des_data - Plataform_data struct with information about the design. |
fneirab | 11:bdbd3104995b | 399 | * @retval 0 on success |
fneirab | 11:bdbd3104995b | 400 | * @retval non-zero for errors |
fneirab | 11:bdbd3104995b | 401 | */ |
fneirab | 13:fc91b283e689 | 402 | uint16_t MAX17055::EZconfig(platform_data des_data) |
fneirab | 7:479a36909ced | 403 | { |
fneirab | 12:519a18fc3b28 | 404 | ///STEP 2.1.1 EZ config values suggested by manufacturer. |
fneirab | 7:479a36909ced | 405 | const int charger_th = 4275; |
fneirab | 12:519a18fc3b28 | 406 | const int chg_V_high = 51200; // scaling factor high voltage charger |
fneirab | 7:479a36909ced | 407 | const int chg_V_low = 44138; |
fneirab | 12:519a18fc3b28 | 408 | const int param_EZ_FG1 = 0x8400; // Sets config bit for the charge voltage for the m5 |
fneirab | 7:479a36909ced | 409 | const int param_EZ_FG2 = 0x8000; |
fneirab | 8:ca8765c30ed2 | 410 | uint16_t dpacc, ret; |
fneirab | 19:20590e00feab | 411 | const int DIV_32 = 5;//DesignCap divide by 32 for EZ config |
fneirab | 19:20590e00feab | 412 | const int DIV_16 = 4;//DesignCap divide by 16 only for custom ini files |
fneirab | 7:479a36909ced | 413 | |
fneirab | 17:7447aaa9c121 | 414 | ///STEP 2.1.2 Store the EZ Config values into the appropriate registers. |
fneirab | 9:f29d5e49b190 | 415 | ret = writeReg(DESIGNCAP_REG, des_data.designcap); |
fneirab | 19:20590e00feab | 416 | ret = writeReg(DQACC_REG, des_data.designcap >> DIV_32); |
fneirab | 9:f29d5e49b190 | 417 | ret = writeReg(ICHGTERM_REG, des_data.ichgterm); |
fneirab | 9:f29d5e49b190 | 418 | ret = writeReg(VEMPTY_REG, des_data.vempty); |
fneirab | 7:479a36909ced | 419 | |
fneirab | 7:479a36909ced | 420 | if (des_data.vcharge > charger_th) { |
fneirab | 19:20590e00feab | 421 | dpacc = (des_data.designcap >> DIV_32) * chg_V_high / des_data.designcap; |
fneirab | 9:f29d5e49b190 | 422 | ret = writeReg(DPACC_REG, dpacc); |
fneirab | 17:7447aaa9c121 | 423 | ret = writeReg(MODELCFG_REG, param_EZ_FG1); // |
fneirab | 7:479a36909ced | 424 | } else { |
fneirab | 19:20590e00feab | 425 | dpacc = (des_data.designcap >> DIV_32) * chg_V_low / des_data.designcap; |
fneirab | 9:f29d5e49b190 | 426 | ret = writeReg(DPACC_REG, dpacc); |
fneirab | 9:f29d5e49b190 | 427 | ret = writeReg(MODELCFG_REG, param_EZ_FG2); |
fneirab | 7:479a36909ced | 428 | } |
fneirab | 7:479a36909ced | 429 | return ret; |
fneirab | 7:479a36909ced | 430 | } |
fneirab | 7:479a36909ced | 431 | |
fneirab | 17:7447aaa9c121 | 432 | |
fneirab | 17:7447aaa9c121 | 433 | /** |
fneirab | 17:7447aaa9c121 | 434 | * @brief Get reported Battery Capacity Function from MAX17055 Fuel Gauge |
fneirab | 17:7447aaa9c121 | 435 | * @par Details |
fneirab | 17:7447aaa9c121 | 436 | * This function sends a request to access the RepCAP register |
fneirab | 22:607f6917832a | 437 | * of the MAX17055. RepCAP is the reported Battery Capacity in mAh of the battery based on the calculation by the Fuel Gauge algorithm. |
fneirab | 17:7447aaa9c121 | 438 | * |
fneirab | 17:7447aaa9c121 | 439 | * @retval repcap_data - Reported SOC data from the RepSOC register in % value. |
fneirab | 17:7447aaa9c121 | 440 | * @retval non-0 negative values check for errors |
fneirab | 17:7447aaa9c121 | 441 | */ |
fneirab | 17:7447aaa9c121 | 442 | |
fneirab | 17:7447aaa9c121 | 443 | int MAX17055::get_battCAP(platform_data des_data) |
fneirab | 17:7447aaa9c121 | 444 | { |
fneirab | 17:7447aaa9c121 | 445 | int ret, design_rsense; |
fneirab | 17:7447aaa9c121 | 446 | uint16_t repcap_data; |
fneirab | 17:7447aaa9c121 | 447 | |
fneirab | 17:7447aaa9c121 | 448 | ret = readReg(REPCAP_REG, repcap_data); |
fneirab | 17:7447aaa9c121 | 449 | if (ret < F_SUCCESS_0) |
fneirab | 17:7447aaa9c121 | 450 | return ret; |
fneirab | 17:7447aaa9c121 | 451 | else |
fneirab | 17:7447aaa9c121 | 452 | design_rsense = des_data.rsense; |
fneirab | 17:7447aaa9c121 | 453 | ret = raw_cap_to_uAh((uint32_t)repcap_data, design_rsense); |
fneirab | 17:7447aaa9c121 | 454 | if (ret < F_SUCCESS_0) |
fneirab | 17:7447aaa9c121 | 455 | return ret; |
fneirab | 17:7447aaa9c121 | 456 | else |
fneirab | 17:7447aaa9c121 | 457 | return ret; |
fneirab | 17:7447aaa9c121 | 458 | } |
fneirab | 17:7447aaa9c121 | 459 | |
fneirab | 7:479a36909ced | 460 | /** |
fneirab | 11:bdbd3104995b | 461 | * @brief Get reported State Of Charge(SOC) Function from MAX17055 Fuel Gauge. |
fneirab | 11:bdbd3104995b | 462 | * @par Details |
fneirab | 11:bdbd3104995b | 463 | * This function sends a request to access the RepSOC register |
fneirab | 17:7447aaa9c121 | 464 | * of the MAX17055. RepSOC is the reported state-of-charge percentage output of the fuel gauge. |
fneirab | 11:bdbd3104995b | 465 | * |
fneirab | 11:bdbd3104995b | 466 | * @retval soc_data - Reported SOC data from the RepSOC register in % value. |
fneirab | 17:7447aaa9c121 | 467 | * @retval non-0 negative values check for errors |
fneirab | 11:bdbd3104995b | 468 | */ |
fneirab | 7:479a36909ced | 469 | int MAX17055::get_SOC() |
fneirab | 7:479a36909ced | 470 | { |
fneirab | 7:479a36909ced | 471 | |
fneirab | 7:479a36909ced | 472 | int ret; |
fneirab | 11:bdbd3104995b | 473 | uint16_t soc_data; |
fneirab | 7:479a36909ced | 474 | |
fneirab | 11:bdbd3104995b | 475 | ret = readReg(REPSOC_REG, soc_data); |
fneirab | 11:bdbd3104995b | 476 | if (ret < F_SUCCESS_0) |
fneirab | 7:479a36909ced | 477 | return ret; |
fneirab | 7:479a36909ced | 478 | |
fneirab | 11:bdbd3104995b | 479 | soc_data = soc_data >> 8; /* RepSOC LSB: 1/256 % */ |
fneirab | 7:479a36909ced | 480 | |
fneirab | 11:bdbd3104995b | 481 | return soc_data; |
fneirab | 7:479a36909ced | 482 | } |
fneirab | 7:479a36909ced | 483 | |
fneirab | 8:ca8765c30ed2 | 484 | /** |
fneirab | 12:519a18fc3b28 | 485 | * @brief Get at rate Average State Of Charge(SOC) Function from MAX17055 Fuel Gauge. |
fneirab | 11:bdbd3104995b | 486 | * @par Details |
fneirab | 12:519a18fc3b28 | 487 | * This function sends a request to access the atAvSOC register of the MAX17055. |
fneirab | 11:bdbd3104995b | 488 | * The AvSOC registers hold the calculated available capacity and percentage of the |
fneirab | 17:7447aaa9c121 | 489 | * battery based on all inputs from the ModelGauge m5 algorithm including empty |
fneirab | 17:7447aaa9c121 | 490 | * compensation. These registers provide unfiltered results. Jumps in the reported |
fneirab | 11:bdbd3104995b | 491 | * values can be caused by abrupt changes in load current or temperature. |
fneirab | 11:bdbd3104995b | 492 | * |
fneirab | 17:7447aaa9c121 | 493 | * @retval atAvSOC_data - Average SOC data from the atAVSOC register in % value. |
fneirab | 17:7447aaa9c121 | 494 | * @retval non-0 negative values check for errors |
fneirab | 11:bdbd3104995b | 495 | */ |
fneirab | 12:519a18fc3b28 | 496 | int MAX17055::get_atAvSOC() |
fneirab | 8:ca8765c30ed2 | 497 | { |
fneirab | 8:ca8765c30ed2 | 498 | int ret; |
fneirab | 12:519a18fc3b28 | 499 | uint16_t atAvSOC_data; |
fneirab | 8:ca8765c30ed2 | 500 | |
fneirab | 12:519a18fc3b28 | 501 | ret = readReg(AVSOC_REG, atAvSOC_data); |
fneirab | 11:bdbd3104995b | 502 | if (ret < F_SUCCESS_0) |
fneirab | 11:bdbd3104995b | 503 | return ret; //Check errors if data is not correct |
fneirab | 8:ca8765c30ed2 | 504 | |
fneirab | 12:519a18fc3b28 | 505 | atAvSOC_data = atAvSOC_data >> 8; /* avSOC LSB: 1/256 % */ |
fneirab | 11:bdbd3104995b | 506 | |
fneirab | 12:519a18fc3b28 | 507 | return atAvSOC_data; |
fneirab | 8:ca8765c30ed2 | 508 | } |
fneirab | 7:479a36909ced | 509 | |
fneirab | 9:f29d5e49b190 | 510 | /** |
fneirab | 11:bdbd3104995b | 511 | * @brief Get mix State Of Charge(SOC) Function for MAX17055 Fuel Gauge. |
fneirab | 11:bdbd3104995b | 512 | * @par Details |
fneirab | 11:bdbd3104995b | 513 | * This function sends a request to access mixSOC register |
fneirab | 11:bdbd3104995b | 514 | * of the MAX17055. The MixSOC registers holds the calculated |
fneirab | 11:bdbd3104995b | 515 | * remaining capacity and percentage of the cell before any empty compensation |
fneirab | 11:bdbd3104995b | 516 | * adjustments are performed. |
fneirab | 17:7447aaa9c121 | 517 | * |
fneirab | 17:7447aaa9c121 | 518 | * @retval mixSOC_data - Mixed SOC register values from the mixSOC register in % value. |
fneirab | 11:bdbd3104995b | 519 | * @retval non-0 for errors |
fneirab | 11:bdbd3104995b | 520 | */ |
fneirab | 11:bdbd3104995b | 521 | int MAX17055::get_mixSOC() |
fneirab | 11:bdbd3104995b | 522 | { |
fneirab | 11:bdbd3104995b | 523 | int ret; |
fneirab | 11:bdbd3104995b | 524 | uint16_t mixSOC_data; |
fneirab | 11:bdbd3104995b | 525 | |
fneirab | 11:bdbd3104995b | 526 | ret = readReg(MIXSOC_REG, mixSOC_data); |
fneirab | 11:bdbd3104995b | 527 | if (ret < F_SUCCESS_0) |
fneirab | 11:bdbd3104995b | 528 | return ret; |
fneirab | 9:f29d5e49b190 | 529 | |
fneirab | 11:bdbd3104995b | 530 | mixSOC_data = mixSOC_data >> 8; /* RepSOC LSB: 1/256 % */ |
fneirab | 9:f29d5e49b190 | 531 | |
fneirab | 11:bdbd3104995b | 532 | return mixSOC_data; |
fneirab | 11:bdbd3104995b | 533 | } |
fneirab | 11:bdbd3104995b | 534 | |
fneirab | 11:bdbd3104995b | 535 | /** |
fneirab | 11:bdbd3104995b | 536 | * @brief Get the Time to Empty(TTE) Function form MAX17055 Fuel Gauge. |
fneirab | 11:bdbd3104995b | 537 | * @par Details |
fneirab | 11:bdbd3104995b | 538 | * This function sends a request to access the TTE register |
fneirab | 11:bdbd3104995b | 539 | * of the MAX17055 |
fneirab | 17:7447aaa9c121 | 540 | * The TTE register holds the estimated time to empty for the |
fneirab | 17:7447aaa9c121 | 541 | * application under present temperature and load conditions. The TTE value is |
fneirab | 17:7447aaa9c121 | 542 | * determined by relating AvCap with AvgCurrent. The corresponding AvgCurrent |
fneirab | 11:bdbd3104995b | 543 | * filtering gives a delay in TTE, but provides more stable results. |
fneirab | 11:bdbd3104995b | 544 | * |
fneirab | 11:bdbd3104995b | 545 | * @retval tte_data - Time to Empty data from the TTE register in seconds. |
fneirab | 11:bdbd3104995b | 546 | * @retval non-0 negative values check for errors |
fneirab | 11:bdbd3104995b | 547 | */ |
fneirab | 12:519a18fc3b28 | 548 | float MAX17055::get_TTE() |
fneirab | 9:f29d5e49b190 | 549 | { |
fneirab | 9:f29d5e49b190 | 550 | |
fneirab | 9:f29d5e49b190 | 551 | int ret; |
fneirab | 11:bdbd3104995b | 552 | uint16_t tte_data; |
fneirab | 12:519a18fc3b28 | 553 | float f_tte_data; |
fneirab | 9:f29d5e49b190 | 554 | |
fneirab | 11:bdbd3104995b | 555 | ret = readReg(TTE_REG, tte_data); |
fneirab | 11:bdbd3104995b | 556 | if (ret < F_SUCCESS_0) |
fneirab | 11:bdbd3104995b | 557 | return ret; |
fneirab | 11:bdbd3104995b | 558 | else |
fneirab | 12:519a18fc3b28 | 559 | f_tte_data = ((float)tte_data * 5.625); /* TTE LSB: 5.625 sec */ |
fneirab | 9:f29d5e49b190 | 560 | |
fneirab | 12:519a18fc3b28 | 561 | return f_tte_data; |
fneirab | 9:f29d5e49b190 | 562 | } |
fneirab | 7:479a36909ced | 563 | |
fneirab | 7:479a36909ced | 564 | /** |
fneirab | 11:bdbd3104995b | 565 | * @brief Get the at Time to Empty(atTTE) value Function for MAX17055 Fuel Gauge. |
fneirab | 11:bdbd3104995b | 566 | * @par Details |
fneirab | 11:bdbd3104995b | 567 | * This function sends a request to access the internal register |
fneirab | 11:bdbd3104995b | 568 | * of the MAX17055 |
fneirab | 11:bdbd3104995b | 569 | * |
fneirab | 17:7447aaa9c121 | 570 | * @retval atTTE_data - Time to Empty data from the atTTE register in seconds. |
fneirab | 11:bdbd3104995b | 571 | * @retval non-0 negative values check for errors |
fneirab | 11:bdbd3104995b | 572 | */ |
fneirab | 12:519a18fc3b28 | 573 | float MAX17055::get_atTTE() |
fneirab | 7:479a36909ced | 574 | { |
fneirab | 7:479a36909ced | 575 | |
fneirab | 7:479a36909ced | 576 | int ret; |
fneirab | 11:bdbd3104995b | 577 | uint16_t atTTE_data; |
fneirab | 12:519a18fc3b28 | 578 | float f_atTTE_data; |
fneirab | 7:479a36909ced | 579 | |
fneirab | 11:bdbd3104995b | 580 | ret = readReg(ATTTE_REG, atTTE_data); |
fneirab | 11:bdbd3104995b | 581 | if (ret < F_SUCCESS_0) |
fneirab | 11:bdbd3104995b | 582 | return ret; //Check for errors |
fneirab | 7:479a36909ced | 583 | else |
fneirab | 12:519a18fc3b28 | 584 | f_atTTE_data = ((float)atTTE_data * 5.625); /* TTE LSB: 5.625 sec */ |
fneirab | 7:479a36909ced | 585 | |
fneirab | 12:519a18fc3b28 | 586 | return f_atTTE_data; |
fneirab | 7:479a36909ced | 587 | } |
fneirab | 7:479a36909ced | 588 | |
fneirab | 8:ca8765c30ed2 | 589 | /** |
fneirab | 11:bdbd3104995b | 590 | * @brief Get the Time to Full(TTE) values Function for MAX17055 Fuel Gauge. |
fneirab | 11:bdbd3104995b | 591 | * @par Details |
fneirab | 11:bdbd3104995b | 592 | * This function sends a request to access the internal register of the MAX17055 |
fneirab | 11:bdbd3104995b | 593 | * The TTF register holds the estimated time to full for the application |
fneirab | 11:bdbd3104995b | 594 | * under present conditions. The TTF value is determined by learning the |
fneirab | 11:bdbd3104995b | 595 | * constant current and constant voltage portions of the charge cycle based |
fneirab | 17:7447aaa9c121 | 596 | * on experience of prior charge cycles. Time to full is then estimate |
fneirab | 17:7447aaa9c121 | 597 | * by comparing present charge current to the charge termination current. |
fneirab | 11:bdbd3104995b | 598 | * Operation of the TTF register assumes all charge profiles are consistent in the application. |
fneirab | 11:bdbd3104995b | 599 | * |
fneirab | 17:7447aaa9c121 | 600 | * @retval ttf_data - Time to Full data from the TTF register in seconds. |
fneirab | 11:bdbd3104995b | 601 | * @retval non-0 negative values check for errors |
fneirab | 11:bdbd3104995b | 602 | */ |
fneirab | 12:519a18fc3b28 | 603 | float MAX17055::get_TTF() |
fneirab | 8:ca8765c30ed2 | 604 | { |
fneirab | 8:ca8765c30ed2 | 605 | |
fneirab | 8:ca8765c30ed2 | 606 | int ret; |
fneirab | 8:ca8765c30ed2 | 607 | uint16_t ttf_data; |
fneirab | 12:519a18fc3b28 | 608 | float f_ttf_data; |
fneirab | 8:ca8765c30ed2 | 609 | |
fneirab | 8:ca8765c30ed2 | 610 | ret = readReg(TTF_REG, ttf_data); |
fneirab | 11:bdbd3104995b | 611 | if (ret < F_SUCCESS_0) |
fneirab | 8:ca8765c30ed2 | 612 | return ret; |
fneirab | 8:ca8765c30ed2 | 613 | else |
fneirab | 12:519a18fc3b28 | 614 | f_ttf_data = ((float)ttf_data * 5.625); /* TTE LSB: 5.625 sec */ |
fneirab | 8:ca8765c30ed2 | 615 | |
fneirab | 12:519a18fc3b28 | 616 | return f_ttf_data; |
fneirab | 8:ca8765c30ed2 | 617 | } |
fneirab | 7:479a36909ced | 618 | |
fneirab | 7:479a36909ced | 619 | /** |
fneirab | 11:bdbd3104995b | 620 | * @brief Get voltage of the cell Function for MAX17055 Fuel Gauge. |
fneirab | 11:bdbd3104995b | 621 | * @par Details |
fneirab | 11:bdbd3104995b | 622 | * This function sends a request to access the VCell Register |
fneirab | 17:7447aaa9c121 | 623 | * of the MAX17055 to read the measured voltage from the cell. |
fneirab | 17:7447aaa9c121 | 624 | * |
fneirab | 11:bdbd3104995b | 625 | * @retval vcell_data - vcell data from the VCELL_REG register in uVolts. |
fneirab | 11:bdbd3104995b | 626 | * @retval non-0 negative values check for errors |
fneirab | 11:bdbd3104995b | 627 | */ |
fneirab | 7:479a36909ced | 628 | int MAX17055::get_Vcell() |
fneirab | 7:479a36909ced | 629 | { |
fneirab | 7:479a36909ced | 630 | |
fneirab | 7:479a36909ced | 631 | int ret; |
fneirab | 7:479a36909ced | 632 | uint16_t vcell_data; |
fneirab | 7:479a36909ced | 633 | |
fneirab | 7:479a36909ced | 634 | ret = readReg(VCELL_REG, vcell_data); |
fneirab | 11:bdbd3104995b | 635 | if (ret < F_SUCCESS_0) |
fneirab | 7:479a36909ced | 636 | return ret; |
fneirab | 7:479a36909ced | 637 | else |
fneirab | 7:479a36909ced | 638 | ret = lsb_to_uvolts(vcell_data); |
fneirab | 7:479a36909ced | 639 | return ret; |
fneirab | 7:479a36909ced | 640 | } |
fneirab | 7:479a36909ced | 641 | |
fneirab | 7:479a36909ced | 642 | /** |
fneirab | 17:7447aaa9c121 | 643 | * @brief Gets Average voltage of the cell Function for MAX17055 Fuel Gauge. |
fneirab | 17:7447aaa9c121 | 644 | * @par Details |
fneirab | 17:7447aaa9c121 | 645 | * This function sends a request to access the AvgVCell Register |
fneirab | 17:7447aaa9c121 | 646 | * of the MAX17055 to read the measured voltage from the cell. |
fneirab | 17:7447aaa9c121 | 647 | * |
fneirab | 17:7447aaa9c121 | 648 | * @retval avgVcell_data - avgvcell data from the AVGVCELL_REG register in uVolts. |
fneirab | 17:7447aaa9c121 | 649 | * @retval non-0 negative values check for errors |
fneirab | 17:7447aaa9c121 | 650 | */ |
fneirab | 17:7447aaa9c121 | 651 | int MAX17055::get_avgVcell() |
fneirab | 17:7447aaa9c121 | 652 | { |
fneirab | 17:7447aaa9c121 | 653 | |
fneirab | 17:7447aaa9c121 | 654 | int ret; |
fneirab | 17:7447aaa9c121 | 655 | uint16_t avgVcell_data; |
fneirab | 17:7447aaa9c121 | 656 | |
fneirab | 17:7447aaa9c121 | 657 | ret = readReg(AVGVCELL_REG, avgVcell_data); |
fneirab | 17:7447aaa9c121 | 658 | if (ret < F_SUCCESS_0) |
fneirab | 17:7447aaa9c121 | 659 | return ret; |
fneirab | 17:7447aaa9c121 | 660 | else |
fneirab | 17:7447aaa9c121 | 661 | ret = lsb_to_uvolts(avgVcell_data); |
fneirab | 17:7447aaa9c121 | 662 | return ret; |
fneirab | 17:7447aaa9c121 | 663 | } |
fneirab | 17:7447aaa9c121 | 664 | |
fneirab | 17:7447aaa9c121 | 665 | /** |
fneirab | 11:bdbd3104995b | 666 | * @brief Get current Function for MAX17055 Fuel Gauge. |
fneirab | 11:bdbd3104995b | 667 | * @par Details |
fneirab | 11:bdbd3104995b | 668 | * This function sends a request to access the CURRENT register |
fneirab | 17:7447aaa9c121 | 669 | * of the MAX17055 to read the current readings. |
fneirab | 11:bdbd3104995b | 670 | * |
fneirab | 12:519a18fc3b28 | 671 | * @param[in] des_data - Plataform_data struct with information about the design. |
fneirab | 17:7447aaa9c121 | 672 | * |
fneirab | 17:7447aaa9c121 | 673 | * @retval curr_data - current data from the CURRENT register in uAmps. |
fneirab | 11:bdbd3104995b | 674 | * @retval non-0 negative values check for errors. |
fneirab | 11:bdbd3104995b | 675 | */ |
fneirab | 17:7447aaa9c121 | 676 | float MAX17055::get_Current( platform_data des_data ) |
fneirab | 7:479a36909ced | 677 | { |
fneirab | 7:479a36909ced | 678 | |
fneirab | 7:479a36909ced | 679 | int ret,design_rsense; |
fneirab | 11:bdbd3104995b | 680 | uint16_t curr_data; |
fneirab | 17:7447aaa9c121 | 681 | float f_ret; |
fneirab | 7:479a36909ced | 682 | |
fneirab | 11:bdbd3104995b | 683 | ret = readReg(CURRENT_REG, curr_data); |
fneirab | 11:bdbd3104995b | 684 | if (ret < F_SUCCESS_0) |
fneirab | 7:479a36909ced | 685 | return ret; |
fneirab | 7:479a36909ced | 686 | else |
fneirab | 17:7447aaa9c121 | 687 | design_rsense = des_data.rsense; |
fneirab | 17:7447aaa9c121 | 688 | f_ret = raw_current_to_uamps((uint32_t)curr_data, design_rsense); |
fneirab | 17:7447aaa9c121 | 689 | return f_ret; |
fneirab | 7:479a36909ced | 690 | } |
fneirab | 7:479a36909ced | 691 | |
fneirab | 7:479a36909ced | 692 | /** |
fneirab | 11:bdbd3104995b | 693 | * @brief Get average current Function for MAX17055 Fuel Gauge. |
fneirab | 11:bdbd3104995b | 694 | * @par Details |
fneirab | 11:bdbd3104995b | 695 | * This function sends a request to access the aveCURRENT register |
fneirab | 17:7447aaa9c121 | 696 | * of the MAX17055 to read the average current readings. |
fneirab | 11:bdbd3104995b | 697 | * |
fneirab | 12:519a18fc3b28 | 698 | * @param[in] des_data - Plataform_data struct with information about the design. |
fneirab | 17:7447aaa9c121 | 699 | * |
fneirab | 17:7447aaa9c121 | 700 | * @retval aveCurr_data - current data from the AVGCURRENT register in uAmps. |
fneirab | 11:bdbd3104995b | 701 | * @retval non-0 negative values check for errors. |
fneirab | 11:bdbd3104995b | 702 | */ |
fneirab | 17:7447aaa9c121 | 703 | float MAX17055::get_AvgCurrent( platform_data des_data ) |
fneirab | 7:479a36909ced | 704 | { |
fneirab | 7:479a36909ced | 705 | int ret, design_rsense; |
fneirab | 7:479a36909ced | 706 | uint16_t data; |
fneirab | 17:7447aaa9c121 | 707 | float avgCurr_data; |
fneirab | 7:479a36909ced | 708 | |
fneirab | 7:479a36909ced | 709 | ret = readReg(AVGCURRENT_REG, data); |
fneirab | 11:bdbd3104995b | 710 | if (ret < F_SUCCESS_0) |
fneirab | 7:479a36909ced | 711 | return ret; |
fneirab | 7:479a36909ced | 712 | else |
fneirab | 17:7447aaa9c121 | 713 | avgCurr_data = data; |
fneirab | 7:479a36909ced | 714 | design_rsense = des_data.rsense; |
fneirab | 17:7447aaa9c121 | 715 | avgCurr_data = raw_current_to_uamps((uint32_t)data, design_rsense); |
fneirab | 17:7447aaa9c121 | 716 | return avgCurr_data; |
fneirab | 7:479a36909ced | 717 | } |
fneirab | 7:479a36909ced | 718 | |
fneirab | 7:479a36909ced | 719 | /** |
fneirab | 17:7447aaa9c121 | 720 | * @brief lsb_to_uvolts Conversion Function |
fneirab | 11:bdbd3104995b | 721 | * @par Details |
fneirab | 11:bdbd3104995b | 722 | * This function takes the lsb value of the register and convert it |
fneirab | 11:bdbd3104995b | 723 | * to uvolts |
fneirab | 11:bdbd3104995b | 724 | * |
fneirab | 11:bdbd3104995b | 725 | * @param[in] lsb - value of register lsb |
fneirab | 17:7447aaa9c121 | 726 | * @retval conv_2_uvolts - value converted lsb to uvolts |
fneirab | 11:bdbd3104995b | 727 | */ |
fneirab | 7:479a36909ced | 728 | int MAX17055:: lsb_to_uvolts(uint16_t lsb) |
fneirab | 7:479a36909ced | 729 | { |
fneirab | 11:bdbd3104995b | 730 | int conv_2_uvolts; |
fneirab | 11:bdbd3104995b | 731 | conv_2_uvolts = (lsb * 625) / 8; /* 78.125uV per bit */ |
fneirab | 11:bdbd3104995b | 732 | return conv_2_uvolts; |
fneirab | 7:479a36909ced | 733 | } |
fneirab | 7:479a36909ced | 734 | |
fneirab | 7:479a36909ced | 735 | /** |
fneirab | 17:7447aaa9c121 | 736 | * @brief raw_current_to_uamp Conversion Function |
fneirab | 11:bdbd3104995b | 737 | * @par Details |
fneirab | 17:7447aaa9c121 | 738 | * This function takes the raw current value of the register and |
fneirab | 11:bdbd3104995b | 739 | * converts it to uamps |
fneirab | 11:bdbd3104995b | 740 | * |
fneirab | 17:7447aaa9c121 | 741 | * @param[in] curr - raw current value of register |
fneirab | 17:7447aaa9c121 | 742 | * @retval res - converted raw current to uamps (Signed 2's complement) |
fneirab | 11:bdbd3104995b | 743 | */ |
fneirab | 17:7447aaa9c121 | 744 | float MAX17055::raw_current_to_uamps(uint32_t curr, int rsense_value) |
fneirab | 7:479a36909ced | 745 | { |
fneirab | 7:479a36909ced | 746 | int res = curr; |
fneirab | 17:7447aaa9c121 | 747 | float final_res; |
fneirab | 17:7447aaa9c121 | 748 | /* Negative Check*/ |
fneirab | 17:7447aaa9c121 | 749 | if (res & 0x8000){ |
fneirab | 7:479a36909ced | 750 | res |= 0xFFFF0000; |
fneirab | 7:479a36909ced | 751 | } |
fneirab | 17:7447aaa9c121 | 752 | final_res = (float)res; |
fneirab | 20:dcb0e5893677 | 753 | final_res *= 1562500 /(float)(rsense_value*10000); |
fneirab | 17:7447aaa9c121 | 754 | |
fneirab | 17:7447aaa9c121 | 755 | return final_res; |
fneirab | 17:7447aaa9c121 | 756 | } |
fneirab | 17:7447aaa9c121 | 757 | |
fneirab | 17:7447aaa9c121 | 758 | /** |
fneirab | 17:7447aaa9c121 | 759 | * @brief raw_cap_to_uAh Conversion Function |
fneirab | 17:7447aaa9c121 | 760 | * @par Details |
fneirab | 17:7447aaa9c121 | 761 | * This function takes the raw battery capacity value of the register and |
fneirab | 17:7447aaa9c121 | 762 | * converts it to uAh |
fneirab | 17:7447aaa9c121 | 763 | * |
fneirab | 17:7447aaa9c121 | 764 | * @param[in] raw_cap - raw capacity value of register |
fneirab | 17:7447aaa9c121 | 765 | * @retval res - converted raw capacity to uAh |
fneirab | 17:7447aaa9c121 | 766 | */ |
fneirab | 17:7447aaa9c121 | 767 | int MAX17055::raw_cap_to_uAh(uint32_t raw_cap, int rsense_value) |
fneirab | 17:7447aaa9c121 | 768 | { |
fneirab | 17:7447aaa9c121 | 769 | int res = raw_cap ; |
fneirab | 17:7447aaa9c121 | 770 | res *= 5000000/(rsense_value * 1000000); |
fneirab | 7:479a36909ced | 771 | return res; |
fneirab | 9:f29d5e49b190 | 772 | } |
fneirab | 9:f29d5e49b190 | 773 | |
fneirab | 9:f29d5e49b190 | 774 | /** |
fneirab | 17:7447aaa9c121 | 775 | * @brief Save Learned Parameters Function for battery Fuel Gauge model. |
fneirab | 11:bdbd3104995b | 776 | * @par Details |
fneirab | 11:bdbd3104995b | 777 | * It is recommended to save the learned capacity parameters every |
fneirab | 11:bdbd3104995b | 778 | * time bit 2 of the Cycles register toggles |
fneirab | 17:7447aaa9c121 | 779 | * (so that it is saved every 64% change in the battery) |
fneirab | 15:291446b008df | 780 | * so that if power is lost the values can easily be restored. Make sure |
fneirab | 22:607f6917832a | 781 | * the data is saved on a non-volatile memory. Call this function after first initialization for reference in future function calls. |
fneirab | 22:607f6917832a | 782 | * Max number of cycles is 655.35 cycles with a LSB of 1% for the cycles register. |
fneirab | 11:bdbd3104995b | 783 | * |
fneirab | 17:7447aaa9c121 | 784 | * @param[in] FG_params Fuel Gauge Parameters based on design details. |
fneirab | 17:7447aaa9c121 | 785 | * |
fneirab | 11:bdbd3104995b | 786 | * @retval 0 for success |
fneirab | 11:bdbd3104995b | 787 | * @retval non-0 negative for errors |
fneirab | 11:bdbd3104995b | 788 | */ |
fneirab | 9:f29d5e49b190 | 789 | int MAX17055::save_Params(saved_FG_params_t FG_params) |
fneirab | 9:f29d5e49b190 | 790 | { |
fneirab | 17:7447aaa9c121 | 791 | int ret; |
fneirab | 17:7447aaa9c121 | 792 | uint16_t data[5], value; |
fneirab | 22:607f6917832a | 793 | ///STEP 1. Checks if the cycle register bit 2 has changed. |
fneirab | 11:bdbd3104995b | 794 | ret = readReg(CYCLES_REG, data[3]); |
fneirab | 17:7447aaa9c121 | 795 | value = data[3]; |
fneirab | 11:bdbd3104995b | 796 | if (ret < F_SUCCESS_0) |
fneirab | 9:f29d5e49b190 | 797 | return ret; |
fneirab | 17:7447aaa9c121 | 798 | //Check if the stored cycles value is different from the read Cycles_reg value |
fneirab | 17:7447aaa9c121 | 799 | else if (FG_params.cycles == value) |
fneirab | 17:7447aaa9c121 | 800 | return ret; //exits the function without saving, when initializing or value did not change (calculate when the function is called in you application). |
fneirab | 17:7447aaa9c121 | 801 | else { |
fneirab | 17:7447aaa9c121 | 802 | value = FG_params.cycles^value; |
fneirab | 17:7447aaa9c121 | 803 | //check with mask |
fneirab | 17:7447aaa9c121 | 804 | value = (value & MAX17055_POR_MASK); |
fneirab | 17:7447aaa9c121 | 805 | |
fneirab | 17:7447aaa9c121 | 806 | if (value == 0) |
fneirab | 17:7447aaa9c121 | 807 | return ret; |
fneirab | 17:7447aaa9c121 | 808 | |
fneirab | 17:7447aaa9c121 | 809 | ///STEP 2. Save the capacity parameters for the specific battery. |
fneirab | 17:7447aaa9c121 | 810 | ret = readReg(RCOMP0_REG, data[0]); |
fneirab | 17:7447aaa9c121 | 811 | if (ret < F_SUCCESS_0) |
fneirab | 17:7447aaa9c121 | 812 | return ret; |
fneirab | 17:7447aaa9c121 | 813 | else |
fneirab | 17:7447aaa9c121 | 814 | FG_params.rcomp0 = data[0]; |
fneirab | 9:f29d5e49b190 | 815 | |
fneirab | 17:7447aaa9c121 | 816 | ret = readReg(TEMPCO_REG, data[1]); |
fneirab | 17:7447aaa9c121 | 817 | if (ret < F_SUCCESS_0) |
fneirab | 17:7447aaa9c121 | 818 | return ret; |
fneirab | 17:7447aaa9c121 | 819 | else |
fneirab | 17:7447aaa9c121 | 820 | FG_params.temp_co = data[1]; |
fneirab | 9:f29d5e49b190 | 821 | |
fneirab | 17:7447aaa9c121 | 822 | ret = readReg(FULLCAPREP_REG, data[2]); |
fneirab | 17:7447aaa9c121 | 823 | if (ret < F_SUCCESS_0) |
fneirab | 17:7447aaa9c121 | 824 | return ret; |
fneirab | 17:7447aaa9c121 | 825 | else |
fneirab | 17:7447aaa9c121 | 826 | FG_params.full_cap_rep = data[2]; |
fneirab | 17:7447aaa9c121 | 827 | |
fneirab | 17:7447aaa9c121 | 828 | FG_params.cycles = data[3]; |
fneirab | 17:7447aaa9c121 | 829 | |
fneirab | 17:7447aaa9c121 | 830 | ret = readReg(FULLCAPNOM_REG, data[4]); |
fneirab | 17:7447aaa9c121 | 831 | if (ret < F_SUCCESS_0) |
fneirab | 17:7447aaa9c121 | 832 | return ret; |
fneirab | 17:7447aaa9c121 | 833 | else |
fneirab | 17:7447aaa9c121 | 834 | FG_params.full_cap_nom = data[4]; |
fneirab | 9:f29d5e49b190 | 835 | return ret; |
fneirab | 17:7447aaa9c121 | 836 | } |
fneirab | 17:7447aaa9c121 | 837 | } |
fneirab | 9:f29d5e49b190 | 838 | |
fneirab | 17:7447aaa9c121 | 839 | |
fneirab | 9:f29d5e49b190 | 840 | |
fneirab | 9:f29d5e49b190 | 841 | /** |
fneirab | 12:519a18fc3b28 | 842 | * @brief Restore Parameters Function for battery Fuel Gauge model. |
fneirab | 11:bdbd3104995b | 843 | * @par Details |
fneirab | 17:7447aaa9c121 | 844 | * If power is lost, then the capacity information |
fneirab | 17:7447aaa9c121 | 845 | * can be easily restored with this function. |
fneirab | 11:bdbd3104995b | 846 | * |
fneirab | 17:7447aaa9c121 | 847 | * @param[in] FG_params Struct for Fuel Gauge Parameters |
fneirab | 11:bdbd3104995b | 848 | * @retval 0 for success |
fneirab | 11:bdbd3104995b | 849 | * @retval non-0 negative for errors |
fneirab | 11:bdbd3104995b | 850 | */ |
fneirab | 9:f29d5e49b190 | 851 | int MAX17055::restore_Params(saved_FG_params_t FG_params) |
fneirab | 9:f29d5e49b190 | 852 | { |
fneirab | 9:f29d5e49b190 | 853 | int ret; |
fneirab | 9:f29d5e49b190 | 854 | uint16_t temp_data, fullcapnom_data, mixCap_calc, dQacc_calc; |
fneirab | 12:519a18fc3b28 | 855 | uint16_t dPacc_value = 0x0C80;//Set it to 200% |
fneirab | 9:f29d5e49b190 | 856 | |
fneirab | 17:7447aaa9c121 | 857 | ///STEP 1. Restoring capacity parameters |
fneirab | 9:f29d5e49b190 | 858 | write_and_verify_reg(RCOMP0_REG, FG_params.rcomp0); |
fneirab | 9:f29d5e49b190 | 859 | write_and_verify_reg(TEMPCO_REG, FG_params.temp_co); |
fneirab | 9:f29d5e49b190 | 860 | write_and_verify_reg(FULLCAPNOM_REG, FG_params.full_cap_nom); |
fneirab | 17:7447aaa9c121 | 861 | |
fneirab | 11:bdbd3104995b | 862 | wait_ms(350);//check the type of wait |
fneirab | 17:7447aaa9c121 | 863 | |
fneirab | 11:bdbd3104995b | 864 | ///STEP 2. Restore FullCap |
fneirab | 9:f29d5e49b190 | 865 | ret = readReg(FULLCAPNOM_REG, fullcapnom_data); |
fneirab | 11:bdbd3104995b | 866 | if (ret < F_SUCCESS_0) |
fneirab | 9:f29d5e49b190 | 867 | return ret; |
fneirab | 9:f29d5e49b190 | 868 | |
fneirab | 18:37bca022d144 | 869 | ret = readReg(MIXSOC_REG, temp_data); |
fneirab | 11:bdbd3104995b | 870 | if (ret < F_SUCCESS_0) |
fneirab | 9:f29d5e49b190 | 871 | return ret; |
fneirab | 17:7447aaa9c121 | 872 | |
fneirab | 9:f29d5e49b190 | 873 | mixCap_calc = (temp_data*fullcapnom_data)/25600; |
fneirab | 9:f29d5e49b190 | 874 | |
fneirab | 9:f29d5e49b190 | 875 | write_and_verify_reg(MIXCAP_REG, mixCap_calc); |
fneirab | 9:f29d5e49b190 | 876 | write_and_verify_reg(FULLCAPREP_REG, FG_params.full_cap_rep); |
fneirab | 17:7447aaa9c121 | 877 | |
fneirab | 11:bdbd3104995b | 878 | ///STEP 3. Write DQACC to 200% of Capacity and DPACC to 200% |
fneirab | 9:f29d5e49b190 | 879 | dQacc_calc = (FG_params.full_cap_nom/ 16) ; |
fneirab | 9:f29d5e49b190 | 880 | |
fneirab | 9:f29d5e49b190 | 881 | write_and_verify_reg(DPACC_REG, dPacc_value); |
fneirab | 9:f29d5e49b190 | 882 | write_and_verify_reg(DQACC_REG, dQacc_calc); |
fneirab | 9:f29d5e49b190 | 883 | |
fneirab | 9:f29d5e49b190 | 884 | wait_ms(350); |
fneirab | 9:f29d5e49b190 | 885 | |
fneirab | 11:bdbd3104995b | 886 | ///STEP 4. Restore Cycles register |
fneirab | 9:f29d5e49b190 | 887 | ret = write_and_verify_reg(CYCLES_REG, FG_params.cycles); |
fneirab | 11:bdbd3104995b | 888 | if (ret < F_SUCCESS_0) |
fneirab | 9:f29d5e49b190 | 889 | return ret; |
fneirab | 11:bdbd3104995b | 890 | return ret; |
fneirab | 11:bdbd3104995b | 891 | } |
fneirab | 11:bdbd3104995b | 892 | |
fneirab | 11:bdbd3104995b | 893 | /** |
fneirab | 11:bdbd3104995b | 894 | * @brief Function to Save Average Current to At Rate register. |
fneirab | 11:bdbd3104995b | 895 | * @par Details |
fneirab | 12:519a18fc3b28 | 896 | * For User friendliness display of atTTE, atAvSOC, atAvCAP |
fneirab | 17:7447aaa9c121 | 897 | * write the average current to At Rate registers every 10sec |
fneirab | 11:bdbd3104995b | 898 | * when the battery is in use. |
fneirab | 17:7447aaa9c121 | 899 | * NOTE: do not use this function when the Battery is charging. |
fneirab | 11:bdbd3104995b | 900 | * |
fneirab | 11:bdbd3104995b | 901 | * @retval 0 for success |
fneirab | 11:bdbd3104995b | 902 | * @retval non-0 negative for errors |
fneirab | 11:bdbd3104995b | 903 | */ |
fneirab | 11:bdbd3104995b | 904 | int MAX17055::avCurr_2_atRate() |
fneirab | 11:bdbd3104995b | 905 | { |
fneirab | 11:bdbd3104995b | 906 | int ret; |
fneirab | 11:bdbd3104995b | 907 | uint16_t avCurr_data; |
fneirab | 11:bdbd3104995b | 908 | |
fneirab | 11:bdbd3104995b | 909 | ret = readReg(AVGCURRENT_REG, avCurr_data); |
fneirab | 17:7447aaa9c121 | 910 | if (ret < F_SUCCESS_0) { |
fneirab | 12:519a18fc3b28 | 911 | return ret = -3; |
fneirab | 17:7447aaa9c121 | 912 | } |
fneirab | 11:bdbd3104995b | 913 | |
fneirab | 11:bdbd3104995b | 914 | //Write avCurrent to atRate Register |
fneirab | 12:519a18fc3b28 | 915 | ret = writeReg(ATRATE_REG, avCurr_data); |
fneirab | 17:7447aaa9c121 | 916 | if (ret < F_SUCCESS_0) { |
fneirab | 11:bdbd3104995b | 917 | return ret; |
fneirab | 12:519a18fc3b28 | 918 | } |
fneirab | 12:519a18fc3b28 | 919 | return F_SUCCESS_0; |
fneirab | 7:479a36909ced | 920 | } |