This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[BQ27621] Register Setting Error

Hi Team,

BQ27621_RS_Battery.xls

With using EVM, set up the battery parameter as attached Excel file.

then I export dolden image and use this file on sample board, it happened data error from 30 row(C: AA 60 E5)

Q1) Can you share the reference code?

Q2) do we have to input delay time(200ms)? data writing time is so long.

Q3) Can you check the source code as below?

/////////////////////////////////////////////////////////
#define REG_CTRL                            0x00
#define REG_FLAGS                           0x06
#define REG_DATA_CLASS                      0x3e
#define REG_DATA_BLOCK                      0x3f
#define REG_BLOCK_DATA_CHECKSUM             0x60
#define REG_BLOCK_DATA_CONTROL              0x61
#define REGISTERS_BLOCK_OP_CONFIG           0x40

/* BQ27621 Control subcommands */
#define CONTROL_CONTROL_STATUS   0x00
#define CONTROL_DEVICE_TYPE      0x01
#define CONTROL_FW_VERSION       0x02
#define CONTROL_SET_CFGUPDATE    0x13
#define CONTROL_SEALED           0x20
#define CONTROL_SOFT_RESET       0x42
#define CONTROL_UNSEAL           0x8000

/* BQ27621 Status bits */
#define STATUS_SHUTDOWNEN        0x8000
#define STATUS_WDRESET           0x4000
#define STATUS_SS                0x2000
#define STATUS_CALMODE           0x1000
#define STATUS_OCVCMDCOMP        0x0200
#define STATUS_OCVFAIL           0x0100
#define STATUS_INITCOMP          0x0080
#define STATUS_HIBERNATE         0x0040
#define STATUS_POWERMIN          0x0020
#define STATUS_SLEEP             0x0010
#define STATUS_LDMD              0x0008
#define STATUS_CHEMCHNG          0x0001

/* BQ27621 Flags bits */
#define FLAGS_CFGUPD             0x0010
/////////////////////////////////////////////////////////


#define REG_DATA_WAIT_MAX_CNT	(300)

#define BATT_I2C_READ_MAX_RETRY_COUNT	(50)
#define BATT_I2C_DATA_WAIT_DELAY	(TRUE)
#define BATT_I2C_FOR_DELAY_CNT	(400)

#define BATT_I2C_WRITE_MAX_SIZE	(32)

static uint8_t BlockCfg_Seq=0;

uint8_t BlockConfigArry[14][BATT_I2C_WRITE_MAX_SIZE]={
	{0x02,0x26,0x00,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
	{0x00,0x19,0x28,0x63,0x5F,0xFF,0x62,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
	{0x10,0xFE,0xFD,0xFF,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
	{0x0A,0x0F,0x02,0x05,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
	{0xB4,0xD8,0x0C,0x02,0x00,0xC8,0x04,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
	{0x14,0x00,0x03,0x08,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
	{0x02,0xBC,0x01,0x2C,0x00,0x1E,0x00,0xC8,0xC8,0x14,0x08,0x00,0x3C,0x0E,0x10,0x00,0x0A,0x46,0x14,0x05,0x0F,0x03,0xE8,0x00,0x64,0x46,0x50,0x0A,0x19,0x28,0x01,0xF4},
	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x80,0x04,0x01,0x14,0x00,0x00,0x0B,0xB8,0x01,0x2C,0x0A,0x01,0x0A,0x00,0x00,0x00,0xC8,0x00,0x64,0x02,0x5A,0x20,0x64},
	{0x0F,0x02,0x00,0x05,0x04,0xB0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
	{0x00,0xA7,0x00,0x64,0x00,0xFA,0x00,0x3C,0x3C,0x01,0xB3,0xB3,0x01,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
	{0x43,0x33,0x00,0x03,0x39,0x0C,0x4E,0x09,0x79,0x0C,0x80,0x00,0xC8,0x00,0x32,0x00,0x14,0x03,0xE8,0x01,0x00,0xC8,0x10,0x04,0x00,0x0A,0x10,0xDD,0xFF,0xCE,0xFF,0xCE},
	{0x00,0x01,0x02,0xBC,0x12,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
	{0x00,0x1D,0x00,0x1E,0x00,0x22,0x00,0x2E,0x00,0x26,0x00,0x20,0x00,0x25,0x00,0x1F,0x00,0x20,0x00,0x23,0x00,0x27,0x00,0x27,0x00,0x3D,0x00,0x73,0x00,0xC8,0x00,0x00},
	{0x80,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
};
uint8_t RdComp_BlockData_Checksum(uint8_t Ok_Answers)
{
	uint8_t ReadData[1]={0};
	uint8_t Result=0;
	uint16_t retryCnt=0;

	Batt_i2c_Buff.CheckSumOK=Ok_Answers;

	for(retryCnt=0;retryCnt<BATT_I2C_READ_MAX_RETRY_COUNT;retryCnt++)
	{
		i2c_mux_repeat_read(IDX_BATT_GAUGE,REG_BLOCK_DATA_CHECKSUM,1,ReadData);
		Batt_i2c_Buff.Read_CheckSum=ReadData[0];
	#if(BATT_I2C_DATA_WAIT_DELAY==TRUE)
		for(uint16_t DelayCnt=0;DelayCnt<BATT_I2C_FOR_DELAY_CNT;DelayCnt++);
	#endif
		if(ReadData[0]==Ok_Answers)
		{
			Result=1;
			break;
		}
	}
	return Result;
}


void gauge_full_sequence(void)
{
	uint8_t CheckSum_Result=0;
	uint8_t Return_Val=0;
	uint16_t config_lookCnt=0;
	
	BlockCfg_Seq=0;
	
	//--------------------------------------------------------
	// 	-------------------------------------------------------------------------------------------->>>>>>>>> Verify Existing Firmware Version
	//--------------------------------------------------------


	Batt_i2c_Buff.write[0]=(uint8_t)(CONTROL_DEVICE_TYPE);
	Batt_i2c_Buff.write[1]=(uint8_t)(CONTROL_DEVICE_TYPE >> 8);
	batt_i2c_write(REG_CTRL,Batt_i2c_Buff.write,2);

	Batt_i2c_Buff.readSwap[0].u16_data = 0x0000;
	batt_i2c_repeat_read(REG_CTRL, Batt_i2c_Buff.readSwap[0].u8_buff,2);
	DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "batt-gauge-Device_Type :: 0x%04X (0x%02X,0x%02X)", 3, Batt_i2c_Buff.readSwap[0].u16_data, Batt_i2c_Buff.readSwap[0].u8_buff[0],Batt_i2c_Buff.readSwap[0].u8_buff[1]);

	Batt_i2c_Buff.write[0]=(uint8_t)(CONTROL_FW_VERSION);
	Batt_i2c_Buff.write[1]=(uint8_t)(CONTROL_FW_VERSION >> 8);
	batt_i2c_write(REG_CTRL,Batt_i2c_Buff.write,2);

	Batt_i2c_Buff.readSwap[0].u16_data = 0x0000;
	batt_i2c_repeat_read(REG_CTRL, Batt_i2c_Buff.readSwap[0].u8_buff,2);
	DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "batt-gauge-FW_Version :: 0x%04X (0x%02X,0x%02X)", 3, Batt_i2c_Buff.readSwap[0].u16_data, Batt_i2c_Buff.readSwap[0].u8_buff[0],Batt_i2c_Buff.readSwap[0].u8_buff[1]);

	
	//--------------------------------------------------------
	//	-------------------------------------------------------------------------------------------->>>>>>>>>Enter ROM Mode
	//--------------------------------------------------------

	
	//--------------------------------------------------------
	//	-------------------------------------------------------------------------------------------->>>>>>>>>SET_CFGUPDATE
	//--------------------------------------------------------

	///////////////////////////////////////////////////////////////////
	BATT_I2C_BUFF_CLEAR();
	//--------------------------------------------------------
	//	-------------------------------------------------------------------------------------------->>>>>>>>>Un-seal
	//--------------------------------------------------------
	Batt_i2c_Buff.write[0]=(uint8_t)(CONTROL_UNSEAL);
	Batt_i2c_Buff.write[1]=(uint8_t)(CONTROL_UNSEAL >> 8);
	batt_i2c_write(REG_CTRL,Batt_i2c_Buff.write,2);
	batt_i2c_write(REG_CTRL,Batt_i2c_Buff.write,2);
	delayMS(10);
	
	for(config_lookCnt=0;config_lookCnt<REG_DATA_WAIT_MAX_CNT;config_lookCnt++)
	{
		BATT_I2C_BUFF_CLEAR();
		Batt_i2c_Buff.write[0]=(uint8_t)(CONTROL_SET_CFGUPDATE);
		Batt_i2c_Buff.write[1]=(uint8_t)(CONTROL_SET_CFGUPDATE >> 8);
		batt_i2c_write(REG_CTRL,Batt_i2c_Buff.write,2);
		
		Batt_i2c_Buff.readSwap[0].u16_data=0;
		
		batt_i2c_repeat_read(REG_FLAGS,Batt_i2c_Buff.readSwap[0].u8_buff,2);
	
		if(Batt_i2c_Buff.readSwap[0].u16_data & FLAGS_CFGUPD)
		{
			DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "batt-Config Success[%d]", 1,config_lookCnt);
			break;
		}
			
	}
	///////////////////////////////////////////////////////////////////
	delayMS(1100);
	Batt_i2c_Buff.write[0]=0x02;
	Batt_i2c_Buff.write[1]=0x00;
	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);	
	batt_i2c_write(REGISTERS_BLOCK_OP_CONFIG,BlockConfigArry[BlockCfg_Seq++],BATT_I2C_WRITE_MAX_SIZE); 	// 32-bytes
	Batt_i2c_Buff.write[0]=0xA5;
	batt_i2c_write(REG_BLOCK_DATA_CHECKSUM,Batt_i2c_Buff.write,1);	


	////////////////////////////////////////////////////////////////////
	delayMS(CONFG_INTERVAL_DELAY_MS);
	Batt_i2c_Buff.write[0]=0x02;
	Batt_i2c_Buff.write[1]=0x00;
	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);	
	CheckSum_Result=RdComp_BlockData_Checksum(0xA5); 
	DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "BATT_CHKS:: %d, [0x%02X][0x%02X]", 3,CheckSum_Result,Batt_i2c_Buff.CheckSumOK,Batt_i2c_Buff.Read_CheckSum);
	Batt_i2c_Buff.write[0]=0x24;
	Batt_i2c_Buff.write[1]=0x00;
	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);	
	batt_i2c_write(REGISTERS_BLOCK_OP_CONFIG,BlockConfigArry[BlockCfg_Seq++],BATT_I2C_WRITE_MAX_SIZE); 
	Batt_i2c_Buff.write[0]=0x69;
	batt_i2c_write(REG_BLOCK_DATA_CHECKSUM,Batt_i2c_Buff.write,1);	


	////////////////////////////////////////////////////////////////////
	delayMS(CONFG_INTERVAL_DELAY_MS);
	Batt_i2c_Buff.write[0]=0x24;
	Batt_i2c_Buff.write[1]=0x00;
	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);	
	CheckSum_Result=RdComp_BlockData_Checksum(0x69); 
	DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "BATT_CHKS:: %d, [0x%02X][0x%02X]", 3,CheckSum_Result,Batt_i2c_Buff.CheckSumOK,Batt_i2c_Buff.Read_CheckSum);
	Batt_i2c_Buff.write[0]=0x30;
	Batt_i2c_Buff.write[1]=0x00;
	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
	batt_i2c_write(REGISTERS_BLOCK_OP_CONFIG,BlockConfigArry[BlockCfg_Seq++],BATT_I2C_WRITE_MAX_SIZE); 
	Batt_i2c_Buff.write[0]=0xBD;
	batt_i2c_write(REG_BLOCK_DATA_CHECKSUM,Batt_i2c_Buff.write,1);	


	////////////////////////////////////////////////////////////////////
	delayMS(CONFG_INTERVAL_DELAY_MS);
	Batt_i2c_Buff.write[0]=0x30;
	Batt_i2c_Buff.write[1]=0x00;
	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
	CheckSum_Result=RdComp_BlockData_Checksum(0xBD); 
	DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "BATT_CHKS:: %d, [0x%02X][0x%02X]", 3,CheckSum_Result,Batt_i2c_Buff.CheckSumOK,Batt_i2c_Buff.Read_CheckSum);
	Batt_i2c_Buff.write[0]=0x31;
	Batt_i2c_Buff.write[1]=0x00;
	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
	batt_i2c_write(REGISTERS_BLOCK_OP_CONFIG,BlockConfigArry[BlockCfg_Seq++],BATT_I2C_WRITE_MAX_SIZE); 
	Batt_i2c_Buff.write[0]=0xAD;
	batt_i2c_write(REG_BLOCK_DATA_CHECKSUM,Batt_i2c_Buff.write,1);	


	////////////////////////////////////////////////////////////////////
	delayMS(CONFG_INTERVAL_DELAY_MS);
	Batt_i2c_Buff.write[0]=0x31;
	Batt_i2c_Buff.write[1]=0x00;
	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
	CheckSum_Result=RdComp_BlockData_Checksum(0xAD); 
	DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "BATT_CHKS:: %d, [0x%02X][0x%02X]", 3,CheckSum_Result,Batt_i2c_Buff.CheckSumOK,Batt_i2c_Buff.Read_CheckSum);
	Batt_i2c_Buff.write[0]=0x40;
	Batt_i2c_Buff.write[1]=0x00;
	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
	batt_i2c_write(REGISTERS_BLOCK_OP_CONFIG,BlockConfigArry[BlockCfg_Seq++],BATT_I2C_WRITE_MAX_SIZE); 
	Batt_i2c_Buff.write[0]=0x90;
	batt_i2c_write(REG_BLOCK_DATA_CHECKSUM,Batt_i2c_Buff.write,1);	


	////////////////////////////////////////////////////////////////////
	delayMS(CONFG_INTERVAL_DELAY_MS);
	Batt_i2c_Buff.write[0]=0x40;
	Batt_i2c_Buff.write[1]=0x00;
	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
	CheckSum_Result=RdComp_BlockData_Checksum(0x90); 
	DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "BATT_CHKS:: %d, [0x%02X][0x%02X]", 3,CheckSum_Result,Batt_i2c_Buff.CheckSumOK,Batt_i2c_Buff.Read_CheckSum);
	Batt_i2c_Buff.write[0]=0x44;
	Batt_i2c_Buff.write[1]=0x00;
	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
	batt_i2c_write(REGISTERS_BLOCK_OP_CONFIG,BlockConfigArry[BlockCfg_Seq++],BATT_I2C_WRITE_MAX_SIZE); 
	Batt_i2c_Buff.write[0]=0x48;
	batt_i2c_write(REG_BLOCK_DATA_CHECKSUM,Batt_i2c_Buff.write,1);	


	////////////////////////////////////////////////////////////////////
	delayMS(CONFG_INTERVAL_DELAY_MS);
	Batt_i2c_Buff.write[0]=0x44;
	Batt_i2c_Buff.write[1]=0x00;
	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
	CheckSum_Result=RdComp_BlockData_Checksum(0x48); 
	DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "BATT_CHKS:: %d, [0x%02X][0x%02X]", 3,CheckSum_Result,Batt_i2c_Buff.CheckSumOK,Batt_i2c_Buff.Read_CheckSum);
	Batt_i2c_Buff.write[0]=0x50;
	Batt_i2c_Buff.write[1]=0x00;
	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
	batt_i2c_write(REGISTERS_BLOCK_OP_CONFIG,BlockConfigArry[BlockCfg_Seq++],BATT_I2C_WRITE_MAX_SIZE); 
	Batt_i2c_Buff.write[0]=0x53;
	batt_i2c_write(REG_BLOCK_DATA_CHECKSUM,Batt_i2c_Buff.write,1);	


	////////////////////////////////////////////////////////////////////
	delayMS(CONFG_INTERVAL_DELAY_MS);
	Batt_i2c_Buff.write[0]=0x50;
	Batt_i2c_Buff.write[1]=0x00;
	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
	CheckSum_Result=RdComp_BlockData_Checksum(0x53); 
	DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "BATT_CHKS:: %d, [0x%02X][0x%02X]", 3,CheckSum_Result,Batt_i2c_Buff.CheckSumOK,Batt_i2c_Buff.Read_CheckSum);
	Batt_i2c_Buff.write[0]=0x50;
	Batt_i2c_Buff.write[1]=0x01;
	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
	batt_i2c_write(REGISTERS_BLOCK_OP_CONFIG,BlockConfigArry[BlockCfg_Seq++],BATT_I2C_WRITE_MAX_SIZE); 
	Batt_i2c_Buff.write[0]=0x12;
	
	
	////////////////////////////////////////////////////////////////////
	delayMS(CONFG_INTERVAL_DELAY_MS);
	Batt_i2c_Buff.write[0]=0x50;
	Batt_i2c_Buff.write[1]=0x01;
	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
	CheckSum_Result=RdComp_BlockData_Checksum(0x12); 
	DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "BATT_CHKS:: %d, [0x%02X][0x%02X]", 3,CheckSum_Result,Batt_i2c_Buff.CheckSumOK,Batt_i2c_Buff.Read_CheckSum);
	Batt_i2c_Buff.write[0]=0x50;
	Batt_i2c_Buff.write[1]=0x02;
	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
	batt_i2c_write(REGISTERS_BLOCK_OP_CONFIG,BlockConfigArry[BlockCfg_Seq++],BATT_I2C_WRITE_MAX_SIZE); 
	Batt_i2c_Buff.write[0]=0x26;
	batt_i2c_write(REG_BLOCK_DATA_CHECKSUM,Batt_i2c_Buff.write,1);	


	////////////////////////////////////////////////////////////////////
	delayMS(CONFG_INTERVAL_DELAY_MS);
	Batt_i2c_Buff.write[0]=0x50;
	Batt_i2c_Buff.write[1]=0x02;
	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
	CheckSum_Result=RdComp_BlockData_Checksum(0x26); 
	DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "BATT_CHKS:: %d, [0x%02X][0x%02X]", 3,CheckSum_Result,Batt_i2c_Buff.CheckSumOK,Batt_i2c_Buff.Read_CheckSum);
	Batt_i2c_Buff.write[0]=0x51;
	Batt_i2c_Buff.write[1]=0x00;
	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
	batt_i2c_write(REGISTERS_BLOCK_OP_CONFIG,BlockConfigArry[BlockCfg_Seq++],BATT_I2C_WRITE_MAX_SIZE); 
	Batt_i2c_Buff.write[0]=0x8A;
	batt_i2c_write(REG_BLOCK_DATA_CHECKSUM,Batt_i2c_Buff.write,1);	


	////////////////////////////////////////////////////////////////////
	delayMS(CONFG_INTERVAL_DELAY_MS);
	Batt_i2c_Buff.write[0]=0x51;
	Batt_i2c_Buff.write[1]=0x00;
	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
	CheckSum_Result=RdComp_BlockData_Checksum(0x8A); 
	DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "BATT_CHKS:: %d, [0x%02X][0x%02X]", 3,CheckSum_Result,Batt_i2c_Buff.CheckSumOK,Batt_i2c_Buff.Read_CheckSum);
	Batt_i2c_Buff.write[0]=0x52;
	Batt_i2c_Buff.write[1]=0x00;
	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
	batt_i2c_write(REGISTERS_BLOCK_OP_CONFIG,BlockConfigArry[BlockCfg_Seq++],BATT_I2C_WRITE_MAX_SIZE); 
	Batt_i2c_Buff.write[0]=0x7E;
	batt_i2c_write(REG_BLOCK_DATA_CHECKSUM,Batt_i2c_Buff.write,1);	


	////////////////////////////////////////////////////////////////////
	delayMS(CONFG_INTERVAL_DELAY_MS);
	Batt_i2c_Buff.write[0]=0x52;
	Batt_i2c_Buff.write[1]=0x00;
	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
	CheckSum_Result=RdComp_BlockData_Checksum(0x7E); 
	DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "BATT_CHKS:: %d, [0x%02X][0x%02X]", 3,CheckSum_Result,Batt_i2c_Buff.CheckSumOK,Batt_i2c_Buff.Read_CheckSum);
	Batt_i2c_Buff.write[0]=0x52;
	Batt_i2c_Buff.write[1]=0x01;
	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
	batt_i2c_write(REGISTERS_BLOCK_OP_CONFIG,BlockConfigArry[BlockCfg_Seq++],BATT_I2C_WRITE_MAX_SIZE); 
	Batt_i2c_Buff.write[0]=0x2C;
	batt_i2c_write(REG_BLOCK_DATA_CHECKSUM,Batt_i2c_Buff.write,1);	


	////////////////////////////////////////////////////////////////////
	delayMS(CONFG_INTERVAL_DELAY_MS);
	Batt_i2c_Buff.write[0]=0x52;
	Batt_i2c_Buff.write[1]=0x01;
	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
	CheckSum_Result=RdComp_BlockData_Checksum(0x2C); 
	DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "BATT_CHKS:: %d, [0x%02X][0x%02X]", 3,CheckSum_Result,Batt_i2c_Buff.CheckSumOK,Batt_i2c_Buff.Read_CheckSum);
	Batt_i2c_Buff.write[0]=0x55;
	Batt_i2c_Buff.write[1]=0x00;
	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
	batt_i2c_write(REGISTERS_BLOCK_OP_CONFIG,BlockConfigArry[BlockCfg_Seq++],BATT_I2C_WRITE_MAX_SIZE); 
	Batt_i2c_Buff.write[0]=0xE1;
	batt_i2c_write(REG_BLOCK_DATA_CHECKSUM,Batt_i2c_Buff.write,1);	


	////////////////////////////////////////////////////////////////////
	delayMS(CONFG_INTERVAL_DELAY_MS);
	Batt_i2c_Buff.write[0]=0x55;
	Batt_i2c_Buff.write[1]=0x00;
	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
	CheckSum_Result=RdComp_BlockData_Checksum(0xE1); 
	DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "BATT_CHKS:: %d, [0x%02X][0x%02X]", 3,CheckSum_Result,Batt_i2c_Buff.CheckSumOK,Batt_i2c_Buff.Read_CheckSum);
	Batt_i2c_Buff.write[0]=0x70;
	Batt_i2c_Buff.write[1]=0x00;
	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
	batt_i2c_write(REGISTERS_BLOCK_OP_CONFIG,BlockConfigArry[BlockCfg_Seq++],BATT_I2C_WRITE_MAX_SIZE); 
	Batt_i2c_Buff.write[0]=0xFF;
	batt_i2c_write(REG_BLOCK_DATA_CHECKSUM,Batt_i2c_Buff.write,1);	


	////////////////////////////////////////////////////////////////////
	delayMS(CONFG_INTERVAL_DELAY_MS);
	Batt_i2c_Buff.write[0]=0x70;
	Batt_i2c_Buff.write[1]=0x00;
	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
	CheckSum_Result=RdComp_BlockData_Checksum(0xFF); 
	DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "BATT_CHKS:: %d, [0x%02X][0x%02X]", 3,CheckSum_Result,Batt_i2c_Buff.CheckSumOK,Batt_i2c_Buff.Read_CheckSum);

	//--------------------------------------------------------
	//	-------------------------------------------------------------------------------------------->>>>>>>>>Exit 0xCFGUPDATE
	//--------------------------------------------------------

	for(config_lookCnt=0;config_lookCnt<REG_DATA_WAIT_MAX_CNT;config_lookCnt++)
	{
		BATT_I2C_BUFF_CLEAR();
		Batt_i2c_Buff.write[0]=(uint8_t)(CONTROL_SOFT_RESET);
		Batt_i2c_Buff.write[1]=(uint8_t)(CONTROL_SOFT_RESET >> 8);
		batt_i2c_write(REG_CTRL,Batt_i2c_Buff.write,2);
		
		Batt_i2c_Buff.readSwap[0].u16_data=0;
		
		batt_i2c_repeat_read(REG_FLAGS,Batt_i2c_Buff.readSwap[0].u8_buff,2);

		if(!(Batt_i2c_Buff.readSwap[0].u16_data & FLAGS_CFGUPD))
		{
			DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "batt-Config exit Success[%d]", 1,config_lookCnt);
			break;
		}
			
	}

}

Regards,

Nate

  • Please use the delays (X: commands) that are embedded in the gm.fs file.
    We will release an applications note with reference code this month but it is not available yet.
  • Hi Dominik

    delay term must use at code. Am I correct?
    Can you check the C source as attacehd before thred?
    Also Can you share the reference code by mail earlier? Please review the attached Source code

    Especially, below part has error.

    delayMS(CONFG_INTERVAL_DELAY_MS);
     Batt_i2c_Buff.write[0]=0x30;
     Batt_i2c_Buff.write[1]=0x00;
     batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
     CheckSum_Result=RdComp_BlockData_Checksum(0xBD);
     DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "BATT_CHKS:: %d, [0x%02X][0x%02X]", 3,CheckSum_Result,Batt_i2c_Buff.CheckSumOK,Batt_i2c_Buff.Read_CheckSum);
     Batt_i2c_Buff.write[0]=0x31;
     Batt_i2c_Buff.write[1]=0x00;
     batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
     batt_i2c_write(REGISTERS_BLOCK_OP_CONFIG,BlockConfigArry[BlockCfg_Seq++],BATT_I2C_WRITE_MAX_SIZE);
     Batt_i2c_Buff.write[0]=0xAD;
     batt_i2c_write(REG_BLOCK_DATA_CHECKSUM,Batt_i2c_Buff.write,1); 

    /////////////////////////////////////////////////////////
    #define REG_CTRL                            0x00
    #define REG_FLAGS                           0x06
    #define REG_DATA_CLASS                      0x3e
    #define REG_DATA_BLOCK                      0x3f
    #define REG_BLOCK_DATA_CHECKSUM             0x60
    #define REG_BLOCK_DATA_CONTROL              0x61
    #define REGISTERS_BLOCK_OP_CONFIG           0x40
    
    /* BQ27621 Control subcommands */
    #define CONTROL_CONTROL_STATUS   0x00
    #define CONTROL_DEVICE_TYPE      0x01
    #define CONTROL_FW_VERSION       0x02
    #define CONTROL_SET_CFGUPDATE    0x13
    #define CONTROL_SEALED           0x20
    #define CONTROL_SOFT_RESET       0x42
    #define CONTROL_UNSEAL           0x8000
    
    /* BQ27621 Status bits */
    #define STATUS_SHUTDOWNEN        0x8000
    #define STATUS_WDRESET           0x4000
    #define STATUS_SS                0x2000
    #define STATUS_CALMODE           0x1000
    #define STATUS_OCVCMDCOMP        0x0200
    #define STATUS_OCVFAIL           0x0100
    #define STATUS_INITCOMP          0x0080
    #define STATUS_HIBERNATE         0x0040
    #define STATUS_POWERMIN          0x0020
    #define STATUS_SLEEP             0x0010
    #define STATUS_LDMD              0x0008
    #define STATUS_CHEMCHNG          0x0001
    
    /* BQ27621 Flags bits */
    #define FLAGS_CFGUPD             0x0010
    /////////////////////////////////////////////////////////
    
    
    #define REG_DATA_WAIT_MAX_CNT	(300)
    
    #define BATT_I2C_READ_MAX_RETRY_COUNT	(50)
    #define BATT_I2C_DATA_WAIT_DELAY	(TRUE)
    #define BATT_I2C_FOR_DELAY_CNT	(400)
    
    #define BATT_I2C_WRITE_MAX_SIZE	(32)
    
    static uint8_t BlockCfg_Seq=0;
    
    uint8_t BlockConfigArry[14][BATT_I2C_WRITE_MAX_SIZE]={
    	{0x02,0x26,0x00,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
    	{0x00,0x19,0x28,0x63,0x5F,0xFF,0x62,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
    	{0x10,0xFE,0xFD,0xFF,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
    	{0x0A,0x0F,0x02,0x05,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
    	{0xB4,0xD8,0x0C,0x02,0x00,0xC8,0x04,0x00,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
    	{0x14,0x00,0x03,0x08,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
    	{0x02,0xBC,0x01,0x2C,0x00,0x1E,0x00,0xC8,0xC8,0x14,0x08,0x00,0x3C,0x0E,0x10,0x00,0x0A,0x46,0x14,0x05,0x0F,0x03,0xE8,0x00,0x64,0x46,0x50,0x0A,0x19,0x28,0x01,0xF4},
    	{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x80,0x04,0x01,0x14,0x00,0x00,0x0B,0xB8,0x01,0x2C,0x0A,0x01,0x0A,0x00,0x00,0x00,0xC8,0x00,0x64,0x02,0x5A,0x20,0x64},
    	{0x0F,0x02,0x00,0x05,0x04,0xB0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
    	{0x00,0xA7,0x00,0x64,0x00,0xFA,0x00,0x3C,0x3C,0x01,0xB3,0xB3,0x01,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
    	{0x43,0x33,0x00,0x03,0x39,0x0C,0x4E,0x09,0x79,0x0C,0x80,0x00,0xC8,0x00,0x32,0x00,0x14,0x03,0xE8,0x01,0x00,0xC8,0x10,0x04,0x00,0x0A,0x10,0xDD,0xFF,0xCE,0xFF,0xCE},
    	{0x00,0x01,0x02,0xBC,0x12,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
    	{0x00,0x1D,0x00,0x1E,0x00,0x22,0x00,0x2E,0x00,0x26,0x00,0x20,0x00,0x25,0x00,0x1F,0x00,0x20,0x00,0x23,0x00,0x27,0x00,0x27,0x00,0x3D,0x00,0x73,0x00,0xC8,0x00,0x00},
    	{0x80,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
    };
    uint8_t RdComp_BlockData_Checksum(uint8_t Ok_Answers)
    {
    	uint8_t ReadData[1]={0};
    	uint8_t Result=0;
    	uint16_t retryCnt=0;
    
    	Batt_i2c_Buff.CheckSumOK=Ok_Answers;
    
    	for(retryCnt=0;retryCnt<BATT_I2C_READ_MAX_RETRY_COUNT;retryCnt++)
    	{
    		i2c_mux_repeat_read(IDX_BATT_GAUGE,REG_BLOCK_DATA_CHECKSUM,1,ReadData);
    		Batt_i2c_Buff.Read_CheckSum=ReadData[0];
    	#if(BATT_I2C_DATA_WAIT_DELAY==TRUE)
    		for(uint16_t DelayCnt=0;DelayCnt<BATT_I2C_FOR_DELAY_CNT;DelayCnt++);
    	#endif
    		if(ReadData[0]==Ok_Answers)
    		{
    			Result=1;
    			break;
    		}
    	}
    	return Result;
    }
    
    
    void gauge_full_sequence(void)
    {
    	uint8_t CheckSum_Result=0;
    	uint8_t Return_Val=0;
    	uint16_t config_lookCnt=0;
    	
    	BlockCfg_Seq=0;
    	
    	//--------------------------------------------------------
    	// 	-------------------------------------------------------------------------------------------->>>>>>>>> Verify Existing Firmware Version
    	//--------------------------------------------------------
    
    
    	Batt_i2c_Buff.write[0]=(uint8_t)(CONTROL_DEVICE_TYPE);
    	Batt_i2c_Buff.write[1]=(uint8_t)(CONTROL_DEVICE_TYPE >> 8);
    	batt_i2c_write(REG_CTRL,Batt_i2c_Buff.write,2);
    
    	Batt_i2c_Buff.readSwap[0].u16_data = 0x0000;
    	batt_i2c_repeat_read(REG_CTRL, Batt_i2c_Buff.readSwap[0].u8_buff,2);
    	DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "batt-gauge-Device_Type :: 0x%04X (0x%02X,0x%02X)", 3, Batt_i2c_Buff.readSwap[0].u16_data, Batt_i2c_Buff.readSwap[0].u8_buff[0],Batt_i2c_Buff.readSwap[0].u8_buff[1]);
    
    	Batt_i2c_Buff.write[0]=(uint8_t)(CONTROL_FW_VERSION);
    	Batt_i2c_Buff.write[1]=(uint8_t)(CONTROL_FW_VERSION >> 8);
    	batt_i2c_write(REG_CTRL,Batt_i2c_Buff.write,2);
    
    	Batt_i2c_Buff.readSwap[0].u16_data = 0x0000;
    	batt_i2c_repeat_read(REG_CTRL, Batt_i2c_Buff.readSwap[0].u8_buff,2);
    	DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "batt-gauge-FW_Version :: 0x%04X (0x%02X,0x%02X)", 3, Batt_i2c_Buff.readSwap[0].u16_data, Batt_i2c_Buff.readSwap[0].u8_buff[0],Batt_i2c_Buff.readSwap[0].u8_buff[1]);
    
    	
    	//--------------------------------------------------------
    	//	-------------------------------------------------------------------------------------------->>>>>>>>>Enter ROM Mode
    	//--------------------------------------------------------
    
    	
    	//--------------------------------------------------------
    	//	-------------------------------------------------------------------------------------------->>>>>>>>>SET_CFGUPDATE
    	//--------------------------------------------------------
    
    	///////////////////////////////////////////////////////////////////
    	BATT_I2C_BUFF_CLEAR();
    	//--------------------------------------------------------
    	//	-------------------------------------------------------------------------------------------->>>>>>>>>Un-seal
    	//--------------------------------------------------------
    	Batt_i2c_Buff.write[0]=(uint8_t)(CONTROL_UNSEAL);
    	Batt_i2c_Buff.write[1]=(uint8_t)(CONTROL_UNSEAL >> 8);
    	batt_i2c_write(REG_CTRL,Batt_i2c_Buff.write,2);
    	batt_i2c_write(REG_CTRL,Batt_i2c_Buff.write,2);
    	delayMS(10);
    	
    	for(config_lookCnt=0;config_lookCnt<REG_DATA_WAIT_MAX_CNT;config_lookCnt++)
    	{
    		BATT_I2C_BUFF_CLEAR();
    		Batt_i2c_Buff.write[0]=(uint8_t)(CONTROL_SET_CFGUPDATE);
    		Batt_i2c_Buff.write[1]=(uint8_t)(CONTROL_SET_CFGUPDATE >> 8);
    		batt_i2c_write(REG_CTRL,Batt_i2c_Buff.write,2);
    		
    		Batt_i2c_Buff.readSwap[0].u16_data=0;
    		
    		batt_i2c_repeat_read(REG_FLAGS,Batt_i2c_Buff.readSwap[0].u8_buff,2);
    	
    		if(Batt_i2c_Buff.readSwap[0].u16_data & FLAGS_CFGUPD)
    		{
    			DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "batt-Config Success[%d]", 1,config_lookCnt);
    			break;
    		}
    			
    	}
    	///////////////////////////////////////////////////////////////////
    	delayMS(1100);
    	Batt_i2c_Buff.write[0]=0x02;
    	Batt_i2c_Buff.write[1]=0x00;
    	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);	
    	batt_i2c_write(REGISTERS_BLOCK_OP_CONFIG,BlockConfigArry[BlockCfg_Seq++],BATT_I2C_WRITE_MAX_SIZE); 	// 32-bytes
    	Batt_i2c_Buff.write[0]=0xA5;
    	batt_i2c_write(REG_BLOCK_DATA_CHECKSUM,Batt_i2c_Buff.write,1);	
    
    
    	////////////////////////////////////////////////////////////////////
    	delayMS(CONFG_INTERVAL_DELAY_MS);
    	Batt_i2c_Buff.write[0]=0x02;
    	Batt_i2c_Buff.write[1]=0x00;
    	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);	
    	CheckSum_Result=RdComp_BlockData_Checksum(0xA5); 
    	DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "BATT_CHKS:: %d, [0x%02X][0x%02X]", 3,CheckSum_Result,Batt_i2c_Buff.CheckSumOK,Batt_i2c_Buff.Read_CheckSum);
    	Batt_i2c_Buff.write[0]=0x24;
    	Batt_i2c_Buff.write[1]=0x00;
    	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);	
    	batt_i2c_write(REGISTERS_BLOCK_OP_CONFIG,BlockConfigArry[BlockCfg_Seq++],BATT_I2C_WRITE_MAX_SIZE); 
    	Batt_i2c_Buff.write[0]=0x69;
    	batt_i2c_write(REG_BLOCK_DATA_CHECKSUM,Batt_i2c_Buff.write,1);	
    
    
    	////////////////////////////////////////////////////////////////////
    	delayMS(CONFG_INTERVAL_DELAY_MS);
    	Batt_i2c_Buff.write[0]=0x24;
    	Batt_i2c_Buff.write[1]=0x00;
    	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);	
    	CheckSum_Result=RdComp_BlockData_Checksum(0x69); 
    	DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "BATT_CHKS:: %d, [0x%02X][0x%02X]", 3,CheckSum_Result,Batt_i2c_Buff.CheckSumOK,Batt_i2c_Buff.Read_CheckSum);
    	Batt_i2c_Buff.write[0]=0x30;
    	Batt_i2c_Buff.write[1]=0x00;
    	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
    	batt_i2c_write(REGISTERS_BLOCK_OP_CONFIG,BlockConfigArry[BlockCfg_Seq++],BATT_I2C_WRITE_MAX_SIZE); 
    	Batt_i2c_Buff.write[0]=0xBD;
    	batt_i2c_write(REG_BLOCK_DATA_CHECKSUM,Batt_i2c_Buff.write,1);	
    
    
    	////////////////////////////////////////////////////////////////////
    	delayMS(CONFG_INTERVAL_DELAY_MS);
    	Batt_i2c_Buff.write[0]=0x30;
    	Batt_i2c_Buff.write[1]=0x00;
    	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
    	CheckSum_Result=RdComp_BlockData_Checksum(0xBD); 
    	DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "BATT_CHKS:: %d, [0x%02X][0x%02X]", 3,CheckSum_Result,Batt_i2c_Buff.CheckSumOK,Batt_i2c_Buff.Read_CheckSum);
    	Batt_i2c_Buff.write[0]=0x31;
    	Batt_i2c_Buff.write[1]=0x00;
    	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
    	batt_i2c_write(REGISTERS_BLOCK_OP_CONFIG,BlockConfigArry[BlockCfg_Seq++],BATT_I2C_WRITE_MAX_SIZE); 
    	Batt_i2c_Buff.write[0]=0xAD;
    	batt_i2c_write(REG_BLOCK_DATA_CHECKSUM,Batt_i2c_Buff.write,1);	
    
    
    	////////////////////////////////////////////////////////////////////
    	delayMS(CONFG_INTERVAL_DELAY_MS);
    	Batt_i2c_Buff.write[0]=0x31;
    	Batt_i2c_Buff.write[1]=0x00;
    	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
    	CheckSum_Result=RdComp_BlockData_Checksum(0xAD); 
    	DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "BATT_CHKS:: %d, [0x%02X][0x%02X]", 3,CheckSum_Result,Batt_i2c_Buff.CheckSumOK,Batt_i2c_Buff.Read_CheckSum);
    	Batt_i2c_Buff.write[0]=0x40;
    	Batt_i2c_Buff.write[1]=0x00;
    	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
    	batt_i2c_write(REGISTERS_BLOCK_OP_CONFIG,BlockConfigArry[BlockCfg_Seq++],BATT_I2C_WRITE_MAX_SIZE); 
    	Batt_i2c_Buff.write[0]=0x90;
    	batt_i2c_write(REG_BLOCK_DATA_CHECKSUM,Batt_i2c_Buff.write,1);	
    
    
    	////////////////////////////////////////////////////////////////////
    	delayMS(CONFG_INTERVAL_DELAY_MS);
    	Batt_i2c_Buff.write[0]=0x40;
    	Batt_i2c_Buff.write[1]=0x00;
    	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
    	CheckSum_Result=RdComp_BlockData_Checksum(0x90); 
    	DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "BATT_CHKS:: %d, [0x%02X][0x%02X]", 3,CheckSum_Result,Batt_i2c_Buff.CheckSumOK,Batt_i2c_Buff.Read_CheckSum);
    	Batt_i2c_Buff.write[0]=0x44;
    	Batt_i2c_Buff.write[1]=0x00;
    	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
    	batt_i2c_write(REGISTERS_BLOCK_OP_CONFIG,BlockConfigArry[BlockCfg_Seq++],BATT_I2C_WRITE_MAX_SIZE); 
    	Batt_i2c_Buff.write[0]=0x48;
    	batt_i2c_write(REG_BLOCK_DATA_CHECKSUM,Batt_i2c_Buff.write,1);	
    
    
    	////////////////////////////////////////////////////////////////////
    	delayMS(CONFG_INTERVAL_DELAY_MS);
    	Batt_i2c_Buff.write[0]=0x44;
    	Batt_i2c_Buff.write[1]=0x00;
    	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
    	CheckSum_Result=RdComp_BlockData_Checksum(0x48); 
    	DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "BATT_CHKS:: %d, [0x%02X][0x%02X]", 3,CheckSum_Result,Batt_i2c_Buff.CheckSumOK,Batt_i2c_Buff.Read_CheckSum);
    	Batt_i2c_Buff.write[0]=0x50;
    	Batt_i2c_Buff.write[1]=0x00;
    	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
    	batt_i2c_write(REGISTERS_BLOCK_OP_CONFIG,BlockConfigArry[BlockCfg_Seq++],BATT_I2C_WRITE_MAX_SIZE); 
    	Batt_i2c_Buff.write[0]=0x53;
    	batt_i2c_write(REG_BLOCK_DATA_CHECKSUM,Batt_i2c_Buff.write,1);	
    
    
    	////////////////////////////////////////////////////////////////////
    	delayMS(CONFG_INTERVAL_DELAY_MS);
    	Batt_i2c_Buff.write[0]=0x50;
    	Batt_i2c_Buff.write[1]=0x00;
    	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
    	CheckSum_Result=RdComp_BlockData_Checksum(0x53); 
    	DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "BATT_CHKS:: %d, [0x%02X][0x%02X]", 3,CheckSum_Result,Batt_i2c_Buff.CheckSumOK,Batt_i2c_Buff.Read_CheckSum);
    	Batt_i2c_Buff.write[0]=0x50;
    	Batt_i2c_Buff.write[1]=0x01;
    	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
    	batt_i2c_write(REGISTERS_BLOCK_OP_CONFIG,BlockConfigArry[BlockCfg_Seq++],BATT_I2C_WRITE_MAX_SIZE); 
    	Batt_i2c_Buff.write[0]=0x12;
    	
    	
    	////////////////////////////////////////////////////////////////////
    	delayMS(CONFG_INTERVAL_DELAY_MS);
    	Batt_i2c_Buff.write[0]=0x50;
    	Batt_i2c_Buff.write[1]=0x01;
    	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
    	CheckSum_Result=RdComp_BlockData_Checksum(0x12); 
    	DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "BATT_CHKS:: %d, [0x%02X][0x%02X]", 3,CheckSum_Result,Batt_i2c_Buff.CheckSumOK,Batt_i2c_Buff.Read_CheckSum);
    	Batt_i2c_Buff.write[0]=0x50;
    	Batt_i2c_Buff.write[1]=0x02;
    	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
    	batt_i2c_write(REGISTERS_BLOCK_OP_CONFIG,BlockConfigArry[BlockCfg_Seq++],BATT_I2C_WRITE_MAX_SIZE); 
    	Batt_i2c_Buff.write[0]=0x26;
    	batt_i2c_write(REG_BLOCK_DATA_CHECKSUM,Batt_i2c_Buff.write,1);	
    
    
    	////////////////////////////////////////////////////////////////////
    	delayMS(CONFG_INTERVAL_DELAY_MS);
    	Batt_i2c_Buff.write[0]=0x50;
    	Batt_i2c_Buff.write[1]=0x02;
    	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
    	CheckSum_Result=RdComp_BlockData_Checksum(0x26); 
    	DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "BATT_CHKS:: %d, [0x%02X][0x%02X]", 3,CheckSum_Result,Batt_i2c_Buff.CheckSumOK,Batt_i2c_Buff.Read_CheckSum);
    	Batt_i2c_Buff.write[0]=0x51;
    	Batt_i2c_Buff.write[1]=0x00;
    	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
    	batt_i2c_write(REGISTERS_BLOCK_OP_CONFIG,BlockConfigArry[BlockCfg_Seq++],BATT_I2C_WRITE_MAX_SIZE); 
    	Batt_i2c_Buff.write[0]=0x8A;
    	batt_i2c_write(REG_BLOCK_DATA_CHECKSUM,Batt_i2c_Buff.write,1);	
    
    
    	////////////////////////////////////////////////////////////////////
    	delayMS(CONFG_INTERVAL_DELAY_MS);
    	Batt_i2c_Buff.write[0]=0x51;
    	Batt_i2c_Buff.write[1]=0x00;
    	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
    	CheckSum_Result=RdComp_BlockData_Checksum(0x8A); 
    	DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "BATT_CHKS:: %d, [0x%02X][0x%02X]", 3,CheckSum_Result,Batt_i2c_Buff.CheckSumOK,Batt_i2c_Buff.Read_CheckSum);
    	Batt_i2c_Buff.write[0]=0x52;
    	Batt_i2c_Buff.write[1]=0x00;
    	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
    	batt_i2c_write(REGISTERS_BLOCK_OP_CONFIG,BlockConfigArry[BlockCfg_Seq++],BATT_I2C_WRITE_MAX_SIZE); 
    	Batt_i2c_Buff.write[0]=0x7E;
    	batt_i2c_write(REG_BLOCK_DATA_CHECKSUM,Batt_i2c_Buff.write,1);	
    
    
    	////////////////////////////////////////////////////////////////////
    	delayMS(CONFG_INTERVAL_DELAY_MS);
    	Batt_i2c_Buff.write[0]=0x52;
    	Batt_i2c_Buff.write[1]=0x00;
    	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
    	CheckSum_Result=RdComp_BlockData_Checksum(0x7E); 
    	DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "BATT_CHKS:: %d, [0x%02X][0x%02X]", 3,CheckSum_Result,Batt_i2c_Buff.CheckSumOK,Batt_i2c_Buff.Read_CheckSum);
    	Batt_i2c_Buff.write[0]=0x52;
    	Batt_i2c_Buff.write[1]=0x01;
    	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
    	batt_i2c_write(REGISTERS_BLOCK_OP_CONFIG,BlockConfigArry[BlockCfg_Seq++],BATT_I2C_WRITE_MAX_SIZE); 
    	Batt_i2c_Buff.write[0]=0x2C;
    	batt_i2c_write(REG_BLOCK_DATA_CHECKSUM,Batt_i2c_Buff.write,1);	
    
    
    	////////////////////////////////////////////////////////////////////
    	delayMS(CONFG_INTERVAL_DELAY_MS);
    	Batt_i2c_Buff.write[0]=0x52;
    	Batt_i2c_Buff.write[1]=0x01;
    	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
    	CheckSum_Result=RdComp_BlockData_Checksum(0x2C); 
    	DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "BATT_CHKS:: %d, [0x%02X][0x%02X]", 3,CheckSum_Result,Batt_i2c_Buff.CheckSumOK,Batt_i2c_Buff.Read_CheckSum);
    	Batt_i2c_Buff.write[0]=0x55;
    	Batt_i2c_Buff.write[1]=0x00;
    	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
    	batt_i2c_write(REGISTERS_BLOCK_OP_CONFIG,BlockConfigArry[BlockCfg_Seq++],BATT_I2C_WRITE_MAX_SIZE); 
    	Batt_i2c_Buff.write[0]=0xE1;
    	batt_i2c_write(REG_BLOCK_DATA_CHECKSUM,Batt_i2c_Buff.write,1);	
    
    
    	////////////////////////////////////////////////////////////////////
    	delayMS(CONFG_INTERVAL_DELAY_MS);
    	Batt_i2c_Buff.write[0]=0x55;
    	Batt_i2c_Buff.write[1]=0x00;
    	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
    	CheckSum_Result=RdComp_BlockData_Checksum(0xE1); 
    	DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "BATT_CHKS:: %d, [0x%02X][0x%02X]", 3,CheckSum_Result,Batt_i2c_Buff.CheckSumOK,Batt_i2c_Buff.Read_CheckSum);
    	Batt_i2c_Buff.write[0]=0x70;
    	Batt_i2c_Buff.write[1]=0x00;
    	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
    	batt_i2c_write(REGISTERS_BLOCK_OP_CONFIG,BlockConfigArry[BlockCfg_Seq++],BATT_I2C_WRITE_MAX_SIZE); 
    	Batt_i2c_Buff.write[0]=0xFF;
    	batt_i2c_write(REG_BLOCK_DATA_CHECKSUM,Batt_i2c_Buff.write,1);	
    
    
    	////////////////////////////////////////////////////////////////////
    	delayMS(CONFG_INTERVAL_DELAY_MS);
    	Batt_i2c_Buff.write[0]=0x70;
    	Batt_i2c_Buff.write[1]=0x00;
    	batt_i2c_write(REG_DATA_CLASS,Batt_i2c_Buff.write,2);
    	CheckSum_Result=RdComp_BlockData_Checksum(0xFF); 
    	DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "BATT_CHKS:: %d, [0x%02X][0x%02X]", 3,CheckSum_Result,Batt_i2c_Buff.CheckSumOK,Batt_i2c_Buff.Read_CheckSum);
    
    	//--------------------------------------------------------
    	//	-------------------------------------------------------------------------------------------->>>>>>>>>Exit 0xCFGUPDATE
    	//--------------------------------------------------------
    
    	for(config_lookCnt=0;config_lookCnt<REG_DATA_WAIT_MAX_CNT;config_lookCnt++)
    	{
    		BATT_I2C_BUFF_CLEAR();
    		Batt_i2c_Buff.write[0]=(uint8_t)(CONTROL_SOFT_RESET);
    		Batt_i2c_Buff.write[1]=(uint8_t)(CONTROL_SOFT_RESET >> 8);
    		batt_i2c_write(REG_CTRL,Batt_i2c_Buff.write,2);
    		
    		Batt_i2c_Buff.readSwap[0].u16_data=0;
    		
    		batt_i2c_repeat_read(REG_FLAGS,Batt_i2c_Buff.readSwap[0].u8_buff,2);
    
    		if(!(Batt_i2c_Buff.readSwap[0].u16_data & FLAGS_CFGUPD))
    		{
    			DBG_BUFFER(MODULE_DRIVERTASK, LEVEL_INFO, "batt-Config exit Success[%d]", 1,config_lookCnt);
    			break;
    		}
    			
    	}
    
    }
    

  • Something seems to go wrong with the check-sum.

    I recommend the following:

    * read the whole subclass data block (32 bytes) into a buffer
    * change the parameters that you want to update in this buffer
    * calculate the check-sum for the whole 32 byte buffer
    * write the whole subclass data block
    * write the check-sum
    * wait
    * verify the check-sum

  • Hi Dominik,

    I have additional questions.

    After POR(power on reset), how much time does need it to control data memory?

    Or simply, SET_CFGUPDATE -> read flags register -> set "1" for CONFIG UPDATE bit -> to control data memory ?

    BRs,

    Nate

  • Nate,

    After POR, wait for the INITCOMP bit (7) in CONTROL_STATUS. Once this is set you can start updating the data memory.

    Regards,
    Dominik.
  • Hi Dominik,

    Very thanks

    I have 2 more questions.

    Q1) In quickstart guide, there is commented 100ms delay time at flowchart. Can it changed to 10ms?

    what is minimum delay time?

    Q2) For BlockData() writing, we have to 32-byte. As below, Can I delete data written 00 ?

    For example, yellow row - After AA 40, there is 32 byte data. just write 02 26 00 00 32 then after date is deleted.

    To do this question, I try to reduce checksum time.

  • A1: Please use the X:10 delays from the FlashStream file
    A2: This is possible if the previous data in this subclass is all zero. Otherwise the check-sum isn't correct (you have to calculate the check sum of the whole 32-byte block).