I try to update the design capcity parameter in bq27441.
my source code is :
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void bq27441Init(void)
{
unsigned int cnt;
//inicializamos el modulo I2C como transmisión.
HAL_USCI_I2C_transmitinit(I2CSLAVEADDR,I2CCLOCKPRESCALER);
__enable_interrupt();
while ( HAL_USCI_I2C_notready() == 1 );
Flags_bq27441 = bq27441_cmdReadFlags();
//Rutina de Inicializacion del BT27441 extraida de la "Quickstart Guide for bq27441-G1.pdf"
// 1º Steps to unseal the fuel gauge
for(cnt=0;cnt<2;cnt++)
{
//I2CWriteWord(0x00,0x8000,100);
//Metodo 1
bq27441_CmdWriteWord(bq27441CMD_CNTL_LSB,0x8000);
rfDelayUsec(66);//66useg
}
//2º Steps to place the gaude into CONFIG UPDATE mode
cnt=0;
salir=0;
//I2CWriteWord(0x00,0x0013,100);
bq27441_CmdWriteWord(bq27441CMD_CNTL_LSB,0x0013);
rfDelayUsec(66);
do
{
//Flags[2] = I2CReadSubcommand(0x06,2,100)
//Flags_bq27441 =bq27441_ReadSubcommand(bq27441CMD_FLAGS_LSB);
Flags_bq27441=0;
Flags_bq27441 = bq27441_cmdReadFlags();
//High Byte: OT UT - RSVD - RSVD - RSVD - RSVD FC - CHG
//Low Byte :OCVTAKEN - RSVD - ITPOR - CFGUPMODE - BAT_DET - SOC1 - SOCF - DSG
Flags_bq27441 &= FLAG_CFGUPMODE;
rfDelayUsec(66);//66useg
} while (!salir && (Flags_bq27441 != FLAG_CFGUPMODE));
//Imposible colocar el bq27441 en modo de actualización de parámetros.
if(salir == 1)
{
return;
}
//3º Steps to setup block RAM update
//I2CWritteByte(0x61,0x00,100)
bq27441_cmdWrite(bq27441CMD_BLOCKDATACTRL,0x00);
rfDelayUsec(100); //66useg
//I2CWritteByte(0x3E,0x52,100)
bq27441_cmdWrite(bq27441CMD_DATACLASS,0x52);
rfDelayUsec(100); //66useg
//I2CWritteByte(0x3F,0x00)
bq27441_cmdWrite(bq27441CMD_DATABLOCK,0x00);
rfDelayUsec(100); //66useg
//Actualización de la RAM.
//for(cnt = 0; cnt<50;cnt++)
salir=0;
do
{
bq27441_OldChk = bq27441_cmdRead(bq27441CMD_BLOCKDATACHK);
//Steps to compute the new checksum
bq27441_TmpChk = 255 - bq27441_OldChk;
//OLD_DC[2] = I2CReadBlock(0x4A,2,100)
bq27441_Old_DC = bq27441_cmdReadBlock(bq27441DATABLOCK_DESIGN_CAPACITY);
rfDelayUsec(66); //66useg
//----------------------------------------------------------------------------------------------
// Calculo del checksum
// bq27441_TmpChk = bq27441_TmpChk - bq27441_Old_DC - bq27441_Old_DE - bq27441_Old_TV - bq27441_Old_TR;
bq27441_DataChk[0] =bq27441_Old_DC;
bq27441_DataChk[1] = bq27441_Old_DC>>8;
for(cnt=0;cnt<2;cnt++)
{
bq27441_TmpChk -=bq27441_DataChk[cnt];
}
//----------------------------------------------------------------------------------------------
//I2CWriteWord(0x4A,NEW_DC[2],100);
bq27441_CmdWriteWord(bq27441DATABLOCK_DESIGN_CAPACITY, 0x0708);
//bq27441_CmdWriteWord(bq27441DATABLOCK_DESIGN_CAPACITY, bq27441_Old_DC);
//Retardo de 2 sg para comprobacion de la escritura de los registros
for(cnt=0;cnt<10;cnt++)
{
rfDelayUsec(2000); //250useg
}
do
{
//OLD_DC[2] = I2CReadBlock(0x4A,2,100)
bq27441_Old_DC_2 = bq27441_cmdReadBlock(bq27441DATABLOCK_DESIGN_CAPACITY);
rfDelayUsec(66); //66useg
}while(bq27441_Old_DC_2 != 0x0708);
if(bq27441_Old_DC_2 == 0x0708)
{
//----------------------------------------------------------------------------------------------
// Calculo del checksum
bq27441_DataChk[0] =0x08;
bq27441_DataChk[1] = 0x07;
for(cnt=0;cnt<2;cnt++)
{
bq27441_TmpChk +=bq27441_DataChk[cnt];
}
bq27441_NewChk = 255 - bq27441_TmpChk;
//bq27441CMD_BLOCKDATACHK = 0x60
bq27441_cmdWrite(bq27441CMD_BLOCKDATACHK,bq27441_NewChk);
rfDelayUsec(66); //66useg
// 4º Steps to verify RAM update completed correctly
//I2CWritteByte(0x3E,0x52,100)
bq27441_cmdWrite(bq27441CMD_DATACLASS,0x52);
rfDelayUsec(66); //66useg
//I2CWritteByte(0x3F,0x00)
bq27441_cmdWrite(bq27441CMD_DATABLOCK,0x00);
rfDelayUsec(250); //250useg
//bq27441CMD_BLOCKDATACHK = 0x60
bq27441_Chk = bq27441_cmdRead(bq27441CMD_BLOCKDATACHK);
rfDelayUsec(250); //250useg
bq27441_OldChk_n = bq27441_cmdRead(bq27441CMD_BLOCKDATACHK);
if(bq27441_OldChk_n == bq27441_NewChk)
{
salir =1;
}
}
else
{
salir = 1;
}
}while (!salir);
//5º Steps to exit CONFIG UPDATE mode
//I2CWriteWord(0x00,0x0042,100);
bq27441_CmdWriteWord(bq27441CMD_CNTL_LSB, 0x0042);
rfDelayUsec(250); //250useg
cnt=0;
do
{
rfDelayUsec(10000); //10mseg
//Flags[2] = I2CReadSubcommand(0x06,2,100)
//Flags_bq27441 =bq27441_ReadSubcommand(bq27441CMD_FLAGS_LSB);
Flags_bq27441 =bq27441_cmdReadBlock(bq27441CMD_FLAGS_LSB);
cnt++;
Flags_bq27441 &= FLAG_CFGUPMODE;
} while (Flags_bq27441 == FLAG_CFGUPMODE);
//6 Step to seal the fuel gauge
//I2CWriteWord(0x00,0x0020,100);
bq27441_CmdWriteWord(bq27441CMD_CNTL_LSB, 0x0020);
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------