⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c.c

📁 I2C programming for ARM7 philips LPC210x
💻 C
字号:
/*********************************/
/* Write Output Data to 24C04	 */
/* Addr = ID Code+Direction(W:0) */
/* Data = Output Data Write Port */
/*********************************/
void write_byte_24C04(unsigned char Addr,unsigned char Data)		// Write Output 24C04
{
	T2MCR=0x03;
  	T2TCR 	= 0x00000001;				//Enable Timer 2	
	TimeOUT_I2C=0;
  	I2C0CONCLR  = 0x6C;										// Reset all I2C Status   
  	I2C0CONSET = 0x40;									    // Enable I2C Interface  
  	I2C0CONSET = 0x20;										// Send Start Condition

	while(((I2C0STAT)!= 0x08) && (TimeOUT_I2C<2)){;;}
  // Wait I2C Status Return
//  	while((I2C0STAT)!= 0x08){;;}								// Wait Start Condition Complete  
  	I2C0CONCLR = 0x28;									    // Clear Start Bit + Interrupt Flag  
  	I2C0DAT    = 0xA0;										// Send EEPROM Address +[Write]

  // Wait I2C Status Return
	while(((I2C0STAT)!= 0x18) && (TimeOUT_I2C<2)){;;}
//  	while((I2C0STAT)!= 0x18){;;}								// Wait Slave Address+W, ACK
  	I2C0DAT = Addr;											// Send DataAddress to EEPROM
  	I2C0CONCLR = 0x0C;										// Clear Acknowledge Bit + Interrupt Flag

	while(((I2C0STAT)!= 0x28) && (TimeOUT_I2C<2)){;;}
//  	while((I2C0STAT)!= 0x28){;;}								// Data has been transmitted, ACK has been received   
  	I2C0DAT = Data;											// Send Output Data to EEPROM
  	I2C0CONCLR = 0x0C;										// Clear Acknowledge Bit + Interrupt Flag

  // Wait I2C Status Return
	while(((I2C0STAT)!= 0x28) && (TimeOUT_I2C<2)){;;}		// Data has been transmitted, ACK has been received   
  	I2C0CONSET = 0x10;										// Send Stop Condition
  	I2C0CONCLR = 0x0C;										// Clear Acknowledge Bit + Interrupt Flag   
//	delay(100000);										// Clear Acknowledge Bit + Interrupt Flag
  	T2TCR 	= 0x00000000;				//Disable Timer 2	
	TimeOUT_I2C=0;
}

void read_24C04(unsigned char DeviceAddr,unsigned char DataAddr, char *Buffer, char Count)
{
	unsigned char Data;	

	T2MCR=0x03;
  	T2TCR 	= 0x00000001;				//Enable Timer 2	
	TimeOUT_I2C=0;
  	I2C0CONCLR  = 0x6C;										// Reset all I2C Status   
  	I2C0CONSET = 0x40;									    // Enable I2C Interface  
  	I2C0CONSET = 0x20;										// Send Start Condition
	while(((I2C0STAT)!= 0x08) && (TimeOUT_I2C<2)){;;}
  // Wait I2C Status Return
//  	while((I2C0STAT)!= 0x08){;;}								// Wait Start Condition Complete  
  	I2C0CONCLR = 0x28;									    // Clear Start Bit + Interrupt Flag  
  	I2C0DAT    = DeviceAddr & 0xfe;										// Send EEPROM Address +[Write]

  // Wait I2C Status Return
	while(((I2C0STAT)!= 0x18) && (TimeOUT_I2C<2)){;;}
//  	while((I2C0STAT)!= 0x18){;;}								// Wait Slave Address+W, ACK
  	I2C0DAT = DataAddr;											// Send DataAddress to EEPROM
  	I2C0CONCLR = 0x0C;										// Clear Acknowledge Bit + Interrupt Flag

	while(((I2C0STAT)!= 0x28) && (TimeOUT_I2C<2)){;;}
//  	while((I2C0STAT)!= 0x28){;;}								// Data has been transmitted, ACK has been received   
  	I2C0DAT = 0x00;											// Send Output Data to EEPROM
  	I2C0CONCLR = 0x0C;										// Clear Acknowledge Bit + Interrupt Flag

  // Wait I2C Status Return
	while(((I2C0STAT)!= 0x28) && (TimeOUT_I2C<2)){;;}		// Data has been transmitted, ACK has been received   
  	I2C0CONSET = 0x20;										// Send Start Condition
  	I2C0CONCLR = 0x0C;										// Clear Acknowledge Bit + Interrupt Flag     	while((I2C0STAT)!= 0x08);//{;;}							// Wait Start Condition Complete  

	while(((I2C0STAT)!= 0x10) && (TimeOUT_I2C<2)){;;}							// Wait Start Condition Complete  
  	I2C0CONCLR = 0x28;									    // Clear Start Bit + Interrupt Flag  
  	I2C0DAT = DeviceAddr|0x01;										// Send EEPROM Address +[Write]

  // Wait I2C Status Return
  	while(((I2C0STAT)!= 0x40) && (TimeOUT_I2C<2)){;;}		// Wait Slave Address+R, ACK
	I2C0CONCLR = 0x08;
  	I2C0CONSET = 0x04;	// ACK to slave device

	for (Data=0; Data<Count-1;Data++)
	{
  		while(((I2C0STAT)!= 0x50) && (TimeOUT_I2C<2)){;;}			// Wait Received Data from EEPROM
	  	Buffer = I2C0DAT;											// Received Data from EEPROM
  		I2C0CONCLR = 0x08;										// Clear Acknowledge Bit + Interrupt Flag
  		I2C0CONSET = 0x04;	// ACK to slave device
		Buffer++;
	}
	while(((I2C0STAT)!= 0x50) && (TimeOUT_I2C<2)){;;}			// Wait Received Data from EEPROM
  	Buffer = I2C0DAT;											// Received Data from EEPROM
	I2C0CONCLR = 0x08;										    // Clear Acknowledge Bit + Interrupt Flag
	I2C0CONSET = 0x00;	// NACK to slave device
		
  	while(((I2C0STAT)!= 0x58) && (TimeOUT_I2C<2)){;;}		// Wait Received Data from EEPROM
	I2C0CONCLR = 0x08;										    // Clear Acknowledge Bit + Interrupt Flag
  	I2C0CONSET = 0x10;										// Send Stop Condition
}



/*********************************/
/* Write Output Data to 24C04	 */
/* Addr = ID Code+Direction(W:0) */
/* Data = Output Data Write Port */
/*********************************/
void write_byte_24C04(unsigned char Addr,unsigned char Data)		// Write Output 24C04
{
	T2MCR=0x03;
  	T2TCR 	= 0x00000001;				//Enable Timer 2	
	TimeOUT_I2C=0;
  	I2C0CONCLR  = 0x6C;										// Reset all I2C Status   
  	I2C0CONSET = 0x40;									    // Enable I2C Interface  
  	I2C0CONSET = 0x20;										// Send Start Condition

	while(((I2C0STAT)!= 0x08) && (TimeOUT_I2C<2)){;;}
  // Wait I2C Status Return
//  	while((I2C0STAT)!= 0x08){;;}								// Wait Start Condition Complete  
  	I2C0DAT    = 0xA0;										// Send EEPROM Address +[Write]
  	I2C0CONCLR = 0x28;									    // Clear Start Bit + Interrupt Flag  

  // Wait I2C Status Return
	while(((I2C0STAT)!= 0x18) && (TimeOUT_I2C<2)){;;}
//  	while((I2C0STAT)!= 0x18){;;}								// Wait Slave Address+W, ACK
  	I2C0DAT = Addr;											// Send DataAddress to EEPROM
  	I2C0CONCLR = 0x0C;										// Clear Acknowledge Bit + Interrupt Flag

	while(((I2C0STAT)!= 0x28) && (TimeOUT_I2C<2)){;;}
//  	while((I2C0STAT)!= 0x28){;;}								// Data has been transmitted, ACK has been received   
  	I2C0DAT = Data;											// Send Output Data to EEPROM
  	I2C0CONCLR = 0x0C;										// Clear Acknowledge Bit + Interrupt Flag

  // Wait I2C Status Return
	while(((I2C0STAT)!= 0x28) && (TimeOUT_I2C<2)){;;}		// Data has been transmitted, ACK has been received   
  	I2C0CONSET = 0x10;										// Send Stop Condition
  	I2C0CONCLR = 0x0C;										// Clear Acknowledge Bit + Interrupt Flag   
//	delay(100000);										// Clear Acknowledge Bit + Interrupt Flag
  	T2TCR 	= 0x00000000;				//Disable Timer 2	
	TimeOUT_I2C=0;
}

void read_24C04(unsigned char DeviceAddr,unsigned char DataAddr, char *Buffer, char Count)
{
	char Data;	

	T2MCR=0x03;
  	T2TCR 	= 0x00000001;				//Enable Timer 2	
	TimeOUT_I2C=0;
  	I2C0CONCLR  = 0x6C;										// Reset all I2C Status   
  	I2C0CONSET = 0x40;									    // Enable I2C Interface  
  	I2C0CONSET = 0x20;
	delay(100);										// Send Start Condition
	while(((I2C0STAT)!= 0x08) && (TimeOUT_I2C<2))//{;;}
  // Wait I2C Status Return
{
  	I2C0CONSET = 0x10;
	I2C0CONCLR = 0x18;									    // Enable I2C Interface  
  	I2C0CONCLR  = 0x6C;										// Reset all I2C Status   
  	I2C0CONSET = 0x40;									    // Enable I2C Interface  
  	I2C0CONSET = 0x20;										// Send Start Condition

}//  	while((I2C0STAT)!= 0x08){;;}								// Wait Start Condition Complete  
  	I2C0DAT    = DeviceAddr & 0xfe;										// Send EEPROM Address +[Write]
	delay(100);
  	I2C0CONCLR = 0x28;									    // Clear Start Bit + Interrupt Flag  
	TimeOUT_I2C=0;
  // Wait I2C Status Return
	while(((I2C0STAT)!= 0x18) && (TimeOUT_I2C<2)){;;}
//  	while((I2C0STAT)!= 0x18){;;}								// Wait Slave Address+W, ACK
  	I2C0CONCLR = 0x08;										// Clear Acknowledge Bit + Interrupt Flag
  	I2C0DAT = DataAddr;											// Send DataAddress to EEPROM
	TimeOUT_I2C=0;
	while(((I2C0STAT)!= 0x28) && (TimeOUT_I2C<2)){;;}
//  	while((I2C0STAT)!= 0x28){;;}								// Data has been transmitted, ACK has been received   
  	I2C0CONCLR = 0x08;										// Clear Acknowledge Bit + Interrupt Flag
 	I2C0DAT = 0x00;											// Send Output Data to EEPROM
	TimeOUT_I2C=0;

  // Wait I2C Status Return
	while(((I2C0STAT)!= 0x28) && (TimeOUT_I2C<2)){;;}		// Data has been transmitted, ACK has been received   
  	I2C0CONSET = 0x10;										// Send Stop Condition
  	I2C0DAT = 0xA1;										// Send EEPROM Address +[READ]
  	I2C0CONCLR = 0x08;										// Clear Acknowledge Bit + Interrupt Flag     	while((I2C0STAT)!= 0x08);//{;;}							// Wait Start Condition Complete  
	TimeOUT_I2C=0;
	delay(10000);
  	I2C0CONSET = 0x20;										// Send Stop Condition
	
// 	I2C0CONCLR  = 0x2C;										// Reset all I2C Status   
//  	I2C0CONSET = 0x40;									    // Enable I2C Interface  
//  	I2C0CONSET = 0x20;										// Send Start Condition
	
	while(((((I2C0STAT)!= 0x10) && (I2C0STAT)!= 0x08)) && (TimeOUT_I2C<2)){;;}							// Wait Start Condition Complete  
  	I2C0DAT = 0xA1;										// Send EEPROM Address +[READ]
  	I2C0CONCLR = 0x28;									    // Clear Start Bit + Interrupt Flag  

  // Wait I2C Status Return
  	while(((I2C0STAT)!= 0x40) && (TimeOUT_I2C<2)){;;}
//	{
//		I2C0CONCLR=0x28;
//		I2C0CONSET = 0x20;
//	  	I2C0DAT = 0xA1;										// Send EEPROM Address +[READ]
////		while(((I2C0STAT)!= 0x08) && (TimeOUT_I2C<2)){;;}							// Wait Start Condition Complete  
////  		I2C0CONCLR = 0x28;									    // Clear Start Bit + Interrupt Flag  
////  		I2C0DAT = 0xA1;										// Send EEPROM Address +[READ]
//	}		// Wait Slave Address+R, ACK
	Data=I2C0DAT;
  	I2C0CONSET = 0x04;	// ACK to slave device
	I2C0CONCLR = 0x08;
//  	I2C0CONSET = 0x04;	// ACK to slave device
	I2C0CONCLR = 0x04;

	for (Data=0; Data<Count-1;Data++)
	{
  		while(((I2C0STAT)!= 0x50) && (TimeOUT_I2C<2)){;;}			// Wait Received Data from EEPROM
//  		I2C0CONSET = 0x04;	// ACK to slave device
  		I2C0CONCLR = 0x0C;										// Clear Acknowledge Bit + Interrupt Flag
		I2C0CONSET = 0x04;	// ACK to slave device
	  	*Buffer = I2C0DAT;											// Received Data from EEPROM
		Buffer++;
	}
	while(((I2C0STAT)!= 0x50) && (TimeOUT_I2C<2)){;;}			// Wait Received Data from EEPROM
  	*Buffer = I2C0DAT;											// Received Data from EEPROM
	I2C0CONCLR = 0x0C;										    // Clear Acknowledge Bit + Interrupt Flag
	I2C0CONSET = 0x00;	// NACK to slave device
		
  	while(((I2C0STAT)!= 0x58) && (TimeOUT_I2C<2)){;;}		// Wait Received Data from EEPROM
  	I2C0CONSET = 0x10;										// Send Stop Condition
	I2C0CONCLR = 0x08;										    // Clear Acknowledge Bit + Interrupt Flag
}

/*
void i2c_isr(void) __irq
{
	switch (I2C0STAT)							//Read result code and switch to next action
	{
	// Start and Send byte conditions

		case (0x08):						//Start bit
			I2C0CONCLR 	= 0x20;				//Clear start bit
			I2C0DAT   	= I2CAddress;		//Send address and write bit
			break;

		case (0x10):						//Start bit
			I2C0CONCLR 	= 0x20;				//Clear start bit
			I2C0DAT   	= I2CAddress+1;		//Send address and write bit
//			I2C0CONSET = 0x20;		//Send RESTART
			break;
			
		case (0x18):					//Slave address+W, ACK
			I2C0DAT   = MemAddress;		//Write Mem,ory start address to tx register
			break;

		case (0x20):					//Salve address +W, Not ACK
			I2C0DAT  	= I2CAddress; 					//Resend address and write bi
			break;

		case (0x28):
			if(I2Counter-->0)			//Data sent, Ack
			{
				I2C0DAT  	= *I2CData;	//Write data to tx register
				I2CData++;
			}
			else
			{
				if (NEXTREAD)
				{
					I2C0CONSET = 0x20;		//Send RESTART
					lock = 0;      			//Signal end of I2C activity
				}
				else
				{
					I2C0CONSET = 0x10;		//Stop condition
					lock = 0;      			//Signal end of I2C activity
				}
			}
			break;

		case (0x30)	:					//Data sent, NOT Ack
			I2C0DAT  	= *I2CData;			//Write data to tx register
			break;


	//Receive byte conditions

		case (0x40) :					//Slave Address +R, ACK
			I2C0CONSET = 0x04;			//Enable ACK for data byte
			break;

		case (0x48) :					//Slave Address +R, Not Ack
			I2C0CONSET 	= 0x20;			//Resend Start condition
			break;

		case (0x50) :					//Data Received, ACK 
			if(--I2Counter>0)
			{
				*I2CData= I2C0DAT;
				I2CData++;
			}
			else
			{
				I2C0CONSET= 0x10;			//Stop condition
				lock	= 0;       		//Signal end of I2C activity							
			}
			break;

		case (0x58):					//Data Received, Not Ack
			I2C0CONSET= 0x20;				// Resend Start condition
			break;
		
		default :
			break;

	}

	I2C0CONCLR 	= 0x08;							//Clear I2C interrupt flag
	VICVectAddr = 0x00000000;					//Clear interrupt in 
}


void I2CTransferByte(unsigned int I2CAddr,unsigned char MemAddr,unsigned char count,...)
{
	va_list ap;
	va_start(ap,count);
//	I2C0CONCLR 	= 0x0000002C;					//Clear all I2C settings, except ENABLE bit

//	while((lock == 1 ) && (TimeOUT_I2C < 2))							//Wait for interrupt to signal end of I2C activity
//	{
//		;
//	}
	lock 		= 1;                   			//Set I2C bus as active
//	delay(100000);

	I2CAddress 	= I2CAddr;						//Place address and data in Globals to be used by the interrupt
	if(count >0)
	{
		I2CData  	= va_arg(ap,unsigned char *);
		RestoreI2CData= va_arg(ap,unsigned char *);
	}
	I2Counter	= count;
	MemAddress	= MemAddr;
//	I2C0CONCLR 	= 0x0000002C;					//Clear all I2C settings, except ENABLE bit
	I2C0CONSET 	= 0x00000040; 					//Enable the I2C interface
	I2C0CONSET 	= 0x00000020; 					//Start condition
	T2MCR=0x03;
  	T2TCR 	= 0x00000001;				//Enable Timer 2	
	TimeOUT_I2C=0;
	while((lock == 1 ))// && (TimeOUT_I2C < 2))							//Wait for interrupt to signal end of I2C activity
	{
		;
	}
  	T2TCR 	= 0x00000000;				//Disable Timer 2	
	TimeOUT_I2C=0;
//	lock 		= 1;                   			//Set I2C bus as active
	va_end(ap);
}
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -