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

📄 flash.c

📁 非常不错的Nand Flash读写程序
💻 C
字号:
//-----------------------------------------------------------------------------


// P2口为FASH数据线接口,P1口为模拟量输入接口。

// 第一页编号,
// 第3页模拟量起始地址
// 第9页模拟量坏块地址


//----------FLASH初始化子程序
void FLASH_Init(void)
{
    CLE=0;
    RE=1;
    ALE=0;
    WE=1;
}




//向FLASH写入命令子程序
void WRITEcomd_flash(unsigned char comd)
{
    P2MDOUT=0xff;
    FLASH_Init();
    CLE=1;
    nop();
	         
    P2=comd;    
    WE=0;WE=0;WE=0;
    WE=1;WE=1;
    CLE=0;
}



//以下子程序将写内存时的FLASH地址送FLASH
void addr_flash(unsigned int r_p_addr,unsigned char position)
{
    P2MDOUT=0xff;
    P2=position;   //A0-A7
    ALE=1;ALE=1;
    nop();
	         
    WE=0;WE=0;WE=0;
    WE=1;WE=1;

    P2=r_p_addr;  //A9-A16
    
    WE=0;WE=0;WE=0;
    WE=1;WE=1;

    P2=r_p_addr>>8;  ///A17-A24
    
    WE=0;WE=0;WE=0;
    WE=1;WE=1;
    ALE=0;
}




//读FLASH状态子程序
unsigned char readsta(void)
{
    unsigned char soop;
    P2MDOUT=0x00;
	P2 = 0xff;
    RE=0;
    nop();
    soop=P1;
    RE=1;
    return(soop);
}




//向FLASH写入页面结束标志(当前时间)子程序
void WRITE_PE_flash(void)      //PAGE END
{
    unsigned char pe;

    FLASH_Init();
	pe=TIME;    

    P2=TIME>>8;   
    WE=0;WE=0;WE=1;
    nop();P2=pe;    
    WE=0;WE=0;WE=1;
  
    FLASH_Init();    
}







//向FLASH写入页面起始标志(00)子程序
void WRITE_PS_flash(void)     //page start
{

    P2=0x55;   
    WE=0;
    WE=0;
    WE=1;
    nop();    
    P2=0x55;  
    WE=0;
    WE=0;
    WE=1;

}






//将数据按每半页写入FLASH子程序
void DATA_Input(unsigned int p_addr,unsigned char H_P_label,unsigned char len)
{
    int i;
    unsigned char result;

  if(H_P_label==0)
    {
    
//    pointer=&TIME;

    if(PCA_position>=256)
	  {WRITEcomd_flash(0x01);}
    else
	  {WRITEcomd_flash(0x00);}
    WRITEcomd_flash(0x80);
    addr_flash(PCA_addr,PCA_position);
    if(PCA_position==0)
	   {
	     WRITE_PS_flash();
         PCA_position=PCA_position+2;	   
	   }
    else{}
    for(i=0;i<len;i++)
       {
	    P2=HT_PCA;
        WE=0;WE=0;WE=1;
	    P2=LT_PCA;
        WE=0;WE=0;WE=1;
	   }

    WRITEcomd_flash(0x10);
    
	if(PCA_position>=500)
	   {PCA_position=0;PCA_addr++;}
	else
	   {PCA_position=PCA_position+2;}

    while(RB==0){};

    WRITEcomd_flash(0x70);
    result=readsta();
          //    if(result^0==1)
          //        {error();}
          //    else
          //        return();
    }




   else if(H_P_label==6)       //段起始和结束地址写入
     {                          
     
    pointer=&a_r_p_addr;

    FLASH_Init();
    WRITEcomd_flash(0x00);
    WRITEcomd_flash(0x80);
    addr_flash(p_addr,seg_numb*8);
    for(i=0;i<2;i++)
       {
	    P2=*pointer;
        WE=0;WE=0;
        WE=1;pointer++;
	   }
    WRITEcomd_flash(0x10);
    while(RB==0){};

    WRITEcomd_flash(0x70);
    result=readsta();
        //if(result^0==1)
         //         {error();}
        //    else
          //        return();
     }




  else if(H_P_label==8)       //模拟量坏块地址写入第9页
     {                          

    pointer=&a_r_p_addr;     

    FLASH_Init();
    WRITEcomd_flash(0x00);
    WRITEcomd_flash(0x80);
    addr_flash(p_addr,Abad_cout*8);
    for(i=0;i<4;i++)
       {
	    P2=*pointer;
        WE=0;WE=0;
        WE=1;pointer++;
	   }
    WRITEcomd_flash(0x10);
    while(RB==0){};

    WRITEcomd_flash(0x70);
    result=readsta();
        //if(result^0==1)
         //         {error();}
        //    else
          //        return();
     }
       
}











/////////////////////////////////////////////

void read_data(int number)//读出数据 number=1~528
{
        int i;
        P2MDOUT=0;
        P2=0xff;
        
        FLASH_Init();
        RE=0;RE=0;TI0=0;TI0=0;
      for(i=0;i<(number);i++)
        {
            TI0=0;

		    RE=0;RE=0;
//            SBUF0=0xaa;    
            SBUF0=P2;            
            while(TI0==0);
            TI0=0;
            RE=1;
            //printf("%x ",j);//从FLASH读数,串口输出     
        }
        FLASH_Init();    
}

//////////////////////////////////////////////////////
void page_read_data(unsigned int page_number)//页读出,page_number为页码0~65565
{
        
        WRITEcomd_flash(0x00);     
        addr_flash(page_number,0);
        while(~RB){};   
        read_data(512);//每页读出500 BYTE
}




////////////////////////////////////////////////////////

//******块擦除,block_number的间隔值为32

//////////////////////////////////////////////////////
unsigned char block_erase(unsigned int block_number)//块擦除,block_number的间隔值为32
{   
    unsigned char result=0;
    unsigned char sta=0;
    unsigned char block_number1;

    block_number1=(unsigned char)block_number & 0x00ff;

    sta=(unsigned char)((block_number &0xff00)>>8);

    P2MDOUT = 0xFF;
//        wait_time(1);
        WRITEcomd_flash(0x60);
        nop();
        nop();
        ALE=1;
        nop();
        WE=0;
        
        P2=block_number1;//A9-A16
        nop();nop();nop();
        WE=1;WE=1;
        WE=0;
        
        P2=sta;//A17-A24
        nop();nop();nop();
        WE=1;
        nop();
        ALE=0;
        nop();
        WRITEcomd_flash(0xd0);
        nop();
        WE=1;
        WE=1;
        while(~RB){};
        wait_time(1);
       WRITEcomd_flash(0x70);
        result=readsta();
        result=result&0x01;
        if(result==1)
              {
              sta=1;
              TI0=1;
              printf("Erro_page=%u\n",block_number);
              TI0=0;
              nop();
             }
           return sta;
}      

char erase_flash(void)
{
/* 1 block = 32 pages, 1 K9f2808 Device=1024 blocks  1 K9f5608 Device=2048 blocks 擦除整片 */   
     unsigned char i=0;
     unsigned int j; 
     for (j=1;j<=2047;j++){i=i+block_erase(j*32+1);} 
      return i;            
}


⌨️ 快捷键说明

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