PIC内部EEPROM读写操作

2019-04-15 11:44发布

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 #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;//返回读取的数据 }