[PIC®/AVR®/dsPIC®产品] pic18F27Q10的EEPROM 擦,写问题

[复制链接]
1262|7
 楼主| rpk74A 发表于 2019-7-15 21:18 | 显示全部楼层 |阅读模式
pic18F27Q10,在操作flash的eeprom时候,无法写入数据,但是可以读出数据,同时也无法擦除。
我把代码例程核对过,看不出什么问题,请各位大师指点一二,看看问题出在哪里,eerate也读过了,已经把err位的问题解决了
             下面是写eeprom的代码。已经加了注释,帮忙看下问题大概出在什么地方,多谢
//*************************************************************************************************************************************
     GIE=0;                   // 关闭中断
     temp_reg=0x7A;             // 准备写入数据0x7A  
    NVMADRU=0x31;           // 最高位地址 0x31
    NVMADRH=0x00;          // 高位地址   0x00
    NVMADRL=0x00;          // 地位地址   0x00  // 0x310000为18F27Q10 date eeprom地址
    NVMDATL=temp_reg;      //数据写入寄存器
    NVMCON0bits.NVMEN=1;   // NVM 控制器使能
    NVMCON2=0x55;          // 解锁序列 0x55 0xAA
    NOP();
    NVMCON2=0xAA;
    NOP();
    NVMCON1bits.WR=1;     // WR置1  操作eeprom时候使用wr 位
    NOP();
    NOP();
    while(NVMCON1bits.WR==1);
     NVMCON0bits.NVMEN=0;
     GIE=1;
、、*************************************************************************************************************
北极风 发表于 2019-7-16 08:23 | 显示全部楼层
用MCC生成多好,不用自己一点点写了。

下面是MCC生成的代码。

void DATAEE_WriteByte(uint16_t bAdd, uint8_t bData)
{
    uint8_t GIEBitValue = INTCONbits.GIE;
   
    //Set NVMADR with the target word address: 0x310000 - 0x3103FF
    NVMADRU = 0x31;
    NVMADRH = (uint8_t)((bAdd & 0xFF00) >> 8);
    NVMADRL = (uint8_t)(bAdd & 0x00FF);

    //Load NVMDATL with desired byte
    NVMDATL = (uint8_t)(bData & 0xFF);
   
    //Enable NVM access
    NVMCON0bits.NVMEN = 1;
   
    //Disable interrupts
    INTCONbits.GIE = 0;

    //Perform the unlock sequence
    NVMCON2 = 0x55;
    NVMCON2 = 0xAA;

    //Start DATAEE write and wait for the operation to complete
    NVMCON1bits.WR = 1;
    while (NVMCON1bits.WR);

    //Restore all the interrupts
    INTCONbits.GIE = GIEBitValue;

    //Disable NVM access
    NVMCON0bits.NVMEN = 0;
}
cdyyabc 发表于 2019-7-16 15:11 | 显示全部楼层
如果你用硬件调试工具,写了EE之后,IDE里面EE窗口数据是不会变化的。需要停下来,读一下芯片,才能刷新到IDE的窗口
yiyigirl2014 发表于 2019-7-16 15:29 | 显示全部楼层
自己写,会漏掉一些内容。除非对寄存器和手册非常非常了解。
 楼主| rpk74A 发表于 2019-7-16 19:47 | 显示全部楼层
cdyyabc 发表于 2019-7-16 15:11
如果你用硬件调试工具,写了EE之后,IDE里面EE窗口数据是不会变化的。需要停下来,读一下芯片,才能刷新到I ...

我写入之后,我用读eeprom去读取内容,希望的数值没有写入,通过校对
 楼主| rpk74A 发表于 2019-7-16 19:48 | 显示全部楼层
yiyigirl2014 发表于 2019-7-16 15:29
自己写,会漏掉一些内容。除非对寄存器和手册非常非常了解。

我担心系统bug会更难差,我用数据手册对照写的。刚刚对比了MMC生成代码,没有什么差别
 楼主| rpk74A 发表于 2019-7-16 19:49 | 显示全部楼层
北极风 发表于 2019-7-16 08:23
用MCC生成多好,不用自己一点点写了。

下面是MCC生成的代码。

谢谢您的答复,我去试试看
zhuotuzi 发表于 2019-7-19 00:46 | 显示全部楼层
建议直接打印出来看。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

1

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