| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 | /*************************************************************************** Author        : ADI - Apps                    www.analog.com/MicroConverter Date          : May. 2007 File          : I2C_Slave.c Hardware      : Applicable to ADuC702x rev H or I silicon                 Currently targetting ADuC7028. Description   : I2C Slave to demonstrate with I2C_Master.				 				 Operates in two modes, read & write (called recieve and 				 transmit here). At the begining of an I2C transmission, the 				 Master sends an address. The LSB of this address determines 				 if the Master is to read (1) or write (0).		***************************************************************************/#include<ADuC7028.h>void My_IRQ_Handler(void);typedef unsigned char       BYTE;       //8-bittypedef unsigned short int  HALFWORD;   //16-bittypedef unsigned int        WORD;       //32-bit#define TRUE 1#define FALSE 0#define HIGH 1#define LOW 0short i = 0, dat[256];int r = 0;int w = 0;BYTE i2c_first = TRUE;int main(){	dat[0] = 0;	dat[1] = 1;	dat[2] = 2;	dat[3] = 3;	dat[4] = 4;	dat[5] = 5;	dat[6] = 6;	dat[7] = 7;	i=1;	// I2C on P1.0 and P1.1 	GP1CON = 0x22;	IRQ=My_IRQ_Handler;	IRQEN = 0x200;					// I2C0 Slave Interupt		I2C0CFG = 0x4001;//0x01;		  			// Slave Enable	I2C0ID0 = 0xA0;					// Slave ID	I2C0STX = 0x77;			while (1)	{	}; // 	return 0;}/*************************************************//*************************************************//************	IRQ Service Routine  *************//*************************************************//*************************************************/unsigned int status;unsigned int x;unsigned int addr;void My_IRQ_Handler(){		status = I2C0SSTA;	if (((status & 0x02000)==0x02000))   // Slave Transmit IRQ	{		 		 r=0;		 w=-1;		 i++;			}	// Slave Recieve	if ((status & 0x08)==0x08)   // Slave Recieve IRQ	{		if(w==-1){	 	   addr = I2C0SRX;		   w++;		}		else{		/*	if(w==0){			}			else if(w==1){			}*/			dat[addr+w] = I2C0SRX;			w++;		} 		//I2C0STX = dat[addr+r];		//I2C0STX = dat[addr+r];		 		   //i++;	}		// Slave Transmit	if ((status & 0x04)==0x04)   // Slave Transmit IRQ	{		 		 I2C0STX = dat[addr+r];		 //I2C0STX = dat[addr+r];		 r++;	//	 i++;			}		//i++;}
 |