打印
[PIC®/AVR®/dsPIC®产品]

EEPROM掉电被清0

[复制链接]
859|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangzsa|  楼主 | 2022-10-9 22:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我按照例程序读写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 )

使用特权

评论回复
5
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)  
}

使用特权

评论回复
6
huangchui| | 2022-10-13 18:44 | 只看该作者
if(WRERR==0)  不用

使用特权

评论回复
7
chuxh| | 2022-10-13 18:46 | 只看该作者
我用的芯片是PIC16F1939

使用特权

评论回复
8
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();
    }
}

使用特权

评论回复
9
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生成的  可参考

使用特权

评论回复
10
jf101| | 2022-12-24 16:33 | 只看该作者
PIC16F1939中EEPROM是应该有标准的程序,建议参考一下

使用特权

评论回复
11
小夏天的大西瓜| | 2022-12-25 10:18 | 只看该作者
建议楼主使用库函数自带的读写EEPROM函数
void Write_b_eep( unsigned int badd,unsigned char bdata )
unsigned char Read_b_eep( unsigned int badd )

使用特权

评论回复
12
OKAKAKO| | 2022-12-25 13:31 | 只看该作者
楼主有没有可能是硬件本身的问题,一般情况下使用标准的读写不会说存在无法写入的问题,建议排查一下硬件

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

914

主题

9040

帖子

5

粉丝