www.pudn.com > LPT_I2C_ADuC.rar > I2C_LPT.c


/**************************************************************************** 
 * 
 * File:                I2C_LPT.c 
 * 
 * Author:              Fiberxon(Jack Zhou) 
 * 
 * Description:         Base function of the I2C-LPT accessing with EVB 
 * 
 * Time:                2006-Feb-26 
 * 
 * version:				v1.2  重大改版 
 ****************************************************************************/ 
 
#include  
#include  
#include  
 
float I2C_DELAY=0.000; 
 
int I2C_position=-1; 
//如果并口转I2C电路板异常,则I2C_position=-1; 
//如果并口转I2C电路板的逻辑是SDA:!D1/!S5, SCL:!D0,则I2C_position=0; 
//如果并口转I2C电路板的逻辑是SDA:!D1/ S5, SCL:!D0,则I2C_position=1; 
 
BYTE LPT_DataReg;//并口数据寄存器的初始值 
//利用该初值,就不用每次发SDA或SCL时都先去读并口的数据寄存器 
//在ADuC的下载程序里,实际测试,在Write Flash时,时间由原先的4.2秒缩短至2.4秒 
 
void SetSCL(BYTE value) 
{BYTE byte_temp, value_not; 
 
    //byte_temp = inp(0x378);//注释掉此句话是为了提速 
	byte_temp = LPT_DataReg; 
 
	value_not = !value ; 
 
    if (I2C_position) //SCL_out=!D0 
  		byte_temp = (byte_temp & 0xfe) | (value_not); 
	else			  //SCL_out=!D0 
  		byte_temp = (byte_temp & 0xfe) | (value_not); 
	 
    outp(0x378, byte_temp); 
 
    LPT_DataReg = byte_temp; 
   
	Delay(I2C_DELAY); 
	return; 
} 
 
void SetSDA(BYTE value) 
{BYTE byte_temp, value_not; 
 
    //byte_temp = inp(0x378);//注释掉此句话是为了提速 
	byte_temp = LPT_DataReg; 
	 
  	value_not = !value;	 
 
    if (I2C_position) //SDA_out=!D1 
  		byte_temp = (byte_temp & 0xfd) | (value_not << 1); 
	else			  //SDA_out=!D1 
  		byte_temp = (byte_temp & 0xfd) | (value_not << 1); 
  	 
	outp(0x378, byte_temp); 
 
    LPT_DataReg = byte_temp; 
     
	Delay(I2C_DELAY); 
  	return; 
} 
 
BYTE GetSDA(void) 
{BYTE byte_temp; 
 
    byte_temp = inp(0x379);  
 
    if (I2C_position) //SDA_in=S5 
  		byte_temp = ((byte_temp & 0x20) >> 5);  
	else			  //SDA_out=!S1 
  		byte_temp = !((byte_temp & 0x20) >> 5);  
	 
  	return byte_temp; 
} 
 
void Init_LPT(void) 
{BYTE byte_temp; 
     
    I2C_position=-1; //初始化I2C_position,即没有I2C host板 
	LPT_DataReg=inp(0x378); 
 
}