[PIC®/AVR®/dsPIC®产品] dsPIC内部EEPROM不能擦除写操作,求高手指点

[复制链接]
4452|4
 楼主| 杨立业yly 发表于 2013-7-31 14:22 | 显示全部楼层 |阅读模式

  1. int main(void)
  2. {   
  3.     fnInitLcd();
  4.    
  5.     i = fnReadEEByTable(2);      
  6.     fnDigiDisplay( i );  
  7.     fnEraseEE(2);   
  8.     fnWriteEE(2,6);
  9.     while(1);
  10. }
  11.                                                   
  12. void fnWriteCmd(unsigned int Cmd)
  13. {
  14.           NVMCON  = Cmd;
  15.           
  16.       asm volatile ("push SR");
  17.       asm volatile ("mov #0x00e0,w0");
  18.       asm volatile ("ior SR");       
  19.       asm volatile ("mov #0x55,w0");
  20.       asm volatile ("mov w0,NVMKEY");
  21.       asm volatile ("mov #0xAA,w1");
  22.       asm volatile ("mov w1,NVMKEY");
  23.         
  24.       asm("NOP");
  25.       asm("NOP");       
  26.       asm volatile ("pop SR");       
  27.       
  28.       NVMCONbits.WR = 1;              
  29.       while(NVMCONbits.WR == 1);
  30.              
  31. }
  32. unsigned int  fnReadEEByTable(unsigned int addr) //通过表读指令从EEPROM中读一行指令到RAM                  
  33. {
  34.         unsigned int ReturnValue;
  35.        
  36.         TBLPAG = 0x7F;
  37.         WREG0 = addr*2+0xfc00;
  38.        
  39.         asm volatile("TBLRDL [w0], w4");
  40.        
  41.         ReturnValue = WREG4;

  42.         return ReturnValue;
  43.        
  44. }
  45. void fnEraseEE(unsigned int OffsetAddr)  // 擦除EEPROM中指定的一个字数据
  46.   {
  47.       NVMADRU = 0x7F;
  48.       NVMADR  = OffsetAddr*2+0xfc00;
  49.   
  50.       fnWriteCmd(EE_ERASE_WORD);   
  51.       NVMCONbits.WREN = 0;         
  52.   }

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

  57.             asm volatile("TBLWTL.W w1, [w2]");         
  58.                
  59.             fnWriteCmd(EE_WRITE_WORD);  
  60.             NVMCONbits.WREN = 0;                              
  61.   }
这是我写的对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 | 显示全部楼层
应该是你的配置不对,把配置发给大家看看
2008wzs 发表于 2014-1-4 09:43 | 显示全部楼层
yewuyi 发表于 2013-8-1 09:28
好奇怪,你在这里为何要用嵌入汇编的方式呢?

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

请问是哪个库函数哇?我用的是dsPIC6014A,dsPIC6014A.h里没有EEPROM的读写函数啊?菜鸟,勿喷哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

125

帖子

0

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