Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

[Moved] Need I2C code for LPC2148

Status
Not open for further replies.

Surender Reddy

Full Member level 2
Joined
Jan 28, 2012
Messages
129
Helped
7
Reputation
14
Reaction score
7
Trophy points
1,298
Location
Bangalore, India
Activity points
2,186
I have some knowledge of I2C for atmega series for 8-bit.
I am new to arm controller. I want to interface PCF8563 rtc with Lpc2148 controller. I have read the datasheet, when started writing the code i got stuck. I am using Keil uVision 4 software.
Does anyone have I2C and SPI codes for Lpc2148? please post here, it will be helpful to me..........
 

Re: Need I2C code for LPC2148

I don't have it.
 

Re: Need I2C code for LPC2148

try this code,

i tried with lpc2129 and with DS1307(RTC)
Code:
/*
PORT 0.3-SDA LINE

PORT 0.2-SCL LINE

LCD DISPLAY
PORT 1.16-1.23 - DATA LINES

PORT 0.4- RS PIN 
PORT 0.5- RW PIN
PORT 0.6- EN PIN




*/



#include<lpc21xx.h>

unsigned int val,n;
unsigned char a[8]={0};


void lcdready(void)
 	{  	
			IODIR1=0X007F0000;								/* MAKE D7 AS A INPUT PIN & D0-D6 AS OUTPUT PINS  */
	   	 	IOSET1=0x00800000;								/*MAKE D7=1*/
	   		IOCLR0=0x00000010;	 							/* RS(P0.4)=0  */
			IOSET0=0x00000020;								/* R/W(P0.5)=1  */
	   	   while((IOPIN1&0x00800000)== 0x00800000)			/* IF D7 IS HIGH STAY HERE  */
		   {		   
			   IOCLR0=0x00000040;		  				/* EN(P0.6)=0  */
			   IOSET0=0x00000040;			 	 		/* EN(P0.6)=1  */	   
		   }
	 }

void lcdcommand(void)
 		{
 			 lcdready();
			 IODIR1=0X00FF0000;				/* P1.16..23 defined as Outputs  */	 
			 IOPIN1 = n; 
			 IOCLR0=0x00000010;	   			/* RS(P0.4)=0  */
			 IOCLR0=0x00000020;				/* R/W(P0.5)=0  */
			 IOSET0=0x00000040;				/* EN(P0.6)=1  */
			 IOCLR0=0x00000040;				/* EN(P0.30)=0  */			 
		 }

void lcddatawrt(void)
		{
			lcdready();	
			IODIR1=0X00FF0000;				/* P1.16..23 defined as Outputs  */	  
			IOPIN1 = n;
			IOSET0=0x00000010;				/* RS(P0.4)=1  */
			IOCLR0=0x00000020;				/* R/W(P0.5)=0  */
			IOSET0=0x00000040;				/* EN(P0.6)=1  */
			IOCLR0=0x00000040;				/* EN(P0.6)=0  */
		 }	
void lcd_initialization(void)
		{
		//PINSEL1=0x00000000;				/*MAKE 0.28,0.29,0.30 AS I/O*/
		//PINSEL2=0x00000000;				   /*MAKE 1.16...1.23 AS I/O*/
	   	n=0x00380000;
		lcdcommand();
		n=0x000c0000;
		lcdcommand();
		n=0x00060000;
		lcdcommand();
		n=0x00010000;
		lcdcommand(); 
			   	   
		  }

void year()
{
	unsigned char s;
	
	n=0x00c60000;
	lcdcommand(); 

	s=a[6]>>4 ;
	s=s+0x30;	
	val=s;
	n=val<<16;
	lcddatawrt();

	s=a[6] & 0x0f;
	s=s+0x30;
	val=s;
	n=val<<16;
	lcddatawrt();

	s=' ';
	val=s;
	n=val<<16;
	lcddatawrt();
	

}

void month()
{
	unsigned char s;
	
	n=0x00c30000;
	lcdcommand(); 

	s=a[5]>>4 ;
	s=s+0x30;	
	val=s;
	n=val<<16;
	lcddatawrt();

	s=a[5] & 0x0f;
	s=s+0x30;
	val=s;
	n=val<<16;
	lcddatawrt();

	s='-';
	val=s;
	n=val<<16;
	lcddatawrt();
	

}

void date()
{
	unsigned char s;
	
	n=0x00c00000;
	lcdcommand(); 

	s=a[4]>>4 ;
	s=s+0x30;	
	val=s;
	n=val<<16;
	lcddatawrt();

	s=a[4] & 0x0f;
	s=s+0x30;
	val=s;
	n=val<<16;
	lcddatawrt();

	s='-';
	val=s;
	n=val<<16;
	lcddatawrt();
	

}

void hour()
{
	unsigned char s;
	
	n=0x00800000;
	lcdcommand(); 
	
	s=a[2]>>4 ;
	s=s+0x30;	
	val=s;
	n=val<<16;
	lcddatawrt();

	s=a[2] & 0x0f;
	s=s+0x30;
	val=s;
	n=val<<16;
	lcddatawrt();

	s=':';
	val=s;
	n=val<<16;
	lcddatawrt();


		

}

void min()
{
	unsigned char s;
	
	n=0x00830000;
	lcdcommand(); 
	
	s=a[1]>>4 ;
	s=s+0x30;	
	val=s;
	n=val<<16;
	lcddatawrt();

	s=a[1] & 0x0f;
	s=s+0x30;
	val=s;
	n=val<<16;
	lcddatawrt();

	s=':';
	val=s;
	n=val<<16;
	lcddatawrt();
	

}

void sec()
{
	unsigned char s;
	
	n=0x00860000;
	lcdcommand();

	s=a[0]>>4 ;
	s=s+0x30;	
	val=s;
	n=val<<16;
	lcddatawrt();

	s=a[0] & 0x0f;
	s=s+0x30;
	val=s;
	n=val<<16;
	lcddatawrt();

		

}

void day()
{
	unsigned char s;
	
	n=0x00890000;
	lcdcommand();

	/*s=a[]>>4 ;
	s=s+0x30;	
	val=s;
	n=val<<16;
	lcddatawrt();
	*/
	s=a[3] & 0x0f;
	s=s+0x30;
	val=s;
	n=val<<16;
	lcddatawrt();

		

}


 void main()
{
unsigned char i,j=0;

	PINSEL0= 0X00000050;
	PINSEL1= 0x00000000;				/*MAKE 0.28,0.29,0.30 AS I/O*/
	IODIR1 = 0x00FF0000;                     /* P1.16..23 defined as Outputs  */
  	IODIR0 = 0x000000f0;
	
	lcd_initialization();			//INITIALIZATION OF LCD 
		 

	
	I2SCLL=0X4B;				//TO SET BUAD RATE OF I2C
	I2SCLH=0X4B;				//TO SET BUAD RATE OF I2C
	I2CONSET=0X40;				//TO ENABLE I2C

	while(1)
	{

		I2CONSET=0X20;							// TO SEND START CONDITION
		while(I2STAT!=0X08 || I2CONSET!=0X68);
		I2CONCLR=0X20;


		I2DAT=0XD0;								//SLAVE ADDRESS + WR
		I2CONCLR=0X08;
		while(I2STAT!=0X18 && I2CONSET!=0X48);

		/*
		if(I2STAT!=0X18)						//IF NO ACK FROM SLAVE
		{
			
			I2DAT=0X00;
			I2CONCLR=0X08;
			while(I2STAT!=0X28 && I2CONSET!=0X48);
			I2CONCLR=0X08;

			I2CONSET=0X10;
			//I2CONCLR=0X08;
			while((I2CONSET&0x08)!=0X08);
			//I2CONCLR=0X20;
			while((I2CONSET&0x08)!=0X08);
			n=0x00010000;
			lcdcommand(); 
			n=0x00300000;
			lcddatawrt();
			while(1);
		}
		else;
	//	 */
		
		
		I2DAT=0X00;										 // DATA WRITE TO SALVE
		I2CONCLR=0X08;
		while(I2STAT!=0X28 && I2CONSET!=0X48);
		
		

		/*
		if(j==0)
		{	

		I2DAT=0X00;										 // DATA WRITE TO SALVE
		I2CONCLR=0X08;
		while(I2STAT!=0X28 && I2CONSET!=0X48);

		I2DAT=0X15;										 // DATA WRITE TO SALVE
		I2CONCLR=0X08;
		while(I2STAT!=0X28 && I2CONSET!=0X48);

		I2DAT=0X18;										 // DATA WRITE TO SALVE
		I2CONCLR=0X08;
		while(I2STAT!=0X28 && I2CONSET!=0X48);

		I2DAT=0X00;										// DATA WRITE TO SALVE
		I2CONCLR=0X08;
		while(I2STAT!=0X28 && I2CONSET!=0X48);

		I2DAT=0X07;										// DATA WRITE TO SALVE
		I2CONCLR=0X08;
		while(I2STAT!=0X28 && I2CONSET!=0X48);

		I2DAT=0X11;										// DATA WRITE TO SALVE
		I2CONCLR=0X08;
		while(I2STAT!=0X28 && I2CONSET!=0X48);

		I2DAT=0X12;										// DATA WRITE TO SALVE
		I2CONCLR=0X08;
		while(I2STAT!=0X28 && I2CONSET!=0X48);

		I2DAT=0X10;										// DATA WRITE TO SALVE
		I2CONCLR=0X08;
		while(I2STAT!=0X28 && I2CONSET!=0X48);

		
		j++;
		}
		else;
		
		*/


		I2CONSET=0X20;									//REPEATED START
		I2CONCLR=0X08;
		while(I2STAT!=0X10 || I2CONSET!=0X68);
		I2CONCLR=0X20;

		

		I2DAT=0XD1;										//SLAVE ADDRESS + READ
		I2CONCLR=0X08;
		while(I2STAT!=0X40 && I2CONSET!=0X48);

		/*
		if(I2STAT!=0X40)								//IF NOT ACK FROM SLAVE
		{
			
			I2DAT=0X00;
			I2CONCLR=0X08;
			while(I2STAT!=0X28 && I2CONSET!=0X48);
			I2CONCLR=0X08;

			I2CONSET=0X10;
			//I2CONCLR=0X08;
			while((I2CONSET&0x08)!=0X08);
			//I2CONCLR=0X20;
			//while((I2CONSET&0x08)!=0X08);
			n=0x00010000;
			lcdcommand(); 
			n=0x00320000;
			lcddatawrt();
			while(1);
		}
		  */


		for(i=0;i<6;i++)					 		//REPEATE FOR 6 TIMES
		{
			I2CONCLR=0X08;							//CLEAR SI
			I2CONSET=0X04;							//TO SEND ACK FROM MASTER TO SLAVE
			while((I2CONSET&0x08)!=0X08);
			a[i]=I2DAT;								//TAKING THE DATA RECEIVED FROM SLAVE
		}


		I2CONCLR=0X0C;								//CLEAR SI AND AA BIT
		while((I2CONSET&0x08)!=0X08);				
		a[i]=I2DAT;									//TAKING THE DATA RECEIVED FROM SLAVE
											 		
		
		I2CONSET=0X10;								//TO SEND STOP SEQUENCE
		I2CONCLR=0X08;
		while((I2CONSET&0x10)==0X10);
		I2CONCLR=0X08;

	
		hour();										//TO DISPLAY HOUR
		min();										//TO DISPLAY MINS 
		sec();										//TO DISPLAY SECONDS
		date();										//TO DISPLAY DATE
		month();									//TO DISPLAY MONTH
		year();										//TO DISPLAY YEAR
		//day();
			
	}

}

hope this helps
 

Re: Need I2C code for LPC2148

try this code,

i tried with lpc2129 and with DS1307(RTC)
Code:
/*
PORT 0.3-SDA LINE

PORT 0.2-SCL LINE

LCD DISPLAY
PORT 1.16-1.23 - DATA LINES

PORT 0.4- RS PIN 
PORT 0.5- RW PIN
PORT 0.6- EN PIN




*/



#include<lpc21xx.h>

unsigned int val,n;
unsigned char a[8]={0};


void lcdready(void)
 	{  	
			IODIR1=0X007F0000;								/* MAKE D7 AS A INPUT PIN & D0-D6 AS OUTPUT PINS  */
	   	 	IOSET1=0x00800000;								/*MAKE D7=1*/
	   		IOCLR0=0x00000010;	 							/* RS(P0.4)=0  */
			IOSET0=0x00000020;								/* R/W(P0.5)=1  */
	   	   while((IOPIN1&0x00800000)== 0x00800000)			/* IF D7 IS HIGH STAY HERE  */
		   {		   
			   IOCLR0=0x00000040;		  				/* EN(P0.6)=0  */
			   IOSET0=0x00000040;			 	 		/* EN(P0.6)=1  */	   
		   }
	 }

void lcdcommand(void)
 		{
 			 lcdready();
			 IODIR1=0X00FF0000;				/* P1.16..23 defined as Outputs  */	 
			 IOPIN1 = n; 
			 IOCLR0=0x00000010;	   			/* RS(P0.4)=0  */
			 IOCLR0=0x00000020;				/* R/W(P0.5)=0  */
			 IOSET0=0x00000040;				/* EN(P0.6)=1  */
			 IOCLR0=0x00000040;				/* EN(P0.30)=0  */			 
		 }

void lcddatawrt(void)
		{
			lcdready();	
			IODIR1=0X00FF0000;				/* P1.16..23 defined as Outputs  */	  
			IOPIN1 = n;
			IOSET0=0x00000010;				/* RS(P0.4)=1  */
			IOCLR0=0x00000020;				/* R/W(P0.5)=0  */
			IOSET0=0x00000040;				/* EN(P0.6)=1  */
			IOCLR0=0x00000040;				/* EN(P0.6)=0  */
		 }	
void lcd_initialization(void)
		{
		//PINSEL1=0x00000000;				/*MAKE 0.28,0.29,0.30 AS I/O*/
		//PINSEL2=0x00000000;				   /*MAKE 1.16...1.23 AS I/O*/
	   	n=0x00380000;
		lcdcommand();
		n=0x000c0000;
		lcdcommand();
		n=0x00060000;
		lcdcommand();
		n=0x00010000;
		lcdcommand(); 
			   	   
		  }

void year()
{
	unsigned char s;
	
	n=0x00c60000;
	lcdcommand(); 

	s=a[6]>>4 ;
	s=s+0x30;	
	val=s;
	n=val<<16;
	lcddatawrt();

	s=a[6] & 0x0f;
	s=s+0x30;
	val=s;
	n=val<<16;
	lcddatawrt();

	s=' ';
	val=s;
	n=val<<16;
	lcddatawrt();
	

}

void month()
{
	unsigned char s;
	
	n=0x00c30000;
	lcdcommand(); 

	s=a[5]>>4 ;
	s=s+0x30;	
	val=s;
	n=val<<16;
	lcddatawrt();

	s=a[5] & 0x0f;
	s=s+0x30;
	val=s;
	n=val<<16;
	lcddatawrt();

	s='-';
	val=s;
	n=val<<16;
	lcddatawrt();
	

}

void date()
{
	unsigned char s;
	
	n=0x00c00000;
	lcdcommand(); 

	s=a[4]>>4 ;
	s=s+0x30;	
	val=s;
	n=val<<16;
	lcddatawrt();

	s=a[4] & 0x0f;
	s=s+0x30;
	val=s;
	n=val<<16;
	lcddatawrt();

	s='-';
	val=s;
	n=val<<16;
	lcddatawrt();
	

}

void hour()
{
	unsigned char s;
	
	n=0x00800000;
	lcdcommand(); 
	
	s=a[2]>>4 ;
	s=s+0x30;	
	val=s;
	n=val<<16;
	lcddatawrt();

	s=a[2] & 0x0f;
	s=s+0x30;
	val=s;
	n=val<<16;
	lcddatawrt();

	s=':';
	val=s;
	n=val<<16;
	lcddatawrt();


		

}

void min()
{
	unsigned char s;
	
	n=0x00830000;
	lcdcommand(); 
	
	s=a[1]>>4 ;
	s=s+0x30;	
	val=s;
	n=val<<16;
	lcddatawrt();

	s=a[1] & 0x0f;
	s=s+0x30;
	val=s;
	n=val<<16;
	lcddatawrt();

	s=':';
	val=s;
	n=val<<16;
	lcddatawrt();
	

}

void sec()
{
	unsigned char s;
	
	n=0x00860000;
	lcdcommand();

	s=a[0]>>4 ;
	s=s+0x30;	
	val=s;
	n=val<<16;
	lcddatawrt();

	s=a[0] & 0x0f;
	s=s+0x30;
	val=s;
	n=val<<16;
	lcddatawrt();

		

}

void day()
{
	unsigned char s;
	
	n=0x00890000;
	lcdcommand();

	/*s=a[]>>4 ;
	s=s+0x30;	
	val=s;
	n=val<<16;
	lcddatawrt();
	*/
	s=a[3] & 0x0f;
	s=s+0x30;
	val=s;
	n=val<<16;
	lcddatawrt();

		

}


 void main()
{
unsigned char i,j=0;

	PINSEL0= 0X00000050;
	PINSEL1= 0x00000000;				/*MAKE 0.28,0.29,0.30 AS I/O*/
	IODIR1 = 0x00FF0000;                     /* P1.16..23 defined as Outputs  */
  	IODIR0 = 0x000000f0;
	
	lcd_initialization();			//INITIALIZATION OF LCD 
		 

	
	I2SCLL=0X4B;				//TO SET BUAD RATE OF I2C
	I2SCLH=0X4B;				//TO SET BUAD RATE OF I2C
	I2CONSET=0X40;				//TO ENABLE I2C

	while(1)
	{

		I2CONSET=0X20;							// TO SEND START CONDITION
		while(I2STAT!=0X08 || I2CONSET!=0X68);
		I2CONCLR=0X20;


		I2DAT=0XD0;								//SLAVE ADDRESS + WR
		I2CONCLR=0X08;
		while(I2STAT!=0X18 && I2CONSET!=0X48);

		/*
		if(I2STAT!=0X18)						//IF NO ACK FROM SLAVE
		{
			
			I2DAT=0X00;
			I2CONCLR=0X08;
			while(I2STAT!=0X28 && I2CONSET!=0X48);
			I2CONCLR=0X08;

			I2CONSET=0X10;
			//I2CONCLR=0X08;
			while((I2CONSET&0x08)!=0X08);
			//I2CONCLR=0X20;
			while((I2CONSET&0x08)!=0X08);
			n=0x00010000;
			lcdcommand(); 
			n=0x00300000;
			lcddatawrt();
			while(1);
		}
		else;
	//	 */
		
		
		I2DAT=0X00;										 // DATA WRITE TO SALVE
		I2CONCLR=0X08;
		while(I2STAT!=0X28 && I2CONSET!=0X48);
		
		

		/*
		if(j==0)
		{	

		I2DAT=0X00;										 // DATA WRITE TO SALVE
		I2CONCLR=0X08;
		while(I2STAT!=0X28 && I2CONSET!=0X48);

		I2DAT=0X15;										 // DATA WRITE TO SALVE
		I2CONCLR=0X08;
		while(I2STAT!=0X28 && I2CONSET!=0X48);

		I2DAT=0X18;										 // DATA WRITE TO SALVE
		I2CONCLR=0X08;
		while(I2STAT!=0X28 && I2CONSET!=0X48);

		I2DAT=0X00;										// DATA WRITE TO SALVE
		I2CONCLR=0X08;
		while(I2STAT!=0X28 && I2CONSET!=0X48);

		I2DAT=0X07;										// DATA WRITE TO SALVE
		I2CONCLR=0X08;
		while(I2STAT!=0X28 && I2CONSET!=0X48);

		I2DAT=0X11;										// DATA WRITE TO SALVE
		I2CONCLR=0X08;
		while(I2STAT!=0X28 && I2CONSET!=0X48);

		I2DAT=0X12;										// DATA WRITE TO SALVE
		I2CONCLR=0X08;
		while(I2STAT!=0X28 && I2CONSET!=0X48);

		I2DAT=0X10;										// DATA WRITE TO SALVE
		I2CONCLR=0X08;
		while(I2STAT!=0X28 && I2CONSET!=0X48);

		
		j++;
		}
		else;
		
		*/


		I2CONSET=0X20;									//REPEATED START
		I2CONCLR=0X08;
		while(I2STAT!=0X10 || I2CONSET!=0X68);
		I2CONCLR=0X20;

		

		I2DAT=0XD1;										//SLAVE ADDRESS + READ
		I2CONCLR=0X08;
		while(I2STAT!=0X40 && I2CONSET!=0X48);

		/*
		if(I2STAT!=0X40)								//IF NOT ACK FROM SLAVE
		{
			
			I2DAT=0X00;
			I2CONCLR=0X08;
			while(I2STAT!=0X28 && I2CONSET!=0X48);
			I2CONCLR=0X08;

			I2CONSET=0X10;
			//I2CONCLR=0X08;
			while((I2CONSET&0x08)!=0X08);
			//I2CONCLR=0X20;
			//while((I2CONSET&0x08)!=0X08);
			n=0x00010000;
			lcdcommand(); 
			n=0x00320000;
			lcddatawrt();
			while(1);
		}
		  */


		for(i=0;i<6;i++)					 		//REPEATE FOR 6 TIMES
		{
			I2CONCLR=0X08;							//CLEAR SI
			I2CONSET=0X04;							//TO SEND ACK FROM MASTER TO SLAVE
			while((I2CONSET&0x08)!=0X08);
			a[i]=I2DAT;								//TAKING THE DATA RECEIVED FROM SLAVE
		}


		I2CONCLR=0X0C;								//CLEAR SI AND AA BIT
		while((I2CONSET&0x08)!=0X08);				
		a[i]=I2DAT;									//TAKING THE DATA RECEIVED FROM SLAVE
											 		
		
		I2CONSET=0X10;								//TO SEND STOP SEQUENCE
		I2CONCLR=0X08;
		while((I2CONSET&0x10)==0X10);
		I2CONCLR=0X08;

	
		hour();										//TO DISPLAY HOUR
		min();										//TO DISPLAY MINS 
		sec();										//TO DISPLAY SECONDS
		date();										//TO DISPLAY DATE
		month();									//TO DISPLAY MONTH
		year();										//TO DISPLAY YEAR
		//day();
			
	}

}

hope this helps
i have converted the code for LPC2148, but i am getting the constant values, time is not varying. I mean it is not working..
 
Last edited:

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top