?? 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 + -