Nand Flash介绍
来源:互联网 发布:web science数据库 编辑:程序博客网 时间:2024/04/30 09:00
NOR flash采用位读写,因为它具有sram的接口,有足够的引脚来寻址,可以很容易的存取其内部的每一个字节。
NAND flash使用复杂的I/O口来串行地存取数据。8个引脚用来传送控制、地址和数据信息(复用)。NAND的读和写单位为512Byte的页,擦写单位为32页的块。
● NOR的读速度比NAND稍快一些。
● NAND的写入速度比NOR快很多。
● NAND的4ms擦除速度远比NOR的5s快。
● 大多数写入操作需要先进行擦除操作。
● NAND的擦除单元更小,相应的擦除电路更少。
在NOR器件上运行代码不需要任何的软件支持,在NAND器件上进行同样操作时,通常需要驱动程序,也就是内存技术驱动程序(MTD),NAND和NOR器件在进行写入和擦除操作时都需要MTD。
再来看看Nand flash自身的特点:
Nand Flash的数据是以bit的方式保存在memory cell中,一般来说,一个cell 中只能存储一个bit。这些cell 以8个或者16个为单位,连成bit line,形成所谓的byte(x8)/word(x16),这就是NAND Device的位宽。
多个line(多个位宽大小的数据)会再组成Page。我使用的Nand flash是三星的K
Nand flash以页(512Byte)为单位读写数据,而以块(16KB)为单位擦除数据。按照这样的组织方式可以形成所谓的三类地址:
● Column Address:列地址,地址的低8位
● Page Address :页地址
● Block Address :块地址
对于NAND Flash来讲,地址和命令只能在I/O[7:0]上传递,数据宽度也是8位,这导致在读写指定地址的数据时,地址是分4次传递的(3次右移),见后文。
s
下面具体看一下如何读写这块Nand flash:
从s
NAND FLASH MODE CONFIGURATION
1
. Set NAND flash configuration by NFCONF register.
2
. Write NAND flash command onto NFCMD register.
3
. Write NAND flash address onto NFADDR register.
4
. Read/Write data while checking NAND flash status by NFSTAT register. R/nB signal should be checked before read operation or after program operation.
-------------------------------------------------------------------------------------------
NFCONF
地址:0x4E000000
NFCMD
地址:0x4E000004
[15:8]:resevered
[7:0] :nand flash memory command value
nand flash的所有命令
Function
1st. Cycle
2nd. Cycle
3rd. Cycle
Acceptable Command
during Busy
Read 1
00h/01h(1)
-
-
Read 2
50h
-
-
Read ID
90h
-
-
Reset
FFh
-
-
O
Page Program (True)(2)
80h
10h
-
Page Program (Dummy)(2)
80h
11h
-
Copy-Back Program(True)(2)
00h
8Ah
10h
Copy-Back Program(Dummy)(2)
03h
8Ah
11h
Block Erase
60h
D0h
-
Multi-Plane Block Erase
60h----60h
D0h
-
Read Status
70h
-
-
O
Read Multi-Plane Status
71h(3)
-
-
O
NOTE: 1. The 00h command defines starting address of the 1sthalf of registers.
The01h command defines starting address of the 2nd half of registers.
Afterdata access on the 2nd half of register by the 01h command, the status pointeris automatically moved to the 1st half register(00h) on the next cycle.
2.Page Program(True) and Copy-Back Program(True) are available on 1 planeoperation.
Page Program(Dummy) and Copy-Back Program(Dummy) are available on the2nd,3rd,4th plane of multi plane operation. 3. The 71h command should be usedfor read status of Multi Plane operation.
Caution : Any undefinedcommand inputs are prohibited except for above command set of Table 1.
NFADDR地址:0x4E000008
[15:8]:resevered
[7:0] :nand flash memory command value
NFDATA
地址:0x4E00000C
[15:8]:resevered
[7:0] :nand flash memory date value
NFSTAT
地址:0x4E000010
[16:1]:resevered
[0]:RnB read/busy status
0:busy
1:ready for operation
NFECC
地址:0x4E000014
-------------------------------------------------------------------------------------------
下面结合vivi源码来详细的分析具体如何操作这6个寄存器来完成以上4个步骤来完成读过程:
先要初始化Nandflash,紧接着复位一下:
void reset_nand()
{
int i=0;
NFCONF
&= ~0x800; /* 现在真正使用Nand flash,bit[11]要置0,与初始化时相反 */
for(; i<10; i++);
NFCMD
= 0xff; //reset command
/* 复位命令。NFCMD寄存器只用到低8位(bit[7:0])。
K
手册中列出了针对此块flash的各种命令,见Table 1. Command Sets。vivi/include/mtd/nand.h更直观的列出了各种命令 */
wait_idle
();
}
/* 初始化NAND Flash */
/* NFCONF设定为0xf830,作用是使能Nand flash控制器、初始化ECC、Nand flash片选信号nFCE=1(inactive,真正使用时再让它等于0)、设置TACLS、TWRPH0、TWRPH1。
TACLS
、 TWRPH0、TWRPH1这三个参数是控制Nand flash信号线CLE/ALE和写控制信号nWE的时序关系的,要参照具体的flash芯片手册来设置。我这个是K
CLE setup Time = 0 ns
,CLE Hold Time = 10 ns,
ALE setup Time = 0 ns
,ALE Hold Time = 10 ns,
WE Pulse Width = 25 ns
可 以计算,即使在HCLK=100MHz的情况下,TACLS+TWRPH0+TWRPH1=6/100 uS=60 ns,也是可以满足NAND Flash K
void init_nand()
{
NFCONF
= 0xf830;//自己对照手册
reset_nand
();
}
初始化Nand flash之后,就可以把stage2的main函数代码拷贝到SDRAM中去执行,当然之前已经配置好了SDRAM。以上工作都是在stage1阶段(片内SRAM中)完成的,之后就可以读写Nand flash了。
下面分析读操作的实现,贴上vivi/s
#include <config.h>
#define __REGb(x) (*(volatile unsigned char *)(x))
#define __REGi(x) (*(volatile unsigned int *)(x))
#define NF_BASE 0x4e000000
#define NFCONF __REGi(NF_BASE + 0x0)
#define NFCMD __REGb(NF_BASE + 0x4)
#define NFADDR __REGb(NF_BASE + 0x8)
#define NFDATA __REGb(NF_BASE + 0xc)
#define NFSTAT __REGb(NF_BASE + 0x10)
#define BUSY 1
inline void wait_idle(void) {
int i;
/* NFSTAT:只用到位0,0-busy,1-ready */
while(!(NFSTAT & BUSY))
for(i=0; i<10; i++);
}
#define NAND_SECTOR_SIZE 512 /* Nand flash是以512Byte为单位来读写的 */
#define NAND_BLOCK_MASK (NAND_SECTOR_SIZE - 1)
/* low level nand read function */
/* 下面的读过程严格按照2410手册上的顺序 */
int nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)
{
int i, j;
if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) {
return -1; /* invalid alignment */
}
/* chip Enable */
/* 对应第一条:1. Set NAND flash configuration by NFCONF register. */
NFCONF
&= ~0x800;
for(i=0; i<10; i++);
for(i=start_addr; i < (start_addr + size);) {
/* READ0 */
/* 对应第二条:2. Write NAND flash command onto NFCMD register. */
NFCMD
= 0;
/* Write Address */
/* 对应第三条:3. Write NAND flash address onto NFADDR register.
*NFADDR
寄存器也只用到低八位来传输,所以需要分4次来写入一个完整的32位地址,需要注意后3次的移位操作
*/
NFADDR
= i & 0xff;
NFADDR
= (i >> 9) & 0xff;
NFADDR
= (i >> 17) & 0xff;
NFADDR
= (i >> 25) & 0xff;
/* 对应第四条:4. Read/Write data while checking NAND flash status by NFSTAT register.
一个地址对应512个字节数据。所以,由于8bit位宽的限制,每次读取8位(1个字节),共读512次得到1页512Byte数据
*/
wait_idle
();
for(j=0; j < NAND_SECTOR_SIZE; j++, i++) {
*buf = (NFDATA & 0xff);
buf
++;
}
}
/* chip Disable */
/* 读写完毕需要禁止Nand flash ,与开始相对应*/
NFCONF
|= 0x800; /* chip disable */
return 0;
}
以上是对Nand flash读操作的分析。总体来看,关键在于根据CPU和Flash的datasheet配置各寄存器和按照规定顺序进行操作。具体的配置过程是比较繁杂的,可参照u-boot或vivi中对各种硬件支持的源码来配置,可省不少事。
- Nand Flash介绍
- NAND FLash基础概念介绍
- nor flash与nand flash介绍
- NAND FLASH和NOR FLASH的介绍
- NAND Flash传输速度--基于Micron的NAND Flash介绍
- Nand Flash介绍和Nand Flash控制器使用
- NAND FLASH 产品介绍(K9F2G08UA)
- linux nand flash 驱动简单介绍
- 【转载】NAND Flash的续介绍
- Nand Flash
- NAND Flash
- nand flash
- NAND FLASH
- NAND FLASH
- nand flash
- Nand Flash
- NAND Flash
- NAND FLASH
- [basics]demo之cclasses Symbian C类对象
- DirectInput
- WORD中想要删除大量的回车键怎么办
- 超酷,可惜,貌似中文的音乐电台不能添加
- Linux服务器配置学习材料 (个人学习笔记,代替书签)
- Nand Flash介绍
- Eclipse报告内存不足和PermSize space错误
- 《Web标准和SEO应用实践》读书笔记-摘要
- 安装Microsoft Visual Studio 2008 SP1时出现无法访问Windows Installer服务的问题
- OpenCL on the Fast Track
- DirectInput 键盘编程入门
- Visual Studio 2008新特性
- java对象群体的组织:向量Vector
- image与byte数组的转换