I am trying to interface I2C EEPROM (AT24C512) with nrf52840 and I am directly writing to and reading from the registers mentioned in the datasheet. I am seeing the i2c waveforms on DSO and I think I am getting the start pulse correctly but not the further address and ACK and data. I tried to run and debug the code to check the data written and read but I am not getting the correct data.
Also I think I have not really written the ACK or NACK conditions correctly . ERRORSRC This is the register I am checking for ACK.
I have attached the code. Please can anyone help me figure out what is going wrong. Because I really need to make it work ASAP.
Thank You
#define EEPROM_SIZE 0xFFFF
#define EEPROM_DEVADDR 0xA0
#define EEReadAddress 0xA1
#define EEWriteAddress 0x00
#define TWI_SCL 27
#define TWI_SDA 26
uint8_t *MAIN_u8buffer1 ;
//uint8_t MAIN_u8temp12[2][2]={0,1,2,3};
uint8_t MAIN_u8temp12[2] ;
uint8_t MAIN_u8buffer2[20] ;
uint8_t MAIN_u8temp = 0;
/*
Initialize I2C (TWI) interface
*/
void I2CInit()
{
/* NRF_GPIO->PIN_CNF[TWI_SCL] = 0x0000000F ; //configure pins with pullup
NRF_GPIO->PIN_CNF[TWI_SDA] = 0x0000000F ;*/
NRF_TWI0->SHORTS = 0 ; //disable all shortcuts
NRF_TWI0->INTENSET = 0 ; //disable all twi interrupts
NRF_TWI0->FREQUENCY = NRF_DRV_TWI_FREQ_100K ;
NRF_TWI0->PSEL.SCL = TWI_SCL ;
NRF_TWI0->PSEL.SDA = TWI_SDA ;
// NRF_TWI0->ADDRESS = EEPROM_DEVADDR ; //I2C EEPROM Address AT24C512
NRF_TWI0->ENABLE = 5 ; //For enabling TWI we need to write 5 to the enable register according to datasheet
}
/*
Writes data to EEPROM.
Return: True on successful write and
False on time out or any error with device
*/
unsigned char I2C_WriteToEEPROM (unsigned int u32startAddr, unsigned char *u8data, unsigned int u32len)
{
unsigned int u32i,u32j;
//1. Check for upper limit
if (u32startAddr + u32len > EEPROM_SIZE)
return false;
//2.Generate Start
NRF_TWI0->TASKS_STARTTX = 1 ;
//3.Transmit Device Address+Write
NRF_TWI0->ADDRESS = EEWriteAddress ;
//4.Wait for ACK
while(!((NRF_TWI0->ERRORSRC & 0x00000002) == 0x00000000)) //ANACK Address NACK is 0 that is Address ACK is received
{
//wait till bit B in ERRORSRC register is not 0
}
//5.First Word Address (u32startAddr & 0x000000FF)(MSB)
NRF_TWI0->ADDRESS = (u32startAddr & 0x000000FF);
//6.Wait for ACK
while(!((NRF_TWI0->ERRORSRC & 0x00000002) == 0x00000000)) //ANACK Address NACK is 0 that is Data ACK is received
{
//wait till bit B in ERRORSRC register is not 0
}
//7.Second Word Address (((u32startAddr & 0x0000FF00)>>8) &0xFF)(LSB)
//8.Wait for ACK
//9.Data
NRF_TWI0->TXD = ((u8data[u32i])&0x000000FF);
u32startAddr++;
//10.Wait for ACK
while(!((NRF_TWI0->ERRORSRC & 0x00000004) == 0x00000000)) //DNACK Address NACK is 0 that is Data ACK is received
{
//wait till bit B in ERRORSRC register is not 0
}
//11.Generate Stop
NRF_TWI0->TASKS_STOP = 1 ;
return true ;
}
/*
Reads data from EEPROM.
Return: True on valid data and
False on time out or any error with device
*/
unsigned char I2C_ReadFromEEPROM (unsigned int u32startAddr, unsigned char *u8data, unsigned int u32len)
{
unsigned int u32i;
//1.Dummy Write. Reapeat the write routine
for(u32i=0;u32i<u32len;u32i++)
{
//1. Check for upper limit
if (u32startAddr + u32len > EEPROM_SIZE)
return false;
//2.Generate Start
NRF_TWI0->TASKS_STARTTX = 1 ;
//3.Transmit Device Address+Write
NRF_TWI0->ADDRESS = EEWriteAddress ;
//4.Wait for ACK
while(!((NRF_TWI0->ERRORSRC & 0x00000002) == 0x00000000)) //ANACK Address NACK is 0 that is Address ACK is received
{
//wait till bit B in ERRORSRC register is not 0
}
//5.First Word Address (u32startAddr & 0x000000FF)(MSB)
NRF_TWI0->ADDRESS = (u32startAddr & 0x000000FF);
//6.Wait for ACK
while(!((NRF_TWI0->ERRORSRC & 0x00000002) == 0x00000000)) //ANACK Address NACK is 0 that is Data ACK is received
{
//wait till bit B in ERRORSRC register is not 0
}
//7.Second Word Address (((u32startAddr & 0x0000FF00)>>8) &0xFF)(LSB)
//8.Wait for ACK
// Read data - Sequential mode.
//1.Generate Start
NRF_TWI0->TASKS_STARTRX = 1 ;
//2.Transmit Device Address+Read
NRF_TWI0->ADDRESS = EEReadAddress ;
//3.Wait for ACK
while(!((NRF_TWI0->ERRORSRC & 0x00000002) == 0x00000000)) //ANACK Address NACK is 0 that is Address ACK is received
{
//wait till bit B in ERRORSRC register is not 0
}
//4.Read Data
/* while(!(NRF_TWI0->EVENTS_RXDREADY))
{
//Wait till received data is ready
}*/
u8data[u32i] = (unsigned char)(NRF_TWI0->RXD) ;
u32startAddr++;
//5.Transmit STOP
NRF_TWI0->TASKS_STOP = 1 ;
}
return true ;
}
I2CInit() ;
//for(uint8_t i = 0 ; i < 10 ; i++) ;
MAIN_u8buffer1 = 0 ;
MAIN_u8temp12[0] = 'a' ;
// MAIN_u8temp=MAIN_u8temp12[0];
MAIN_u8buffer1 = /*(uint8_t*)*/MAIN_u8temp12[0];
while (true)
{
if (I2C_WriteToEEPROM(0, MAIN_u8buffer1, 1) == true) ;
if (I2C_ReadFromEEPROM(0, MAIN_u8buffer2 , 1) == true) ;
}
}