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

📄 nandflash.c

📁 s3c2410 nand flash ads下的测试程序  是我们学校买的实验箱上带的
💻 C
📖 第 1 页 / 共 2 页
字号:
		stat = NFRdDat();
		//printf("%x\n", stat);
	}while(!(stat&0x40));
	NFWrCmd(READCMD0);
	return stat&1;
}
#endif

/********************************************************************
Function name: NFReadID
Parameter    : void     
Description	 : 读取NAND FLASH的ID号
Return		 : 返回读取的ID号
Argument     :                            
Autor & date : void
*********************************************************************/
static U32 NFReadID(void)
{
	U32 id, loop = 0;

	NFChipEn();
	NFWrCmd(READIDCMD);
	NFWrAddr(0);
	while(NFIsBusy()&&(loop<10000)) loop++;
	if(loop>=10000)
		return 0;
	id  = NFRdDat()<<8;
	id |= NFRdDat();
	NFChipDs();
	
	return id;
}

/********************************************************************
Function name: NFReadStat
Parameter    : void     
Description	 : 读取NAND FLASH的状态
Return		 : 返回读取的状态
Argument     :                            
Autor & date : void
*********************************************************************/
static U16 NFReadStat(void)
{
	U16 stat;
	
	NFChipEn();	
	NFWrCmd(QUERYCMD);
	stat = NFRdDat();	
	NFChipDs();
	
	return stat;
}


/********************************************************************
Function name: NFEraseBlock
Parameter    : U32 addr : 要擦除块的地址     
Description	 : 擦除地址为addr的块
Return		 : void
Argument     :                            
Autor & date : void
*********************************************************************/
static U32 NFEraseBlock(U32 addr)
{
	U8 stat;

	addr &= ~0x1f;
		
	NFChipEn();	
	NFWrCmd(ERASECMD0);		
	NFWrAddr(addr);
	NFWrAddr(addr>>8);
	if(NandAddr)
		NFWrAddr(addr>>16);
	NFWrCmd(ERASECMD1);		
	stat = NFWaitBusy();
	NFChipDs();
	
#ifdef	ER_BAD_BLK_TEST
	if(!((addr+0xe0)&0xff)) stat = 1;	//just for test bad block
#endif
	putch('.');
	return stat;
}

/********************************************************************
Function name: NandReadPage
Parameter    : addr : 地址    *buf:要写入的数据
Description	 : 向地址addr写入数据*buf
Return		 : void
Argument     : addr = page address                                   
Autor & date :
*********************************************************************/
static void NFReadPage(U32 addr, U8 *buf)
{
	U16 i;
	
	NFChipEn();
	NFWrCmd(READCMD0);
	NFWrAddr(0);
	NFWrAddr(addr);
	NFWrAddr(addr>>8);
	if(NandAddr)
		NFWrAddr(addr>>16);
//	InitEcc();
	NFWaitBusy();		
	for(i=0; i<512; i++)
		buf[i] = NFRdDat();		
	NFChipDs();
}

/********************************************************************
Function name: NandWritePage
Parameter    : addr : 地址    *buf:要写入的数据 blk_idx
Description	 : 向地址addr写入数据*buf
Return		 : void
Argument     : addr = page address                                   
Autor & date :
*********************************************************************/
//addr = page address
static U32 NFWritePage(U32 addr, U8 *buf, U16 blk_idx)
{
	U16 i, stat;
//	U8 tmp[3];
	U8 ecc_code[3];
	U8 oob_info[16];
		
	for(i=0; i<sizeof(oob_info); i++)
		oob_info[i] = 0xff;
	
	nand_calculate_ecc(buf, ecc_code);
	oob_info[eccpos[0]] = ecc_code[0];
	oob_info[eccpos[1]] = ecc_code[1];
	oob_info[eccpos[2]] = ecc_code[2];
	nand_calculate_ecc(buf+256, ecc_code);
	oob_info[eccpos[3]] = ecc_code[0];
	oob_info[eccpos[4]] = ecc_code[1];
	oob_info[eccpos[5]] = ecc_code[2];
	oob_info[BLK_IDXL]  = blk_idx;
	oob_info[BLK_IDXH]  = blk_idx>>8;
	oob_info[FMT_TAG]   = format_tags[addr&0x1f];
	
	NFChipEn();
	NFWrCmd(PROGCMD0);
	NFWrAddr(0);
	NFWrAddr(addr);
	NFWrAddr(addr>>8);
	if(NandAddr)
		NFWrAddr(addr>>16);
//	InitEcc();	
	for(i=0; i<512; i++)
		NFWrDat(buf[i]);
		
	if(!addr) {
		NFWrDat('b');
		NFWrDat('o');
		NFWrDat('o');
		NFWrDat('t');		
	} else {		
		for(i=0; i<sizeof(oob_info); i++)
			NFWrDat(oob_info[i]);
	}
    	
	NFWrCmd(PROGCMD1);
	stat = NFWaitBusy();
	NFChipDs();
	
#ifdef	WR_BAD_BLK_TEST
	if((addr&0xff)==0x17) stat = 1;	//just for test bad block
#endif
	
	if(stat)
		printf("Write nand flash 0x%x fail\n", addr);
	else {	
		U8 RdDat[512];
		
		NFReadPage(addr, RdDat);
		for(i=0; i<512; i++)
			if(RdDat[i]!=buf[i]) {
				printf("Check data at page 0x%x, offset 0x%x fail\n", addr, i);
				stat = 1;
				break;
			}
	}
		
	return stat;	
}

/********************************************************************
Function name: NandFlashInit
Parameter    : void
Description	 : 初始化Nand Flash
Return		 : void
Argument     :                                    
Autor & date :
*********************************************************************/
static U32 nand_id;
void NandFlashInit(void)
{
	int i;	
	
	support = 0;
	nand_id = NFReadID();
	
	for(i=0; NandFlashChip[i].id!=0; i++)
		if(NandFlashChip[i].id==nand_id) {			
			nand_id = i;
			NandFlashSize = NandFlashChip[i].size;
			support  = 1;
			NandAddr = NandFlashSize>SIZE_32M;
			if(!pNandPart[0].size) {
				pNandPart[0].offset = 0;
				pNandPart[0].size   = NandFlashSize;
				pNandPart[1].size   = 0;				
			}			
			return;
		}
	
}

/********************************************************************
Function name: NandFlashStatusRep
Parameter    : void
Description	 : 读取Nand Flash的相关信息
Return		 : void
Argument     :                                    
Autor & date :
*********************************************************************/
void NandFlashStatusRep(void)
{
	if(support) {
		printf("Nand Flash ID is 0x%x, Size = %dM, Status = 0x%x\n", NandFlashChip[nand_id].id, NandFlashChip[nand_id].size>>20, NFReadStat());
	} else {
		printf("No supported Nand Flash Found!\n");
	}
}

/********************************************************************
Function name: NandFlash_Test
Parameter    : void
Description	 : 用来测试NAND读写实验
Return		 : void
Argument     :                                    
Autor & date :
*********************************************************************/

void NandFlash_Test( void )
{
	U16 m,n ;
	U8 d[640] ;
	
	//擦除NandFlash
  	printf( "\nNand Flash Erase Block!\n\n" ) ;
	for( m = 0 ; m < 0x200 ; m += 0x20 )		NFEraseBlock( m ) ;

	//给要写入nandflash的数组赋值
	for( m = 0 ; m < 640 ; m++ )	d[m] = m ;
	
	//页写方式将数组依次写入nandflash,一次写入512字节
   	printf( "\nNand Flash Write Page!\n\n" ) ;
	NFWritePage( 0, d, 0 ) ;

	//将数组全部清零
	for( m = 0 ; m < 640 ; m++ )	d[m] = 0 ;

	//页读方式将nandflash的0地址数据读出并写到数组
   	printf( "\nNand Flash Read Page!\n\n" ) ;
	NFReadPage( 0, d ) ;

	//将数组里面的数据依次打印出来,验证写入与读出是否相符
    for( m = 0; m < 40; m++ )
    {
		for( n = 0; n < 16; n++ )
		    printf( "%2x ", d[m*16+n] ) ;
		printf("\n");
    }

}
#endif	/* NAND_SUPPORT */

⌨️ 快捷键说明

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