搜索
bottom↓
回复: 10

mc9s12xdp512的EEPROM

[复制链接]

出0入0汤圆

发表于 2011-11-10 12:45:51 | 显示全部楼层 |阅读模式
飞思卡尔 mc9s12xdp512的EEPROM读写,有写过的贴下代码。。。谢了!

出0入147汤圆

发表于 2011-11-10 13:41:57 | 显示全部楼层
xdp512的手册有详细的读写流程图,另外可以Codewarrior自带的PE生成代码参考下
xdp512的EEPROM可编程为每8字节或每4字节一个扇区,每次写入时要确保该扇区已被擦除,如果是批量写入数据的话,要注意跨扇区的处理,最好是以4字节对齐写入。

出0入0汤圆

 楼主| 发表于 2011-11-10 14:14:53 | 显示全部楼层
0x13_F000   到   0x13_FFFF    这下划线什么意思?

初始化部分:      
      ECLKDIV = 0x28; //EEPROM CLK    200K
      ECNFG = 0x00; //关命令缓冲区空中断,关命令完成中断
      EPROT = 0x88; // 关写保护
      ESTAT = 0x00; //标志位清零
//写EEPROM
void EEPROMWrite(long  Address,short WData)
{

  if(ECLKDIV_EDIVLD == 1)
  {
    if(ESTAT_CBEIF == 1)
  
    {  
      if((ESTAT_PVIOL == 0) && (ESTAT_ACCERR == 0))
      {
        EADDRHI = (Address >> 8) & 0xff;
        EADDRLO = Address & 0xff;
        EDATAHI = (WData >> 8) & 0xff;
        EDATALO = WData & 0xff;
        ECMD = 0x20;
        ESTAT = 0x80;
        while(ESTAT_CBEIF == 0);
        while(ESTAT_CCIF == 0);  
      }
      else
      {
        ESTAT = 0x30;  
      }

  }
  else
  ECLKDIV = 0x28;
  }
}
//擦除
void EEPROMErase(long Address,short EData)
{

  if(ECLKDIV_EDIVLD == 1)
  {
    if(ESTAT_CBEIF == 1)
  
    {  
      if((ESTAT_PVIOL == 0) && (ESTAT_ACCERR == 0))
      {
        EADDRHI = (Address >> 8) & 0xff;
        EADDRLO = Address & 0xff;
        EDATAHI = (EData >> 8) & 0xff;
        EDATALO = EData & 0xff;
        ECMD = 0x05;
        ESTAT = 0x80;
        while(ESTAT_CCIF == 0);
        while(ESTAT_BLANK == 0);
      
      }
      else
      {
        ESTAT = 0x30;  
      }

    }
  else
  ECLKDIV = 0x28;
  }
}


这样貌似不行。。。有什么问题吗?

出0入0汤圆

 楼主| 发表于 2011-11-14 19:01:01 | 显示全部楼层
高手路过,回答下。。。逻辑地址,页地址,全局地址;




EEPROM地址 (原文件名:未命名.jpg)


MMC,逻辑地址与全局地址 (原文件名:未命名1.jpg)

出0入0汤圆

 楼主| 发表于 2011-11-15 08:54:43 | 显示全部楼层
EEprom应该写到什么地址?怎么配置?谢了。

出0入147汤圆

发表于 2011-11-15 21:00:03 | 显示全部楼层
如果你的数据少的话,可以存到0xC00至0x1000这个区间,如果想利用全部4K的EEPROM,就需要通过EPAGE寄存器来将另外的另外的3K空间映射到0x800至0xBFF这个区间。

(原文件名:xdp512.JPG)

出0入0汤圆

 楼主| 发表于 2011-11-17 09:18:59 | 显示全部楼层
0xC00至0x1000   ,貌似我试过,仿真时MEMERY窗口能看到写进去的值;  但断电貌似就丢失了。。。。

硬件都被拿出去调试了,等硬件回来。。。我再试试了。。。。先谢了。


dreampet 原野   留个联系方式吧,呵呵。。我的QQ 549848360

出0入0汤圆

发表于 2012-12-18 22:07:32 | 显示全部楼层
学习一下!

出0入0汤圆

发表于 2015-7-17 15:30:41 | 显示全部楼层
unsigned char write(unsigned long addr, unsigned long data)
{
       
        ESTAT_PVIOL = 1;
        ESTAT_ACCERR = 1;                            //clear error flags
        if(( ESTAT_PVIOL == 1) || (ESTAT_ACCERR == 1))
        {
                ESTAT_PVIOL = 1;
                ESTAT_ACCERR = 1;                        //clear error flags
            return(0);
        }

        while(!ESTAT_CBEIF);                        //if there are still some commands in the buffer, wait

       
                *(unsigned short *far)addr = 0xFF;
        ECMD = EE_CMD_SECTORERASE;
        ESTAT |= 0x80;                            //clear the interrupt flag
        if((ESTAT_PVIOL == 1) || (ESTAT_ACCERR == 1))//if there are erros
        {
                ESTAT_PVIOL = 1;
                ESTAT_ACCERR = 1;                        //clear error flags
                return(0);
        }

        while(!ESTAT_CBEIF);                        //if there are still some commands in the buffer, wait
  while(!ESTAT_CCIF);


               
        if( (ESTAT_PVIOL == 1) || (ESTAT_ACCERR == 1))
        {
                ESTAT_PVIOL=1;
                ESTAT_ACCERR=1;                                 //clear error flags
                return(0);
        }
       
        while(!ESTAT_CBEIF){};                            //if there are still some commands in the buffer, wait
        *(unsigned short *far)addr = ((unsigned short *)&data)[0];
                                  //write the data into the address
        ECMD = EE_CMD_WORDWRITE;
        ESTAT |= 0x80;                                    //clear the interrupt flag.
        if(ESTAT_PVIOL == 1 || ESTAT_ACCERR == 1)         //there are errors.
        {
                ESTAT_PVIOL=1;
                ESTAT_ACCERR=1;                                 //clear the error flags.
                return(0);
               
        }
        while(!ESTAT_CCIF);
       
       
       
        if( (ESTAT_PVIOL == 1) || (ESTAT_ACCERR == 1))
        {
                ESTAT_PVIOL=1;
                ESTAT_ACCERR=1;                                 //clear error flags
                return(0);
        }
       
        while(!ESTAT_CBEIF){};                            //if there are still some commands in the buffer, wait
        *(unsigned short *far)(addr+2) = ((unsigned short *)&data)[1];                                    //write the data into the address
        ECMD = EE_CMD_WORDWRITE;
        ESTAT |= 0x80;                                    //clear the interrupt flag.
        if(ESTAT_PVIOL == 1 || ESTAT_ACCERR == 1)         //there are errors.
        {
                ESTAT_PVIOL=1;
                ESTAT_ACCERR=1;                                 //clear the error flags.
                return(0);
               
        }
        while(!ESTAT_CCIF);
        return 1;

}
地址从0x13f000开始

出0入0汤圆

发表于 2015-7-17 15:32:47 | 显示全部楼层
unsigned char write(unsigned long addr, unsigned long data)
{
       
        ESTAT_PVIOL = 1;
        ESTAT_ACCERR = 1;                            //clear error flags
        if(( ESTAT_PVIOL == 1) || (ESTAT_ACCERR == 1))
        {
                ESTAT_PVIOL = 1;
                ESTAT_ACCERR = 1;                        //clear error flags
            return(0);
        }

        while(!ESTAT_CBEIF);                        //if there are still some commands in the buffer, wait

       
                *(unsigned short *far)addr = 0xFF;
        ECMD = EE_CMD_SECTORERASE;
        ESTAT |= 0x80;                            //clear the interrupt flag
        if((ESTAT_PVIOL == 1) || (ESTAT_ACCERR == 1))//if there are erros
        {
                ESTAT_PVIOL = 1;
                ESTAT_ACCERR = 1;                        //clear error flags
                return(0);
        }

        while(!ESTAT_CBEIF);                        //if there are still some commands in the buffer, wait
  while(!ESTAT_CCIF);


               
        if( (ESTAT_PVIOL == 1) || (ESTAT_ACCERR == 1))
        {
                ESTAT_PVIOL=1;
                ESTAT_ACCERR=1;                                 //clear error flags
                return(0);
        }
       
        while(!ESTAT_CBEIF){};                            //if there are still some commands in the buffer, wait
        *(unsigned short *far)addr = ((unsigned short *)&data)[0];
                                  //write the data into the address
        ECMD = EE_CMD_WORDWRITE;
        ESTAT |= 0x80;                                    //clear the interrupt flag.
        if(ESTAT_PVIOL == 1 || ESTAT_ACCERR == 1)         //there are errors.
        {
                ESTAT_PVIOL=1;
                ESTAT_ACCERR=1;                                 //clear the error flags.
                return(0);
               
        }
        while(!ESTAT_CCIF);
       
       
       
        if( (ESTAT_PVIOL == 1) || (ESTAT_ACCERR == 1))
        {
                ESTAT_PVIOL=1;
                ESTAT_ACCERR=1;                                 //clear error flags
                return(0);
        }
       
        while(!ESTAT_CBEIF){};                            //if there are still some commands in the buffer, wait
        *(unsigned short *far)(addr+2) = ((unsigned short *)&data)[1];                                    //write the data into the address
        ECMD = EE_CMD_WORDWRITE;
        ESTAT |= 0x80;                                    //clear the interrupt flag.
        if(ESTAT_PVIOL == 1 || ESTAT_ACCERR == 1)         //there are errors.
        {
                ESTAT_PVIOL=1;
                ESTAT_ACCERR=1;                                 //clear the error flags.
                return(0);
               
        }
        while(!ESTAT_CCIF);
        return 1;

}
地址从0x13f000开始

出0入0汤圆

发表于 2015-7-17 15:52:46 | 显示全部楼层
unsigned char write(unsigned long addr, unsigned long data)
{
       
        ESTAT_PVIOL = 1;
        ESTAT_ACCERR = 1;                            //clear error flags
        if(( ESTAT_PVIOL == 1) || (ESTAT_ACCERR == 1))
        {
                ESTAT_PVIOL = 1;
                ESTAT_ACCERR = 1;                        //clear error flags
            return(0);
        }

        while(!ESTAT_CBEIF);                        //if there are still some commands in the buffer, wait

       
                *(unsigned short *far)addr = 0xFF;
        ECMD = EE_CMD_SECTORERASE;
        ESTAT |= 0x80;                            //clear the interrupt flag
        if((ESTAT_PVIOL == 1) || (ESTAT_ACCERR == 1))//if there are erros
        {
                ESTAT_PVIOL = 1;
                ESTAT_ACCERR = 1;                        //clear error flags
                return(0);
        }

        while(!ESTAT_CBEIF);                        //if there are still some commands in the buffer, wait
  while(!ESTAT_CCIF);


               
        if( (ESTAT_PVIOL == 1) || (ESTAT_ACCERR == 1))
        {
                ESTAT_PVIOL=1;
                ESTAT_ACCERR=1;                                 //clear error flags
                return(0);
        }
       
        while(!ESTAT_CBEIF){};                            //if there are still some commands in the buffer, wait
        *(unsigned short *far)addr = ((unsigned short *)&data)[0];
                                  //write the data into the address
        ECMD = EE_CMD_WORDWRITE;
        ESTAT |= 0x80;                                    //clear the interrupt flag.
        if(ESTAT_PVIOL == 1 || ESTAT_ACCERR == 1)         //there are errors.
        {
                ESTAT_PVIOL=1;
                ESTAT_ACCERR=1;                                 //clear the error flags.
                return(0);
               
        }
        while(!ESTAT_CCIF);
       
       
       
        if( (ESTAT_PVIOL == 1) || (ESTAT_ACCERR == 1))
        {
                ESTAT_PVIOL=1;
                ESTAT_ACCERR=1;                                 //clear error flags
                return(0);
        }
       
        while(!ESTAT_CBEIF){};                            //if there are still some commands in the buffer, wait
        *(unsigned short *far)(addr+2) = ((unsigned short *)&data)[1];                                    //write the data into the address
        ECMD = EE_CMD_WORDWRITE;
        ESTAT |= 0x80;                                    //clear the interrupt flag.
        if(ESTAT_PVIOL == 1 || ESTAT_ACCERR == 1)         //there are errors.
        {
                ESTAT_PVIOL=1;
                ESTAT_ACCERR=1;                                 //clear the error flags.
                return(0);
               
        }
        while(!ESTAT_CCIF);
        return 1;

}
地址从0x13f000开始
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-9 05:09

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表