Nand Flash裸机驱动设计
最后更新于:2022-04-01 16:11:39
Nand Flash型号 : K9F2G08U0A
## 1、以页方式读取Nand Flash中的数据
①选中Nand Flash芯片;
②清除RnB;
③发送命令0x00;
④发送列地址(列地址两个周期,行地址三个周期);
⑤发送行地址(页号);
⑥发送命令0x30;
⑦等待RnB;
⑧读取RnB;
⑨取消选中Nand Flash芯片;
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-07-26_579724f8e5b4f.jpg)
## 2、以页方式向Nand Flash中写入数据
①选中Nand Flash芯片;
②清除RnB;
③发送命令0x80;
④发送列地址;发送行地址;
⑤向Nand Flash写入数据;
⑥发送命令0x10;
⑦等待RnB;
⑧发送命令0x70;
⑨读取写入状态;
⑩取消选中Nand Flash;
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-07-26_579724f9301f2.jpg)
## 3、块擦除操作
①选中Nand Flash芯片;
②清除RnB;
③发送命令0x60;
④发送行地址;
⑤发送命令0xD0;
⑥等待RnB;
⑦读取擦除状态;
⑧取消选中Nand Flash;
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-07-26_579724f9501b2.jpg)
## 4、K9F2G08U0A的阵列组织(即内部组成结构)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-07-26_579724f9746b3.jpg)
## 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++;
}
}
~~~