Tag Archives: embedded projects

ARM7 to ARM7 (LPC2148) communication using I2C

1 Apr

     Board to board communication using I2C protocol, is simple once you’ve done any other program using this protocol with arm7. Since I have interfaced arm7 with eeprom. The same code used to send data to the eeprom is been used,except for the change in slave address,in this case it’s (0x00);

SEND

Master transmit mode

#include<lpc214x.h>
#include<stdio.h>
#include”appdef.h”
#include”armlcd.h”
#define led_port BIT0+BIT1+BIT8+BIT9+BIT25+BIT15+BIT12+BIT28
int c=1;
int r=0;
static int i=0;
unsigned char buf[12]=”YES YAMAHA”;
__irq void led(void)
{
     IOSET0=led_port;
     switch(I2C0STAT)
     {
         case 0x08 : lcd(‘s’); //start
                             I2C0CONCLR=BIT3+BIT5;

                             I2C0DAT=0x00;  //slave address of the other board

                             break;
          case 0x18 : lcd(‘a’);
                             I2C0CONCLR=BIT3;
                             break;
         case 0x28 : lcd(‘k’);
                            I2C0CONCLR=BIT3;
                            switch(c)
                            {
                               case 1 : I2C0DAT=buf[i];
                                             i++;
                                            if(i==10)
                                            {
                                                c++;
                                             }
                                             break;
                              case 2: I2C0CONSET=BIT4;
                                           lcd(‘p’);
                                           break;
                            }
                              break;
       case 0x30 : lcd(‘n’);
                          I2C0CONCLR=BIT3+BIT5;
                          break;
       default:      lcd(‘f’);
                         break;
}

VICVectAddr=0x00;
}

int main()
{

rs_clr();
en_clr();
lcd_init();
rs_set();
en_clr();
lcd(‘i’);
PINSEL0=BIT4+BIT6;

VICVectCntl0=0x29;
VICVectAddr0=(unsigned) led;
VICIntEnable=BIT9;

I2C0CONSET=BIT6;
I2C0CONCLR=BIT3+BIT2+BIT4;
I2C0SCLH=0x4B;
I2C0SCLL=0x4B;

I2C0CONSET|=BIT5;
while(1);

}
void lcd_init()
{
unsigned int i;
PINSEL0 = 0x00000000;

lcd_dir_write(); // output port
for (i=0;i<1000;i++);
lcd(0x33);
lcd(0x32);
lcd(0x28);
lcd(0x0e);
lcd(0x01);
lcd(0x06);
lcd(0x80);

for (i=0;i<1000000;i++);
}

void lcd(unsigned char val)
{
lcd1(val>>4);
lcd1(val);
}

void lcd1(unsigned char c)
{
unsigned int i;
IOCLR0 = 0x00f00000;
IOSET0 = (c<<20); // d4 connected to 20th port pin
en_set();
for (i=0;i<1000000;i++);
en_clr();
}

RECEIVE

Slight changes at the code at the slave side.You have to choose the arm controller to be in slave mode.

Slave receiver mode.

I2C0ADR=0X01; // general call address.Only when you set bit0 of this register can the master board send address as 0x00 to the slave board.

Enable bit & AA bit of the I2CCONSET register has to set to 1 during initialization. 

Remember no start bit required.

status codes are 0x70,0x90. go through the user manual

#include<lpc214x.h>
#include<stdio.h>
#include”appdef.h”
#include”armlcd.h”
#define led_port BIT0+BIT1+BIT8+BIT9+BIT25+BIT15+BIT12+BIT28
int c=0;
int r=0,dw=1,ss=0,rs=0,j;
char ch;
__irq void led(void)
{
        switch(I2C0STAT)
       {
           case 0x70 : lcd(‘g’);  
                              I2C0CONSET|=BIT2;  //AA bit set
                              I2C0CONCLR=BIT3;
                              break;
           case 0x90 :ch=I2C0DAT;  //data received and stored safely
                             I2C0CONCLR=BIT3;
                             lcd(ch);
                             break;
           case 0xa0 :lcd(‘p’);
                             I2C0CONCLR=BIT3;
                             break;
           default:lcd(‘f’);
                       I2C0CONCLR=BIT3;
                       break;
}

VICVectAddr=0x00;
}

int main()
{

rs_clr();
en_clr();
lcd_init();
rs_set();
en_clr();
PINSEL0=BIT4+BIT6;
VICVectCntl0=0x29;
VICVectAddr0=(unsigned) led;
VICIntEnable=BIT9;

I2C0ADR=0X01;  // general call addr
I2C0CONSET=BIT6+BIT2; // SLAVE MODE
I2C0CONCLR=BIT3;
I2C0SCLH=0x4B;
I2C0SCLL=0x4B;

lcd(‘v’);
while(1);
}
void lcd_init()
{
unsigned int i;
PINSEL0 = 0x00000000;

lcd_dir_write(); // output port
for (i=0;i<1000;i++);
lcd(0x33);
lcd(0x32);
lcd(0x28);
lcd(0x0e);
lcd(0x01);
lcd(0x06);
lcd(0x80);

for (i=0;i<1000000;i++);
}

void lcd(unsigned char val)
{
lcd1(val>>4);
lcd1(val);
}

void lcd1(unsigned char c)
{
unsigned int i;
IOCLR0 = 0x00f00000;
IOSET0 = (c<<20); // d4 connected to 20th port pin
en_set();
for (i=0;i<1000000;i++);
en_clr();
}