I2C on LPC2103

Status
Not open for further replies.

AtomSoft

Well-Known Member
Need some help heh

This is my code so far. For some reason it doesnt even send a start signal. I must be missing something...

I2C Code:
Code:
unsigned char I2C_RECV(unsigned char REG)
{
    unsigned char temp;

    I2C0CONSET |= 0x20;        //Send Start Signal
    while(I2C0STAT != 8);     //A START condition has been transmitted
    I2C0DAT=ACCW;                   //Set I2C0DAT with SLA + W bit
    I2C0CONCLR=0x28;             //START flag Clear & I2C interrupt Clear
    while(I2C0STAT != 24);   //SLA+W has been transmitted; ACK has been received.
    I2C0DAT=REG;                      //Set I2C0DAT with REG Byte
    I2C0CONCLR=0x8;               //I2C interrupt Clear
    while(I2C0STAT != 40);   //Data byte in I2C0DAT has been transmitted; ACK has been received.
    I2C0CONSET = 0x20;              //Send Start Signal AGAIN
    while(I2C0STAT != 0x10);     //A Repeated START condition has been transmitted
    I2C0DAT=ACCR;                         //Set I2C0DAT with SLA + R bit
    I2C0CONCLR=0x28;                  //START flag Clear & I2C interrupt Clear
    while(I2C0STAT != 0x40);    //SLA+R has been transmitted; ACK has been received.
    while(I2C0STAT != 0x58);    //Data byte has been received; NOT ACK has been returned.
    temp = I2C0DAT;                        //temp holds data
    I2C0CONSET=0x10;                  //Send a Stop Signal
    I2C0CONCLR=0x8;                   //I2C interrupt Clear

    return temp;
}
void I2C_SEND(unsigned char REG,unsigned char DATA)
{
    I2C0CONSET |= 0x20;        //Send Start Signal
    while(I2C0STAT != 8);       //A START condition has been transmitted
    I2C0DAT=ACCW;                   //Set I2C0DAT with SLA + W bit
    I2C0CONCLR=0x28;             //START flag Clear & I2C interrupt Clear
    while(I2C0STAT != 24);   //SLA+W has been transmitted; ACK has been received.
    I2C0DAT=REG;                      //Set I2C0DAT with REG Byte
    I2C0CONCLR=0x8;               //I2C interrupt Clear
    while(I2C0STAT != 40);   //Data byte in I2C0DAT has been transmitted; ACK has been received.
    I2C0DAT=DATA;                      //Set I2C0DAT with Data Byte
    I2C0CONCLR=0x8;               //I2C interrupt Clear
    while(I2C0STAT != 40);   //Data byte in I2C0DAT has been transmitted; ACK has been received.
    I2C0CONSET=0x10;              //Send a Stop Signal
    I2C0CONCLR=0x8;               //I2C interrupt Clear
}
void InitI2C(void)
{
    PINSEL0 |= 0x50;    //Pins 2,3 are I2C0 Pins SCL,SDA
    IO0DIR &=~(1<<4);   //Pin P0.4 aka Interrupt Pin is input (defined as ACCINT)

   I2C0SCLH = 65;    // 50Mhz / 130 = 384,615 Hz  MAX from MMA7660FC = 400khz
   I2C0SCLL = 65;
   I2C0CONSET = 0x40;    //Enable I2C
   I2C0CONSET = 0x64; 
   I2C0CONCLR = 0x08;    //Clear Interrupt Flag
   I2C0CONCLR = 0x20;    //Clear Interrupt Flag
}

Main Code:
Code:
#define ACCW 0x98
#define ACCR 0x99
#define ACCINT ((IO0PIN >> 4) & 0x01)
//......
int main(void)
{
    int MyRes = 0;
    ctl_global_interrupts_disable();

    PINSEL0 = 0x00000000;    //All GPIO
    PINSEL1 = 0x00000000;    //All GPIO
    IO0DIR = 0xFFFFFFFF;         //All Output
    IO0CLR = 0xFFFFFFFF;        //All Low
    IO0DIR &= ~(MySw);          //Button is input
    InitTimer1();
    debug_printf("Timer 1 Init Complete\n\r");
    InitUart0();
    debug_printf("UART Init Complete\n\r");
    InitI2C();
    debug_printf("I2C Init Complete\n\r");
    
    I2C_SEND(0x06,0x10);    //There is an automatic interrupt after every measurement
    while(1) {
        MyRes = 0;
        if(ACCINT > 0)
            MyRes = I2C_RECV(0x00);
        debug_printf("MyRes = %i\n\r",MyRes);
    }
  return 0;
}
 
Status
Not open for further replies.
Cookies are required to use this site. You must accept them to continue using the site. Learn more…