wangzsa 发表于 2022-10-9 22:38

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:31

本帖最后由 lcczg 于 2022-10-10 09:35 编辑

建议用MCC生成底层EEPROM驱动代码,驱动代码都是测试验证过的。如果自己写的驱动,可以和它比对一下。
读的话可以用MPLAB IPE读出来HEX,肯定是里面真实的内容。

wangzsa 发表于 2022-10-13 18:29


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,

pengf 发表于 2022-10-13 18:34


你可以试下microchip自带的读写EEPROM函数
void Write_b_eep( unsigned int badd,unsigned char bdata )
unsigned char Read_b_eep( unsigned int badd )

spark周 发表于 2022-10-13 18:40

最近我也遇到同样的问题,我是写到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)
}

huangchui 发表于 2022-10-13 18:44

if(WRERR==0)不用

chuxh 发表于 2022-10-13 18:46

我用的芯片是PIC16F1939

huanghuac 发表于 2022-10-13 18:51


// 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();
    }
}

GIGGWANG 发表于 2022-10-19 17:24

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生成的可参考

jf101 发表于 2022-12-24 16:33

PIC16F1939中EEPROM是应该有标准的程序,建议参考一下

小夏天的大西瓜 发表于 2022-12-25 10:18

建议楼主使用库函数自带的读写EEPROM函数
void Write_b_eep( unsigned int badd,unsigned char bdata )
unsigned char Read_b_eep( unsigned int badd )

OKAKAKO 发表于 2022-12-25 13:31

楼主有没有可能是硬件本身的问题,一般情况下使用标准的读写不会说存在无法写入的问题,建议排查一下硬件
页: [1]
查看完整版本: EEPROM掉电被清0