NandFlash驱动超详细分析(三)(转)
2410NandFlash控制器
管脚配置
D[7:0]: DATA0-7 数据/命令/地址/的输入/输出口(与数据总线共享)
CLE : GPA17 命令锁存使能 (输出)
ALE : GPA18 地址锁存使能(输出)
nFCE : GPA22 NAND Flash 片选使能(输出)
nFRE : GPA20 NAND Flash 读使能 (输出)
nFWE : GPA19 NAND Flash 写使能 (输出)
R/nB : GPA21 NAND Flash 准备好/繁忙(输入)
相关寄存器:
NFCONF NandFlash控制寄存器
[15]NandFlash控制器使能/禁止 0 = 禁止 1 = 使能
[14:13]保留
[12]初始化ECC解码器/编码器 0 = 不初始化 1 = 初始化
[11]芯片使能 nFCE控制 0 = 使能 1 = 禁止
[10:8]TACLS 持续时间 = HCLK*(TACLS+1)
[6:4] TWRPH0
[2:0] TWRPH1
NFCMD 命令设置寄存器
[7:0] 命令值
NFADDR 地址设置寄存器
[7:0] 存储器地址
NFDATA 数据寄存器
[7:0] 存放数据
NFSTAT 状态寄存器
[0] 0 = 存储器忙 1 = 存储器准备好
NFECC ECC寄存器
[23:16]ECC校验码2
[15:8] ECC校验码1
[8:0] ECC校验码0
写操作:
写入操作以页为单位。写入必须在擦除之后,否则写入将出错。
页写入周期中包括以下步骤:
写入串行数据输入指令(80h)。然后写入4个字节的地址,最后串行写入数据(528Byte)。串行写入的数据最多为528byte。
串行数据写入完成后,需要写入“页写入确认”指令10h,这条指令将初始化器件内部写入操作。
10h写入之后,nand flash的内部写控制器将自动执行内部写入和校验中必要的算法和时序,
系统可以通过检测R/B的输出,或读状态寄存器的状态位(I/O 6)来判断内部写入是否结束
擦除操作:
擦除操作时以块(16K Byte)为单位进行的
擦除的启动指令为60h,随后的3个时钟周期是块地址。其中只有A14到A25是有效的,而A9到A13是可以忽略的。
块地址之后是擦除确认指令D0h,用来开始内部的擦除操作。
器件检测到擦除确认命令后,在/WE的上升沿启动内部写控制器,开始执行擦除和擦除校验。内部擦除操作完成后,应该检测写状态位(I/O 0),从而了解擦除操作是否成功完成。
读操作有两种读模式:
读方式1用于读正常数据;
读方式2用于读附加数据
在初始上电时,器件进入缺省的“读方式1模式”。在这一模式下,页读取操作通过将00h指令写入指令寄存器,接着写入3个地址(一个列地址和2个行地址)来启动。一旦页读指令被器件锁存,下面的页操作就不需要再重复写入指令了。
写入指令和地址后,处理器可以通过对信号线R//B的分析来判断该才作是否完成。
外部控制器可以再以50ns为周期的连续/RE脉冲信号的控制下,从I/O口依次读出数据
备用区域的从512到527地址的数据,可以通过读方式2指令进行指令进行读取(命令为50h)。地址A0~A3设置了备用区域的起始地址,A4~A7被忽略掉
时序要求:
写地址、数据、命令时,nCE、nWE信号必须为低电平,它们在nWE信号的上升沿被锁存。命令锁存使能信号CLE和地址锁存信号ALE用来区分I/O引脚上传输的是命令还是地址。
寻址方式:
NAND Flash的寻址方式和NAND Flash的memory组织方式紧密相关。NAND Flash的数据以bit的方式保存在memory cell,一个cell中只能存储一个bit。这些cell以8个或者16个为单位,连成bit line,形成byte(x8)/word(x16),这就是NAND的数据宽度。
这些Line会再组成Page,典型情况下:通常是528Byte/page或者264Word/page。然后,每32个page形成一个Block,Sizeof(block)=16.5kByte。其中528Byte = 512Byte+16Byte,前512Byte为数据区,后16Byte存放数据校验码等,因此习惯上人们称1page有512个字节,每个Block有16Kbytes;
现在在一些大容量的FLASH存贮设备中也采用以下配置:2112 Byte /page 或 1056 Word/page;64page/Block;Sizeof(block) = 132kByte;同上:2112 = 2048 +64,人们习惯称一页含2k个字节,一个Block含有64个页,容量为128KB;
Block是NAND Flash中最大的操作单元,擦除可以按照block或page为单位完成,而编程/读取是按照page为单位完成的
。
所以,按照这样的组织方式可以形成所谓的三类地址:
-Block Address 块地址
-Page Address 页地址
-Column Address 列地址
首先,必须清楚一点,对于NAND Flash来讲,地址和命令只能在I/O[7:0]上传递,数据宽度可以是8位或者16位,但是,对于x16的NAND Device,I/O[15:8]只用于传递数据。
清楚了这一点,我们就可以开始分析NAND Flash的寻址方式了。
以528Byte/page 总容量64M Byte+512kbyte的NAND器件为例:
因为
1page=528byte=512byte(Main Area)+16byte(Spare Area)
1block=32page = 16kbyte
64Mbyte = 4096 Block
用户数据保存在main area中。
512byte需要9bit来表示,对于528byte系列的NAND,这512byte被分成1st half和2nd half,各自的访问由所谓的pointer operation命令来选择,也就是选择了bit8的高低。因此A8就是halfpage pointer,A[7:0]就是所谓的column address。
32个page需要5bit来表示,占用A[13:9],即该page在块内的相对地址。
Block的地址是由A14以上的bit来表示,例如64MB的NAND,共4096block,因此,需要12个bit来表示,即A[25:14],如果是1Gbit的528byte/page的NAND Flash,共8192个block,则block address用A[30:14]表示。
NAND Flash的地址表示为:
Block Address | Page Address in block | half page pointer | Column Address
地址传送顺序是Column Address , Page Address , Block Address。
例如一个地址:0x00aa55aa
0000 0000 1010 1010 0101 0101 1010 1010
由于地址只能在I/O[7:0]上传递,因此,必须采用移位的方式进行。
例如,对于64MBx8的NAND flash,地址范围是0~0x3FF_FFFF,只要是这个范围内的数值表示的地址都是有效的。
以NAND_ADDR为例:
第1步是传递column address,就是NAND_ADDR[7:0],不需移位即可传递到I/O[7:0]上, 而halfpage pointer即bit8是由操作指令决定的,即指令决定在哪个halfpage上进行读写,而真正的bit8的值是don't care的。
第2步就是将NAND_ADDR右移9位,将NAND_ADDR[16:9]传到I/O[7:0]上;
第3步将NAND_ADDR[24:17]放到I/O上;
第4步需要将NAND_ADDR[25]放到I/O上;
因此,整个地址传递过程需要4步才能完成,即4-step addressing。
如果NAND Flash的容量是32MB以下,那么,block adress最高位只到bit24,因此寻址只需要3步。
没有评论:
发表评论