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

📄 nand_flash_test.c

📁 s3c2410的nandflash调试程序
💻 C
字号:
/*********************************************************************************************
* File:	nand_flash_test.c
* Author:	lirui
* Desc:	nand flash test file
* History:	
*********************************************************************************************/

/*------------------------------------------------------------------------------------------*/
/*                                     include files	                                    */
/*------------------------------------------------------------------------------------------*/
#include "2410lib.h"
#define NAND_CE    (0x1<<22)
#define NAND_RE    (0x1<<20)
#define NAND_WE    (0x1<<19)
#define NAND_ALE   (0x1<<18)
#define NAND_CLE   (0x1<<17)
#define Fail       0
#define OK         1
#define BUSY        0x1
#define NAND_SECTOR_SIZE	528
#define NAND_BLOCK_MASK		(NAND_SECTOR_SIZE - 1)
/*------------------------------------------------------------------------------------------*/
/*                            external varibles	and functions                               */
/*------------------------------------------------------------------------------------------*/

static void Nand_Init(void);
static void Nand_Reset(void);
static void Wait_Idle(void);
static void Nand_Read(char * , unsigned int , unsigned int );
static int Nand_Write(char *, unsigned int , unsigned int );
static UINT8T  Nand_Erase(unsigned int );
static UINT16T Read_Nand_ID(void);
UINT16T RxID;
//unsigned char *RxBuf;
char RxBuf[NAND_SECTOR_SIZE*2];
char WriteBuf[NAND_SECTOR_SIZE*2];
//unsigned char *WxBuf;

/*********************************************************************************************
* name:		nand_flash_test
* func:		nand_flash_test function
* para:		none
* ret:		none
* modify:
* comment:		
*********************************************************************************************/
void nand_flash_test(void)
{
	int i=0;
	for(;i< 128;i++)
	{
		WriteBuf[i]=i;
	}
	char *mybuf="my NAND Flash test";
//	uart_printf(" The words that SPI0 transmit are:\n");
	Nand_Init();
	RxID=Read_Nand_ID();
	uart_printf(" %x\n",RxID);
	Nand_Read(RxBuf, 0,0);
	uart_printf(" %s\n",RxBuf);
	
	Nand_Erase(400);
	Nand_Write(WriteBuf, 400, 0);
	Nand_Read(RxBuf, 400, 0);
	uart_printf(" %s\n",RxBuf);
//	uart_printf(" %d\n",RxData[0]);
	
	
	uart_printf(" %s\n",mybuf);
	
}



static void Nand_Init(void)
{
	rNFCONF = 0xf830;//enable NAND Flash,init ECC,nFCE=1,TACLS=0,TWRPH0=3,TWRPH1=0
	Nand_Reset();
}

static void Nand_Reset(void)
{
	int i=0;
	rNFCONF &=(~(1<<11));
	for(;i<10;i++);
	rNFCMD=0xff;
	Wait_Idle();
}

static void Wait_Idle(void)
{
	int i=0;
	while(!(rNFSTAT&BUSY));
	for(;i<10;i++);
}

/* erase  block */
static UINT8T  Nand_Erase(unsigned int block)
{
	unsigned int blockPage=(block<<5);
	rNFCONF &= ~0x800;  //not initial the Ecc
	rNFCMD = 0x60;
	rNFADDR = blockPage&0xff;
	rNFADDR = (blockPage>>8)&0xff;
	rNFCMD  = 0xd0;
	Wait_Idle();
	rNFCMD = 0x70;
	if(rNFDATA&0x1)
	{
		rNFCONF |= (1<<11);
		return Fail;
	}
	else
	{
		rNFCONF |= (1<<11);
		return OK;
	}
}

/* read NAND Flash ID maker code=EC,device code=75*/
static UINT16T Read_Nand_ID(void)
{
	UINT16T id;
	rNFCONF &= (~0x800);
	rNFCMD = 0x90;
	rNFADDR = 0;
	Wait_Idle();
	id = rNFDATA;
	Wait_Idle();
	id = (id<<8)+rNFDATA;
	rNFCONF |=0x800;
	return id;

}
/* NAND Flash Read ,mode 1*/
static void Nand_Read(char *buf, unsigned int block,unsigned int page)
{
	int j;
	unsigned int blockPage = (block<<5)+page;
/*	if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK))
	{
		return;
	}
*/	
	rNFCONF &= ~0x800;
	
	rNFCMD = 0;
	
	rNFADDR = 0;
	rNFADDR = blockPage & 0xff;
	rNFADDR = (blockPage>>8) & 0xff;
//	rNFADDR = (i >> 25) & 0xff;
		
	Wait_Idle();
	for(j=0; j < 128;j++)
	{
			*buf++ = (rNFDATA & 0xff);
	}
		
	/* chip disable*/
	rNFCONF |= (1<<11);
	
	
}

/* NAND Flash write */
static int Nand_Write(char *buf, unsigned int block,unsigned int page)
{
	int i,j;
	unsigned int blockPage = (block<<5)+page;
	UINT8T *source;
	source = buf;
	rNFCONF &= ~0x800;
	
	rNFCMD = 0x80;
	for(i=0;i<10;i++);
	rNFADDR = 0;
	rNFADDR = blockPage & 0xff;
	rNFADDR = (blockPage>>8) & 0xff;
//	rNFADDR = (i >> 25) & 0xff;
	for(i=0;i<3;i++);
	
	for(j=0; j < 128;j++)
	{
		 rNFDATA = (*buf);
		 uart_printf(" %c\n",*buf);
		 
		 uart_printf(" %c\n", (rNFDATA&0xff));
		 
		 buf++;
	}
	
	for(i=0;i<3;i++);	
	rNFCMD = 0x10;
	for(i=0;i<3;i++);	
	Wait_Idle();
	for(i=0;i<3;i++);	
	rNFCMD = 0x10;
	for(i=0;i<3;i++);	
	if(rNFDATA&0x1)
	{
		rNFCONF |= (1<<11);
		return Fail;
	}
	else
	{
		rNFCONF |= (1<<11);
		return OK;
	}		
	
	
}

⌨️ 快捷键说明

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