zhanghaodianzi 发表于 2011-10-26 20:54:14

PIC18f4321单片机 内部EEPROM只能写一个地址,断电不保存

voidWR_EEP(ucharaddr,uchardat)
{
                EEADR = addr;
                EEDATA = dat;
                EEPGD = 0;
                CFGS = 0;
                WREN = 1;
                GIE = 0;
                EECON2 = 0x55;
                EECON2 = 0xAA;
                WR = 1;
                while(WR);
                GIE = 1;
                WREN = 0;
}

ucharRD_EEP(ucharaddr)
{
                EEADR = addr;
                EEPGD = 0;
                CFGS = 0;
                RD = 1;
                returnEEDATA;
}

WR__EEP(0,10);
val = RD_EEP(0);
可以读出来10;
//WR__EEP(0,10);
val = RD_EEP(0);
断电后,读出来是0.不解啊。
仿真结果竟然EECON2写不进去。

zlxd1990 发表于 2016-9-22 14:15:50

楼主,我也遇到这个情况了EECON2写不进去,请问怎么解决的

duxingkei 发表于 2016-9-22 15:38:19

本帖最后由 duxingkei 于 2016-9-22 15:45 编辑

zlxd1990 发表于 2016-9-22 14:15
楼主,我也遇到这个情况了EECON2写不进去,请问怎么解决的

直接先用库函数试试再说啊,
C编译自带的库函数应该有这方面的操作吧,自己找找帮助手册





meirenai 发表于 2016-9-22 15:44:04

本帖最后由 meirenai 于 2016-9-22 15:46 编辑

eecon2 只能写不能读,仿真看不到结果的
给你一个pic18f87k22的程序你参考一下。
#include "flash_eeprom.h"

#define EEPROM_START 0

#define ALIVE 0x55

system_param_t system_param;

void read_eeprom(uint8_t *array,uint8_t length)
{
    uint8_t i;
    for(i=0;i<length;i++) {
      EEADRH = (EEPROM_START+i)>>8;
      EEADR = (EEPROM_START+i)&0xff;
      EECON1bits.EEPGD = 0;
      EECON1bits.CFGS = 0;
      EECON1bits.RD = 1;
      NOP();
      NOP();
      array = EEDATA;
    }
}

void write_eeprom(uint8_t *array,uint8_t length)
{
    uint8_t i;
    for(i=0;i<length;i++) {
      EEADRH = (EEPROM_START+i)>>8;
      EEADR = (EEPROM_START+i)&0xff;
      EEDATA = array;
      EECON1bits.EEPGD = 0;
      EECON1bits.CFGS = 0;
      EECON1bits.WREN = 1;

      INTCONbits.GIE = 0;
      EECON2 = 0x55;
      EECON2 = 0xaa;
      EECON1bits.WR = 1;
      while(EECON1bits.WR);
      INTCONbits.GIE = 1;
      
      EECON1bits.WREN = 0;
    }
}

void flash_eeprom_init()
{
    read_eeprom((uint8_t *)&system_param,(uint8_t)sizeof(system_param));
    if(system_param.isAlive != ALIVE) {
      system_param.isAlive = ALIVE;
      system_param.isAuto = 1;
      system_param.windowTime = 25;
      write_eeprom((uint8_t *)&system_param,(uint8_t)sizeof(system_param));
    }else {
      
    }
}

sweet_136 发表于 2016-9-22 17:32:35

同样发现,有的时候,单片机写EEPROM 有问题,
页: [1]
查看完整版本: PIC18f4321单片机 内部EEPROM只能写一个地址,断电不保存