Please note: We are aware of an issue affecting replies on the Arm Community forums, which may not be loading as expected.
We apologize for any inconvenience and appreciate your patience while we investigate and work to resolve the issue.
Thank you for your understanding.
Hey guys, I can't seem to get I2C working with LPC2148. The problem arise when I transfer data. Slave device (I2C debugger in Proteus) doesn't respond. Neither ACK nor NACK. It just get paused. Although when I Write Slave address, Ack is given by Slave. PCLK is 60MHz.
#define I2EN (1<<6) //Enable/Disable bit #define STA (1<<5) //Start Set/Clear bit #define STO (1<<4) //Stop bit #define SI (1<<3) //Serial Interrupt Flag Clear bit #define AA (1<<2) //Assert Acknowledge Set/Clear bit void I2C0_Init (void) // initialise i2c { I2C0CONCLR = STA|STO|AA|SI; // clear start, stop, aa and interrupt bit I2C0CONSET = I2EN; // set enable bit } bool I2C0_WaitForSI (void) //wait for si flag to set { int timeout = 0; while (!(I2C0CONSET&SI)) // while si bit in conset is not set { timeout++; if (timeout>1000) return false; } return true; } void I2C0_SendStart (void) //send start or r-start { I2C0CONCLR = STA|STO|SI|AA; //clear start, stop, aa, interrupt bit I2C0CONSET = STA; // enable start bit I2C0_WaitForSI(); //wait for above condition to complete } void I2C0_SendStop (void) { I2C0CONSET = STO; //set stop bit } void I2C0_Tx (unsigned char data) { I2C0DAT = data; //load data into register I2C0CONCLR = STA|SI|STO; // clear start,interrupt and stop to transfer data I2C0_WaitForSI (); //wait for above condition to complete } //unsigned char I2C0_Rx (bool last) //{ // if (last) I2C0CONCLR = AA; //is last address, than clear aa to send nack. // else I2C0CONSET = AA; //otherwise send ack to keep receiving data. // I2C0CONCLR = SI; //clear si to receive data. // I2C0_WaitForSI (); //wait for data to be received. // return I2C0DAT; //} int main () { PINSEL0 |= (1<<4)|(1<<6)|(0<<5)|(0<<7); //set i2c scl and sda PINSEL2 = PINSEL1= 0; VPBDIV=0x01; //pclk is 60Mhz I2C0SCLH=300; // 100 khz rate I2C0SCLL=300; IODIR1 = 0xffffffff; unsigned char slave_address = 0xA0; unsigned char data = '1'; I2C0_Init (); I2C0_SendStart(); I2C0_Tx (slave_address); I2C0_SendStop(); I2C0_SendStart (); I2C0_Tx (slave_address); I2C0_Tx (data); I2C0_SendStop(); }
Does a real I2C device respond?
The LPC2148 is an NXP device; NXP own & invented I2C - surely they must have working examples?
http://www.lpcware.com
www.nxp.com/.../single-chip-16-bit-32-bit-microcontrollers-512-kb-flash-with-32-segment-x-4-lcd-driver:LPC2157FBD100?fsrch=1&sr=1&pageNum=1
Actually I don't have a real I2C. That's why I am using I2C debugger in simulator. I'll try using my PIC microcontroller as slave and revert back.