首页>>论坛 >>技术社区 >>飞思卡尔社区论坛 >>16位MCU
|
我要发帖  | 我要投票  | 我要回复  | 收藏
1

MC9S12D64非专家模式的内部1K EEPROM操作问题

版主: 南京老练   
MC9S12D64非专家模式的内部1K EEPROM操作问题
 

各位朋友:

 小弟最近操作MC9S12D64非专家模式的内部1K EEPROM,发现总是操作不成功,

现在主要问题是:经查询,首先应该设定INITEE寄存器,将EEPROM地址重新映射,否则就被RAM和内部寄存器挡住了。我贴上我的主要代码,麻烦有经验的给看看:

  注意是:非专家模式

1、初始化时钟(使用的是外部24M晶振)后,设定INITEE = 41;

2、初始化EEPROM分频等

 /************************************************* 
   功能   : EEPROM初始化
   参数   : OSCCLK 晶振频率,这里用KHz表示 
 
Returns   :无          
**************************************************/
void EEPROMInit(void)  
{  
    ECLKDIV|=0X51;//晶振频率进入分频器前8分频,分频系数16 
    ESTAT_PVIOL=1;    /*清零写保护侵害故障*/  
    ESTAT_ACCERR=1;   /*清零访问错误故障*/  
      
    ECNFG_CCIE=0;     /*命令完成中断禁止*/  
    ECNFG_CBEIE=0;    /*命令缓冲器空中断禁止*/  
      
    EPROT_EPOPEN=1;   /*EEPROM不被写保护*/  
    EPROT_EPDIS=1;    /*无保护区域*/  
}

3、将需要写的地址擦除

 

/************************************************* 
   功能   : EEPROM扇区擦除
   参数   : addr
            data_length
   返回值 :   1  OK
              0  FAIL              
**************************************************/  
uchar EEPROMSectorErase(volatile uint *addr)       
{    
    uchar   count;     
   if((ESTAT_PVIOL==1) || (ESTAT_ACCERR==1))     //发现错误
    {  
        ESTAT_PVIOL=1;  
        ESTAT_ACCERR=1;                      //清除中断标志  
         return(0);  
    }        
    
          while(!ESTAT_CBEIF){}                 //判断命令缓冲区是否为空
          *addr=0xFF;  
          ECMD=0x40;  
          ESTAT_CBEIF=1;                          //清除中断标志   
          if((ESTAT_PVIOL==1) || (ESTAT_ACCERR==1)) //发现错误   
          {  
              ESTAT_PVIOL=1;  
              ESTAT_ACCERR=1;                       //清除错误标志  
              return(0);  
          }  

  while(ESTAT_CCIF!=1)  //等待所有的指令操作完成
   {  
   } 
  return(1);  
}

 

4、编程/************************************************* 
   功能   : EEPROM字编程
   参数   : addr
            data
            data_length
   返回值 :   1  OK
              0  FAIL              
**************************************************/ 
uchar EEPROMWordProgram(uint addr,volatile uint data)  
{  
    uint *paddr;  
    uchar   count;    
          
    if((ESTAT_PVIOL==1) || (ESTAT_ACCERR==1))  
    {  
        ESTAT_PVIOL=1;  
        ESTAT_ACCERR=1;                       //清除中断标志  
        //return(0);   
    }    
          paddr= (uint *)addr;  
          while(!ESTAT_CBEIF){}                   //判断命令缓冲区是否为空  
          *paddr=data;                            //写数据到地址   
          ECMD=0x20;  
          ESTAT_CBEIF=1;                          //清除中断标志  
          if(ESTAT_PVIOL==1 || ESTAT_ACCERR==1)   //发现错误  
          {  
              ESTAT_PVIOL=1;  
              ESTAT_ACCERR=1;                       //清除中断标志    
              return(0);  
          }  
 
 while(ESTAT_CCIF!=1)    //等待所有的指令操作完成
  {  
  }  
  return(1);  
}

5、读取验证

/************************************************* 
   功能   : EEPROM读一个字
   参数   : addr
            *data
   返回值 :   1  OK
              0  FAIL              
**************************************************/  
uchar EEPROMWordRead(volatile uint addr,uint data)  
{  
          data=*(uint *)addr;  
          return(1);   
}

飞思卡尔内部EEPROM研究.rar

希望有经验的给看一看

附件:请先登陆查看附件!
 
相关主题
回复 链接 收藏
 
RE:MC9S12D64非专家模式的内部1K EEPROM操作问题
 
自己顶一个,希望多帮忙
 
回复 链接 收藏
 
RE:MC9S12D64非专家模式的内部1K EEPROM操作问题
 
你看一下下面地址的例程和说明文档,或许有帮助.我再帮你看看程序.
http://www.freescaleic.org/bbs/article_265_193299.html
 
站在ARM的平台上看DSP,我们还需要奋进。
回复 链接 收藏
 
RE:MC9S12D64非专家模式的内部1K EEPROM操作问题
 
好的,先谢谢这位大哥了,我也多看看
 
回复 链接 收藏
 
RE:MC9S12D64非专家模式的内部1K EEPROM操作问题
 
上楼的大哥,你说的例程,我也基本看过了,但是貌似程序结构,以及工程的结构都大不一样,我贴的程序,在专家模式下,基本能用,但是非专家模式就是不行
 
回复 链接 收藏
 
我要发帖  | 我要投票  | 我要回复  | 收藏
1