[PIC®/AVR®/dsPIC®产品] PIC18F66K80不能写入EEPROM

[复制链接]
1331|27
 楼主| renyaq 发表于 2022-6-10 20:38 | 显示全部楼层 |阅读模式
本帖最后由 pzsh 于 2022-6-25 16:04 编辑

用PIC18F66K80这款单片机,写入一个简单的数进入EEPROM,然后再读出来,点亮LED灯。发现EEPROM里面的值没有变化
stly 发表于 2022-6-10 20:40 | 显示全部楼层
读出来?
 楼主| renyaq 发表于 2022-6-10 20:42 | 显示全部楼层
读出来还是0XFF的值
dengdc 发表于 2022-6-10 20:45 | 显示全部楼层
楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因
 楼主| renyaq 发表于 2022-6-10 20:48 | 显示全部楼层
用的晶振是16M,采用4倍频。程序如下:

void WriteEEprom(unsigned int EEaddr,unsigned char WEEdata)
{
    char GIE_BIT_VAL = 0;
    do{}
    while(EECON1bits.WR);
    EEADRH  =  ((unsigned char)(EEaddr>>8))&0X03;
    EEADR   =  (unsigned char)(EEaddr&0X00FF);
    EEDATA  =  WEEdata;
    EECON1bits.EEPGD  =  0;
    EECON1bits.CFGS   =  0;
    EECON1bits.WREN   =  1;
    GIE_BIT_VAL = INTCONbits.GIE;
    INTCONbits.GIE  =  0;
    EECON2  =  0X55;
    Nop();
    Nop();
    Nop();
    EECON2  =  0XAA;
    EECON1bits.WR     =  1;
    do{}
    while(EECON1bits.WR);
    Nop();
    Nop();
    Nop();
    INTCONbits.GIE  =  GIE_BIT_VAL;
    EECON1bits.WREN  =  0;
}
unsigned char ReadEEprom(unsigned int EEaddr)
{
    do{}
    while(EECON1bits.RD);
    EEADRH  =  ((unsigned char)(EEaddr>>8))&0X03;
    EEADR   =  (unsigned char)(EEaddr&0X00FF);
    EECON1bits.EEPGD = 0;
    EECON1bits.CFGS  = 0;
    EECON1bits.RD    = 1;
    do{}
    while(EECON1bits.RD);
    Nop();
    Nop();
    Nop();
    return (EEDATA);
}
void main(void)
{
     #pragma config CONFIG1L = 0X10;    //仅使用主时钟
     #pragma config CONFIG1H = 0X12;    //4倍频,振荡器为HS
     #pragma config CONFIG2L = 0X00;    //禁止欠压复位
     #pragma config CONFIG2H = 0X3A;    //看门狗定时65.5s
     #pragma config CONFIG3H = 0X80;    //使能/MCLR
     #pragma config CONFIG4L = 0X00;    //RB6和RB7只能用于调试
     #pragma config CONFIG5L = 0X00;    //BLOCK受代码保护
     #pragma config CONFIG5H = 0X00;    //EEPROM受代码保护
     #pragma config CONFIG6L = 0X00;    //BLOCK受写保护
     #pragma config CONFIG6H = 0X00;    //EEPROM受写保护
     #pragma config CONFIG7L = 0X00;    //禁止BLOCK读操作
     #pragma config CONFIG7H = 0X00;    //禁止引导区执行表读操作
while(1)
     {
          unsigned int i = 0;
          CLRWDT();
          WriteEEprom(0X0000,0X01);
          i = ReadEEprom(0X0000);
          if(i == 0X01)
             bLED_LOOP = 0;                   //LED灯亮
     }
}
chuxh 发表于 2022-6-10 20:50 | 显示全部楼层
对于PIC18f26K22、46K80相似芯片,内部有1024字节EEPROM,只有XC8 1.34及以前例如1.33版本能用eeprom_read(addr),及eeprom_write(addr,dat),能读写EEPROM ,并且能读写至1023地址。
xxrs 发表于 2022-6-10 20:52 | 显示全部楼层
其他版本XC8,如1.36,1.37,1.38,经实验不能读写!
wyjie 发表于 2022-6-10 20:54 | 显示全部楼层
XC8版本已经是二字头了
dingy 发表于 2022-6-10 21:05 | 显示全部楼层
没用过这个系列的EEPROM。。。
jiajs 发表于 2022-6-10 21:07 | 显示全部楼层
EECON2  =  0X55;
    Nop();
    Nop();
    Nop();
    EECON2  =  0XAA;

这个是解锁序列,
juventus9554 发表于 2022-6-10 21:09 | 显示全部楼层
你如果仔细看datasheet,会发现, 明确有要求说解锁序列是连续的, 不能被打断, 你这里还加这么多nop...
初步看起来这个地方的问题最大
zwll 发表于 2022-6-10 21:11 | 显示全部楼层
其实,可以用MCC自动生成的FLASH/E2PROM的代码, 简单又实用...
dingy 发表于 2022-6-10 21:14 | 显示全部楼层
操作FLASH/E2PROM根编译器版本没多大关系, 主要是对原理理解了, 编译出来的代码都不会有问题的.

The write will not begin if this sequence is not exactly
followed (write 55h to EECON2, write 0AAh to
EECON2, then set WR bit) for each byte. It is strongly
recommended that interrupts be disabled during this
code segment.
heweibig 发表于 2022-6-10 21:17 | 显示全部楼层
有没有试过不用倍频的配置看看
pengf 发表于 2022-6-10 21:22 | 显示全部楼层
MCC生成的。
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);
}
 楼主| renyaq 发表于 2022-6-10 21:22 | 显示全部楼层
可能就是有些原理性的问题
supernan 发表于 2022-6-10 21:24 | 显示全部楼层
这个用MCC生成的就好了,没必要自己写
 楼主| renyaq 发表于 2022-6-10 21:26 | 显示全部楼层

嗯,预料中的结果,多谢大家啦
pzsh 发表于 2022-6-25 16:04 | 显示全部楼层
用MCC生产代码参考一下
tpgf 发表于 2022-7-4 15:27 | 显示全部楼层
这种存在写保护吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

700

主题

10138

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部