I am trying to save battery configuration in fuel gauge registers MAx17205 but failing
my code is as below,
//I am trying to save battery configuration in fuel gauge registers MAx17205 but failing
//my code is as below,
//
//```
#include <Wire.h>
//#include "MAX17205.h"
#define confige 0x001d
#define confige2 0x00bb
#define nConfig 0x01B0
#define DesignCap 0x018
#define ststus2_reg 0x0B0
#define Lock_Register 0x07F
const int NV_i2c_addr = 0x0B;
const int MAX1720X_ADDR = 0x36;
//const int NV_i2c_addr = 0x16;
//const int MAX1720X_ADDR = 0x6c;
const int MAX1720X_COMMAND_ADDR = 0x60; // Command register
const int MAX1720X_CONFIG2_ADDR = 0xbb; // Command register
uint16_t response = 0;
float response_float = 0;
void setup() {
delay(2000);
Wire.begin();
// put your setup code here, to run once:
Serial.begin(115200); // Initializes serial port
// Waits for serial port to connect. Needed for Leonardo only
while ( !Serial ) ;
Serial.println("POWER ON");
get_DevName();
WriteRegistor( 0x1B5, 0x3a02 ); // nPackCfg
WriteRegistor( 0x0BB, 0x0001 ); // fuel gauge reset
delay(1000);
response = ReadRegistor (0x1B5);// nPackCfg
response = ReadRegistor (0x00BD);// PackCfg
while (1);
}
void loop() {
// put your main code here, to run repeatedly:
}
void get_DevName()
{
Wire.beginTransmission(MAX1720X_ADDR);
Wire.write(0x021);
Wire.endTransmission(false);
Wire.requestFrom(MAX1720X_ADDR, (int)2);//
uint16_t DevName = Wire.read() | (Wire.read() << 8); // LSB or-ed with MSB
Serial.println("Reading DevName Register(021h)");//correct Decimal 4357 \\19082 wrong
// Serial.println("(HEX)=" + String(DevName, HEX)); //correct HEX = 1105
DevName = DevName & 0x000F;//mask the unwanted bits
// Serial.println("After Mask(HEX)=" + String(DevName, HEX));
(DevName == 5) ? Serial.println("---------------Detected Fuel Guage is MAX17205----------") : \
(DevName == 1) ? Serial.println("---------------Detected Fuel Guage is MAX17201----------") : \
Serial.println("Failed to read correct DevName\n");
}
uint16_t ReadRegistor(uint16_t reg)
{
if (reg & 0x100)
{
//write to NV slave addr
Serial.println("");
Serial.println("I2C address= 0X" + String(NV_i2c_addr, HEX));
Serial.println("Reading from register address 0X" + String(reg, HEX));
Wire.beginTransmission(NV_i2c_addr);//01CF
Wire.write(reg & 0xFF);//read_rsense Register addrs
Wire.write(reg >> 8); //read_rsense Register addrs
Wire.endTransmission(false);
Wire.requestFrom(NV_i2c_addr, (int)2);
uint16_t i2c_reply = Wire.read() | (Wire.read() << 8); // LSB or-ed with MSB
Serial.println("Read Val 0X" + String(i2c_reply, HEX)); Serial.println(" ");
return i2c_reply;
}
else//read to MAX1720X_ADDR regular i2c
{
//write to MAX1720X_ADDR slave addr
Serial.println("");
Serial.println("I2C address= 0X" + String(MAX1720X_ADDR, HEX));
Serial.println("Reading from register 0X" + String(reg, HEX));
Wire.beginTransmission(MAX1720X_ADDR);
Wire.write(reg & 0xFF);
Wire.write(reg >> 8);
Wire.endTransmission(false);
Wire.requestFrom(MAX1720X_ADDR, (int)2);
uint16_t i2c_reply = Wire.read() | (Wire.read() << 8); // LSB or-ed with MSB
Serial.println("Read Val 0X" + String(i2c_reply, HEX)); Serial.println(" ");
return i2c_reply;
}
}
void WriteRegistor(uint16_t reg, uint16_t value)
{
if (reg & 0x100)
{
// Serial.println("--------------------NON-Volatile register selected, First CONFIRM \"BALANCE NV WRITE CYCLES\"");
Serial.println("");
Serial.println("I2C address= 0X" + String(NV_i2c_addr, HEX));
Serial.println("writing to Register Address 0X" + String(reg, HEX));
Wire.beginTransmission(NV_i2c_addr);
Wire.write(reg & 0xFF);
Wire.write(reg >> 8);
delay(10);
Wire.write(value & 0xFF);
Wire.write(value >> 8);
Serial.println("writing val=0X" + String(value, HEX)); Serial.println(" ");
// delay(200);
Wire.endTransmission();
}
else//write to MAX1720X_ADDR regular i2c
{
//write to MAX1720X_ADDR slave addr
Serial.println("");
Serial.println("I2C address= 0X" + String(MAX1720X_ADDR, HEX));
Serial.println("writing to Register Address 0X" + String(reg, HEX));
Wire.beginTransmission(MAX1720X_ADDR);
Wire.write(reg & 0xFF);
Wire.write(reg >> 8);
delay(10);
Wire.write(value & 0xFF);
Wire.write(value >> 8);
Serial.println("writing val=0X" + String(value, HEX)); Serial.println(" ");
// delay(200);
Wire.endTransmission();
}
}
my output is
18:40:20.497 -> POWER ON
18:40:20.497 -> Reading DevName Register(021h)
18:40:20.497 -> ---------------Detected Fuel Guage is MAX17205----------
18:40:20.497 ->
18:40:20.497 -> I2C address= 0Xb
18:40:20.497 -> writing to Register Address 0X1b5
18:40:20.543 -> writing val=0X3a02
18:40:20.543 ->
18:40:20.543 ->
18:40:20.543 -> I2C address= 0X36
18:40:20.543 -> writing to Register Address 0Xbb
18:40:20.543 -> writing val=0X1
18:40:20.543 ->
18:40:21.518 ->
18:40:21.518 -> I2C address= 0Xb
18:40:21.518 -> Reading from register address 0X1b5
18:40:21.518 -> Read Val 0X201
18:40:21.565 ->
18:40:21.565 ->
18:40:21.565 -> I2C address= 0X36
18:40:21.565 -> Reading from register 0Xbd
18:40:21.565 -> Read Val 0X3a04
18:40:21.565 ->