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

📄 main.c

📁 一份对nandflash ks9f1208读写操作的源代码 本人已经测试通过
💻 C
📖 第 1 页 / 共 2 页
字号:
	r_ecc2=rNF_ECC2;
	
	
	Uart_Printf("R_ECC0:0x%x,R_EEC1:0x%x,R_EEC2:0x%x\n",r_ecc0,r_ecc1,r_ecc2);
	
	if( (r_ecc0==eccbuf[0]) && (r_ecc1==eccbuf[1]) && (r_ecc2==eccbuf[2]) )
	{
		Uart_Printf("ECC check is ok\n");
		return TRUE;
	}	
	else 
	{
		Uart_Printf("ECC check is error\n");
		return FALSE;
	}	
	
}
/*********************************************************************************************************
** Function name: NF_ReadSpareData
** Descriptions:  读出block块中第page页的OOB区的第num个字节   
** Input: blcok		块地址
**		  page		页地址
**        num       第n个字节		
** Output:
** Created by:   刘国华
** Created Date: 2008-08-14 
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8  NF_ReadSpareData(uint32 block,uint8 page, uint8 num)
{
	uint32 block_page;
	uint8 ret_data;
	block_page=(block<<5)+page;
	// 发送命令和地址
	NF_nFCE_L();	
	
	
	NF_CMD(CMD_READOOB);				 // 读取空闲区数据	  	  
	
	NF_ADDR(num&0x0f);   				  // 发送地址地址的A3-A0,A7-A4无效
	NF_ADDR(block_page&0xff);	           // 发送地址A9--A16
	NF_ADDR((block_page>>8) & 0x000000FF);	// 发送地址A17--A24
	NF_ADDR((block_page>>16) & 0x000000FF);	// 发送地址A25	
	
	NF_WAITRB();						    // 等待数据准备好
	ret_data=NF_RDDATA();			    // 读出一个字节的数据	
	
	//NF_WAITRB();             //如果加在这里则会出错千万要注意
	NF_nFCE_H();		
	
	
	return ret_data;
}


/*********************************************************************************************************
** Function name: NF_WriteByte()
** Descriptions:  向某个块的某个页中的某个地址写入n个字节   
** Input: blcok		块地址   (0-4096)
**		  page		页地址   (0-31)
**		  addr      字节地址 (0-527)
**        num       写入字节的个数		
** Output:
** Created by:   刘国华
** Created Date: 2008-08-14 
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 NF_WriteByte(uint32 block,uint8 page,uint32 addr,uint32 num,uint8 *buf)
{
	uint32 block_page;
	uint32 i;
	uint8 status;
	
	block_page=(block<<5)+page;
	
	NF_RSTECC();                     //ECC使能
	NF_nFCE_L();	
	if(addr>=512)
		NF_CMD(CMD_READOOB);  //0x50(C区)
	else if(addr>=256)
		NF_CMD(CMD_READ1);    //0x01(B区)
	else 
		NF_CMD(CMD_READ0);    //0x00(A区)
		
	NF_CMD(CMD_SEQIN);		 // 装载数据命令0x80
	NF_ADDR(addr&0xff);   				    // 发送地址地址的A0-A7无效
	NF_ADDR(block_page&0xff);	            // 发送地址A9--A16
	NF_ADDR((block_page>>8) & 0x000000FF);	// 发送地址A17--A24
	NF_ADDR((block_page>>16) & 0x000000FF);	// 发送地址A25
	
	//load data to nandflash
	for(i=0;i<num;i++)	
	{
		NF_WRDATA(*buf++);
	}	
	
	eccbuf[0]=rNF_ECC0;
	eccbuf[1]=rNF_ECC1;
	eccbuf[2]=rNF_ECC2;         //两种方法都可以
	Uart_Printf("W_EEC0:0x%x,W_EEC1:0x%x,W_EEC2:0x%x\n",eccbuf[0],eccbuf[1],eccbuf[2]);
	
		
	NF_CMD(CMD_PAGEPROG);
	NF_WAITRB();	
	
	NF_CMD(CMD_STATUS);
	status=NF_RDDATA();
	
	if(status&0x01)
	{
		NF_nFCE_H();
		return FALSE;
	}
	else
	{
		NF_nFCE_H();
		return TRUE;
	}
		
}

/*********************************************************************************************************
** Function name: NF_ReadByte()
** Descriptions:    从某个块的某个页中的某个地址读出n个字节   
** Input: blcok		块地址   (0-4096)
**		  page		页地址   (0-31)
**		  addr      字节地址 (0-527)
**        num       写入字节的个数		
** Output:
** Created by:   刘国华
** Created Date: 2008-08-14 
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 NF_ReadByte(uint32 block,uint8 page,uint32 addr,uint32 num,uint8 *buf_ret)
{
	
	uint32 blockpage=(block<<5)+page;//
	uint32 i;
	uint8 r_ecc0,r_ecc1,r_ecc2;
	NF_RSTECC();                     //ECC使能
	NF_nFCE_L();	
	
	
	
	if(addr>=512)
		NF_CMD(CMD_READOOB);  //0x50(C区)
	else if(addr>=256)
		NF_CMD(CMD_READ1);    //0x01(B区)
	else 
		NF_CMD(CMD_READ0);    //0x00(A区)
		
	NF_ADDR(addr&0xff);                   //A7-A0为0x00
	NF_ADDR(blockpage&0x000000ff);   //A9-A16
	NF_ADDR((blockpage>>8)&0x000000ff);//A17-A24
	NF_ADDR((blockpage>>16)&0x000000ff);  //A25
	NF_WAITRB();
	
	for(i=0;i<num;i++)
	{
		*buf_ret++=NF_RDDATA();
	}
	
	
	
	NF_nFCE_H();
	
	//读出此时的ECC校验码(读出数据后产生的ECC)
	r_ecc0=rNF_ECC0;
	r_ecc1=rNF_ECC1;
	r_ecc2=rNF_ECC2;
	
	
	Uart_Printf("R_ECC0:0x%x,R_EEC1:0x%x,R_EEC2:0x%x\n",r_ecc0,r_ecc1,r_ecc2);
	
	if( (r_ecc0==eccbuf[0]) && (r_ecc1==eccbuf[1]) && (r_ecc2==eccbuf[2]) )
	{
		Uart_Printf("ECC check is ok\n");
		return TRUE;
	}	
	else 
	{
		Uart_Printf("ECC check is error\n");
		return FALSE;
	}	
	
}









/*********************************************************************************************************
** Function name: main
** Descriptions: 主函数,程序入口。            
** Input: 无
** Output: 系统返回值0
** Created by: 黄绍斌
** Created Date: 2005-12-31 
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
int  main(void)
{	
	uint32 id_code=0;
	uint32 block_num;
	uint8 ret,w_buf[512],r_buf[512];
	uint32 bad_block_num=0;      //坏块计数器
	uint32 i=0;
    UART_Select(0);
	UART_Init();
	
	Uart_Printf("*********************nandflash test******************\n");
	NF_Init();   //nand 初始化
	id_code=NF_ReadID();  //读出芯片的ID信息
	Uart_Printf("manufacture id:0x%x,device code:0x%x,",((id_code&0xff000000)>>24),((id_code&0x00ff0000)>>16));
	Uart_Printf("id_code:0x%x\n",id_code);
	//////////////////////erase all block:4096/////////////////////////////////////
	
	for(block_num=0;block_num<MAX_BLOCK_NUM;block_num++)
	{
	 	
	 	ret=NF_EraseBlock(block_num);
	 	if(FALSE==ret)
	 		{
	 			Uart_Printf("bad block num:%d\n",block_num);
	 		}
	}
	Uart_Printf("erase all block is ok!\n");
	
	/****************************check bad block******************************************************/
	
	for(block_num=0;block_num<MAX_BLOCK_NUM;block_num++)
	{
		if((NF_ReadSpareData(block_num,PAGE0,5)!=0xff) || (NF_ReadSpareData(block_num,PAGE1,5)!=0xff))  //读出每个块的1,2页的起始第517个字节
			{
				bad_block_num++;
				Uart_Printf("block%d is bad\n",block_num);
			}
	}
	Uart_Printf("total num of bad block is:%d",bad_block_num);   //打印出总的坏块
	
	////////////////////////////////////////////////////////////////////////////////////////////////////
	/*
	for(i=0;i<512;i++)
	{
		w_buf[i]=i;              //初始化写buf,注意uint8只能到0xf,所以后面的是256个字节又重复0-0xff  
	}
	
	for(i=0;i<512;i++)
	{
		r_buf[i]=0;              //初始化读buf
	}
	
	ret=NF_EraseBlock(1);             //擦除第二块
	if(FALSE==ret)
	 {
	 	Uart_Printf("bad block\n");
	 }
	 	
	ret=NF_WritePage(1,0,w_buf);   //向第2块的第1页写入512字节 
	if(FALSE==ret)
	 {
	 	Uart_Printf("write page error \n");
	 }
	 	
	NF_ReadPage(1,0,r_buf);        //从第2块的第1页读出512字节 
	for(i=0;i<512;i++)
	{	
		Uart_Printf("%d**",r_buf[i]);
	}
	*/
	while(1);
   	return(0);
}

/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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