原创 SST39VF6401操作的API接品函数

2008-8-22 14:15 3181 6 6 分类: MCU/ 嵌入式
HI ,大家好,今天是2008年的第一天,不知大家上班是否很忙呢?

随着项目的进展,工作也越来起忙了,虽然是第一天也没有一点空闲呀,上午写了一个对SST39VF6401操作的API函数,这也是我整个项目中要使用的一个小模块,做好了放到这里以备后用。

 

/******************************************************/
/*                                                       */
/*                                                       */
/* 文件名称:.c                                          */
/* 文件标识:                                            */
/* 摘 要:                                               */
/*                                                       */
/* 当前版本:                                            */
/* 作 者:   magicchip                                   */
/* 完成日期:                                            */
/* 修改版本:                                            */
/*                                                       */
/*                                                       */
/*********************************************************/

#i nclude "..\src\config.h"

//#define   rstflash(void)    (IO1SET = SST39VF6401RST,DelayNS(1),IO1CLR = SST39VF6401RST)
//  rstflash();
/********************************************************************************************************
** 函数名称:void resetsst(void)
** 函数功能:对flash存储器进行复位
** 入口参数:无
** 出口参数:无
** create by:   magicchip
** create data: 2007/12/28
********************************************************************************************************/
void RESETSST(void)
{
  uint16 *rstaddr;
  IO1CLR = SST39VF6401RST;
  DelayNS(1);
  IO1SET = SST39VF6401RST;
  rstaddr = (uint16 *)0x81000000;
  *rstaddr = 0x00f0;
  rstaddr = (uint16 *)0x82000000;
  *rstaddr = 0x00f0;  
}

/********************************************************************************************************
** 函数名称:bool writesst(uint32 writesstaddr, uint16 *writesstdata,uint8 writesstlen)
** 函数功能:对flash存储器进行写操作
** 入口参数:存数据的起始地址,写数据的起始地址,写数据的长度
** 出口参数:ture or false
** create by:   magicchip
** create data: 2008/01/02
********************************************************************************************************/

bool writesst(uint32 writesstaddr, uint16 *writesstdata,uint32 writesstlen)
{
  volatile uint16 *sstaddr;
  uint16 sstdatatemp[2];
  uint32 addr;
  uint32 i;
  addr = (writesstaddr & 0xff000000);  
  for ( ;writesstlen>0;writesstlen--)
  { 
    sstaddr = (uint16 *)(addr | (0x00005555*2));
    *sstaddr = 0x00aa;
    sstaddr = (uint16 *)(addr | (0x00002aaa*2));
    *sstaddr = 0x0055;
    sstaddr = (uint16 *)(addr | (0x00005555*2));
    *sstaddr = 0x00a0;   
    sstaddr = (uint16 *)writesstaddr;
    *sstaddr = *writesstdata;
    i = 100;
    while (i)
    {
      sstdatatemp[0] = *sstaddr;
      sstdatatemp[1] = *sstaddr;
      if ((sstdatatemp[0] & 0x0040) == (sstdatatemp[1] & 0x0040))
        break;
      i--;     
    }
    if (i==0)
      return FALSE;
    writesstaddr +=2;
      writesstdata++;
  }
  return TRUE;
}

/********************************************************************************************************
** 函数名称:bool checkover(checkaddr)
** 函数功能:对器件进行擦除(扇区擦除,块擦除,器件擦除)。

** 入口参数:擦除地址和擦除类型数据
** 出口参数:TURE or FALSE
** create by:   magicchip
** create data: 2008/01/02
********************************************************************************************************/
bool eraseflash(uint32 eraseaddr,uint16 erasedata)
{
  uint16 *eraseaddrtemp;
  uint32 addr;
  uint16 checkdata;
  uint32 i,j;
  for (j=5;j>0;j--)
  {
    addr = (eraseaddr & 0xff000000);
    eraseaddrtemp = (uint16 *)(addr | (0x00005555*2));
    *eraseaddrtemp = 0x00aa;
    eraseaddrtemp = (uint16 *)(addr | (0x00002aaa*2));
    *eraseaddrtemp = 0x0055;
    eraseaddrtemp = (uint16 *)(addr | (0x00005555*2));
    *eraseaddrtemp = 0x0080;
    eraseaddrtemp = (uint16 *)(addr | (0x00005555*2));
    *eraseaddrtemp = 0x00aa;
    eraseaddrtemp = (uint16 *)(addr | (0x00002aaa*2));
    *eraseaddrtemp = 0x0055;
    eraseaddrtemp = (uint16 *)eraseaddr;
    *eraseaddrtemp = erasedata;
   
    i = 50;          //delay 50ms.
    while(i)
    {
      DelayNS(100); //delay 1ms.
      i--;
      checkdata = *eraseaddrtemp;
      if ((checkdata & 0x0080) == 0x0080)
        return TRUE;
      else if ((checkdata & 0x0060) == 0x0060)
        break;     
    }   
  }
  return FALSE;
}
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
6
关闭 站长推荐上一条 /3 下一条