📄 ls_i2c.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 + -