Part Number:BQ27441-G1
Hello All,
I am working on battery based project and to measure battery parameters we are using Fuel gauge IC BQ27441-G1. I can successfully read all default parameters set in BQ27441-G1 by implementing the source code.
Now in our hardware board, we have connected 4600mAh battery so I need to change design capacity register in BQ27441-G1. So for that I have write this value into design capacity register. Here I am facing the problem. Writing register is executing successfully but after that when I am going to read the same register, then I am getting always default value only.
I have followed the same steps available in this link: www.ti.com/.../sluuap7.pdf. I have configured I2C Clock frequency to 400KHz. After every write cycle, i have given 3 second delay for updation.
Can you please tell me the procedure how to write value in any register?
Any help in this case is highly appreciated.
I attached my code below.
//============================================== main.c ==================================================
#include "stm32f1xx_hal_conf.h"
#include "stm32f1xx_hal.h"
#include "Fualguage.h"
#include "board.h"
uint8_t init = 0;
extern I2C_HandleTypeDef Fualguage_I2C2descriptor;
uint8_t init = 0,state_of_charge = 0;
uint16_t design_cap = 0;
uint8_t rx1[2] = {0x00};
main()
{
if(init == 0)
{
Fualguage_initialization();
init = 1;
}
while(1)
{
i2cReadBytes(&Fualguage_I2C2descriptor,BQ27741_I2C_ADDRESS,0x3C, rx1, 2);
design_cap = rx1[1] << 8 | rx1[0];
printf("design capacity :%d\r\n",design_cap);
state_of_charge = i2cReadByte(&Fualguage_I2C2descriptor,BQ27741_I2C_ADDRESS,0x1C);
printf("state of charge :%d\r\n",state_of_charge);
HAL_Delay(300000);
}
}
//=========================================== Fualguage.h ====================================================
#ifndef __FUALGUAGE_H
#define __FUALGUAGE_H
#include "board.h"
#define BQ27741_I2C_ADDRESS 0xAA
#define TIMEOUT 10000
#define BQ72441_I2C_TIMEOUT 2000
/* I2C SPEEDCLOCK define to max value: 400 KHz on STM32F1xx*/
#define FUALGUAGE_I2C_SPEEDCLOCK 100000
#define FUALGUAGE_I2C_DUTYCYCLE I2C_DUTYCYCLE_2
/* This delay is required for I2C read */
#define DELAY for(uint16_t j = 0;j < 500;j++)
void Fualguage_I2C_Config(void);
void Fualguage_initialization(void);
#endif
//=============================================== Fualguage.c =======================================================
#include "Fualguage.h"
#define I2C_TIMEOUT_BUSY_FLAG ((uint32_t)10000) /*!< Timeout 10 s */
#define TRUE 1
#define FALSE 0
/* creat external refrance for Fualguage */
I2C_HandleTypeDef Fualguage_I2C2descriptor;
uint8_t data[2] = {0};
uint16_t result16 = 0;
uint8_t rx[2] = {0x00};
uint8_t old_chksum = 0,tmp_chksum = 0,new_chksum = 0,chksum = 0;
uint16_t old_dc = 0,old_de = 0,old_tv = 0,old_tr = 0;
void Fualguage_I2C_Config(void)
{
Fualguage_I2C2descriptor.Instance = FUALGUAGE_BQ27441_I2C;
Fualguage_I2C2descriptor.Init.ClockSpeed = FUALGUAGE_I2C_SPEEDCLOCK;
Fualguage_I2C2descriptor.Init.DutyCycle = FUALGUAGE_I2C_DUTYCYCLE;
Fualguage_I2C2descriptor.Init.OwnAddress1 = BQ27741_I2C_ADDRESS;
Fualguage_I2C2descriptor.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
Fualguage_I2C2descriptor.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
Fualguage_I2C2descriptor.Init.OwnAddress2 = 0xFF;
Fualguage_I2C2descriptor.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
Fualguage_I2C2descriptor.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if(HAL_I2C_Init(&Fualguage_I2C2descriptor) != HAL_OK)
{
#ifdef _ENABLE_PRINTF_
printf("\n\r FUALGUAGE init error \n\r");
#endif
}
}
void Fualguage_initialization(void)
{
/* in this initialization i configure
Design Capacity = 4600mAh, Design Energy = 17020(Design Capacity * 3.7),
Taper Current = 115mA,
Terminal Voltage = 3200mV, Taper Rate = 400(Design Capacity / (0.1 * Taper Current))
HAL_Delay(300000) this function gives delay of 3 seconds */
//1
data[0] = 0x00;
data[1] = 0x80;
i2cWriteBytes(&Fualguage_I2C2descriptor,BQ27741_I2C_ADDRESS,(uint8_t) 0, data, 2);
i2cWriteBytes(&Fualguage_I2C2descriptor,BQ27741_I2C_ADDRESS,(uint8_t) 0, data, 2);
HAL_Delay(300000);
//2
data[0] = 0x13;
data[1] = 0x00;
i2cWriteBytes(&Fualguage_I2C2descriptor,BQ27741_I2C_ADDRESS,(uint8_t) 0, data, 2);
HAL_Delay(300000);
//3
do
{
i2cReadBytes(&Fualguage_I2C2descriptor,BQ27741_I2C_ADDRESS,0x06, rx, 2);
result16 = (rx[1] << 8) | rx[0];
}while(!(result16 & 0x0010));
//4
i2cWriteByte(&Fualguage_I2C2descriptor,BQ27741_I2C_ADDRESS,0x61,0x00);
HAL_Delay(300000);
//5
i2cWriteByte(&Fualguage_I2C2descriptor,BQ27741_I2C_ADDRESS,0x3E,0x52);
HAL_Delay(300000);
//6
i2cWriteByte(&Fualguage_I2C2descriptor,BQ27741_I2C_ADDRESS,0x3F,0x00);
HAL_Delay(300000);
do
{
//7
old_chksum = i2cReadByte(&Fualguage_I2C2descriptor,BQ27741_I2C_ADDRESS,0x60);
//8
tmp_chksum = 0xFF - old_chksum;
//9
i2cReadBytes(&Fualguage_I2C2descriptor,BQ27741_I2C_ADDRESS,0x4A, rx, 2);
old_dc = (rx[1] << 8) | rx[0];
//10
i2cReadBytes(&Fualguage_I2C2descriptor,BQ27741_I2C_ADDRESS,0x4C, rx, 2);
old_de = (rx[1] << 8) | rx[0];
//11
i2cReadBytes(&Fualguage_I2C2descriptor,BQ27741_I2C_ADDRESS,0x50, rx, 2);
old_tv = (rx[1] << 8) | rx[0];
//12
i2cReadBytes(&Fualguage_I2C2descriptor,BQ27741_I2C_ADDRESS,0x5B, rx, 2);
old_tr = (rx[1] << 8) | rx[0];
//13
tmp_chksum = tmp_chksum - old_dc - old_de - old_tv - old_tr;
//14
data[1] = 0x11; //MSB of DC
data[0] = 0xF8; //LSB 0f DC
i2cWriteBytes(&Fualguage_I2C2descriptor,BQ27741_I2C_ADDRESS,0x4A, data, 2);
HAL_Delay(300000);
//15
data[1] = 0x42; //MSB of DE
data[0] = 0x7C; //LSB 0f DE
i2cWriteBytes(&Fualguage_I2C2descriptor,BQ27741_I2C_ADDRESS,0x4C, data, 2);
HAL_Delay(300000);
//16
data[1] = 0x0C; //MSB of TV
data[0] = 0x80; //LSB 0f TV
i2cWriteBytes(&Fualguage_I2C2descriptor,BQ27741_I2C_ADDRESS,0x50, data, 2);
HAL_Delay(300000);
//17
data[1] = 0x01; //MSB of TR
data[0] = 0x90; //LSB 0f TR
i2cWriteBytes(&Fualguage_I2C2descriptor,BQ27741_I2C_ADDRESS,0x5B, data, 2);
HAL_Delay(300000);
//18
tmp_chksum = tmp_chksum + (uint16_t)4600 + (uint16_t)17020 + (uint16_t)3200 + (uint16_t)400;
//19
new_chksum = 0xFF - tmp_chksum;
//20
i2cWriteByte(&Fualguage_I2C2descriptor,BQ27741_I2C_ADDRESS,0x60,new_chksum);
HAL_Delay(300000);
//21
i2cWriteByte(&Fualguage_I2C2descriptor,BQ27741_I2C_ADDRESS,0x3E,0x52);
HAL_Delay(300000);
//22
i2cWriteByte(&Fualguage_I2C2descriptor,BQ27741_I2C_ADDRESS,0x3F,0x00);
HAL_Delay(300000);
//23
chksum = i2cReadByte(&Fualguage_I2C2descriptor,BQ27741_I2C_ADDRESS,0x60);
printf("chksum:%d new_chksum:%d\n\r",chksum,new_chksum);
}while(chksum != new_chksum);
//24
data[0] = 0x42;
data[1] = 0x00;
i2cWriteBytes(&Fualguage_I2C2descriptor,BQ27741_I2C_ADDRESS,0x00, data, 2);
HAL_Delay(300000);
//25
do
{
i2cReadBytes(&Fualguage_I2C2descriptor,BQ27741_I2C_ADDRESS,0x06, rx, 2);
result16 = (rx[1] << 8) | rx[0];
}while(result16 & 0x0010);
//26
data[0] = 0x20;
data[1] = 0x00;
i2cWriteBytes(&Fualguage_I2C2descriptor,BQ27741_I2C_ADDRESS,0x00, data, 2);
HAL_Delay(300000);
}
//================================================= Below is the Screenshot of output ===================================================
![]()