一些概念:
1、NandFlash的数据是以bit 的方式保存在memory cell里的,一般来说,一个cell 中只能存储一个bit,这些cell 以8 个或者16 个为单位,连成bit line,形成所谓的byte(x8)/word(x16),这就是NAND Device 的位宽。这些Line 组成Page, page 再组织形成一个Block。
2、对于NAND Flash 来讲,地址和命令只能在I/O[7:0]上传递,数据宽度是8 位。
3、NandFlash以页为单位读写数据,而以块为单位擦除数据。
一、以三星K9F1208 flash为例,总容量=4096blocks * 32(page/block)*512(byte/page) = 64M
即1block=32pages;1page=512byte(data area)+16bye(apare area)=528bye
读命令有两个,分别是 Read1,Read2其中Read1用于读取Data Field的数据,而Read2则是用于读取Spare Field的数据。对于Nand Flash来说,读操作的最小操作单位为Page,也就是说当我们给定了读取的起始位置后,读操作将从该位置开始,连续读取到本Page的最后一个 Byte为止(可以包括Spare Field)
要定位到flash中的某个byte地址要用到一下4个地址:
1、Column Address -- 表示数据在半页中的地址 ,大小范围为0~255 ,用8位 可以表示 即 A[7:0]
2、halfpage pointer -- 表示半页在整页中的位置 ,即在0~255空间还是在256~511空间,用1位 即可表示,A[8]表示;
3、Page Address -- 表示页在块中的地址(即此页在此块中是第多少页,在0~31中选) ,大小范围0~31,用5位 表示,即A[13:9]表示;
4、Block Address -- 表示块在flash中的位置(即此块在flash中的位置--编号,在0~4095中选) ,大小范围0~4095,用12位 可以表示,即A[25:14] 表示;
综上,要想定位到flash上的某一个byte需要将上面的四种地址拼合在一起形成完整的地址,地址(NAND_ADDR)完整表示如下:
A[25:14] | A[13:9] | A[8] | A[7:0] |
Block Address | Page Address | halfpage pointer | Column Address |
由于地址只能在I/O[7:0]上传递,因此A[25:0]即26为地址只能分步顺序传入I/O[7:0]中,即串行方式一步一步传入。
第一步、传递Column Address,即NAND_ADDR[7:0]不需移位即可传递到I/O[7:0]上,而halfpage pointer 即bit8 是由操作指令决定的,即指令决定在哪个halfpage 上进行读写。而真正的bit8 的值是don't care 的。K9F1208提供了两个读指令,‘0x00’、‘0x01’。这两个指令区别在于‘0x00’可以将A[8]置为0,选中上半页;而‘0x01’可以将A[8]置为1,选中下半页。
第二步、将NAND_ADDR右移9位,即NAND_ADDR[16:9]传递到I/O[7:0]
第三步、将NAND_ADDR再右移8位,NAND_ADDR[24:17]放到I/O 上
第四步、将NAND_ADDR再右移8位,将NAND_ADDR[25]放到I/O上
四步后,整个地址传递完成,即4-step addressing---4个cycle
代码实现见 http://www.dzsc.com/data/html/2009-5-31/76525.html
和http://blog.csdn.net/abc19842008/archive/2008/01/22/2059480.aspx