Nand flash Nand Flash 相当于PC上的硬盘,可用于保存操作系统、应用程序、用户数据等。
一、 nand flash的特点
1、
容量大:32MB~2GB
2、
XIP:NAND一般用来存放代码,但是代码是不能在nand中运行的,如果要执行nand中的代码,必须把代码拷贝到SDRAM中,然后在SDRAM运行代码。
3、
访问速度:nand flash采用“块状”的读写方式,一次可以完成多个字节读写操作,访问速度很快。
4、
接口:nand flash没有地址总线和数据总线,所以一般不能接在存储器控制器上,只能接在nand flash控制器上。这样,ARM不给nand分配地址,访问nand的时候,根据nand自身的编址进行访问。
5、
访问方式:访问nand时,“地址”、“数据”和“命令”都是通过IO口进行传输。Nand有两个使能信号(ALE---地址锁存使能,CLE----命令锁存使能)来区分IO口上传输的内容(命令、地址、数据)。所以nand和硬盘类似,是一种串行访问方式。
二、nand flash的硬件设计
1、硬件设计


2、nand引脚说明

3、2440nand控制器引脚

三、K9F1208特点
1、
结构:
Chip:64MB数据区+2MB寄存器区
Block:(1chip = 4kblocks),16KB数据区+512B寄存器区
Page:(1block = 32pagesr),512B数据区+16B寄存器区
2、
数据区与寄存器区
数据区:存放有效数据。
寄存器区:存放ECC(错误校验码)、坏块标志、文件系统相关信息
3、
nand flash的地址
nand是没数据线和地址线的,但是nand本身内部是有地址的,nandflash的编址方式是按照IO口个数为单位进行编址。Nand在ALE有效而CLE无效的时候,IO口上传输的地址,所以对nand进行寻址的时候,地址值是分周期输入的。
Chip:A25~A0
Block地址:A25~A14;block内地址:A13~A0
Page地址:A25~A9;page内地址:A8~A0。
因为nand只有8个IO传输地址,所以地址分周期传输。地址如下:

4、00H命令和01H命令
00H命令选中“A”区,A8=0
01H命令选中“B”区,A8=1

四、从nand flash启动
一般一个嵌入式平台是支持从NOR flash,为了降低成本和缩小硬件体积,嵌入式处理器可以支持多种启动方式,以便节省NOR。Nand、SD、SPI、网络启动。所谓从哪里驱动,就是将ARM的启动代码放在哪里。
2440从nand启动的原理:

四、2440nand
flash控制器
1、命令寄存器

2、地址寄存器

3、数据寄存器
4、状态寄存器

五、nand
flash的访问
nand flash的访问包括“读”、“写”、“擦除”、“读ID”
1、
读nand ID

举例:
#define rNFCMD (*(volatile unsigned *)0x4E000008) //NAND Flash command
#define rNFADDR (*(volatile unsigned *)0x4E00000C) //NAND Flash address
#define rNFDATA (*(volatile unsigned *)0x4E000010) //NAND Flash data
int id = 0
int read_nand_id(void)
{
rNFCMD = 0x90;
rNFADDR = 0x00;
for(int i=0;i<4;i++)
id |= (rNFDATA<<(8*(3-i)));
return id;
}
2、
nand擦除操作
向nand flash内写数据之前,先需要进行擦除操作,然后才可以写入数据。Nand flash擦除的单位是block,可以同时擦除几个块。

举例:
#define rNFCMD (*(volatile unsigned *)0x4E000008) //NAND Flash command
#define rNFADDR (*(volatile unsigned *)0x4E00000C) //NAND Flash address
#define rNFDATA (*(volatile unsigned *)0x4E000010) //NAND Flash data
//返回值0—>擦除成功
//
1-à擦除失败
//参数:block-à擦除的块号
int
Erase_Nand_Block(int block)
{
int block_addr;
block_addr = block<<14;
rNFCMD = 0x60;
rNFADDR = (block_addr>>9)&0xff;
rNFADDR = (block_addr>>17)&0xff;
rNFADDR = (block_addr>>25)&0x01;
rNFCMD = 0xD0;
while(!(rNFSTAT & 0x01));
rNFCMD = 0x70;
return (rNFDATA
&0x01);
}
3、 nand写操作
nand flash写入是page为单位。

4、 nand flash读操作
1) 读操作1 读数据区
00H命令:从1st half page开始读
01H命令:从2nd half page开始读

2) 读方式2 读寄存器区
命令是50H

5、 注意事项
对nand操作的过程是一个连续的过程,中间是不能被中断打断,所以操作nand的时候,需要关闭中断,否则系统可能崩溃。 |