⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 quickformatflash.c

📁 对NAND FLASH的读写操作
💻 C
字号:
//*******************************************************
//以下是快速格式化的程序
//*******************************************************
#include "msp430x14x.h"
#include "format.h"
#include "flash.h"
#include "MspFlashWriteRead.h"
void QuickFormatFlash(void)
{
  unsigned short InvalidBlockTable[InvalidBlockMaxValue]={0xffff};//定义存放无效块信息表的数组
  unsigned short PtrRowAddress;  //定义在格式化Flash时的地址指针
  unsigned short PtrTable;            //定义填写无效信息表数组的地址指针
  unsigned short InvalidBlockNumber;  //定义无效块的数量
  unsigned short PtrBlock;           //指示需要写入无效块屏蔽表的实际的块指针。
  unsigned short PtrBlockInMaskTable;//指示实际写入无效块屏蔽表内的块指针。
  unsigned short PtrBlockTemp=0;		 //
  unsigned short PtrAddCount=0;         //指示因为存在无效块而增加的无效块屏蔽表内的数值	
  unsigned short LoopForSearchInValid;//为了寻找无效块所设立的for循环变量
  unsigned short *piFlash;             //用来对Msp进行字写入的指针
//*******************************************************
//先复位Flash芯片
//*******************************************************
  WriteReadResetCommandToFlash(); 
//*******************************************************
//开始格式化Flash芯片
//*******************************************************    
  for(PtrRowAddress=32,PtrTable=1,InvalidBlockNumber=0;PtrRowAddress<FlashSizeAddress16M;PtrRowAddress=PtrRowAddress+32)
  {								//因为块的地址是从A14开始的,A9--A13=0
    WriteBlockEraseCommandToFlash(PtrRowAddress);//根据块指针地址来擦除响应的Flash块
    while((InputStatusFromFlash&FlashRB)==0);//查询擦除是否结束
    ReadStatusFromFlash();
    if((InputDataFromFlash&FlashProgramEraseError)!=FlashProgramEraseError)//
    {
      if(((Write00ToFirstPage(PtrRowAddress))&FlashProgramEraseError)!=FlashProgramEraseError)
      {
        if(((Read00PageFromFlash(PtrRowAddress))&FlashProgramEraseError)==FlashProgramEraseError)
        {
          InvalidBlockTable[PtrTable]=PtrRowAddress;//如果擦除出错,把当前的无效块地址存入信息表内
          PtrTable=PtrTable+1;//信息表数组的指针加1
          InvalidBlockNumber=InvalidBlockNumber+1; //无效块数量加1
        }  
      }
      else
      {
        InvalidBlockTable[PtrTable]=PtrRowAddress;//如果擦除出错,把当前的无效块地址存入信息表内
        PtrTable=PtrTable+1;//信息表数组的指针加1
        InvalidBlockNumber=InvalidBlockNumber+1; //无效块数量加1
      }
    }
    else
    {
      InvalidBlockTable[PtrTable]=PtrRowAddress;//如果擦除出错,把当前的无效块地址存入信息表内
      PtrTable=PtrTable+1;//信息表数组的指针加1
      InvalidBlockNumber=InvalidBlockNumber+1; //无效块数量加1
    }    
  }
  InvalidBlockTable[0]=InvalidBlockNumber;//在信息表的第一部分加入无效块的总数
  _NOP();
//*******************************************************   
//根据无效块信息表建立Flash信息表,以便屏蔽掉无效块
//******************************************************* 
  for(PtrRowAddress=32;PtrRowAddress<FlashSizeAddress16M;PtrRowAddress=PtrRowAddress+32)
  {
    WriteBlockEraseCommandToFlash(PtrRowAddress);//建立无效块屏蔽信息表之前先擦除第0块
    while((InputStatusFromFlash&FlashRB)==0);
    ReadStatusFromFlash();
  }
  WriteBlockEraseCommandToFlash(0);              //擦除第0块,以便存放Flash的无效块屏蔽表
  while((InputStatusFromFlash&FlashRB)==0);
  ReadStatusFromFlash();
  for(PtrBlock=0;PtrBlock<=FlashSizeAddress16M;PtrBlock++)
  {
    if((PtrBlock&0x00FF)==0)
    {
      PtrRowAddress=(PtrBlock>>8);
      WriteSequentialDataInputCommandToFlash();
      WriteWriteModeAddressToFlash(PtrRowAddress,0);
      PrepareForWriteDataToFlashIncludeCArea();
    }
    for(LoopForSearchInValid=1;LoopForSearchInValid<(InvalidBlockTable[0]+1);LoopForSearchInValid++)
    {
      if(PtrBlockTemp==InvalidBlockTable[LoopForSearchInValid])
      {
        PtrBlockTemp=PtrBlockTemp+1;
      }
    }
    PtrBlockInMaskTable=PtrBlockTemp;
    if(PtrBlockInMaskTable>FlashSizeAddress16M)
    {
      PtrBlockInMaskTable=0xFFFF;
    }
    PtrBlockInMaskTable=PtrBlockInMaskTable<<5;			//为了保证存放在第0块的块地址直接可以使用,不需要再移位
    OutputToFlash=PtrBlockInMaskTable;
    FlashControlPort&=~FlashWE;
    FlashControlPort|=FlashWE;  
    OutputToFlash=(PtrBlockInMaskTable>>8);
    FlashControlPort&=~FlashWE;
    FlashControlPort|=FlashWE;  
    if((PtrBlock&0x00FF)==0x00FF)   
    {
      WritePageProgramCommandToFlash();
      while((InputStatusFromFlash&FlashRB)==0);
      ReadStatusFromFlash();
    }
    PtrBlockTemp=PtrBlockTemp+1;
  }
  _NOP();
//初始化文件目录表和碎片数据表,因为格式化后,文件数目与碎片数目全为0
FCTL2=FWKEY+FSSEL0+FN0;
piFlash=(unsigned short *)MspInformationA;
FlashClrSegment(piFlash);
for(LoopForSearchInValid=0;LoopForSearchInValid<64;LoopForSearchInValid++)
{
  FlashWriteWord(piFlash+LoopForSearchInValid,0x00);
} 
//初始化文件分配表,初始化时默认存在一个碎片,首地址是0x0001,末地址是0x03FF。
piFlash=(unsigned short *)MspInformationB;
FlashClrSegment(piFlash);
FlashWriteWord(piFlash,0x0001);
FlashWriteWord(piFlash+1,0x0001);
FlashWriteWord(piFlash+2,0x03FF);
for(LoopForSearchInValid=3;LoopForSearchInValid<64;LoopForSearchInValid++)
{
  FlashWriteWord(piFlash+LoopForSearchInValid,0x00);
} 
_NOP();  
}
unsigned short Write00ToFirstPage(unsigned short PtrRowAddress)
{
  unsigned short loop_i;
  WriteSequentialDataInputCommandToFlash(); 
  WriteWriteModeAddressToFlash(PtrRowAddress,0); 
  PrepareForWriteDataToFlashIncludeCArea();
  for(loop_i=0;loop_i<528;loop_i++)
  {
    OutputToFlash=0x00;
    FlashControlPort&=~FlashWE;
    FlashControlPort|=FlashWE;
  }
  WritePageProgramCommandToFlash();
  while((InputStatusFromFlash&FlashRB)==0);
  ReadStatusFromFlash();
  return InputDataFromFlash;
}
unsigned short Read00PageFromFlash(unsigned short PtrRowAddress)
{
  unsigned short loop_i;
  unsigned short ReadValue[2];
  WriteRead1ACommandToFlash();
  WriteReadModeAddressToFlash(PtrRowAddress,0);
  while((InputStatusFromFlash&FlashRB)==0);
  DataPortDirection&=~0xFF;
  PrepareForReadDataFromFlash();
  for(loop_i=0;loop_i<2;loop_i++)
  {
    FlashControlPort&=~FlashRE;
    ReadValue[loop_i]=InputDataFromFlash;
    FlashControlPort|=FlashRE;
  }
  if(((ReadValue[0])==0)&&((ReadValue[1])==0))
  {
    return 0;
  }
  else 
  {
    return FlashProgramEraseError;
  } 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -