Continue to Site

Welcome to our site!

Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

  • Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

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.

Latest threads

New Articles From Microcontroller Tips

Back
Top