一、Flash介绍
常用的flash类型有NOR Flash 和Nand Flash 两种;
(1)Nor Flash
1、Nor Flash的接口和RAM完全相同,可以随机访问任意地址的数据,在其上进行读操作的效率非常高,但是擦除和写操作的效率很低,另外,Nor Flash的容量一般比较小,通常,Nor Flash用于存储程序;
2、Nor Flash的块大小范围为64KB—128KB;
3、擦写一个Nor Flash块需要4s,
4、市场上Nor Flash 的容量通常为1MB—4MB
(2)Nand Flash
1、Nand Flash的接口仅仅包含几个I/O引脚,需要串行地访问,Nand Flash进行擦除和写操作的效率很高,容量较大,
通常Nand Flash用于存储数据;
2、Nand Flash的块大小范围为8KB—64KB;
3、擦写一个Nand Flash块需要2ms;
4、Nand Flash 一般以512字节为单位进行读写
5、 市场上 Nand Flash 的容量一般为 8M—512M
二、Nand Flash的物理结构
以三星公司生产的 K9F1208U0M 为例:
1、容量:64MB,
一共4个层;
每层1024个块(block);
1块包含32页
1页包含 512 + 16 = 528个字节
2、外部接口:8个I/O口,5个使能信号(ALE、CLE、nWE、nRE、nCE),1个状态引脚(RDY/B),1个写保护引脚(nWE);
3、命令、地址、数据都通过8个I/O口输入输出;
4、写入命令、地址、数据时,都需要将nWE、nCE信号同时拉低;数据在WE上升沿被锁存;
5、CLE、ALE用来区分I/O引脚上传输的是数据还是地址;
6、64MB的空间需要26位地址,因此以字节为单位访问Flash时需要4个地址序列;
7、读/写页在发出命令后,需要4个地址序列,而擦除块在发出擦除命令后仅需要3个地址序列;
三、Nand Flash访问方法
1 特殊功能寄存器定义
#define rNFCONF (*(volatile unsigned int *)0x4e000000)
#define rNFCMD (*(volatile unsigned char *)0x4e000004)
#define rNFADDR (*(volatile unsigned char *)0x4e000008)
#define rNFDATA (*(volatile unsigned char *)0x4e00000c)
#define rNFSTAT (*(volatile unsigned int *)0x4e000010)
#define rNFECC (*(volatile unsigned int *)0x4e000014)
#define rNFECC0 (*(volatile unsigned char *)0x4e000014)
#define rNFECC 1 (*(volatile unsigned char *)0x4e000015)
#define rNFECC2 (*(volatile unsigned char *)0x4e000016)
2 操作的函数实现
1. 发送命令
#define NF_CMD(cmd) {rNFCMD=cmd; }
2. 写入地址
#define NF_ADDR(addr) {rNFADDR=addr;}
3. Nand Flash 芯片选中
#define NF_nFCE_L() {rNFCONF&=~(1<<11);}
4. Nand Flash 芯片不选中
#define NF_nFCE_H() {rNFCONF|=(1<<11);}
5. 初始化 ECC
#define NF_RSTECC() {rNFCONF|=(1<<12);}
6. 读数据
#define NF_RDDATA() (rNFDATA)
7. 写数据
#define NF_WRDATA(data) {rNFDATA=data;}
8. 获取Nand Flash 芯片状态
#define NF_WAITRB() {while(!(rNFSTAT&(1<<0)));}
0/假: 表示Nand Flash 芯片忙状态
1/真:表示Nand Flash 已经准备好
3.NandFlash读写擦具体实现。