EEPROM掉电被清0
我按照例程序读写PIC18F25K80的EEPROM,仿真状态下,感觉读写正常(写完 再读,比较数值是正确的),但是有两个问题,就是在仿真状态下看MPLAB中EEPROM,数据不跟随我写而变化,这个很奇怪!!! 2 是掉电后重新上电,发现之前写的EEPROM全部清0了。 求指教!!! 我怀疑我写的数据没存进EEPROM区,所以和仿真器看到的不对应,而且重新上电后被清0了。 下面是读的程序,非常简单,但是就是读出来的和MPLAB中显示不一样unsigned char EE_Read (unsigned char EE_Address)
{
EEADR = EE_Address;
EEADRH = 0;
EECON1bits.EEPGD = 0;
EECON1bits.RD = 1;
return EEDATA;
} 本帖最后由 lcczg 于 2022-10-10 09:35 编辑
建议用MCC生成底层EEPROM驱动代码,驱动代码都是测试验证过的。如果自己写的驱动,可以和它比对一下。
读的话可以用MPLAB IPE读出来HEX,肯定是里面真实的内容。
void EE_Write (unsigned char EE_Address, unsigned char EE_Data)
{
//*************************************************
//*单字节EEPRO写程序
//*地址:EE_Address
//*数据:EE_Data
//*************************************************
PIR4bits.EEIF = 0;
EEADR = EE_Address;
EEADRH = 0;
EEDATA = EE_Data;
EECON1bits.EEPGD = 0;
EECON1bits.WREN = 1;
INTCONbits.GIE = 0;
_asm
MOVLW 0X55
MOVWF EECON2,0
MOVLW 0XAA
MOVWF EECON2,0
BSF EECON1,1,0
_endasm
INTCONbits.GIE = 1;
while (!PIR4bits.EEIF);
PIR4bits.EEIF = 0;
EECON1bits.WREN = 0;
}
这时写EEPROM的程序,都是参考别人的例程。自写自读比较是对的,但是和MPLAB中看的EEPROM不一致,而且掉电清0,
你可以试下microchip自带的读写EEPROM函数
void Write_b_eep( unsigned int badd,unsigned char bdata )
unsigned char Read_b_eep( unsigned int badd ) 最近我也遇到同样的问题,我是写到EEPROM数据存储器(非程序程储器),写好数据复位后再次读出为正常,但关电后就读为0或255.请问楼主搞定没?我用中断方法也试过,同样的问题。
void write_eeprom(uchar ee2,uchar ee3)//PIC内部EEPROM写程序
{
//EEIE=1;
EEIF=0;
EEADRL=ee2;//送写入地址
EEDATL=ee3;//送写入数据
EEPGD=0;//选择EEPROM数据存储器
//CFGS=0;//只选择读取EEPROM数据存储器
NOP(); NOP(); NOP(); NOP(); NOP();
GIE=0;
WREN=1;
EECON2=0x055;//写入解锁
EECON2=0x0aa;//写入解锁
WR=1;
WREN=0;
GIE=1;
while(WR);
if(WRERR==0)
} if(WRERR==0)不用
我用的芯片是PIC16F1939
// get 1 byte from eeprom
unsigned char Eep_Read(unsigned char eep_addr)
{
EEADRL = eep_addr;
EECON1bits.RD = 1;
NOP();
NOP();
NOP();
NOP();
return EEDATL;
}
// write 1 byte to eeprom
void Eep_Wr(unsigned char eep_addr, unsigned char eep_data)
{
EEADRL = eep_addr;
EEDATL = eep_data;
EECON1bits.WREN = 1;
EECON2 = 0x55;
EECON2 = 0xaa;
EECON1bits.WR = 1;
EECON1bits.WREN = 0;
while(EECON1bits.WR)
{
NOP();
NOP();
NOP();
NOP();
}
} void DATAEE_WriteByte(uint16_t bAdd, uint8_t bData)
{
uint8_t GIEBitValue = INTCONbits.GIE;
EEADRH = ((bAdd >> 8) & 0x03);
EEADR = (bAdd & 0xFF);
EEDATA = bData;
EECON1bits.EEPGD = 0;
EECON1bits.CFGS = 0;
EECON1bits.WREN = 1;
INTCONbits.GIE = 0; // Disable interrupts
EECON2 = 0x55;
EECON2 = 0xAA;
EECON1bits.WR = 1;
// Wait for write to complete
while (EECON1bits.WR)
{
}
EECON1bits.WREN = 0;
INTCONbits.GIE = GIEBitValue; // restore interrupt enable
}
uint8_t DATAEE_ReadByte(uint16_t bAdd)
{
EEADRH = ((bAdd >> 8) & 0x03);
EEADR = (bAdd & 0xFF);
EECON1bits.CFGS = 0;
EECON1bits.EEPGD = 0;
EECON1bits.RD = 1;
NOP();// NOPs may be required for latency at high frequencies
NOP();
return (EEDATA);
}
MCC生成的可参考 PIC16F1939中EEPROM是应该有标准的程序,建议参考一下
建议楼主使用库函数自带的读写EEPROM函数
void Write_b_eep( unsigned int badd,unsigned char bdata )
unsigned char Read_b_eep( unsigned int badd ) 楼主有没有可能是硬件本身的问题,一般情况下使用标准的读写不会说存在无法写入的问题,建议排查一下硬件
页:
[1]