调试通过的SST89E564RD的内部EEPROM的读写程序

2006-12-30 01:39 3941 0 分类: MCU/ 嵌入式
调试通过的SST89E564RD的内部EEPROM的读写程序


/*  89E564 Extensions */
sfr IPA   = 0xF8;
sfr IEA   = 0xE8;
sfr SADEN = 0xA9;
sfr SPSR  = 0xAA;
sfr AUXR1 = 0xA2;
sfr AUXR  = 0x8E;
sfr WDTD  = 0x85;
sfr SPDR  = 0x86;
sfr SFCF  = 0xB1;
sfr SFCM  = 0xB2;
sfr SFAL  = 0xB3;
sfr SFAH  = 0xB4;
sfr SFDT  = 0xB5;
sfr SFST  = 0xB6;
sfr IPH   = 0xB7;
sfr SPCR  = 0xD5;
sfr IPAH  = 0xF7;


//块擦除
void Block_Erase (unsigned int);
//扇区擦除
void Sector_Erase(unsigned int);
//字节编程
void Byte_Program(unsigned int, unsigned char);
//扇区拷贝
void Sector_Copy(unsigned int, unsigned int);
//字节校验
unsigned char Byte_Verify(unsigned int);
//等待IAP结束
unsigned char ready(void);


//块擦除
void Block_Erase (unsigned int DataAddr) using 0
{
  SFCF |= IAP_EN_;//启动IAP
  SFAH = DataAddr / 256;//扇区地址高字节
  SFAL = DataAddr;//扇区地址低字节
  SFDT = 0x55;
  SFCM = SFCM_BE;//写入块擦除命令字
  if (ready() == 0) {
    while(1);
  }
}

//扇区擦除
void Sector_Erase (unsigned int DataAddr) using 0
{
  SFCF |= IAP_EN_;//启动IAP
  SFAH = DataAddr / 256;//扇区地址高字节
  SFAL = DataAddr;//扇区地址低字节
  SFCM = SFCM_SE;//写入扇区擦除命令字
  if (ready() == 0) {
    while(1);
  }
}

//字节编程
void Byte_Program (unsigned int DataAddr, unsigned char DataByte) using 0
{
  SFCF |= IAP_EN_;//启动IAP
  SFAH = DataAddr >> 8;//要编程地址高字节
  SFAL = DataAddr;//要编程地址低字节
  SFDT = DataByte;//要编程的数据
  SFCM = SFCM_PB;//写入字节编程命令字
  if (ready() == 0) {
    while(1);
  }
}

//字节校验
unsigned char Byte_Verify(unsigned int DataAddr) using 0
{
unsigned char DataByte;
  SFCF |= IAP_EN_;//启动IAP
  SFAH = DataAddr >> 8;//要编程地址高字节
  SFAL = DataAddr;//要编程地址低字节
  SFDT = DataByte;//要编程的数据
  SFCM = SFCM_VB;//写入字节校验命令字
  DataByte = SFDT;
  SFCF &= ~IAP_EN_;//关闭IAP
  SFDT = 0;
  return DataByte;
}

void Sector_Copy(unsigned int DataAddr0, unsigned int DataAddr1) using 0
{
unsigned char i, ch;
  if ((DataAddr0 >= 0xC000) && (DataAddr1 >= 0xC000)) {//必须为FLASH块1
    if ((DataAddr0 & 0xff80) != (DataAddr1 & 0xff80)) {//没个扇区64个字节
      DataAddr0 &= 0xff80;//取扇区内64个字节的首地址
      DataAddr1 &= 0xff80;//取扇区内64个字节的首地址
      Sector_Erase(DataAddr0);//删除目的扇区
      for (i = 0; i < 128; i ++) {//拷贝扇区内的64个字节
        ch = Byte_Verify(DataAddr1 + i);//读源扇区数据
        Byte_Program(DataAddr0 + i, ch);//写目的扇区数据
      }
    }
  }
}


//等待IAP结束
unsigned char ready(void) using 0
{
unsigned long TimeOut = 0;
unsigned char error = 0;
  while(TimeOut ++ < 100000) {
    if ((SFST & Flash_busy_) == 0) {
      error ++;
      break;
    }
  }
  SFCF &= ~IAP_EN_;//关闭IAP
  SFDT = 0;
  return error;
}

广告

文章评论 0条评论)

登录后参与讨论
相关推荐阅读
雁塔菜农 2012-04-10 12:17
紧急通知:今天下午2:50和7:25抢楼两次
http://bbs.21ic.com/icview-324879-1-1.html ...
雁塔菜农 2012-04-07 16:47
菜农创建西北狼群196098127,欢迎西安网友入群
西北狼群:196098127 互相交流,同城交友,同学进步,同志莫入。 ...
雁塔菜农 2012-04-05 17:51
2012年度新唐Cortex-M0助学开发套件有约束条件赠送申报贴
2012年度新唐Cortex-M0助学套件从4月起每月有约束条件发放16套。 申报人必须是21ic或 EDNC 会员 并具备1月的会龄。 申报时必须注明“遵守约束条件,缴纳250元订金,上...
雁塔菜农 2012-04-05 17:04
2012年度Cortex-M0助学园地推广框图
...
雁塔菜农 2012-04-01 17:59
2012年度Cortex-M0助学园地奖励计划细则
抢楼请点击:菜地公告:即日起创建《菜农Cortex-M0助学园地》(盖楼入口) 每月10号和25号的下午2:50进行2次抢楼,规则同去年12月的疯狂抢楼活动。 奖品由21IC、北航、广州迪圣...
雁塔菜农 2012-02-03 08:19
菜农谋略:搞定牛人宋俊德,对女牛人孙昌旭说:“记住,俺是雁塔菜农~~~ ”
http://www.baidu.com/s?wd=%B2%CB%C5%A9%D0%A6%CC%B8%A1%B6%D0%C2%C0%CB%C3%FB%C8%CB%D0%A7%D3%A6%A1%B7...
我要评论
0
0
广告