打印

pic30f4011的eeprom读写问题

[复制链接]
3855|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gamezm|  楼主 | 2009-3-13 09:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
诸位大侠我的这段eeprom的程序在app009开发板上调试时,我设计的是先写入ee一个数,再读出来,判断读的是那个数,点亮相应的led,现在读写这有问题谁帮我看一下谢谢
#include<p30f4011.h>
#include<math.h>
int failmemory[40];

int   a,b;//EE读写地址
int   *eew_data,*eer_data;//EE读,写指针

int   medium;//中转寄存器

int   led;


void InitializeSys()//程序初始化
{
    INTCON1 = 0x0000;           //关中断                
    INTCON2 = 0x0000;                
    IEC0 = 0x0000;              //IECx中断禁止                    
    IEC1 = 0x0000;
    IEC2 = 0x0000;
    
 TRISEbits.TRISE0=0;  
 TRISEbits.TRISE1=0;  
 TRISEbits.TRISE2=0; 
 TRISEbits.TRISE3=0;
 TRISEbits.TRISE4=0;
 TRISEbits.TRISE5=0;
 TRISEbits.TRISE8=0;
 TRISBbits.TRISB3=0;
 TRISBbits.TRISB4=0;
 TRISBbits.TRISB5=0;//模拟输入出端口

}

//*****************擦除FLASH EEPROM的一个字子程序***************************
void ex_write()
{
  NVMCON=0x4044;//WR,REN,WRERR,xxxxx,PROGOP<7:0>     
                // 0,  1,    0,00000,       44
                //写(编程或擦除)控制位'1写',
                //写(擦除或编程)使能位
                //闪存错误标志位
                //未用,用户代码应该在这些单元中写入0
                //编程操作命令字节位
                 //擦除操作:
                 //0x41 = 从程序闪存中的一个板擦除1 行(32 个指令字)
                 //0x44 = 从数据闪存擦除1 个数据字
                 //0x45 = 从数据闪存擦除1 行(16 个数据字)
                 //编程操作:
                 //0x01 = 将1 行(32 指令字)编程入闪存程序存储器
                 //0x04 = 将1 个数据字编入数据EEPROM
                 //0x05 = 将1 行(16 个数据字)编程入数据EEPROM
                 //0x08 = 将1 个数据字编程入器件配置寄存器

  IFS0bits.NVMIF=0;//中断标志状态寄存器0,非易失性存储器写完成中断标志状态位,未发生中断请求
  IEC0bits.NVMIE=0;//中断允许控制寄存器0,非易失性存储器写完成中断允许位,不允许中断请求
  NVMKEY=0x55;//防止EEPROM的误写/误擦除,
  NVMKEY=0xaa;
  NVMCONbits.WR=1;//控制开始eeprom写,只能由硬件清‘0’
  __asm__( "NOP");//插入两个指令周期的等待时间,单片机将读取指定单元内容,并且放入EEDATA中
  __asm__( "NOP");
  while (IFS0bits.NVMIF==0){;}//在写操作完成时,IFS0 寄存器中的中断标志位NVMIF 将置1。它必须用软件清零。
  IFS0bits.NVMIF=0;
}
//*****************写EEPROM子程序*************************这里是不是应该写入一个数,在读eeprom拿来判断这个数,是led亮,不是led不亮
void ee_write()
{
  __asm__( "MOV 0x0850,W1 " );//指针指向的地址,a的地址
  __asm__( "TBLWTL W1,[W0]");

  NVMCON=0x4004;
  IFS0bits.NVMIF=0;
  IEC0bits.NVMIE=0;
  NVMKEY=0x55;
  NVMKEY=0xaa;
  NVMCONbits.WR=1;
  __asm__( "NOP");
  __asm__( "NOP");
  while (IFS0bits.NVMIF==0){;}    
  IFS0bits.NVMIF=0;
}

//*****************读EEPROM子程序**************************
void ee_read()
{
      __asm__( "MOV #tblpage(0x7ffc02),W0" );
      __asm__( "MOV W0,TBLPAG" );            
      __asm__( "MOV #tbloffset(0x7ffc02),W0");
      __asm__( "TBLRDL [W0], W4 " );
      __asm__( "MOV W4,0x0852");
      led=*eer_data;
}
//*********************延时******************************
void delay_1ms(int delay)// 1ms delay
{
   unsigned int delay1, delay2;
   for(delay2=0;delay2<=delay;delay2++)
   {for(delay1=0;delay1<=10000;delay1++) ;}
}
 //**************主程序**************************
int main(void)
  {
      InitializeSys();      //系统初始化
      eew_data=&a;      //指针指向
      eer_data=&b;



      *eew_data=1;  
      __asm__( "MOV #tblpage(0x7ffc02),W0" );
      __asm__( "MOV W0,NVMADRU" );           
      __asm__( "MOV #tbloffset(0x7ffc02),W0");
      __asm__( "MOV W0,NVMADR" );
      ex_write();
 
      __asm__( "MOV #tblpage(0x7ffc02),W0" );
      __asm__( "MOV W0,TBLPAG" );
      __asm__( "MOV #tbloffset(0x7ffc02),W0" );
      ee_write();  

      delay_1ms(100);

      ee_read();

      if(led==1)
        {
           LATEbits.LATE0=1;
           LATEbits.LATE1=0;//亮
        }
      else if(led==2)
        {
           LATEbits.LATE0=0;
           LATEbits.LATE1=1;//亮
        }
  }
沙发
skygrow| | 2009-3-13 12:07 | 只看该作者

官方网站有例程

http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2620
CE017

使用特权

评论回复
板凳
gamezm|  楼主 | 2009-3-13 12:42 | 只看该作者

我用的是c30 主要是想大家帮我看看我的这个程序哪不对

使用特权

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

本版积分规则

2

主题

3

帖子

0

粉丝