最新消息:20210917 已从crifan.com换到crifan.org

nand flash 的编程细节【待后续详细解释】

工作和技术 crifan 1390浏览 0评论

http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=823970&bbs_id=1000

------------------------------------

我写三星K9G4G08U0A 4G   NAND FLASH 存储器驱动时,发现读写(以page为单位),擦除(以block为单位)地址不好确定呀..

网上有528byte/page    NAND Flash的地址可表示为:
“Block Address|Page Address in block|halfpage pointer|Column Address
地址传送顺序是Column Address,Page Address,Block Address。
由于地址只能在I/O[7:0]上传递,因此,必须采用移位的方式进行。
例如,对于512Mbit x8的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的容量是256Mbit以下,那么,block adress最高位只到bit24,因此寻址
只需要3步。

那么对2k大页面K9G4G08U0A 怎么确定任意一个page,block地址呢, 数据手册里说明用五个字节表示,前两个字节为Column Address,
后三个字节是Row Address,可是没有说明地址具体怎么分配?
请高手指点

------------------------------------

搜到这的这里。觉得之前对我有点帮助,所以才回来回复的。
现在我基本明白了nand flash是如何读写的。
回答你的问题:
拿我这个是 samsung的nand flash
型号是K9K8G08U0A,大小是1G的,8bit的
来说明。
具体其datasheet你可以到网上下载。
按照其说明,一共有

8,448Mbit(8,858,370,048 bit)=524,288 rows(pages) X 2,112×8 columns
其中x8是因为这个是8bit的nand flash
也就是一共524288行,2112列。

具体参数

1 Block = 64 Pages
(128K + 4k) Byte

1 Page = (2K + 64)Bytes
1 Block = (2K + 64)B x 64 Pages
= (128K + 4K) Bytes
1 Device = (2K+64)B x 64Pages x 8,192 Blocks
= 8,448 Mbits

一个chip共512K Pages
(=8,192 Blocks)

具体访问时的顺序:

      I/O 0   1   2   3    4   5   6   7
1st Cycle A0 A1 A2 A3   A4 A5 A6 A7                Column Address
2nd Cycle A8 A9 A10 A11 *L *L *L *L                Column Address
3rd Cycle A12 A13 A14 A15 A16 A17 A18 A19                Row Address
4th Cycle A20 A21 A22 A23 A24 A25 A26 A27                Row Address
5th Cycle A28 A29 A30 *L *L *L *L *L                Row Address

所以,

对于page,和block的地址,就很好确定了。
只需要在函数中将传入的参数要读/写的地址,函数中用page表示,除以页的大小pagesize,就是要访问的真正的页数了
将地址除以block的大小,也就是要访问的block数了。

对于读写需要的是行和列的地址,也就是:
行=page数
列=0x00
就可以找到对应的page,然后进行编程了。

每次送进去行和列之后,按照上面描述的,前两次传列地址,后三次传行地址就可以了。

说得很乱,没看懂的话,有空一起讨论 green-waste@163.com

---------------------------------------

上面的列写错了
列地址=传入地址 & (pagesize-1)

代码中的例子,如
col = from & (mtd->oobblock – 1);
其中col是列地址
from是传入的地址,从哪里开始读的地址
mtd->oobblock 等于pagesize,比如我这个nand flash的页大小是2KB,
2KB = 0x800
0x800-1=0x7FF

详见:uboot源码中的 driversnandnand_base.c 中的nand_read_ecc()

其实列地址页就是页内的偏移量,页内地址

有空可以看看这个帖子:
MTD原始设备与FLASH硬件驱动的对话
http://www.cnitblog.com/luofuchong/archive/2007/09/04/32939.html
http://www.cnitblog.com/luofuchong/archive/2007/08/31/32682.html

转载请注明:在路上 » nand flash 的编程细节【待后续详细解释】

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
85 queries in 0.166 seconds, using 20.10MB memory