Nand Flash裸机驱动设计

Nand Flash型号 : K9F2G08U0A


1、以页方式读取Nand Flash中的数据

①选中Nand Flash芯片;

②清除RnB;

③发送命令0x00;

④发送列地址(列地址两个周期,行地址三个周期);

⑤发送行地址(页号);

⑥发送命令0x30;

⑦等待RnB;

⑧读取RnB;

⑨取消选中Nand Flash芯片;

Nand Flash裸机驱动设计_第1张图片

2、以页方式向Nand Flash中写入数据

①选中Nand Flash芯片;

②清除RnB;

③发送命令0x80;

④发送列地址;发送行地址;

向Nand Flash写入数据;

发送命令0x10;

等待RnB;

发送命令0x70;

读取写入状态;

⑩取消选中Nand Flash;

Nand Flash裸机驱动设计_第2张图片

3、块擦除操作

①选中Nand Flash芯片;

②清除RnB;

③发送命令0x60;

④发送行地址;

⑤发送命令0xD0;

⑥等待RnB;

⑦读取擦除状态;

⑧取消选中Nand Flash;

Nand Flash裸机驱动设计_第3张图片

4、K9F2G08U0A的阵列组织(即内部组成结构)

Nand Flash裸机驱动设计_第4张图片

5、在srart.S中,需要调用Nand_Init函数对Nand Flash进行初始化,然后调用Nand_To_Ram函数将Nand Flash中的数据复制到SDRAM中。

/*******************************************************************
*版权所有(C)2015,ZJU
*
*文件名称:nand.c
*内容摘要:关于NAND flash的配置
*其它说明:NAND flash型号: K9F2G08U0B	 
*	   开发板型号:	    TX2440
*当前版本:V1.0
*作    者:Frank
*完成日期:2015.12.12
*
*******************************************************************/
#define  NFCONF		(*(volatile unsigned long *)0x4E000000)	//NAND flash configuration register
#define	 NFCONT		(*(volatile unsigned long *)0x4E000004)	//NAND flash control register
#define  NFCMMD		(*(volatile unsigned char *)0x4E000008)	//NAND flash command set register
#define  NFADDR		(*(volatile unsigned char *)0x4E00000C)	//NAND flash address register
#define  NFDATA		(*(volatile unsigned char *)0x4E000010)	//NAND flash data register
#define  NFSTAT		(*(volatile unsigned char *)0x4E000020)	//NAND flash operation status register

#define  TACLS		1
#define  TWRPH0		2
#define  TWRPH1		1
	

/*******************************************************************
*函数名称:Select_Chip()
*功能描述:NAND flash使能函数
*其他说明:选中NAND flash(片选使能)
*创建日期:2015.12.12
*******************************************************************/
void Select_Chip(void)
{
	NFCONT &= ~(1 << 1);	
}


/*******************************************************************
*函数名称:Deselect_Chip()
*功能描述:NAND flash禁止函数
*其他说明:取消选中NAND flash(片选禁止)
*创建日期:2015.12.12
*******************************************************************/
void Deselect_Chip(void)
{
	NFCONT |= (1 << 1);	
}


/*******************************************************************
*函数名称:Wait_RnB()
*功能描述:等待RnB
*其他说明:RnB为1时表示响应了
*创建日期:2015.12.12
*******************************************************************/
void Wait_RnB(void)
{
	while (!(NFSTAT & (1 << 2)));	
}


/*******************************************************************
*函数名称:Clear_RnB()
*功能描述:清除RnB
*其他说明:
*创建日期:2015.12.12
*******************************************************************/
void Clear_RnB(void)
{
	NFSTAT |= (1 << 2);
}


/*******************************************************************
*函数名称:Send_Cmd(unsigned char cmd)
*功能描述:NAND flash命令发送
*输入参数:cmd
*返 回 值:无
*其他说明:cmd为向NAND flash发送的命令字符
*创建日期:2015.12.12
*******************************************************************/
void Send_Cmd(unsigned char cmd)
{
	NFCMMD = cmd;
}


/*******************************************************************
*函数名称:Send_Addr(unsigned char addr)
*功能描述:NAND flash地址发送函数
*输入参数:addr
*返 回 值:无
*其他说明:addr为8位地址
*创建日期:2015.12.12
*******************************************************************/
void Send_Addr(unsigned char addr)
{
	NFADDR = addr;	
}


/*******************************************************************
*函数名称:NF_PageRead(unsigned long addr, unsigned char * buff)
*功能描述:读取NAND flash中整页的内容
*输入参数:addr, *buff
*返 回 值:无
*其他说明:addr为所读取页的行地址,buff寄存器存储读取的NF中的内容
*创建日期:2015.12.12
*******************************************************************/
void NF_PageRead(unsigned long addr, unsigned char * buff)
{
	int i = 0;
	
	Select_Chip();			//选中NAND flash芯片		
	Clear_RnB();			//清除RnB
	Send_Cmd(0x00);			//发送命令0x00
	Send_Addr(0x00);		//发送列地址(列地址两个周期,行地址三个周期)
	Send_Addr(0x00);
	Send_Addr(addr & 0xff);		//发送行地址(页号)
	Send_Addr((addr >> 8) & 0xff);
	Send_Addr((addr >> 16) & 0xff);
	Send_Cmd(0x30);			//发送命令0x30
	Wait_RnB();			//等待RnB
	
	for (i=0; i<2048; ++i)		//读取数据
	{
		buff[i] = NFDATA;	
	}
	
	Deselect_Chip();		//取消选中NAND flash芯片
}


/*******************************************************************
*函数名称:NF_PageWrite(unsigned long addr, unsigned char * buff)
*功能描述:以页的方式向NAND flash中写入数据
*输入参数:addr, *buff
*返 回 值:ret
*其他说明:addr为所写页的行地址,buff寄存器为向NF中写入的内容
*创建日期:2015.12.13
*******************************************************************/
int NF_PageWrite(unsigned long addr, unsigned char * buff)
{
	int ret ;
	int i = 0;
	Select_Chip();			//选中NAND flash芯片
	Clear_RnB();			//清除RnB
	Send_Cmd(0x80);			//发送命令0x80
	Send_Addr(0x00);		//发送列地址
	Send_Addr(0x00);
	Send_Addr(addr & 0xff);		//发送行地址
	Send_Addr((addr >> 8) & 0xff);
	Send_Addr((addr >> 16) & 0xff);
	
	for (i=0; i<2048; ++i)		//向NAND flash写入数据
	{
		NFDATA = buff[i];	
	}
	
	Send_Cmd(0x10);			//发送命令0x10
	Wait_RnB();			//等待RnB
	Send_Cmd(0x70);			//发送命令0x70
	
	ret = NFDATA;			//读取写入状态
	Deselect_Chip();		//取消选中NAND flash
	
	return ret;
}


/*******************************************************************
*函数名称:NF_Erase(unsigned long addr)
*功能描述:整块擦除NAND flash
*输入参数:addr
*返 回 值:ret
*其他说明:addr为所擦除页的行地址,ret为擦除状态返回值
*创建日期:2015.12.13
*******************************************************************/
int NF_Erase(unsigned long addr)
{
	int ret;
	Select_Chip();			//选中NAND flash芯片
	Clear_RnB();			//清除RnB
	Send_Cmd(0x60);			//发送命令0x60
	Send_Addr(addr & 0xff);		//发送行地址
	Send_Addr((addr >> 8) & 0xff);
	Send_Addr((addr >> 16) & 0xff);
	Send_Cmd(0xD0);			//发送命令0xD0
	Wait_RnB();			//等待RnB
	Send_Cmd(0x70);			//发送命令0x70
	
	ret = NFDATA;			//读取擦除状态
	Deselect_Chip();		//取消选中NAND flash芯片
	
	return ret;
}


/*******************************************************************
*函数名称:Nand_Reset()
*功能描述:复位NAND flash
*其他说明:
*创建日期:2015.12.12
*******************************************************************/
void Nand_Reset(void)
{
	Select_Chip();		//选中NAND flash	
	Clear_RnB();		//清除RnB
	Send_Cmd(0xff);		//发送0xff命令
	Wait_RnB();		//等待RnB
	Deselect_Chip();	//取消选中NAND flash
}


/*******************************************************************
*函数名称:Nand_Init()
*功能描述:初始化NAND flash
*其他说明:
*创建日期:2015.12.12
*******************************************************************/
void Nand_Init(void)
{
	NFCONF = ((TACLS << 12) | (TWRPH0 << 8) | (TWRPH1 << 4));	//初始化NFCONF
	NFCONT = ((1 << 0) | (1 << 1));		//初始化NFCONT
	Nand_Reset();				//复位
}


/*******************************************************************
*函数名称:Nand_To_Ram(unsigned long , unsigned char * , int)
*功能描述:读取NAND flash中整页的内容
*输入参数:start_addr, * sdram_addr, size
*返 回 值:无
*其他说明:addr为所读取页的行地址,buff寄存器存储读取的NF中的内容
*创建日期:2015.12.12
*******************************************************************/
void Nand_To_Ram(unsigned long start_addr, unsigned char * sdram_addr, int size)
{
	int i = 0;
	for (i=(start_addr>>11); size>0; )	//采用的是按页拷贝的方式,不需要列地址,只保留行地址
	{
		NF_PageRead(i, sdram_addr);
		size -= 2048;
		sdram_addr += 2048;
		i++;	
	}
}












你可能感兴趣的:(Flash,nand,s3c2440)