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

📄 ls_i2c.c

📁 5402控制88796网卡的程序
💻 C
字号:
//////////////////////////////////////////////
#include "c54reg.h"
#include "ls_i2c.h"
///////////硬件IO端口描述//////////////////
//       hd3  scl
//       hd4  sda
//       hd5  wp
/////////////////////////////////////////////
//////////外部变量///////////////////////////
extern word pio;    
/////////////////////////////////////////////
//      模块名称:void i2c_delay(void)
//      模块功能:
//      入口参数:无
//      返回参数:无
//      版本序号:v1.0
//      测试日期:2005.2.21
//////////////////////////////////////////////
void i2c_delay(void)
{word tmp;
for (tmp=0;tmp<100;tmp++);
}
/////////////////////////////////////////////
//      模块名称:void init_i2c(void)
//      模块功能:初始化eeprom
//      入口参数:无
//      返回参数:无
//      版本序号:v1.0
//      测试日期:2005.2.21
//////////////////////////////////////////////
void init_i2c(viod)
{
pio|=PORT_SCL;
pio|=PORT_SDA;
pio|=PORT_WP;
GPIOSR=pio;
}
/////////////////////////////////////////////
//      模块名称:void i2c_start(void)
//      模块功能:
//      入口参数:无
//      返回参数:无
//      版本序号:v1.0
//      测试日期:2005.2.21
//////////////////////////////////////////////
void i2c_start(void)
{
pio|=PORT_SCL;
pio|=PORT_SDA;
pio|=PORT_WP;
GPIOSR=pio;
i2c_delay();
pio&=PORT_SDA;
GPIOSR=pio;
i2c_delay();
}
/////////////////////////////////////////////
//      模块名称:void i2c_stop(void)
//      模块功能:
//      入口参数:无
//      返回参数:无
//      版本序号:v1.0
//      测试日期:2005.2.21
//////////////////////////////////////////////
void i2c_stop(void)
{
pio|=PORT_SCL;  //scl=1
pio&=~PORT_SDA; //sda=0;
pio|=PORT_WP;
GPIOSR=pio;
i2c_delay();
pio|=PORT_SDA;   //sda=1;
GPIOSR=pio;
i2c_delay();
}
/////////////////////////////////////////////
//      模块名称:word i2c_ack(void)
//      模块功能:
//      入口参数:无
//      返回参数:无
//      版本序号:v1.0
//      测试日期:2005.2.21
//////////////////////////////////////////////
word i2c_ack(void)
{word tmp;
GPIOCR=0xef;
pio&=~PORT_SCL;
GPIOSR=pio;
i2c_delay();
pio|=PORT_SCL;
GPIOSR=pio;
i2c_delay();
if ((GPIOSR&PORT_SDA)==PORT_SDA) 
 tmp=1;
else
 tmp=0;
GPIOCR=0xff; 
pio&=~PORT_SCL;
GPIOSR=pio;
i2c_delay(); 
return tmp;  
}

/////////////////////////////////////////////
//      模块名称:word i2c_in(void)
//      模块功能:
//      入口参数:无
//      返回参数:无
//      版本序号:v1.0
//      测试日期:2005.2.21
//////////////////////////////////////////////
word i2c_in(void)
{word tmp,data;
data=0;
GPIOCR=0xef;
pio&=~PORT_SCL;
GPIOSR=pio;
for (tmp=0;tmp<8;tmp++)
{
//////////////////////////////
pio|=PORT_SCL;
GPIOSR=pio;
i2c_delay();
///////////////////////////////
if ((GPIOSR&PORT_SDA)==PORT_SDA)
 data+=1;
data=data<<1;
/////////////////////////////////
pio&=~PORT_SCL;
GPIOSR=pio;
i2c_delay();
};
GPIOCR=0xff;
return data;
}
/////////////////////////////////////////////
//      模块名称:void i2c_out(word val)
//      模块功能:
//      入口参数:无
//      返回参数:无
//      版本序号:v1.0
//      测试日期:2005.2.21
//////////////////////////////////////////////
void i2c_out(word val)
{word tmp;
pio&=~PORT_SCL;
GPIOSR=pio;
i2c_delay();
for (tmp=0;tmp<8;tmp++)
{
if ((val&0x80)==0x80)
 pio|=PORT_SDA;
else
 pio&=~PORT_SDA;
GPIOSR=pio;
i2c_delay();
val=val<<1;  
///////////////////////////////
pio|=PORT_SCL;
GPIOSR=pio;
i2c_delay();
/////////////////////////////////
pio&=~PORT_SCL;
GPIOSR=pio;
i2c_delay();
} 
}
/////////////////////////////////////////////
//      模块名称:word i2c_read(word address,word *p,word lg)
//      模块功能:
//      入口参数:无
//      返回参数:无
//      版本序号:v1.0
//      测试日期:2005.2.21
//////////////////////////////////////////////
word i2c_read(word address,word *p,word lg)
{word tmp;

i2c_start();
i2c_out(0xa0);
if (i2c_ack()!=1) return 0;
i2c_out(address/256);
if (i2c_ack()!=1) return 0;
i2c_out(address%256);
if (i2c_ack()!=1) return 0;
i2c_start();
i2c_out(0xa1);
if (i2c_ack()!=1) return 0;
for (tmp=0;tmp<lg;tmp++)
{ *p=i2c_in();
 if (i2c_ack()!=1) return 0;
 }; 
i2c_stop();
return 1;
}
/////////////////////////////////////////////
//      模块名称:word i2c_write(word address,word val)
//      模块功能:
//      入口参数:无
//      返回参数:无
//      版本序号:v1.0
//      测试日期:2005.2.21
//////////////////////////////////////////////
word i2c_write(word address,word val)
{
i2c_start();
i2c_out(0xa0);
if (i2c_ack()!=1) return 0;
i2c_out(address/256);
if (i2c_ack()!=1) return 0;
i2c_out(address%256);
if (i2c_ack()!=1) return 0;
i2c_out(val);
if (i2c_ack()!=1) return 0;
i2c_stop();
return 1;
}

⌨️ 快捷键说明

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