Hello, I want to read/write some datas to external eeprom ( AT24C256) . I can read/write byte but while reading and writing word and especially double word I face with some problems.
1) When reading a word I see 0xFFFF front of first byte. That happens sometimes not all the time.
2) I am not able to read and write double word correcty. I will write what I expect and what I see.
Waiting for help.
Here you can see related code part :
INITIALIZE
void InitI2C(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C5);
SysCtlPeripheralReset(SYSCTL_PERIPH_I2C5);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
GPIOPinConfigure(GPIO_PB4_I2C5SCL);
GPIOPinConfigure(GPIO_PB5_I2C5SDA);
GPIOPinTypeI2CSCL(GPIO_PORTB_BASE, GPIO_PIN_4);
GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_5);
I2CMasterInitExpClk(I2C5_BASE, SysCtlClockGet(), false);
HWREG(I2C5_BASE + I2C_O_FIFOCTL) = 80008000;
I2CMasterEnable(I2C5_BASE);
EEPROM_WRITE_PROTECTION_ENABLE();
}
void EEPROM_WRITE_PROTECTION_ENABLE(void)
{
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_3);
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_3, GPIO_PIN_3);
}
void EEPROM_WRITE_PROTECTION_DISABLE(void)
{
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_3);
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_3, 0);
}
void Write_Eeprom_Byte(Uint16 address, int16 data)
{
EEPROM_WRITE_PROTECTION_DISABLE();
I2CMasterSlaveAddrSet(I2C5_BASE,SLAVE_ADDRESS, false);
I2CMasterDataPut(I2C5_BASE, ((address >> 8) & 0x00FF));
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_BURST_SEND_START);
SysCtlDelay(10000);
while(I2CMasterBusy(I2C5_BASE));
I2CMasterDataPut(I2C5_BASE, (address & 0x00FF ));
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
SysCtlDelay(10000);
while(I2CMasterBusy(I2C5_BASE));
I2CMasterDataPut(I2C5_BASE, data & 0xFF );
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);
SysCtlDelay(10000);
while(I2CMasterBusy(I2C5_BASE));
EEPROM_WRITE_PROTECTION_ENABLE();
}
int16 Read_Eeprom_Byte(Uint16 address)
{
int16 temp = 0;
I2CMasterSlaveAddrSet(I2C5_BASE, SLAVE_ADDRESS, false);
I2CMasterDataPut(I2C5_BASE,((address >> 8) & 0x00FF));
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_BURST_SEND_START);
SysCtlDelay(10000);
while(I2CMasterBusy(I2C5_BASE));
I2CMasterDataPut(I2C5_BASE, (address & 0x00FF ));
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
SysCtlDelay(10000);
while(I2CMasterBusy(I2C5_BASE));
I2CMasterSlaveAddrSet(I2C5_BASE, SLAVE_ADDRESS, true);
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);
SysCtlDelay(10000);
while(I2CMasterBusy(I2C5_BASE));
temp = (I2CMasterDataGet(I2C5_BASE) & 0xFF);
return( temp );
}
void Write_Eeprom_Word(Uint16 address, int16 data)
{
EEPROM_WRITE_PROTECTION_DISABLE();
I2CMasterSlaveAddrSet(I2C5_BASE,SLAVE_ADDRESS, false);
I2CMasterDataPut(I2C5_BASE, ((address >> 8) & 0x00FF));
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_BURST_SEND_START);
SysCtlDelay(1000);
while(I2CMasterBusy(I2C5_BASE));
I2CMasterDataPut(I2C5_BASE, (address & 0x00FF));
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
SysCtlDelay(1000);
while(I2CMasterBusy(I2C5_BASE));
I2CMasterDataPut(I2C5_BASE, ((data >> 8) & 0x00FF ));
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
SysCtlDelay(1000);
while(I2CMasterBusy(I2C5_BASE));
I2CMasterDataPut(I2C5_BASE, (data & 0x00FF));
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);
SysCtlDelay(1000);
while(I2CMasterBusy(I2C5_BASE));
EEPROM_WRITE_PROTECTION_ENABLE();
}
int16 Read_Eeprom_Word(Uint16 address)
{
int16 temp = 0;
I2CMasterSlaveAddrSet(I2C5_BASE, SLAVE_ADDRESS, false);
I2CMasterDataPut(I2C5_BASE, ((address >> 8) & 0x00FF));
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_BURST_SEND_START);
SysCtlDelay(1000);
while(I2CMasterBusy(I2C5_BASE));
I2CMasterDataPut(I2C5_BASE, (address & 0x00FF ));
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
SysCtlDelay(1000);
while(I2CMasterBusy(I2C5_BASE));
I2CMasterSlaveAddrSet(I2C5_BASE, SLAVE_ADDRESS, true);
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START);
SysCtlDelay(1000);
while(I2CMasterBusy(I2C5_BASE));
temp = (I2CMasterDataGet(I2C5_BASE) << 8 );
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_BURST_RECEIVE_CONT);
SysCtlDelay(1000);
while(I2CMasterBusy(I2C5_BASE));
temp += (I2CMasterDataGet(I2C5_BASE));
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
return( temp );
}
void Write_Eeprom_Double_Word(Uint16 address, int32 data)
{
EEPROM_WRITE_PROTECTION_DISABLE();
I2CMasterSlaveAddrSet(I2C5_BASE,SLAVE_ADDRESS, false);
I2CMasterDataPut(I2C5_BASE, ((address >> 8) & 0x00FF));
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_BURST_SEND_START);
SysCtlDelay(10000);
while(I2CMasterBusy(I2C5_BASE));
I2CMasterDataPut(I2C5_BASE, (address & 0x00FF));
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
SysCtlDelay(10000);
while(I2CMasterBusy(I2C5_BASE));
I2CMasterDataPut(I2C5_BASE, ((data >> 24) & 0x00FF ));
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
SysCtlDelay(10000);
while(I2CMasterBusy(I2C5_BASE));
I2CMasterDataPut(I2C5_BASE, ((data >> 16) & 0x00FF ));
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
SysCtlDelay(10000);
while(I2CMasterBusy(I2C5_BASE));
I2CMasterDataPut(I2C5_BASE, ((data >> 8) & 0x00FF ));
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
SysCtlDelay(10000);
while(I2CMasterBusy(I2C5_BASE));
I2CMasterDataPut(I2C5_BASE, (data & 0x00FF ));
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH);
SysCtlDelay(10000);
while(I2CMasterBusy(I2C5_BASE));
EEPROM_WRITE_PROTECTION_ENABLE();
}
uint32_t Read_Eeprom_Double_Word(Uint16 address)
{
uint16_t temp2,temp3,temp4,temp5;
uint32_t temp;
I2CMasterSlaveAddrSet(I2C5_BASE, SLAVE_ADDRESS, false);
I2CMasterDataPut(I2C5_BASE, ((address >> 8) & 0x00FF));
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_BURST_SEND_START);
SysCtlDelay(10000);
while(I2CMasterBusy(I2C5_BASE));
I2CMasterDataPut(I2C5_BASE, (address & 0x00FF ));
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_BURST_SEND_CONT);
SysCtlDelay(10000);
while(I2CMasterBusy(I2C5_BASE));
I2CMasterSlaveAddrSet(I2C5_BASE, SLAVE_ADDRESS, true);
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START);
SysCtlDelay(10000);
while(I2CMasterBusy(I2C5_BASE));
temp2 = (I2CMasterDataGet(I2C5_BASE) );
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_BURST_RECEIVE_CONT);
SysCtlDelay(10000);
while(I2CMasterBusy(I2C5_BASE));
temp3 = (I2CMasterDataGet(I2C5_BASE) );
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_BURST_RECEIVE_CONT);
SysCtlDelay(10000);
while(I2CMasterBusy(I2C5_BASE));
temp4 = (I2CMasterDataGet(I2C5_BASE) );
I2CMasterControl(I2C5_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
SysCtlDelay(10000);
while(I2CMasterBusy(I2C5_BASE));
temp5 = (I2CMasterDataGet(I2C5_BASE));
temp = (temp2 << 24) | (temp3 << 16) | (temp4 << 8) | temp5;
return( temp );
}
int main {
uint16_t eeprom_read_array[33000],i,j;
Write_Eeprom_Word(6, 0x9C3A);
SysCtlDelay(100000);
Write_Eeprom_Word(8, 0x409B);
SysCtlDelay(100000);
Write_Eeprom_Word(10, 0x23FD);
SysCtlDelay(100000);
Write_Eeprom_Word(12, 0x3344);
SysCtlDelay(100000);
Write_Eeprom_Double_Word(30, 0x103080B0);
SysCtlDelay(100000);
for(i=0,j=6;i<4;i++,j+=2)
eeprom_read_array[i] = Read_Eeprom_Word(j);
I see as output FFFF9C3A, 409B, 23FD, 3344. As I mentioned before I see some 0xFFFF datas before first byte and that happens sometimes. Sometimes I read it correctly.
uint32_t temp_value_int32;
temp_value_int32 = Read_Eeprom_Double_Word(30);
I see : 41B03080
Expected : 103080B0
I think I miss something about bitwising.
}