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

📄 nandflash.c

📁 源代码为ARM2410上NAND FLASH 的驱动程序
💻 C
字号:


//--------------------------------------------------------------------------------------
// Moudle       :                 project file 
// Author       :                 kreal@163.net
// Creation Date:                 04-06-25
// Function Description :  It provide function such as  read write and erase to Nand Flash
//---------------------------------------------------------------------------------------


  #define  NANDFLASH_G
  #include "sysincludes.h"    
  
  #define NF_CMD(cmd)	{rNFCMD=cmd;}
  #define NF_ADDR(addr)	{rNFADDR=addr;}	
  #define NF_nFCE_L()	{rNFCONF&=~(1<<11);}
  #define NF_nFCE_H()	{rNFCONF|=(1<<11);}
  #define NF_RSTECC()	{rNFCONF|=(1<<12);}
  #define NF_RDDATA() 	(rNFDATA)
  #define NF_WRDATA(data) {rNFDATA=data;}
  #define NF_WAITRB()   {while(!(rNFSTAT&(1<<0)));} 
  
  
  #if 1
// HCLK=100Mhz
   #define TACLS		0  //1clk(0ns) 
   #define TWRPH0		3  //3clk(25ns)
   #define TWRPH1		0  //1clk(10ns)  //TACLS+TWRPH0+TWRPH1>=50ns
  #else
// HCLK=50Mhz
   #define TACLS		0  //1clk(0ns)
   #define TWRPH0		1  //2clk(25ns)
   #define TWRPH1		0  //1clk(10ns)
  #endif
   
  
  
  
 U16 NF_CheckId(void)
 {
    int i;
    U16 id;
    
    NF_nFCE_L();
    
    NF_CMD(0x90);
    NF_ADDR(0x0);
    
    for(i=0;i<10;i++); //wait tWB(100ns)////?????
    
    id=NF_RDDATA()<<8;	// Maker code(K9S1208V:0xec)
    id|=NF_RDDATA();	// Devide code(K9S1208V:0x76)
    
    NF_nFCE_H();
    
    return id;
}
  
 void NF_Reset(void)
{
    int i;
        
    
    NF_nFCE_L();

    NF_CMD(0xFF);	//reset command

    for(i=0;i<10;i++);  //tWB = 100ns. //??????

    NF_WAITRB();      //wait 200~500us;
     
    NF_nFCE_H();
}


 void NF_Init(void)
{
    rNFCONF=(1<<15)|(1<<14)|(1<<13)|(1<<12)|(1<<11)|(TACLS<<8)|(TWRPH0<<4)|(TWRPH1<<0);	
    // 1  1    1     1,   1      xxx,  r xxx,   r xxx        
    // En 512B 4step ECCR nFCE=H tACLS   tWRPH0   tWRPH1
    
    NF_Reset();
}



 void  NF_ReadPage(U32 block,U32 page,U8 *buffer, uint Len )
{
    int i;
    unsigned int blockPage;
   
    U8 *bufPt = buffer;
   
    
    page = page&0x1f;    // most 32 page 
    
    
    blockPage=(block<<5) + page;
   
    NF_nFCE_L();    
    NF_CMD(0x00);   // Read command
    NF_ADDR(0);	    // Column = 0
    NF_ADDR(blockPage&0xff);	    //
    NF_ADDR((blockPage>>8)&0xff);   // Block & Page num.
    NF_ADDR((blockPage>>16)&0xff);  //

    for(i=0;i<10;i++); //wait tWB(100ns)
    
    NF_WAITRB();    // Wait tR(max 12us)
    
    for(i=0;i<Len;i++)
    {
    	*bufPt++= NF_RDDATA();	// Read one page
    }
   
    
    NF_nFCE_H();    

    
}



char NF_WritePage(U32 block,U32 page,U8 *buffer, uint Len )
{
    int i;
    U32 blockPage=(block<<5)+page;
    U8 *bufPt=buffer;

    
    NF_nFCE_L(); 
    NF_CMD(0x0);//??????
    NF_CMD(0x80);   // Write 1st command
    NF_ADDR(0);			    // Column 0
    NF_ADDR(blockPage&0xff);	    //
    NF_ADDR((blockPage>>8)&0xff);   // Block & page num.
    NF_ADDR((blockPage>>16)&0xff);  //

    for(i=0;i<Len;i++)
    {
	   NF_WRDATA(*bufPt++);	   // Write one page to NFM from buffer
    }  
    
   
   

    NF_CMD(0x10);   // Write 2nd command
    
    for(i=0;i<10;i++);  //tWB = 100ns. ////??????

    NF_WAITRB();    //wait tPROG 200~500us;
 
    NF_CMD(0x70);   // Read status command   
    
    for(i=0;i<3;i++);  //twhr=60ns
    
    if (NF_RDDATA()&0x1) // Page write error
    {	
    	NF_nFCE_H();
	    return 0;
    }
    else 
    {
    	NF_nFCE_H();
    
	    return 1;
     
    }
}

 char  NF_EraseBlock(U32 block)
{
    U32 blockPage=(block<<5);
    int i;


    NF_nFCE_L();
    
    NF_CMD(0x60);   // Erase one block 1st command

    NF_ADDR(blockPage&0xff);	    // Page number=0
    NF_ADDR((blockPage>>8)&0xff);   
    NF_ADDR((blockPage>>16)&0xff);

    NF_CMD(0xd0);   // Erase one blcok 2nd command
    
    for(i=0;i<10;i++); //wait tWB(100ns)//??????

    NF_WAITRB();    // Wait tBERS max 3ms.
    NF_CMD(0x70);   // Read status command

    if (NF_RDDATA()&0x1) // Erase error
    {	
    	NF_nFCE_H();
	
	    return 0;
    }
    else 
    {
    	NF_nFCE_H();
        return 1;
    }
}

 
uchar NandErase( uint StartAddr, uint EndAddr ) 
{
    uint size , i  ;
    
    uint blknum ;  
    
    size = EndAddr - StartAddr ; 
    
    if( size == 0 ) return 0 ;
       
    blknum = size/16384 + 20 ; 

      
    for( i = 0 ; i < blknum ; i ++ )
    {
    
        if(  !NF_EraseBlock( 20+i ) ) return 0 ;    
        
    }

    return 1 ; 



}

  
  
  
                 

⌨️ 快捷键说明

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