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++; } } ~~~
';