Tool/software: TI C/C++ Compiler
Hi, I am wrting code for I2C interface.
The following is my code for I2C write and read
void I2C_setup(I2C_Handle i2cHandle)
{
i2cHandle->I2CSAR = 0x0050; // Slave address for EEPROM control code
i2cHandle->I2CPSC.all = 7; // Prescaler - need 7~12 MHz on module clock
i2cHandle->I2CCLKL = 20; // Note : must be non zero
i2cHandle->I2CCLKH = 10; // Note : must be non zero
i2cHandle->I2CFFTX.all = 0x6040; // Enable FIFO mode and TXFIFO
i2cHandle->I2CFFRX.all = 0x2040; // Enable RXFIFO, clear RXFFINT
i2cHandle->I2CMDR.all = 0x0020; // Take I2C out of reset
}
void I2C_Write(uint16_t sAddr, uint16_t addr, uint16_t data)
{
HAL_Obj* obj = (HAL_Obj*)halHandle;
uint16_t msbAddr;
uint16_t address;
char slave_addr;
slave_addr = (sAddr >> 1) & 0x7F;
msbAddr = (0x0300 & addr) >> 8;
address = addr & 0x00FF;
slave_addr = slave_addr | msbAddr;
obj->i2cHandle->I2CSAR = slave_addr;
obj->i2cHandle->I2CCNT = 2;
obj->i2cHandle->I2CDXR = address & 0x00FF;
obj->i2cHandle->I2CDXR = data & 0x00FF;
obj->i2cHandle->I2CMDR.all = 0x2E20;
while(!obj->i2cHandle->I2CSTR.bit.SCD)
;
obj->i2cHandle->I2CSTR.bit.SCD = 1;
}
uint16_t I2C_Read(uint16_t sAddr, uint16_t addr)
{
HAL_Obj* obj = (HAL_Obj*)halHandle;
uint16_t rdata;
uint16_t msbAddr;
uint16_t address;
char slave_addr;
slave_addr = (sAddr >> 1) & 0x7F;
msbAddr = (0x0300 & addr) >> 8;
address = addr & 0x00FF;
slave_addr = slave_addr | msbAddr;
while(obj->i2cHandle->I2CSTR.bit.BB)
;
while(obj->i2cHandle->I2CMDR.bit.STP)
;
obj->i2cHandle->I2CSAR = slave_addr;
obj->i2cHandle->I2CCNT = 1;
obj->i2cHandle->I2CDXR = address & 0x00FF;
obj->i2cHandle->I2CMDR.all = 0x2620;
while(!obj->i2cHandle->I2CSTR.bit.ARDY)
;
obj->i2cHandle->I2CCNT = 1;
obj->i2cHandle->I2CMDR.all = 0x2C20;
while(!obj->i2cHandle->I2CSTR.bit.SCD)
;
rdata = obj->i2cHandle->I2CDRR;
return (rdata & 0x00FF);
}
And the follwoing is code to for access to EEPROM.
I2C_Write(I2C_EEPROM_ADDR, 0, 0x34);
usDelay(50000);
data = I2C_Read(I2C_EEPROM_ADDR, 0);
UARTprintf("data = %d\n", data);
This code worked fine. But without delay, The code get stuck in read, waiting for SCD to be 1.
At that time I2CSTR is 0x1406.
I need your help.
Thanks in advance.
