📄 eeprom.h
字号:
//**********************************************************************//
// EEprom读写函数 //
// //
// //
//**********************************************************************//
static bit _F0;
static volatile bit _SDA @ (unsigned)&PORTC*8+4;
static volatile bit _SCL @ (unsigned)&PORTC*8+3;
//***************************************
// 启动I2C总线的函
//***************************************
void I2C_Start(void)
{
//启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变
_SDA=1;
_SCL=1;
DelayUs(DELAY_TIME);
_SDA=0;
DelayUs(DELAY_TIME);
_SCL=0;
DelayUs(DELAY_TIME);
}
//***************************************
// 终止I2C总线
//***************************************
void I2C_Stop(void)
{
//终止I2C总线,当SCL为高电平时使SDA产生一个正跳变
_SDA=0;
_SCL=1;
DelayUs(DELAY_TIME);
_SDA=1;
DelayUs(DELAY_TIME);
_SCL=0;
DelayUs(DELAY_TIME);
}
//***************************************
// 发送0
//***************************************
void SEND_0(void) // SEND ACK
{
//发送0,在SCL为高电平时使SDA信号为低
_SDA=0;
_SCL=1;
DelayUs(DELAY_TIME);
_SCL=0;
DelayUs(DELAY_TIME);
}
//***************************************
// 发送1
//***************************************
void SEND_1(void)
{
//发送1,在SCL为高电平时使SDA信号为高
_SDA=1;
_SCL=1;
DelayUs(DELAY_TIME);
_SCL=0;
DelayUs(DELAY_TIME);
}
//***************************************
// 发送完一个字节后检验设备的应答信号
//***************************************
bit Check_Acknowledge(void)
{
//发送完一个字节后检验设备的应答信号
_SDA=1;
_SCL=1;
TRISC!=0x10; //改变端口的方向
DelayUs(DELAY_TIME/2);
_F0=_SDA;
DelayUs(DELAY_TIME/2);
_SCL=0;
DelayUs(DELAY_TIME);
TRISC&=0xEF;
if(_F0)
return FALSE;
return TRUE;
}
//***************************************
// 向I2C总线写一个字节
//***************************************
void WriteI2CByte(char b)
{
//向I2C总线写一个字节
char i;
for(i=0;i<8;i++)
if((b<<i)&0x80)
SEND_1();
else
SEND_0();
}
//***************************************
// 从I2C总线读一个字节
//***************************************
unsigned char ReadI2CByte(void)
{
//从I2C总线读一个字节
char b=0,i;
for(i=0;i<8;i++)
{
_SDA=1; //释放总线
TRISC|=0x10;
_SCL=1; //接受数据
DelayUs(10);
_F0=_SDA;
DelayUs(10);
_SCL=0;
if(_F0)
{
b=b<<1;
b=b|0x01;
}
else
b=b<<1;
}
TRISC&=0xEF; //改变端口的方向
DelayUs(10);
return b;
}
//**********以下为读写24c02的函数**********/
//*******************************************
// 向24C02写一个字节
//*******************************************
void Write_One_Byte(char addr,char thedata)
{
static bit acktemp;
/*write a byte to mem*/
acktemp=1;
I2C_Start();
WriteI2CByte(0xa0);
acktemp=Check_Acknowledge();
WriteI2CByte(addr);/*address*/
acktemp=Check_Acknowledge();
WriteI2CByte(thedata);/*thedata*/
acktemp=Check_Acknowledge();
I2C_Stop();
}
//*******************************************
// 向24C02写一个页(8字节)
//*******************************************
void Write_A_Page(char *buffer,char addr)
{
static bit acktemp;
// static bit wrtmp;
int i;
acktemp=1;
/*write a page to at24c02*/
I2C_Start();
WriteI2CByte(0xa0);
acktemp=Check_Acknowledge();
WriteI2CByte(addr);/*address*/
acktemp=Check_Acknowledge();
for(i=0;i<8;i++)
{
WriteI2CByte(buffer[i]);
if(!Check_Acknowledge())
{
I2C_Stop();
}
}
I2C_Stop();
}
//***************************************
// 从24C02处读取一个字节
//***************************************
char Read_One_Byte(char addr)
{
static bit acktemp;
char mydata;
//read a byte from mem*/
acktemp=1;
I2C_Start();
WriteI2CByte(0xa0);
acktemp=Check_Acknowledge();
WriteI2CByte(addr);/*address*/
acktemp=Check_Acknowledge();
I2C_Start();
WriteI2CByte(0xa1);
acktemp=Check_Acknowledge();
mydata=ReadI2CByte();
acktemp=Check_Acknowledge();
I2C_Stop();
return mydata;
}
//*******************************************
// 从24C02读N个字节
//*******************************************
void Read_N_Bytes(char *buffer,char n,char addr)
{
static bit acktemp;
int i=0;
acktemp=1;
/*read 8 bytes from mem*/
I2C_Start();
WriteI2CByte(0xa0);
acktemp=Check_Acknowledge();
WriteI2CByte(addr);/*address*/
acktemp=Check_Acknowledge();
I2C_Start();
WriteI2CByte(0xa1);
acktemp=Check_Acknowledge();
for(i=0;i<n;i++)
{
buffer[i]=ReadI2CByte();
if(i!=n-1)
SEND_0(); //发送应答*/
else
SEND_1(); //发送非应答*/
}
I2C_Stop();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -