|
#include "MDT10F272.h"
#include "typedef.h"
#include "common.h"
#define EEPROM_VCC PC3
#define EEPROM_SCL PC6
#define EEPROM_SDA PC7
#define SET_SDA_IN() do {CPIOC|=0X80;} while (0)
#define SET_SDA_OUT() do {CPIOC&=~0X80;} while (0)
#define c_E2Address_R 0XA1 //器件地址-读
#define c_E2Address_W 0XA0 //器件地址-写
extern void EEPROM_Init();
extern u8 Read_EEPROM(u8 address);
extern void Write_EEPROM(u8 address,u8 data );
extern void EEPROM_OFF();
#include "eeprom.h"
BIT b_E2WriteFail; //写失败标志
void I2c_Stat()
{
EEPROM_SCL=1;
Delay_us(5);
EEPROM_SDA=1;
Delay_us(5);
EEPROM_SDA=0;
Delay_us(5);
}
void I2c_Stop()
{
EEPROM_SDA=0;
Delay_us(5);
EEPROM_SCL=1;
Delay_us(5);
EEPROM_SDA=1;
Delay_us(5);
}
void I2c_Response()
{
u8 i=0;
SET_SDA_IN();
EEPROM_SCL=1;
while((EEPROM_SDA==1) && (i<200)) i++;
Delay_us(5);
EEPROM_SCL=0;
SET_SDA_OUT();
EEPROM_SDA=1;
Delay_us(5);
}
void I2c_NoResponse()
{
SET_SDA_OUT();
EEPROM_SDA=1;
Delay_us(5);
EEPROM_SCL=1;
Delay_us(5);
EEPROM_SCL=0;
Delay_us(5);
}
u8 ReadByte()
{
u8 i,data=0;
SET_SDA_IN();
for(i=0;i<8;i++)
{
data=data<<1;
EEPROM_SCL=1;
Delay_us(5);
if(EEPROM_SDA)
{
data|=0x01; // 先读取高位
}
EEPROM_SCL=0;
Delay_us(5);
}
return data;
}
void WriteByte(u8 data)
{
u8 i;
SET_SDA_OUT();
EEPROM_SCL=0;
for(i=0;i<8;i++)
{
if(data&0x80) // 先发送高位
{
EEPROM_SDA=1;
}
else
EEPROM_SDA=0;
data=data<<1;
Delay_us(5);
EEPROM_SCL=1;
Delay_us(5);
EEPROM_SCL=0;
}
Delay_us(5);
}
void EEPROM_Init()
{
b_E2WriteFail=0; // 清除写入失败标志
CPIOC &=0X37; //PC3、PC6、PC7输出高
PORTC |=0XC8;
PCPHR |=0X80; //PC7上拉使能
Delay_us(5);
}
void EEPROM_OFF()
{
CPIOC &=0X37; //PC3、PC6、PC7输出低
PCPHR &=0X7f; //PC7上拉禁止
EEPROM_VCC=0;
EEPROM_SDA=0;
EEPROM_SCL=0;
}
u8 Read_EEPROM(u8 address)
{
u8 data;
EEPROM_Init();
I2c_Stat();
WriteByte(c_E2Address_W);
I2c_Response();
WriteByte(address);
I2c_Response();
I2c_Stat();
WriteByte(c_E2Address_R);
I2c_Response();
data=ReadByte();
I2c_NoResponse();
I2c_Stop();
EEPROM_OFF(); // 关机,减少功耗
return data;
}
void Write_EEPROM(u8 address,u8 data )
{
EEPROM_Init();
I2c_Stat();
WriteByte(c_E2Address_W);
I2c_Response();
WriteByte(address);
I2c_Response();
WriteByte(data);
I2c_Response();
I2c_Stop();
Delay_us(200); //写入后延时,等待数据保存
if(Read_EEPROM(address)!=data)
{
b_E2WriteFail=1; // 写入失败
}
EEPROM_OFF(); // 关机,减少功耗
}
|
|