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

dsPIC内部EEPROM不能擦除写操作,求高手指点

[复制链接]
4035|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
杨立业yly|  楼主 | 2013-7-31 14:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

int main(void)
{   
    fnInitLcd();
   
    i = fnReadEEByTable(2);      
    fnDigiDisplay( i );  
    fnEraseEE(2);   
    fnWriteEE(2,6);
    while(1);
}
                                                  
void fnWriteCmd(unsigned int Cmd)
{
          NVMCON  = Cmd;
          
      asm volatile ("push SR");
      asm volatile ("mov #0x00e0,w0");
      asm volatile ("ior SR");       
      asm volatile ("mov #0x55,w0");
      asm volatile ("mov w0,NVMKEY");
      asm volatile ("mov #0xAA,w1");
      asm volatile ("mov w1,NVMKEY");
        
      asm("NOP");
      asm("NOP");       
      asm volatile ("pop SR");       
      
      NVMCONbits.WR = 1;              
      while(NVMCONbits.WR == 1);
             
}
unsigned int  fnReadEEByTable(unsigned int addr) //通过表读指令从EEPROM中读一行指令到RAM                  
{
        unsigned int ReturnValue;
       
        TBLPAG = 0x7F;
        WREG0 = addr*2+0xfc00;
       
        asm volatile("TBLRDL [w0], w4");
       
        ReturnValue = WREG4;

        return ReturnValue;
       
}
void fnEraseEE(unsigned int OffsetAddr)  // 擦除EEPROM中指定的一个字数据
  {
      NVMADRU = 0x7F;
      NVMADR  = OffsetAddr*2+0xfc00;
  
      fnWriteCmd(EE_ERASE_WORD);   
      NVMCONbits.WREN = 0;         
  }

void fnWriteEE(unsigned  int OffsetAddr,unsigned int SourceArray) // 向EEPROM中指定的行写入一个字数据
  {
            WREG1 = SourceArray;
            WREG2 = OffsetAddr*2 + 0xfc00;       

            asm volatile("TBLWTL.W w1, [w2]");         
               
            fnWriteCmd(EE_WRITE_WORD);  
            NVMCONbits.WREN = 0;                              
  }
这是我写的对dsPICD30f5015内部EEPROM 擦除和写操作的代码,我先擦除再写最后读出来在LCD上显示
但是擦不了写不上,不知道哪里的问题,求指点
沙发
ocon| | 2013-7-31 23:01 | 只看该作者
建议你用C编译器内置的EEPROM读写函数,这种场合不值得插汇编代码牺牲兼容性。

使用特权

评论回复
板凳
yewuyi| | 2013-8-1 09:28 | 只看该作者
好奇怪,你在这里为何要用嵌入汇编的方式呢?

C语言难道不能解决这个问题?

自己用C语言对着库函数里面的读写EEPROM的范例并结合DATASHEET写即可。

使用特权

评论回复
地板
keedy| | 2013-10-8 22:56 | 只看该作者
应该是你的配置不对,把配置发给大家看看

使用特权

评论回复
5
2008wzs| | 2014-1-4 09:43 | 只看该作者
yewuyi 发表于 2013-8-1 09:28
好奇怪,你在这里为何要用嵌入汇编的方式呢?

C语言难道不能解决这个问题?

请问是哪个库函数哇?我用的是dsPIC6014A,dsPIC6014A.h里没有EEPROM的读写函数啊?菜鸟,勿喷哈

使用特权

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

本版积分规则

5

主题

125

帖子

0

粉丝