?? eeprom.c
字號:
//24LC256的宏定義
#define EDATA_H 0x0040 //FLOATS DATA LINE (IOPF6=1)
#define EDATA_L 0xFFBF //DRIVES DATA LINE LOW(IOPF6=0)
#define ECLOCK_H 0x0020 //FLOATS CLOCK LINE (IOPF5=1)
#define ECLOCK_L 0xFFDF //DRIVES CLOCK LINE LOW(IOPF5=0)
#define EDATACLOCK_H 0x0060 //FLOATS CLOCK AND DATA LINE(IOPF6 IOPF5=11)
#define EDATACLOCK_L 0xFF9F //DRIVE CLOCK AND DATA LINE LOW(IOPF6,IOPF5=00)
#define EDATA_INPUT 0xBFFF //PFDATDIR.14=0
#define EDATA_OUTPUT 0x4000 //PFDATDIR.14=1
#define PWP_L 0xFFEF //寫保護WP=0,即EEPROM寫允許(IOPF4)
#define PWP_H 0x0010 //寫保護WP=1,即EEPROM寫禁止(IOPF4)
#define PMAX_N 32 //讀寫24LC256的參數個數
/****************************************/
/*void delay(unsigned int x)
{ int count;
for(count=0;count<x;count++)
;
}*/
/*;======== I2C發送一字節子程序 ====================
; 描述:通過SDA線向EEPROM器件發送一個字節
;=================================================*/
void prom_transmit(unsigned int promdata)
{ unsigned int i;
*PFDATDIR=*PFDATDIR&ECLOCK_L; /*SCL=0*/
delay(72);
*PFDATDIR=*PFDATDIR|EDATA_OUTPUT; /*SDA output*/
for(i=0;i<8;i++)
{
if(promdata&0x0080)
*PFDATDIR=*PFDATDIR|EDATA_H; /*SDA=1*/
else
*PFDATDIR=*PFDATDIR&EDATA_L; /*SDA=0*/
delay(72); //64
*PFDATDIR=*PFDATDIR|ECLOCK_H; /*SCL=1*/
delay(72);
*PFDATDIR=*PFDATDIR&ECLOCK_L; /*SCL=0*/
delay(24); //8添加的!!!!!!!!!!!
promdata=promdata<<1;
}
}
/*;======== I2C接收一字節子程序 ====================
; 描述:通過SDA線從EEPROM器件讀入一個字節
;=================================================*/
unsigned int prom_receive()
{ unsigned int i,temp;
unsigned int promdata=0x0000;
*PFDATDIR=*PFDATDIR&EDATA_INPUT;/*SDA INPUT*/
*PFDATDIR=*PFDATDIR&EDATACLOCK_L; //SCL=0,?????
delay(72);
for(i=0;i<8;i++)
{
promdata=promdata<<1;
*PFDATDIR=*PFDATDIR|ECLOCK_H; /*SCL=1*/
delay(72);
temp=*PFDATDIR&EDATA_H;
if(temp==0)
promdata=promdata&0xFFFE;/*如果數據位為0,則R_DATA最低位清0*/
else
promdata=promdata|0x0001;
//promdata=(promdata+((*PFDATDIR&EDATA_H)>>TSHIFTNUM))<<1; /*input DATA need change(>>)*/
*PFDATDIR=*PFDATDIR&ECLOCK_L; /*SCL=0*/
delay(72);
}
*PFDATDIR=*PFDATDIR|EDATA_OUTPUT; /*SDA output*/
delay(24); //添加的!!!!!!!!!!!
//promdata=promdata>>1;
return(promdata);
}
/*;======== I2C 啟動子程序 =========================
; 描述:啟動I2C總線
;=================================================*/
void prom_start()
{
*PFDATDIR=*PFDATDIR|EDATACLOCK_H; /*SDA=1,SCL=1*/
delay(72);
*PFDATDIR=*PFDATDIR&EDATA_L; /*SDA=0*/
delay(72);
*PFDATDIR=*PFDATDIR&ECLOCK_L; /*SCL=0*/
delay(24); //添加的!!!!!!!!!!!
}
/*;======== I2C 結束子程序 =========================
; 描述:結束 I2C 總線
;=================================================*/
void prom_stop()
{
*PFDATDIR=*PFDATDIR&EDATA_L; //SDA=0
delay(24); //16*/
*PFDATDIR=*PFDATDIR|ECLOCK_H; /*SCL=1*/
delay(24); //8添加的!!!!!!!!!!!
*PFDATDIR=*PFDATDIR|EDATA_H; /*SDA=1*/
delay(24);
}
/*;======== I2C 從機應答子程序 =====================
; 描述:從機發應答信號
;=================================================*/
unsigned int prom_slave_ack()
{ unsigned int k;
*PFDATDIR=*PFDATDIR|EDATA_H; /* SDA=1*/
delay(24); //8
*PFDATDIR=*PFDATDIR&EDATA_INPUT; /* SDA設為輸入*/
delay(24);
*PFDATDIR=*PFDATDIR|ECLOCK_H; /*SCL=1*/
delay(24);
if(*PFDATDIR&EDATA_H)
k=1; //失敗
else
k=0;
*PFDATDIR=(*PFDATDIR|EDATA_OUTPUT)&EDATACLOCK_L;/*SDA設為輸出,SDA=0,SCL=0*/
delay(24); //后來加的?。。?!
return(k);
}
/*;======== I2C 主機不發應答子程序 =====================
; 描述:主機不發應答信號
;=================================================*/
void prom_no_ack()
{
*PFDATDIR=*PFDATDIR|ECLOCK_H; /*SCL=1 */
delay(24); //8
*PFDATDIR=*PFDATDIR&ECLOCK_L; /*Scl=0 */
delay(24); //添加的!!!!!!!!!!!
}
/*;======== I2C 主機應答子程序 =====================
; 描述:主機發應答信號
;=================================================*/
void prom_master_ack()
{
*PFDATDIR=*PFDATDIR&ECLOCK_L; //SCL=0
*PFDATDIR=*PFDATDIR&EDATA_L; /*SDA=0 */
*PFDATDIR=*PFDATDIR|ECLOCK_H; //SCL=1
delay(24); //8添加的!!!!!!!!!!!
*PFDATDIR=*PFDATDIR&ECLOCK_L; /*Scl=0 */
}
/*;======== 向I2C 寫1個字節子程序 =====================
; 描述:入口為要寫入數據的地址ADDR,數據DATA
; 出口為0表示操作成功;為1表示操作失敗
;=================================================*/
unsigned int prom_byte_wr(unsigned int page,unsigned int data)
{ unsigned int k,page_h,page_l;
*PFDATDIR=*PFDATDIR&PWP_L;
page_h=(page>>8)&0xff;
page_l=page&0x00ff;
prom_start();
prom_transmit(0x0A0); //送寫控制字
k=prom_slave_ack(); //從機應答
if(k==0)
{ prom_transmit(page_h); //送地址
k=prom_slave_ack();
}
if(k==0)
{ prom_transmit(page_l); //送地址
k=prom_slave_ack();
}
if(k==0)
{ prom_transmit(data&0x0ff);
k=prom_slave_ack();
}
if(k==0)
prom_stop();
*PFDATDIR=*PFDATDIR|PWP_H;
return(k);
}
/*;======== 從I2C 讀1個字節子程序 =====================
; 描述:入口為要讀數據的地址ADDR,
; 出口為數據DATA
;=================================================*/
unsigned int prom_byte_rd(unsigned int addr)
{ unsigned int data=0,k,addr_h,addr_l;
addr_h=(addr>>8)&0xff;
addr_l=addr&0x00ff;
prom_start(); //啟動I2C總線
prom_transmit(0x0A0); //送寫控制字
k=prom_slave_ack(); //從機應答
if(k==0)
prom_transmit(addr_h); //送地址
k=prom_slave_ack();
if(k==0)
prom_transmit(addr_l); //送地址
k=prom_slave_ack();
if(k==0)
{ prom_start();
prom_transmit(0x0A1); //送讀控制字
}
k=prom_slave_ack();
if(k==0)
{ data=prom_receive();
prom_no_ack();
prom_stop();
}
if(k==0)
return(data);
else
return(0x0FFFF);
}
/*;======== 連續頁寫子程序 ===========================
描述:向EEPROM寫入num個字
; 入口:要寫的起始地址ADDR,要寫數據的數組首址ARRAY,要寫的字數num
; 出口:返回0或1。為0表示操作成功;為1表示操作失敗
;=================================================*/
unsigned int prom_wr(unsigned int addr,unsigned int *array,unsigned int num)
{ unsigned int k,i,addr_h,addr_l; /*page write subroutine*/
//delay(7500);
*PFDATDIR=*PFDATDIR&PWP_L;
addr_h=(addr>>8)&0xff;
addr_l=addr&0x00ff;
prom_start();
prom_transmit(0x0A0); //送寫控制字
k=prom_slave_ack();
if(k==0)
{ prom_transmit(addr_h);
}
k=prom_slave_ack();
if(k==0)
{ prom_transmit(addr_l);
}
k=prom_slave_ack();
if(k==0)
{ for(i=0;i<num;i++)
{
prom_transmit((*array>>8)&0xff); //送高8位
k=prom_slave_ack();
if(k==1)
break;
prom_transmit(*array&0xff); //送低8位
k=prom_slave_ack();
if(k==1)
break;
array++;
}
}
prom_stop();
return(k);
}
/*;======== 頁讀子程序 ===========================
; 描述:從EEPROM讀出num個字
; 入口:要讀的起始地址ADDR,讀出數據存放數組的首址ARRAY,要讀的字數num
; 出口:返回0或1。為0表示操作成功;為1表示操作失敗
;=================================================*/
unsigned int prom_rd(unsigned int addr,unsigned int *array,unsigned int num)
{
unsigned int k,i,temp,addr_h,addr_l;
addr_h=(addr>>8)&0xff;
addr_l=addr&0x00ff;
prom_start();
prom_transmit(0x0A0);
k=prom_slave_ack();
if(k==0)
prom_transmit(addr_h);
k=prom_slave_ack();
if(k==0)
prom_transmit(addr_l);
k=prom_slave_ack();
if(k==0)
{ prom_start();
prom_transmit(0x0A1);
}
k=prom_slave_ack();
if(k==0)
{ for(i=0;i<(num-1);i++)
{
temp=prom_receive();
*array=(temp<<8)&0xff00;
prom_master_ack();
temp=prom_receive();
*array|=temp&0x00ff;
prom_master_ack();
array++;
}
temp=prom_receive();
*array=(temp<<8)&0xff00;
prom_master_ack();
temp=prom_receive();
*array|=temp&0x00ff;
prom_no_ack();
prom_stop();
}
return(k);
}
/**********從24LC256中讀數據子程序------------------**********/
/*void eeprom_read()
{
prom_rd(0x02,&pcf_data[0]);
}*/
/***********----------------*********/
/*void eeprom_write()
{
prom_wr(0x01,&pcf_data[0]);
}*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -