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

📄 nand.c

📁 S3C2440A + ADS 控制nand flash(K9F1208X0B) 的驱动
💻 C
字号:
#include "2440addr.h"
#include "nand.h"
#include "Uart.h"


void Nand_init(void)    //initilaze nand flash
{
    rGPACON &= ~((1<<22)|(0xf<<17));
	rGPACON |=  ((1<<22)|(0xf<<17));

	//rNFCONF |=  ((1<<12)|(2<<8)|(2<<4));

	//rNFCONT &= ~((1<<12)|(7<<8)|(7<<4)|(3));
	//rNFCONT |= ((1<<12)|(6<<8)|(0<<6)|(0<<5)|(1<<4)|(0<<1)|(1));
	
    rNFCONF =  ((1<<12)|(2<<8)|(2<<4));
    rNFCONT = ((0<<12)|(6<<8)|(0<<6)|(0<<5)|(1<<4)|(0<<1)|(1));
	
}

void Test_Nand(void)
{
	unsigned int i,j;
	unsigned char data[512];
	for(i=0;i<512;i++)
		{
		data[i] = i;
		}

	Nand_init();

	Nand_checkID();

	Nand_eraseBlock(4095);

	Nand_writePage(4095,0,data);
								   								   	
	Nand_readPage(4095,0,data); 
								 
	for(i=0;i<16;i++)
	{
		for(j=0;j<16;j++)
		Uart_Printf("%2x ",data[i*16+j]);
		Uart_Printf("\n");
	}
	

}



unsigned int Nand_checkID(void)
{
    unsigned int tmp;

	rNFCONT &= ~(1<<1); //take CE to low

	rNFCMMD = 0x90;   //Read ID Command

	rNFADDR = 0x00;   //Address. 1cycle

	tmp = rNFDATA;       //rNFDATA is char
	Uart_Printf("the frist ID unmber is %x\n",tmp);  //Read  rNFDATA value

	tmp = rNFDATA;
	Uart_Printf("the second ID unmber is %x\n",tmp);

	tmp = rNFDATA;
	Uart_Printf("the third ID unmber is %x\n",tmp);

	tmp = rNFDATA;
	Uart_Printf("the fourth ID unmber is %x\n",tmp);
		
    rNFCONT |= (1<<1);  //take CE to high

}


unsigned int Nand_eraseBlock(unsigned int block)
{
    int i;
    
    unsigned int erase_data;

	unsigned int addr;
	
	addr = (block<<5);

	rNFCONT &= ~(1<<1); //take CE to low
	//rNFCONT |= (0<<1); 

	rNFCMMD = 0x60;   //Auto Block Erase Setup Command

	rNFADDR = (unsigned char)addr; 
	rNFADDR = (unsigned char)(addr>>8);
	rNFADDR = (unsigned char)(addr>>16);

	rNFCMMD = 0xd0;   //Erase Command
	
	for(i = 0; i<10; i++){}

	while(!(rNFSTAT&0x01));  // RnB low to high transition 
	
    rNFCMMD = 0x70;         //Read Status command
	
    erase_data = rNFDATA;

	if((erase_data&0x01) == 0x0){}
	
	Uart_Printf("the erase unmber is %x\n",erase_data);

	rNFCONT |= (1<<1);    //take CE to high

	

}


unsigned int Nand_writePage(unsigned int block , unsigned int page ,unsigned char *buffer)
{
	int i;
	
	unsigned int write_addr;

	rNFCONT &= ~(1<<1); //take CE to low

	rNFCMMD = 0x80;    //Sequential Data Input Command

    rNFADDR  = 0;
	write_addr = (block<<5)|page;
	rNFADDR = (unsigned char)write_addr;
	rNFADDR = (unsigned char)(write_addr>>8);
	rNFADDR = (unsigned char)(write_addr>>16);

    for(i = 0; i<512; i++)
	{
	   rNFDATA = *buffer;     // 1 up to 512 byte data serial input
	   buffer++;
    }

	rNFCMMD = 0x10;          // Program command

	for(i = 0; i<10; i++){}  // delay 10ns

	while(!(rNFSTAT&0x01));  // RnB low to high transition  

	rNFCMMD = 0x70;         //Read Status command

	
	if((rNFDATA&0x01) == 0x0){}
		
		Uart_Printf("the program unmber is %x\n",rNFDATA);
	

	rNFCONT |= (1<<1);      //take CE to high

	

}



unsigned int Nand_readPage(unsigned int block , unsigned int page ,unsigned char *buffer)
{
	int i;
	
	unsigned int write_addr;
	
	write_addr = block;
	
	rNFCONT &= ~(1<<1); //take CE to low
	
	rNFCMMD = 0x00;    //Sequential Data Input Command

	rNFADDR  = 0;
	write_addr = (block<<5)|page;
	rNFADDR = (unsigned char)write_addr;
	rNFADDR = (unsigned char)(write_addr>>8);
	rNFADDR = (unsigned char)(write_addr>>16);

	for(i = 0; i<10; i++){}

	while(!(rNFSTAT&0x01));
	
	for(i = 0; i<512; i++)
	{
	   *buffer=rNFDATA;	  // 1 up to 512 byte data serial input
	   buffer++;
	}
	
	
	rNFCONT |= (1<<1);		//take CE to high



}

⌨️ 快捷键说明

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