Unable to write in register of MAX17205 fuel gauge

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 ->  

Thanks for posting code correctly. You haven't said, in what way it is failing.

I am writing to register nPackCfg whose address is 0x1B5 and value is 0x3a02
using this -> WriteRegistor( 0x1B5, 0x3a02 ); // nPackCfg
but when I read back I get value as -> Read Val 0X201

Okay, but how about some context? Have you tried reading any other registers? Is this the first code version to fail? Have you tried any device example sketches? Have you tried reading/writing a different I2C device using similar code? Etc. etc.

Yes, I am able to read other registers properly.
Since I have working code with same i2c device - Fuel gauge.

By using that code I can read Battery voltage, Battery SOC (state of charge in %) and, Battery REPCAP (reported capacity in mAH).
I have verified this measured parameters using the windows GUI application given by MAXIM company, all are correct.

Even when I read the same register before writing to it, It gives me the correct value ie. 0x3a04 (I have wrote this value using their windows app) at device power on, But when I try to write it and read back it gives me wrong value

The register I am trying to write is to save no.of cells and select temperature sensor etc.
Since I have written the desired value using windows app in EVALUTION KIT, I cant do this with bare Fuel gauge ic in my other pcbs. So I2c is the only option with me

This is code in loop which works


void loop() {
  // put your main code here, to run repeatedly:
  while (1)
  {
    Serial.println("--------------------------------------------------------------------------");
    response  = ReadRegistor(MAX1720X_VBAT_ADDR);//MAX1720X_VBAT_ADDR
    response  = map(response, 0, 10400, 0, 12960);
    float response_float  = float(response) / 1000;
    Serial.println("PackVoltage: " + String(response_float) + String("V"));
    Serial.println("--------------------------------------------------------------------------");

    response  = ReadRegistor(RepSOC);//RepSOC
    response_float = float(response) / 256;
    Serial.println("soc: " + String(response_float) + String("%"));
    Serial.println("--------------------------------------------------------------------------");

    response  = ReadRegistor(RepCap);
    response_float  = float(response) * 500.000 * 0.001;//* 500.000 * Rsense
    Serial.println("RepCap: " + String(response_float) + String("mAH"));
    Serial.println("--------------------------------------------------------------------------");
    delay(500);
  }
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.