注:
Row也就是page
1. 引脚描述
I/O0 ~ I/O7-----data inputs/outputs
通过这8个I/O引脚,可以输入命令,地址和数据,也可以在读操作时输出数据。
CLE-----command latch enable
CLE输入控制了发送到命令寄存器的命令。CLE为高电平时激活,在nWE的上升沿,命令通过I/O端口被锁存到命令寄存器中,结合datasheet的相关时序图来理解更为深刻。
ALE-----address latch enable
ALE输入控制了地址发送到内部地址寄存器中,在nWE的上升沿和ALE为高电平时,地址被锁存到地址寄存器中。
nCE-----chip enable
nCE是设备选择控制引脚。
nWE-----write enable
写使能,在nWE的上升沿,命令,地址和数据被锁存。
nWP -----write protect
写保护,当此引脚为低电平激活,也即内部高压发生器复位。
R/B-----ready/busy output
就绪/忙输出引脚,通过这个引脚可以知道设备操作的状态。低电平时,表示编程或擦除或随机读操作在进行,并且根据完成情况来返回高状态。
2. K9F1208U0B的存储结构和存储特点
2.1 K9F1208U0B的存储结构
一片K9F1208U0B总共有4096blocks,每个block包含32pages,每个page包含528bytes,关系如下:
1 device = 4096 blocks
1 block = 32 pages
1 page = 512 Bytes data field + 16 bytes spare field
所以一片K9F1208U0B的容量为4096*32*528=66MB,但是事实上每个page上的最后16bytes是用于存储校验码用的,并不能存放实际的数据,所以实际上我们可以操作的芯片容量为4096*32*512=64MB
由上图可知,1个page总共由528 bytes组成,这528 bytes安顺序由上到下以列为单位进行排列(1列代表一个byte,第0行为第0 byte,第1行为第1 byte)。这528 bytes按功能分为两大部分,分别是data field和spare field,其中spre field占528 bytes里的16 bytes,这16 bytes是用于在读写操作的时候存放校验码用的,一般不用做普通数据的存储区,除去16 bytes,剩下的512 bytes便是我们用于存放数据用的data field,所以一个page上虽然有528 bytes,但我们只按512 bytes进行容量的计算。
Data field安装位置有分为两部分,分别成为1st half和2nd half,每个half各占256 bytes,至于为什么要把data field分为两部分,后面将做进一步分析。
2.2 K9F1208U0B存储操作特点
⑴K9F1208U0B是以页为单位进行读写,以block为单位进行擦除。
⑵K9F1208U0B芯片每一位只能从1变为0,而不能从0变为1,所以在对其进行写操作之前一定要将相应块擦除(擦除即是将相应块的位全部变为1)
⑶最后16 bytes(OOB),OOB的第六个字节(即第517个byte)标志是否是坏块,如果不是坏块该值为FF,否则为坏块!
⑷除OOB第六字节外,通常至少把OOB的前3个字节存放nandflash硬件ECC码。
2.3
3. K9F1208U0B的地址空间
64M byte物理空间需要26位地址,所以需要4个周期来发送地址,见上图
Column address
列地址,columm address其实就是指定page上的某个byte,指定这个byte,其实也就是指定此页的读写起始地址。512byte需要8bit来表示,对于528byte系列的NANDFLASH,这512byte被分成1st half和2nd half,各自的访问由不同的命令(00h/01h)来选择
因为我们的地址,命令和数据都只能通过I/O0~I/O7这8个引脚发送到nandflash,对应于A0~A7,这也就是为什么A8不出现在我们传递的地址位中,也就是说我们能够指定的column address范围为0~255,但是,1个page的datafield是有512个byte组成的,假设现在我要指定读命令从第256个byte处开始开始读取此页,那么将会发生什么情景呢?我必须把column address设置为256,但column address最大只能是255,这就造成数据溢出,正是这个原因才把data field分成2个半区。当腰读取的其实地址(column address)在0~255内时我们用00h命令,当读取的其实地址是256~511时,则使用01h命令
Page address
页地址,由于页地址总是以512byte对齐的,所以它的低9位总是0,确定读写操作时在flash上的哪个页进行的。一个block有32个page,所以需要5bit来表示,即A9~A13,即该页在blcok内的相对地址
Block address
一个K9F1208U0B flash有4096个block,所以需要12bit来表示,及A14~A25。
地址传送顺序是column address,page address,block address,但由于地址只能在I/O[7:0]上传送,因此,必须采用移位的方式进行,下面以NandAddr为例
⑴第一步是传递column address,就是NandAddr[7:0],不需要移位即可传递到I/O[7:0]上,而halfpage pointer即bit8是有操作指令(00h/01h)决定的,即指令决定是在哪个halfpage上进行读写,而真正的bit8的值是don’t care的。
⑵第2步就是将NandAddr右移9bit,将NandAddr[16:9]传到I/O[7:0]上。
⑶第3步就将NandAddr[24:17]放到I/O[7:0]上。
⑷第4步需要将NandAddr[25]放到I/O[0]上,因此,整个地址传递过程需要4步才能完成,即4-step addressing。
4. K9F1208U0B的操作命令集
⑴ Read 1
命令是00h/01h,这两个命令用于读取datafield的数据,其中00h表示将要读取K9F1208U0B存储空间中一个页的前半部分,并且将内置指针定位到前半部分的第一个字节;01h表示将要读取K9F1208U0B存储空间中一个页的后半部分,并且将内置指针定位到后半部分的第一个字节。
⑵ Read 2
命令是50h,用于读取sparefield的数据。
⑶ Read ID
命令是90h,读取nandflash芯片的ID号
⑷ Reset
命令是FFh,重启nandflash芯片。
⑸ Page Program
对页进行编程命令,由于写操作,首先写入00h(A区)/01h(B区)/50h,表示写入那个区;再写入80h开始编程模式(写入模式),接下来写入地址和数据,最后写入10h表示编程结束。
⑹ Block Erase
块擦除命令,首先写入60h进入擦写模式,然后输入块地址;接下来写入D0h,表示擦写结束。
⑺ Read Status
读取内部状态寄存器值命令,命令式70h。