Hi,
We are using BQ77910 for Protection in one of our projects.
My main query is related to programming/writing the data to EEPROM from the microcontroller.
I followed this flowchart and wrote the code exactly as the flowchart below.
In the below Flowchart, We are reading the data registers for verification 2 times, When i read for the first time i am getting all 10 Bytes of data (with only FIRST Byte missing).
in the second Verification (reading data) I get all random data.
If i reset and read the data, its all 0xFF
The following is the code i am using:
int main(void) { unsigned char UC_NumberOfCells = 0; SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ); // ------------------------------------------------------------------------------------- Fz_Debug #ifdef DEBUG_MODE //ucDCard = MODBUS_DCARD_M; // for testing ModBus ucDCard = I2C_DCARD_M; // for testing I2c //ucDCard = UART_DCARD_M; // for testing UART #endif // End of Debug Mode // ------------------------------------------------------------------------------------- Fz_Debug // Initialises the Communication Protocols Init_Cards(); ChangeSOCI2CSpeed(50000); // 50KHz - SOCI2C //-------------------------------------BQ77910 Testing-------------------------------------- char i, BQtest[10] = {0},BQtest2[10] = {0}; // CHGST and ZEDE Pins on the BQ77910 Need to be HIGH to Write/Read from the IC // Enable Ports SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_5 ); // Configure CHGST PIN as O/P SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE); GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE,GPIO_PIN_3 ); // Configure ZEDE_EN PIN as O/P SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, EEPROM_W_EN ); // Configure EEPROM_W_EN PIN as O/P //Set ZEDE and CHGST High (3.3 V ± 5%) CHGST_ENABLE_M; // Enable CHGST PIN ZEDE_ENABLE_M; // ENABLE ZEDE_EN while (1) { for (i = 1; i < 0x0B; i++) // Fz !Fz_Mod : z starts from 1 { //Send I2C commands to set all device configuration registers (0x01–0x0A) to desired values Write_SOCI2C_Byte(BQ77910A_ADDRESS, i, bq77910a_data[i-1]); // Fz //Wait 10mS Delay_ms(10); // Fz } // Write 0x62 to EEPROM control register (address 0x0B) Write_SOCI2C_Byte(BQ77910A_ADDRESS, 0x0B,0x62); Delay_ms(10); // Read back and verify all device configuration registers for (i = 1; i < 0x0B; i++) { BQtest[i - 1] = Read_SOCI2C_Byte(BQ77910A_ADDRESS, i); Delay_ms(10); } // Write 0x41 to EEPROM control register (address 0x0B) Write_SOCI2C_Byte(BQ77910A_ADDRESS, 0x0B,0x41); //Wait 1 ms Delay_ms(1); //Set EEPROM pin HIGH EEPROM_W_ENABLE_M; //Wait 16 ms Delay_ms(16); //Set EEPROM pin HIGH EEPROM_W_DISABLE_M; //Wait 1 ms Delay_ms(1); //Write 0x00 to EEPROM control register (address 0x0B) Write_SOCI2C_Byte(BQ77910A_ADDRESS, 0x0B,0x00); // Read back and verify all device configuration registers for (i = 1; i < 0x0B; i++) { BQtest2[i - 1] = Read_SOCI2C_Byte(BQ77910A_ADDRESS, i); Delay_ms(10); } //Set ZEDE and CHGST LOW CHGST_DISABLE_M; // Disable CHGST PIN ZEDE_DISABLE_M; // Disable ZEDE_EN } }