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); }