Hi,
to all,
I am trying to interface with EEPROM on TMS320F28335 without interrupt,
I think i am able to write EEPROM as i get XRDY clear while Writting to the data and uo to end of data transmission
but while Read EEPROM RRDY bit of status Register is not getting clear. my EEPROM is having only 1 byte address.
up to Adress field for read I am able to complete for read.
Here is my code can anyone help me???
void I2CA_Init(void)
{
// Initialize I2C
I2caRegs.I2CSAR = 0x0050; // Slave address - EEPROM control code
#if (CPU_FRQ_150MHZ) // Default - For 150MHz SYSCLKOUT
I2caRegs.I2CPSC.all = 14; // Prescaler - need 7-12 Mhz on module clk (150/15 = 10MHz)
#endif
#if (CPU_FRQ_100MHZ) // For 100 MHz SYSCLKOUT
I2caRegs.I2CPSC.all = 9; // Prescaler - need 7-12 Mhz on module clk (100/10 = 10MHz)
#endif
I2caRegs.I2CCLKL = 10; // NOTE: must be non zero
I2caRegs.I2CCLKH = 5; // NOTE: must be non zero
//I2caRegs.I2CIER.all = 0x24; // Enable SCD & ARDY interrupts
I2caRegs.I2CIER.all = 0; // Disable SCD & ARDY interrupts
I2caRegs.I2CMDR.all = 0x0C20; // Take I2C out of reset
// Stop I2C when suspended
I2caRegs.I2CFFTX.bit.I2CFFEN = 0;// Disable FIFO mode
// I2caRegs.I2CFFTX.all = 0x6000; // Enable FIFO mode and TXFIFO
// I2caRegs.I2CFFRX.all = 0x2040; // Enable RXFIFO, clear RXFFINT,
return;
Uint16 I2CA_WriteData(Uint16 tx_adress, Uint16 *tx_data, Uint16 NumOfBytes)
{
char i;
while(I2caRegs.I2CSTR.bit.BB != 0) ;
// I2caRegs.I2CMDR.all = 0;
I2caRegs.I2CSAR = I2C_SLAVE_ADDR;
I2caRegs.I2CCNT = NumOfBytes+1;
I2caRegs.I2CMDR.bit.TRX = 1;
I2caRegs.I2CMDR.bit.STT = 1;
// I2caRegs.I2CMDR.all = 0x6E20;
if(I2caRegs.I2CSTR.bit.XRDY | I2caRegs.I2CSTR.bit.ARDY)
{
I2caRegs.I2CDXR = tx_adress;
for (i=0; i<NumOfBytes; i++)
{
if(I2caRegs.I2CSTR.bit.NACK)
{
return 3;
}
if(I2caRegs.I2CSTR.bit.XRDY | I2caRegs.I2CSTR.bit.ARDY)
{
I2caRegs.I2CDXR = *tx_data;
tx_data++;
}
else
return 2;
}
}
else
return 1;
I2caRegs.I2CMDR.bit.STP = 1;
return 0;
}
Uint16 I2CA_ReadData(Uint16 rx_adress, Uint16 *rx_data, Uint16 NumOfBytes)
{
char i;
while(I2caRegs.I2CSTR.bit.BB != 0) ;
// I2caRegs.I2CMDR.all = 0;
I2caRegs.I2CSAR = I2C_SLAVE_ADDR;
I2caRegs.I2CCNT = 1;
// I2caRegs.I2CMDR.all = 0x6E20;
// I2caRegs.I2CMDR.all = 0x2620;
I2caRegs.I2CMDR.bit.TRX = 1;
// I2caRegs.I2CMDR.bit.IRS = 1;
I2caRegs.I2CMDR.bit.STT = 1;
//while(I2caRegs.I2CSTR.bit.BB != 0) ;
if(I2caRegs.I2CSTR.bit.XRDY | I2caRegs.I2CSTR.bit.ARDY)
{
I2caRegs.I2CDXR = rx_adress;
if(I2caRegs.I2CSTR.bit.XRDY | I2caRegs.I2CSTR.bit.ARDY)
{
// I2caRegs.I2CMDR.all = 0;
I2caRegs.I2CSAR = I2C_SLAVE_ADDR;
I2caRegs.I2CCNT = NumOfBytes;
I2caRegs.I2CMDR.bit.STP = 1;
I2caRegs.I2CMDR.bit.TRX = 0;
//while(I2caRegs.I2CSTR.bit.BB != 0) ;
I2caRegs.I2CMDR.bit.IRS = 1;
// I2caRegs.I2CMDR.bit.STT = 1;
// I2caRegs.I2CMDR.all = 0x2C20; // Send restart as master receiver
for (i=0; i<NumOfBytes; i++)
{
if(I2caRegs.I2CSTR.bit.RRDY | I2caRegs.I2CSTR.bit.ARDY)
{
*rx_data = I2caRegs.I2CDRR;
rx_data++;
}
else
return 4;
}
}
else
return 2;
}
else
return 1;
return 0;
}Regards,