PIC內部EEPROM讀寫操作

EPROM操作:


如果要讀取一個字節,
用戶首先必須向EEADRL寄存器寫入地址,然後清除EEPGD控制位,以及EECON1的CFGS位,
然後再將RD位置高。需要的數據經過一次指令週期馬上就出現在EEDATL裏面了,下一個指令
就可以讀取出來,當然爲了穩定可以加noop。EEDATL寄存器將會保留該讀取的值,直到下一次讀取操作
或者是用戶寫入操作。


代碼:
EEADRL=DATA_EE_Address;
nop();
EEPGD=0;
CFGS=0;
RD=1;
nop();
nop();
result_byte=EEDATL;




如果要寫入一個字節;
先設置地址EEADRL,並寫入數據Byte的EEDATL,然後在遵循如下時序操作:


EEADRL=DATA_EE_Address;
EEDATL=Data_Byte;
EEPGD=0;
CFGS=0;
//危險操作,允許寫入
WREN=1;
//嚴格按照如下順序初始化,
GIE=0;  //關閉中斷
EECON2=0x55;
EECON2=0xaa;
WR=1;
GIE=1;  //恢復中斷
WREN=0; //恢復


while(WR){
nop();
}
while(!EEIF){   //poll中斷標誌位
nop();
}
EEIF=0;  //必須軟件清除標誌位








寫EEPROM要花費2ms到8ms的時間,故在檢測WR狀態位要花費相當長時間,會進入中斷(時間間隔爲1ms的T0中斷)。





寫入EEPROM有一個特定的過程:將55H寫入EECON2,將AAH寫入EECON2
然後將WR位置1
*******************************************/
#include <pic.h>
#include "../head/config.h"

__CONFIG(HS&WDTDIS&LVPDIS&PWRTEN);    
//HS振盪,禁止看門狗,低壓編程關閉,啓動延時定時器


void WriteEE(uint8 addr,uint8 data);//EEPROM寫函數
uint8 ReadEE(uint8 addr);   //EEPROM讀函數

uint8 cydata;   //定義全局變量

void main(void) //主函數
{
    uint8 k;
    PORTD = 0xff; //PORTD賦FF
    TRISD = 0x00;//PORTD爲輸出
        
    for(k = 0;k < 7; k++)
    {
     WriteEE(k,k+1); //循環調用EEPROM寫函數,向地址爲0~7的寫入1~8
    } 
 while(1)
 {
    
    cydata = ReadEE(0);//讀取EEPROM的地址0數據
    
    if(cydata == 1)
    {
       RD0 = 0; //判斷EEPROM地址0裏的數據是不是爲1,爲1則點亮LED0
    }
 }
}

//EEPROM寫數據函數
void WriteEE(uint8 addr,uint8 data)
{
    do{}
    while(WR == 1);//等待寫完成
    
    
    EEADR = addr;//寫入地址信息
    EEDATA = data;//寫入數據信息
    EEPGD = 0;//操作EEPROM
     WREN = 1; //寫EEPROM允許
    EECON2 = 0x55;//寫入特定時序
    EECON2 = 0xaa;
    WR = 1; //執行寫操作
    do{}
    while(WR == 1);//等待寫完成
    WREN = 0;//禁止寫入EEPROM
}

//EEPROM讀數據函數
uint8 ReadEE(uint8 addr)
{
    uint8 num;
    do{}
    while(RD == 1);//等待讀完成
    EEADR = addr;//寫入要讀的址址
    EEPGD = 0;//操作EEPROM
    RD = 1;//執行讀操作
    do{}
    while(RD == 1);//等待讀完成
    num = EEDATA;
    return num;//返回讀取的數據
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章