📄 drv_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 + -