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

📄 drv_at24c64.c

📁 基于EEPROM AT24C64的数据存储
💻 C
字号:
#include <./Atmel/at89x52.h>
#include    "source.h"
#define DEVICEID(A)  (A&0XF0)
#define DEVICE_AT24C64 0xA0 //A1A2A1=0
#define DEVICE_SDA2000 0x60
extern TMDEV_OPS   Opsgp;
unsigned int  eeprom_last=0;
unsigned int  eeprom_grid=0;
//*-----------------------------------------------------------------------------
//* 函数名称  : At24c64_WriteAgain (I2Cdesc *I2C_pt, u_short loadAddress, u_char nbByte)
//* Object    : I2C
//* 输入参数  : <I2C_pt> =   为I2C的描述指针,其结构定义在source.h中
//* 输出变量  : 无
//* 功能       :如果写到AT2C64的数据长度大于一个页,那么下次操作的要等5MS后在进行下次写操作
//*-----------------------------------------------------------------------------
void At24c64_WriteAgain (I2Cdesc *I2C_pt){
	unsigned int temp,adr;
	if(eeprom_grid<eeprom_last){
		adr=eeprom_grid;
		eeprom_grid +=EEPROM_PAGE_LEN;
		temp=eeprom_last>eeprom_grid?eeprom_grid:eeprom_last;
		I2CWrite (&I2c,adr,temp-adr);
	}
	else{
		Opsgp.eeprom_write_over=1;/*写操作完毕*/
		Opsgp.eeprom_read_ok=1;/*可以进行读操作了*/
		Opsgp.dealing=0;
		Stop_I2c_Timer();	//Cnt Stop
	}
}
void At24c64_Finish (I2Cdesc *I2C_pt){
	if(I2C_pt->operate==WRITE_BIT){//Call WriteAgain Wait for 5ms
		Start_I2c_Timer(5000); //Modify the duration 5ms
		I2C_pt->I2CTCHandler=At24c64_WriteAgain;
	}
	else{ //Read Finish Post Message
		Opsgp.eeprom_read_over=1;/*读操作完毕*/
		Opsgp.dealing=0;
		Stop_I2c_Timer();	//Cnt Stop
	}
}
void no_handler_tc(I2Cdesc *I2C_pt) {
}
void I2CError(I2Cdesc *I2C_pt) {
	I2C_pt->Error=1;
	if(I2c.operate==READ_BIT){
		Opsgp.eeprom_read_over=2;
		Opsgp.dealing=0;
		Stop_I2c_Timer();	//Cnt Stop
	}
	else if(I2c.operate==WRITE_BIT){
		Opsgp.eeprom_write_over=2;
		Opsgp.dealing=0;
		Stop_I2c_Timer();	//Cnt Stop
	}

}
/****At24c64 EEProm Driver ***/
void At24c64_Init(void){
	I2c.Timer_Gap_ms=5000; //Gap 5 ms for Write Biger Than Page
	I2C_lineOpen (&I2c,100);//100k clk
	I2c.I2cFinish=At24c64_Finish;
}
void At24c64_Read(unsigned char *buf,unsigned int adr,unsigned int len){
	I2c.deviceAddress=DEVICE_AT24C64;
	I2c.RxEnd=buf;	
	I2CRead (&I2c,adr,len);
}
void At24c64_Write(unsigned char *buf,unsigned int adr,unsigned int len){
	unsigned int temp;
	eeprom_last=adr+len;	
	temp=adr/EEPROM_PAGE_LEN;
	eeprom_grid=(temp+1)*EEPROM_PAGE_LEN;
	temp=eeprom_last>eeprom_grid?eeprom_grid:eeprom_last;

	I2c.deviceAddress=DEVICE_AT24C64;
	I2c.TxEnd=buf;
	I2CWrite (&I2c,adr,temp-adr);
}

⌨️ 快捷键说明

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