rel="File-List" href="file:///C:%5CDOCUME%7E1%5Czhw%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml">
rel="File-List" href="file:///C:%5CDOCUME%7E1%5Czhw%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml">
我先摘录一段对Nor和Nand flash区别的几条总结:
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
9F
1208U
0M
,从datesheet上得知,此flash每页528Bytes(512byte的Main Area + 16byte的Spare Area),每32个page形成一个Block(32*528B)。具体一片flash上有多少个Block视需要所定。我所使用的k
9f
1208U
0M
具有4096个block,故总容量为4096*(32*528B)=66MB,但是其中的2MB(Spaer Area)是用来保存ECC校验码等额外数据的,故实际中可使用的为64MB。
Nand flash以页(512Byte)为单位读写数据,而以块(16KB)为单位擦除数据。按照这样的组织方式可以形成所谓的三类地址:
● Column Address:列地址,地址的低8位
● Page Address :页地址
● Block Address :块地址
对于NAND Flash来讲,地址和命令只能在I/O[7:0]上传递,数据宽度也是8位,这导致在读写指定地址的数据时,地址是分4次传递的(3次右移),见后文。
s
3c
2410这个处理器之所以可以直接从Nand flash启动,是因为CPU内置了4KB的片内SRAM,手册上称作“Steppingstone”。板子上电复位之后,CPU会自动将Nand flash的前4KB代码拷贝到片内SRAM中去执行(此过程是靠硬件实现的,见datasheet图Figure 6-1. NAND Flash Controller Block Diagram),这也是导致从Nor和Nand启动后的内存映射不同的原因。所以,vivi的stage1代码head.S必须要小于4KB,其中实现基本的CPU初始化等工作,并且要实现把自身拷贝到SDRAM中,之后的stage2就实现复杂功能。
下面具体看一下如何读写这块Nand flash:
从s
3c
2410的datasheet上得知,Nand flash的操作通过NFCONF、NFCMD、NFADDR、NFDATA、NFSTAT和NFECC这六个寄存器来完成,并且列出操作Nand flash的4个步骤:
|
-------------------------------------------------------------------------------------------
NFCONF
地址:0x4E000000
NFCMD
地址:0x4E000004
[15:8]:resevered
[7:0] :nand flash memory command value
nand flash的所有命令
rel="File-List" href="file:///C:%5CDOCUME%7E1%5Czhw%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml">
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 |
rel="File-List" href="file:///C:%5CDOCUME%7E1%5Czhw%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml">
NOTE : 1. The 00h command defines starting address of the 1st half of registers.
The 01h command defines starting address of the 2nd half of registers.
After data access on the 2nd half of register by the 01h command, the status pointer is 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 plane operation.
Page Program(Dummy) and Copy-Back Program(Dummy) are available on the 2nd,3rd,4th plane of multi plane operation. 3. The 71h command should be used for read status of Multi Plane operation.
Caution : Any undefined command 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个步骤来完成读过程:
先要初始化Nand flash,紧接着复位一下:
|
初始化Nand flash之后,就可以把stage2的main函数代码拷贝到SDRAM中去执行,当然之前已经配置好了SDRAM。以上工作都是在stage1阶段(片内SRAM中)完成的,之后就可以读写Nand flash了。
下面分析读操作的实现,贴上vivi/s
3c
2410/nand_read.c源码:
|
以上是对Nand flash读操作的分析。总体来看,关键在于根据CPU和Flash的datasheet配置各寄存器和按照规定顺序进行操作。具体的配置过程是比较繁杂的,可参照u-boot或vivi中对各种硬件支持的源码来配置,可省不少事。