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

📄 nand.c

📁 S3C24A0的完整BSP包,对开发此芯片的开发者很有用.
💻 C
字号:
#include <windows.h>
#include "s24A0addr.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)));} 

#define ID_K9S1208V0M	  0xec76

// HCLK=100Mhz
#define TACLS		 0    //0  //1clk(0ns) 
#define TWRPH0		3    //2  //3clk(25ns)
#define TWRPH1		0    //0  //1clk(10ns)  //TACLS+TWRPH0+TWRPH1>=50ns

void __RdPage512(BYTE *bufPt); 


int NF_ReadPage(UINT32 block,UINT32 page,UINT8 *buffer)
{
    volatile int i;
    register UINT8 * bufPt=buffer;
    unsigned int blockPage;
    UINT8 ecc0,ecc1,ecc2;

    UINT8 se[16];    

    //page=page&0x1f;
    blockPage=(block<<5)+page;
    NF_RSTECC();    // Initialize ECC
    
    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<50 ; i++); //wait tWB(100ns)
    
    NF_WAITRB();    // Wait tR(max 12us)


    __RdPage512(bufPt);

    ecc0=rNFECC0;
    ecc1=rNFECC1;
    ecc2=rNFECC2;

    se[0]=NF_RDDATA();
    se[1]=NF_RDDATA();
    se[2]=NF_RDDATA();
    NF_RDDATA();
    NF_RDDATA();
    se[5]=NF_RDDATA();

    NF_nFCE_H();    

    // Skip ECC check...
    //
#if 0
    if(ecc0==se[0] && ecc1==se[1] && ecc2==se[2] && se[5]==0xff)
    {
    	return 1;
    }
    else
    {
    	return 0;
    } 
#endif

    return(1);
}


void NF_Reset(void)
{
    volatile 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();
}

⌨️ 快捷键说明

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