自己学驱动16——NAND Flash

1.NOR Flash和NAND Flash

对于Flash存储器件的可靠性需要考虑3点:位反转、坏块和可擦除次数。所有的Flash器件(包括NOR Flash和NAND Flash)都遭遇位反转的问题:由于Flash固有的电器特性,在读写数据过程中,偶然会产生一位或几位数据错误(这种概率很低),NAND Flash出现这种问题的几率远大于NOR Flash。当位反转发生在关键的代码、数据上时,有可能导致系统崩溃。当仅仅是报告位反转,重新读取即可;如果确实发生了位反转,则必须有相应的错误检测/恢复措施,推荐使用EDC/ECC进行错误检测/恢复。

嵌入式Linux对NOR、NAND Flash的软件支持都很成熟,在NOR Flash上常用jffs2文件系统,而在NAND Flash上常用yaffs文件系统。在更底层,有MTD驱动程序(源代码位于linux源代码的/drivers/mtd中)实现对它们的读、写和擦除操作,它也实现了EDC/ECC校验。

2.K9F1208U0M存储格式

K9F1208U0M容量为528Mbit=64MB,内部分为131072行(页)、528列;每一行(页)大小为512字节,外加16字节的额外空间,这16字节的额外空间的列地址为512~527。

K9F1208U0M的64MB的存储空间需要26位地址,因此以字节为单位访问Flash时需要4个地址序列:列地址(A0~A7)、行地址的低位部分以及行地址的高位部分(A9~A25)。读写页在发出命令后,需要4个地址序列,而擦除块在发出擦除命令后仅需要3个地址序列。这是因为NAND Flash一般以512字节为单位进行读写,NAND Flash的块大小范围为8kB~64kB,读写是按行(页)进行,而擦除是以块为单位完成的。

3.读操作方法

操作NAND Flash时,先传输命令,然后传输地址,最后读/写数据,期间要检查Flash的状态。

K9F1208U0M一页的大小为512字节,分为两部分:上半部、下半部。

列地址的8bits用来在半页(256字节)中寻址。

当发出读命令00h时,表示列地址将在上半部寻址;当发出读命令01h时,表示列地址将在下半部寻址。A8地址线将被读命令00h设置为低电平,被01h设置为高电平。所以2440向K9F1208U0M传输地址过程中不会出现A8,在K9F1208U0M内部A8会根据命令自动被设置为高电平或低电平。

K9F1208U0M一页大小为528字节,而列地址A0~A7可以寻址的范围是256字节,所以必须辅以其他手段才能完全寻址这528字节,将一页分为A、B、C三个区:A区为0~255字节,B区为256~511字节,C区为512~527字节。访问某页时,需要选定特定的区:命令00h选中A区、命令01h选中B区、命令50h选中C区。命令00h和50h会使得访问Flash的地址指针一直从A区或C区开始,除非发出了其他的修改地址指针的命令。而命令01h的效果只能维持一次,当前的读、写、擦除、复位或者上电操作完成之后,地址指针将重新指向A区。

4.写操作方法

写操作命令分为两种:Page Program(True)和Page Program(Dummy)。Page Program(True)需要的命令组合为80h和10h;而Page Program(Dummy)需要的命令组合为80h和11h。写不同于读操作,写操作不分A、B、C三个部分,因为NAND Flash的写操作一般是以页为单位的,但是也可以只写一页中的一部分。写操作的地址序列依然同读一致,A8依然是没有的,所以写NAND Flash一部分的地址只能是在A0~A7寻址空间内开始。

Page Program(True):发出命令80h后,紧接着是4个地址序列,然后向Flash发送数据(最大可以达到528字节),然后发出10h启动写操作,这时Flash会自动完成写、校验操作。一旦发出10h后,就可以通过读取状态命令70h获知当前的写操作是否完成、是否成功。

Page Program(Dummy):由于K9F1208U0M内部分为4个128Mbit的存储层,每个存储层包含1024个Block(不是页而是块)和528个寄存器。这使得可以同时写多个页或者同时擦除多个块。K9F1208U0M的第1块位于第1个存储层、第2块位于第2个存储层、第3个块位于第3个存储层、第4个块位于第4个存储层,以此类推。这样当用于需要连续写1~4块时,就能够充分使用这4个存储层各自的528字节存储器。

5.块擦除

K9F1208U0M块大小为16KB,当发出60h命令后,后续需要发出3个地址(第2、3、4cycle的地址),并且A9~A13被忽略,即可完成块擦除操作。

时间: 2024-10-24 17:24:30

自己学驱动16——NAND Flash的相关文章

块设备驱动之NAND FLASH驱动程序

转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/25240909 一.框架总结 二.硬件原理 相比于nor flash,我们可以清楚的看出引脚少了很多,主要是输入输出引脚进行了复用.现在我说下各引脚的用途. a.LDATA0~LDATA7这8个引脚为输入输出引脚.命令.地址.数据的传输都是由这8个引脚实现的(引脚复用,节约引脚). b.RnB:此引脚用来判忙.因为命令.数据.地址发出去和收到时候不能立刻就完成,需要一个时间.此

【详解】如何编写Linux下Nand Flash驱动

From: http://www.crifan.com/files/doc/docbook/linux_nand_driver/release/html/linux_nand_driver.html 版本:v2.2 Crifan Li 摘要 本文先解释了Nand Flash相关的一些名词,再从Flash硬件机制开始,介绍到Nand Flash的常见的物理特性,且深入介绍了Nand Flash的一些高级功能,然后开始介绍Linux下面和Nand Flash相关的软件架构MTD的相关知识,最后介绍了

Tiny6410之NAND FLASH驱动

一.NAND FLASH的特点 S3C6410的NAND FLASH控制器有如下特点 1.自导入模式:复位后,引导代码被送入到8KB的STEPPINGSTONE中,引导代码移动完毕,引导代码将在STEPPINGSTONE中执行.导入期间,NAND FLASH控制器不支持ECC矫正. 2.NAND FLSH 控制器I/F:支持512字节和2KB页 3.软件模式:用户可以直接访问nand flash 控制器,该特性可以用于读/檫/编程nand flash 存储器. 1)写命令寄存器=NAND FLA

nuc900 nand flash mtd 驱动

nuc900 nand flash mtd 驱动,请参考! /* * Copyright © 2009 Nuvoton technology corporation. * * Wan ZongShun <[email protected]> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License

linux下Pl353 NAND Flash驱动分析

linux的NAND Flash驱动位于drivers/mtd/nand子目录下: nand_base.c-->定义通用的nand flash基本操作函数,如读写page,可自己重写这些函数 nand_bbt.c-->与坏块管理有关的函数和结构体 nand_ids.c-->nand_flash_ids[](芯片ID)和nand_manuf_ids[](厂商ID) nand_ecc.c-->软件ECC代码,若系统支持硬件ECC,则不用理会这个文件 pl353_nand.c-->

嵌入式Linux驱动学习之路(二十三)NAND FLASH驱动程序

NAND FLASH是一个存储芯片. 在芯片上的DATA0-DATA7上既能传输数据也能传输地址. 当ALE为高电平时传输的是地址. 当CLE为高电平时传输的是命令. 当ALE和CLE都为低电平时传输的是数据. 将数据发给nand Flash后,在发送第二次数据之前还要判断芯片是否处于空闲状态.一般是通过引脚RnB来判断,一般是高电平代表就绪,低电平代表正忙. 操作Nand Flash的一般步骤是: 1. 发命令 选中芯片 CLE设置为高电平 在DATA0-DATA7上输出命令值 发出一个写脉冲

NAND FLASH 驱动分析

NAND FLASH是一个存储芯片 那么: 这样的操作很合理"读地址A的数据,把数据B写到地址A" 问1. 原理图上NAND FLASH和S3C2440之间只有数据线, 怎么传输地址? 答1.在DATA0-DATA7上既传输数据,又传输地址 当ALE为高电平时传输的是地址, 问2. 从NAND FLASH芯片手册可知,要操作NAND FLASH需要先发出命令 怎么传入命令? 答2.在DATA0-DATA7上既传输数据,又传输地址,也传输命令 当ALE为高电平时传输的是地址, 当CLE为

Linux 下 Nand Flash 驱动说明

注册 driver_register 通过 module_init(s3c2410_nand_init);注册 Nand Flash 驱动. 在 s3c2410_nand_init ()中通过 driver_register()注册 s3c2410_nand_driver 驱动程序,如下所示: static struct device_driver s3c2410_nand_driver = { .name          = "s3c2410-nand", .bus        

Linux 下 Nand Flash 驱动主要数据结构说明

s3c2410 专有数据结构 s3c2410_nand_set struct s3c2410_nand_set { int                    nr_chips;     /* 芯片的数目 */ int                    nr_partitions; /* 分区的数目 */ char                   *name;          /* 集合名称   */ int                   nr_map;       /* 可选