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

2020-02-06 10:02发布

void  WR_EEP(uchar  addr,uchar  dat)
{
                EEADR = addr;
                EEDATA = dat;
                EEPGD = 0;
                CFGS = 0;
                WREN = 1;
                GIE = 0;
                EECON2 = 0x55;
                EECON2 = 0xAA;
                WR = 1;
                while(WR);
                GIE = 1;
                WREN = 0;
}

uchar  RD_EEP(uchar  addr)
{
                EEADR = addr;
                EEPGD = 0;
                CFGS = 0;
                RD = 1;
                return  EEDATA;
}

WR__EEP(0,10);
val = RD_EEP(0);
可以读出来10;
//WR__EEP(0,10);
val = RD_EEP(0);
断电后,读出来是0.不解啊。
仿真结果竟然EECON2写不进去。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
zlxd1990
1楼-- · 2020-02-06 12:32
楼主,我也遇到这个情况了EECON2写不进去,请问怎么解决的
duxingkei
2楼-- · 2020-02-06 13:23
本帖最后由 duxingkei 于 2016-9-22 15:45 编辑
zlxd1990 发表于 2016-9-22 14:15
楼主,我也遇到这个情况了EECON2写不进去,请问怎么解决的


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



2.jpg (247.01 KB, 下载次数: 0)

下载附件

2016-9-22 15:45 上传

meirenai
3楼-- · 2020-02-06 16:38
本帖最后由 meirenai 于 2016-9-22 15:46 编辑

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

  2. #define EEPROM_START 0

  3. #define ALIVE 0x55

  4. system_param_t system_param;

  5. void read_eeprom(uint8_t *array,uint8_t length)
  6. {
  7.     uint8_t i;
  8.     for(i=0;i<length;i++) {
  9.         EEADRH = (EEPROM_START+i)>>8;
  10.         EEADR = (EEPROM_START+i)&0xff;
  11.         EECON1bits.EEPGD = 0;
  12.         EECON1bits.CFGS = 0;
  13.         EECON1bits.RD = 1;
  14.         NOP();
  15.         NOP();
  16.         array[i] = EEDATA;
  17.     }
  18. }

  19. void write_eeprom(uint8_t *array,uint8_t length)
  20. {
  21.     uint8_t i;
  22.     for(i=0;i<length;i++) {
  23.         EEADRH = (EEPROM_START+i)>>8;
  24.         EEADR = (EEPROM_START+i)&0xff;
  25.         EEDATA = array[i];
  26.         EECON1bits.EEPGD = 0;
  27.         EECON1bits.CFGS = 0;
  28.         EECON1bits.WREN = 1;

  29.         INTCONbits.GIE = 0;
  30.         EECON2 = 0x55;
  31.         EECON2 = 0xaa;
  32.         EECON1bits.WR = 1;
  33.         while(EECON1bits.WR);
  34.         INTCONbits.GIE = 1;
  35.         
  36.         EECON1bits.WREN = 0;
  37.     }
  38. }

  39. void flash_eeprom_init()
  40. {
  41.     read_eeprom((uint8_t *)&system_param,(uint8_t)sizeof(system_param));
  42.     if(system_param.isAlive != ALIVE) {
  43.         system_param.isAlive = ALIVE;
  44.         system_param.isAuto = 1;
  45.         system_param.windowTime = 25;
  46.         write_eeprom((uint8_t *)&system_param,(uint8_t)sizeof(system_param));
  47.     }else {
  48.         
  49.     }
  50. }
复制代码
sweet_136
4楼-- · 2020-02-06 16:52
同样发现,有的时候,单片机写EEPROM 有问题,

一周热门 更多>