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

📄 api1_iic.c

📁 I2C底层驱动程序
💻 C
字号:
/************************************************************************/     
/*     DDS188                     Ver 01                                     
**     Date        : 2007-03-14 	*/                                    
/************************************************************************/     

/*===========================================================================
**  INCLUDE FILES
**==========================================================================*/
#pragma  SFR
#pragma  NOP
#pragma  DI
#pragma  EI
#pragma  access
#pragma  STOP

#include	"Sys_config.h"
#include	"DTree.h"
#include	"Mod_Fun.h"
#include	"API_Fun.h"
#include	"Mod10_debug.h"
#include	"DataState.h"
// =======================================================================
#define EEPROM_ADDR					0xA8		
#define use_24C16
#define SetI2cSdaInput  			PM6.1 = 1
#define SetI2cSdaOutput				PM6.1 = 0

#define I2C_SDA         			P6.1
#define IsI2cSdaHigh    			(I2C_SDA==1)
#define I2cSdaHigh      			(I2C_SDA = 1)
#define I2cSdaLow       			(I2C_SDA = 0)
#define I2C_SCL						P6.0
#define EEPROM_i2c_scl_high() 		{I2C_SCL=1;}
#define EEPROM_i2c_scl_low()  		{I2C_SCL=0;}

const unsigned char I2CBit[8] = {
	0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01
};

void I2cWStart(void)
{
	I2cSdaHigh;
	Nop_2;
	Nop_2;
	EEPROM_i2c_scl_high();
	Nop_2;
	Nop_2;
   	I2cSdaLow;
   	Nop_2;
	Nop_2;
	EEPROM_i2c_scl_low();
}


void I2cStop(void)
{
	EEPROM_i2c_scl_low();
	Nop_2;
    I2cSdaLow;
    Nop_2;
	EEPROM_i2c_scl_high();
	Nop_2;
    I2cSdaHigh;
}

unsigned char ee_ack(void)
{
   	unsigned char ack=0;
   	
	EEPROM_i2c_scl_low();
	I2cSdaHigh;
	SetI2cSdaInput;
	Nop_2;
	ack = FALSE;
	EEPROM_i2c_scl_high();
	Nop_2;
	if(IsI2cSdaHigh)
		ack = 1;
	EEPROM_i2c_scl_low();
	I2cSdaLow;
	SetI2cSdaOutput;
	return ack;
}
// =======================================================================
void I2cWrtBit(unsigned char data)
{
	unsigned char k=8;
	
	for(k=0; k<8; k++) {
		EEPROM_i2c_scl_low();
		if(data & I2CBit[k])
			I2cSdaHigh;
		else
			I2cSdaLow;
		Nop_2;
		EEPROM_i2c_scl_high();
	}
}

// =======================================================================
unsigned char I2cRBit(void)
{
	unsigned char data, i;

	EEPROM_i2c_scl_low();
	I2cSdaHigh;
   	SetI2cSdaInput;

	data = 0;
	for(i=0;i<8;i++) {
		EEPROM_i2c_scl_high();
      if(IsI2cSdaHigh)
			data |= I2CBit[i];
		Nop_2;
		EEPROM_i2c_scl_low();
	}
	I2cSdaHigh;
  	SetI2cSdaOutput;
	return data;
}

// =======================================================================
void I2c_ACK(void)
{
	EEPROM_i2c_scl_low();
	Nop_2;
	I2cSdaLow;
	Nop_2;
	EEPROM_i2c_scl_high();
}
// =======================================================================
void I2c_NACK(void)
{
	EEPROM_i2c_scl_low();
	Nop_2;
	I2cSdaHigh;
	Nop_2;
	EEPROM_i2c_scl_high();
}

unsigned char  API_EEPROM_Read(unsigned int Data_SAdr,unsigned char Data_Len,unsigned char Data[])
{
	unsigned char Loop,mack,i,F_ee_ok=0;
	
	if (Data_Len==0)
		return TRUE;
	Loop = 3;
	while (Loop--){
		F_ee_ok = FALSE;
		I2cWStart();

      	I2cWrtBit (EEPROM_ADDR |((unsigned char)(Data_SAdr>>7) & 0x0e));
      	mack = ee_ack();
      	I2cWrtBit ((unsigned char)Data_SAdr);
      	mack |= ee_ack();
      	I2cWStart();
      	I2cWrtBit ((EEPROM_ADDR|0x01)|((unsigned char)(Data_SAdr>>7) & 0x0e));
      	mack |= ee_ack();

		for ( i=0;i<(Data_Len-1);i++){
			Data[i] = I2cRBit();
			I2c_ACK();
			}
		Data[i] = I2cRBit();
		if (!mack){
			F_ee_ok = TRUE;	
			break;
			}
		/*-----避开干扰--------*/
		Delay_100us();	
		}
	I2c_NACK();
	I2cStop();
	return F_ee_ok;
}

/*----------------读取数据后校验合格返回 TRUE---------------*/
unsigned char  API_EEPROM_Write(unsigned int Data_SAdr,unsigned char Data_Len,unsigned char Data[])
{
	unsigned char Loop,mack,i,j;
	unsigned char Data_SAdrL;
	
	if (Data_Len==0)
		return TRUE;
	Loop = 5;
Again_Wr:	
	while (Loop--)
	{
		I2cWStart();
        Data_SAdrL = (unsigned char)Data_SAdr;
	    I2cWrtBit (EEPROM_ADDR |((unsigned char)(Data_SAdr>>7) & 0x0e));
	    mack = ee_ack();
	    I2cWrtBit (Data_SAdrL);
	    mack |= ee_ack();
	    i=0;
		while(i<Data_Len)
		{  	
			I2cWrtBit(Data[i]);
			mack |= ee_ack();  
			Data_SAdrL++;     
			i++;
		    if(((Data_SAdrL&0x0f)==0)||(i==Data_Len))
			{
				I2cStop();
				Delay_10ms();
				/*-------读取i个数据校验-Data_SAdr-i-Data--------*/
				API_EEPROM_Read(Data_SAdr,i,Temp_DataBuf_EE);
			  	for(j=0;j<i;j++)
			  	{
					if(Data[j] != Temp_DataBuf_EE[j])
						break;
				}
				if(i==j)
				{
					if(i==Data_Len)
						return	true;
					else
					{
						/*-------写完一个页--------*/
						Data_Len -=i;
						Data_SAdr+=i;
						Data+=i;
						Loop = 5;
					}
				}
				goto Again_Wr;
			}
		}
	}
	return false;
}

unsigned char  API_clear_EEPROM(unsigned int Data_SAdr,unsigned int Data_Len)
{
	unsigned char Loop,mack,i,F_ee_ok;
	unsigned int len;
	
	if (Data_Len==0)
		return TRUE;

	Loop = 3;
	F_ee_ok = FALSE;
	mack=0;

Again_Wr:	
	while (Loop--)
	{
		I2cWStart();

#ifdef  use_24C16
      	I2cWrtBit (EEPROM_ADDR |((unsigned char)(Data_SAdr>>7) & 0x0e));
      	mack |= ee_ack();
      	I2cWrtBit ((unsigned char)Data_SAdr);
      	mack |= ee_ack();
#endif
		
#ifdef  use_24C128
		I2cWrtBit (EEPROM_ADDR);
		mack = ee_ack();
		I2cWrtBit ((unsigned char)(Data_SAdr>>8));
		mack = ee_ack();
		I2cWrtBit ((unsigned char)Data_SAdr);
		mack |= ee_ack();
#endif

		len=Data_Len;
		for (i=0;i<Data_Len;i++)
		{
			
			I2cWrtBit(0x00);
			len--;
			mack |= ee_ack();

			//---modify @ 2005.8.11--------
			Data_SAdr+=1;
	    	if(((((unsigned char)Data_SAdr)&0x0f)==0) && (len!=0))
			{
				I2cStop();
				Delay_10ms();
				Data_Len -= (i+1);
				Loop = 3;
				goto Again_Wr;
//				continue;
			}
		}
		if (!mack)
		{
			F_ee_ok = TRUE;		
			break;		
		}
		else
		{
			mack=0;
		}
	}
	I2cStop();
	Delay_10ms();
	
	return F_ee_ok;	
}


void	API_Timer_Init(void)
{
	;
}

/*===========================================================================
**  Abstract:初始化程序
**				 1)完成IIC总线I/O初始化
**				 2)读写测试FM24C64并判断其正确性
**  Parameters:
**
**  Returns:	TRUE	器件ok
**					FALSE	器件ERR
**                 
**  Date:	04-03-01  [yy.mm.dd]
**-------------------------------------------------------------------------*/
unsigned char API_Init_EEPROM(void)
{
	unsigned char temp_buf1[1];
	
	temp_buf1[0]=0xA5;
	if(API_EEPROM_Write(Adr_EEtest,1,temp_buf1)){
		temp_buf1[0]=0x5A;
		if(API_EEPROM_Write(Adr_EEtest,1,temp_buf1));
			return	TRUE;
	}
	return	FALSE;
}


/*===========================================================================
**  Abstract: 判断EEPROM初始化钥匙
**		
**  Parameters:
**
**  Returns:
**			0xFF  未初始化
**			EE_KEY  已经初始化
**  Date:	03-11-10  [yy.mm.dd]
**-------------------------------------------------------------------------*/
unsigned char API_judge_ee_key(void)
{
	unsigned char temp_buf[2];
	unsigned char i=3;
	
	while(i--){
		if(API_EEPROM_Read(Adr_EEkey,2,temp_buf)){
			if((temp_buf[0]==EE_KEY)&&(temp_buf[1]==EE_KEY))
				return	true;
			}
		if(API_EEPROM_Read(Adr_EEkey_BAK,2,temp_buf)){
			if((temp_buf[0]==EE_KEY)&&(temp_buf[1]==EE_KEY))
				return	true;
			}
	}
	return FALSE;
}
/*===========================================================================
**  Abstract: 写EEPROM初始化钥匙
**
**  Parameters:
**
**  Returns:
**  Date:	03-11-10  [yy.mm.dd]
**-------------------------------------------------------------------------*/
void API_write_ee_key(void)
{
	unsigned char temp_buf[2];
	
	temp_buf[0]=EE_KEY;
	temp_buf[1]=EE_KEY;
	API_EEPROM_Write(Adr_EEkey,2,temp_buf);
	API_EEPROM_Write(Adr_EEkey_BAK,2,temp_buf);
}


⌨️ 快捷键说明

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