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

📄 i2c.c

📁 用51单片机实现IR解码
💻 C
字号:
/**********************************************************************
*File		Name		:	eeprom.c
*Creat		Time		:	2002/02/11
*Program	Author		:	mqli
*File		Discreption	:
*	 
************************************************************************/


#include "common.h"
#include "Var.h"
#include "main.h" 
#include "i2c.h"
#include "lcd.h"





#define		I2C_CLK_0	I2C_CLK=0
#define		I2C_CLK_1	I2C_CLK=1	
	
#define		I2C_DATA_0	I2C_DATA=0
#define		I2C_DATA_1	I2C_DATA=1

BOOL IICWriteWaitAcknowlodge(void);

unsigned char IICrxbyte(void);

void IICstart(void);
void IICstop(void);
void IICReadAcknowledge(void);
void IICtxbyte(U8 DateByte);
U8  Comfirm_Var_Validity(U8 *var_address,U8 Max_Value,U8 Min_Value, U8 Normal_Value);



void IICstart(void)
{




  //  I2C_CLK_0;
	//Delay_xuS(1);
	
	I2C_DATA_1;
	Delay_xuS(1);
	I2C_CLK_1;
	Delay_xuS(1);
	I2C_DATA_0;
	Delay_xuS(1);
	I2C_CLK_0;
	Delay_xuS(1);

	
}

void IICstop(void)
{

	Delay_xuS(1);
	I2C_CLK_0;
	Delay_xuS(1);
	I2C_DATA_0;
	Delay_xuS(1);
	I2C_CLK_1;
	Delay_xuS(1);
	I2C_DATA_1;
	Delay_xuS(1);
	
}
void IICReadAcknowledge(void)
{
	I2C_CLK_0;
   	I2C_DATA_0;
	Delay_xuS(1);
	I2C_CLK_1;
	Delay_xuS(1);
	I2C_CLK_0;
   	I2C_DATA_1;
}

BOOL IICWriteWaitAcknowlodge(void)
{

	BOOL WriteSuccessFlag=FALSE;

	I2C_CLK_1;
	WriteSuccessFlag=(I2C_DATA)?FALSE:TRUE;
	I2C_CLK_0;
	if ( WriteSuccessFlag==FALSE )
	{
		Delay_xuS(1);
	}
	return WriteSuccessFlag;

}

void IICtxbyte(U8 DataByte)
{

   DE_DATA U8 BitMast;

	
       for(BitMast=0x80;BitMast>0;BitMast>>=1)
  
       
	   {
	
		 if (DataByte&BitMast)
			I2C_DATA_1;
		 else
			I2C_DATA_0;
		Delay_xuS(1);
		Delay_xuS(1);
		I2C_CLK_1;
		Delay_xuS(1);
		Delay_xuS(1);
		I2C_CLK_0;
	   }
		I2C_DATA_1;


}

unsigned char IICrxbyte(void)
{
DE_DATA	U8 ReceiveByte=0,i;
   I2C_DATA_1;	
   for(i=0;i<8;i++)
   {
	   I2C_CLK_1;
		ReceiveByte<<=1;
      ReceiveByte|=I2C_DATA;
	  I2C_CLK_0;
     Delay_xuS(1);
       
   }
	return ReceiveByte;
	

}




/* Read EEPROM content */
U8  I2C_Read_Bytes(U8 device_address,U8* register_adrress, U8 register_address_length,U8 * buffer_pointer, U8 bytes_counter)
{
	DE_DATA	unsigned char errcnt;

	errcnt=0;
	while(1)
	{
		IICstart();						
		IICtxbyte(device_address);	
		if (IICWriteWaitAcknowlodge()==TRUE) break;
		errcnt++;
		if (errcnt>5)
		{
			IICstop();
			return I2C_WRITE_DEVICE_ADDRESS_NO_ACKNOLOGE;
		}
	}

	do{
		IICtxbyte(*register_adrress);
		if(IICWriteWaitAcknowlodge()==FALSE)
			return I2C_WRITE_REGISTER_ADDRESS_NO_ACKNOLOGE;
		register_address_length--;
		register_adrress++;
	 }while(register_address_length);	
	

	IICstart();							
	IICtxbyte(device_address|0x01);
	if(IICWriteWaitAcknowlodge()==FALSE)
		return I2C_WRITE_DEVICE_ADDRESS_NO_ACKNOLOGE;					

	while (1)
	{
		*buffer_pointer=0;
		*buffer_pointer=IICrxbyte();
		bytes_counter--;
		if (bytes_counter==0) break;
		IICReadAcknowledge();				
		buffer_pointer++;
	}
	Delay_xuS(1);
	IICstop();
	
	return I2C_COMMUNICATION_OK;
	
}




/*******************************************************
  for fast write fuction
  care that some chip limit the total bytes of one write cycle
  1K,2K=8   4K,8K,16K=16
************************************************************/





U8  I2C_Write_Bytes(U8 device_address,U8* register_adrress, U8 register_address_length,U8 * buffer_pointer, U8 bytes_counter)
{
	DE_DATA	 unsigned char errcnt,temp;

	errcnt=0;
	while(1)
	{
		IICstart();						//  IIC start condition
		IICtxbyte(device_address);	
		if (IICWriteWaitAcknowlodge()==TRUE) break;
		errcnt++;
		if (errcnt>5)
		{
			IICstop();
			return I2C_WRITE_DEVICE_ADDRESS_NO_ACKNOLOGE;
		}
	}
	do{
		       temp=*register_adrress;
			   IICtxbyte(temp);	
			//IICtxbyte(*register_adrress);						//write the address onchip
			if(IICWriteWaitAcknowlodge()==FALSE)
			return I2C_WRITE_REGISTER_ADDRESS_NO_ACKNOLOGE;
	               register_address_length--;
				register_adrress++;
	 }while(register_address_length);	
	
	while(bytes_counter)
	{
	       temp=*buffer_pointer;
		IICtxbyte(temp);								// transmit EEPROM data
		if(IICWriteWaitAcknowlodge()==FALSE)
			return I2C_WRITE_REGISTER_DATA_NO_ACKNOLOGE;
			buffer_pointer++;
			bytes_counter--;
	}	
	IICstop();									//  IIC stop condition
	
	return I2C_COMMUNICATION_OK;
}






/************************************************************
* The followed is the application for IIC bus
*
*****************************************************************/
#define EEPROM_I2C_DEVICE_ADDRESS		0xA0

 
/* Read EEPROM content */
U8  ReadXEEprom(U8 * buffer_pointer, U16 register_address, U8 bytes_counter)
{
	DE_DATA U8 result,temp_register_address;
	temp_register_address=(U8)(register_address);
	
	result=	 I2C_Read_Bytes(EEPROM_I2C_DEVICE_ADDRESS+((U8)(register_address/128)&0x0e), 
		                        &temp_register_address, 1,buffer_pointer, bytes_counter);
	Delay_xmS(10);
         if(result!=I2C_COMMUNICATION_OK)
		 	Scroll_Promote_Information("READ EEP ERR:",result);
		return result;
}





/*******************************************************
  for fast write fuction
  care that some chip limit the total bytes of one write cycle
  1K,2K=8   4K,8K,16K=16
************************************************************/


U8 WriteXEEprom(U8 * bufptr, U16 register_address, U8 bytes_counter) 
{
	
	DE_DATA U8 result,temp_register_address;
	temp_register_address=(U8)(register_address);
	result=	I2C_Write_Bytes(EEPROM_I2C_DEVICE_ADDRESS+((U8)(register_address/128)&0x0e),
			                      & temp_register_address,1,bufptr,bytes_counter);
       if(result!=I2C_COMMUNICATION_OK)
	   	Scroll_Promote_Information("WRITE I'C COMM ERR:", result);
  	Delay_xmS(10);
	return result;
}



void Check_EEProm_Var_Validity(void)
{

	//Comfirm_Var_Validity
}


U8 Comfirm_Var_Validity(U8 *var_address,U8 Max_Value,U8 Min_Value, U8 Normal_Value) 
{
	if( (*var_address>Max_Value)||(*var_address<Min_Value) )
        {
        *var_address=Normal_Value; 
		return 0; 
	}
	else
		{
                return 1;
		}
}





⌨️ 快捷键说明

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