TQ2440 Nand Flash

    nandflash在对大容量的数据存储中发挥着重要的作用。相对于norflash,它具有一些优势,但它的一个劣势是很容易产生坏块,因此在使用nandflash时,往往要利用校验算法发现坏块并标注出来,以便以后不再使用该坏块。

    nandflash没有地址或数据总线,如果是8位nandflash,那么它只有8个IO口,这8个IO口用于传输命令、地址和数据。

    nandflash主要以page(页)为单位进行读写,以block(块)为单位进行擦除。

    每一页中又分为main区和spare区,main区用于正常数据的存储(main就是每页的2048字节),spare区(spare就是每页的后64字节)用于存储一些附加信息,如块好坏的标记、块的逻辑地址、页内数据的ECC校验和等。

    s3c2440内部集成有内部sram(steppingstone),当选择从nandflash启动的时候,nandflash的前4k代码将会自动copy到内部sram中后运行。

    Nand FlashECC:

S3C2440在读/写操作时,自动生成2048字节的奇偶校验码。

nand flash的页为2048B。在读写的时候每页会产生28bit的ECC校验码。

28bit ECC校验码 = 22bit 线校验码 + 6bit列校验码

ECC产生模块执行以下步骤:

1:当MCU写数据到NAND时,ECC产生模块生成ECC码。

2:当MCU从NAND读数据时,ECC产生模块生成ECC码同时用户程序将它与先前写入时产生的ECC码作比较。在自动引导模式下,不进行ECC检测。因此,NANDFLASH的前4KB应确保不能有位错误(一般NANDFLASH厂家都确保)。

ECC 硬件校验指导:

1.在读或写数据前,复位ECC寄存器(往initECC[NFCONT[4]]写'1')并且清MainECCLock(NFCONT[5]为'0')(注:MainECCLock(NFCONT[5])和SpareECCLock(NFCONT[6])控制ECC校验码的生成)

2.你在读或写数据的同时,ECC模块会自动生成校验码放到NFMECC0/1寄存器。

3.在你读或写数据完成后,设置MainECCLock位为1,这样你就可以检查ECC状态寄存器了,

并且可以获得ECC校验码。

4.最后你就可以把校验码写入spare空间(写Nand)或者检查错误位(读Nand)了。

坏块管理

   由于NAND Flash的工艺不能保证NAND的Memory Array在其生命周期中保持性能的可靠,因此,在NAND的生产中及使用过程中会产生坏块。坏块的特性是:当编程/擦除这个块时,不能将某些位拉高,这会造成PageProgram和BlockErase操作时的错误,相应地反映到StatusRegister的相应位。

    (1) 固有坏块,这是生产过程中产生的坏块,一般芯片原厂都会在出厂时都会将坏块第一个page的spare area的第6个Byte标记为不等于0xff的值。

    (2) 使用坏块,这是在NANDFlash使用过程中,如果BlockErase或者PageProgram错误,就可以简单地将这个块作为坏块来处理,这个时候需要把坏块标记起来。为了和固有坏块信息保持一致,将新发现的坏块的第一个page的 spare area的第6个Byte标记为非0xff的值。

    (3) 坏块管理

    根据上面的这些叙述,可以了解NANDFlash出厂时在sparearea中已经反映出了坏块信息,因此,如果在擦除一个块之前,一定要先check一下spare area的第6个Byte是否是0xff,如果是就证明这是一个好块,可以擦除;如果是非0xff,那么就不能擦除。

    (4)需要对前面由于PageProgram错误发现的坏块进行一下特别说明。如果在对一个块的某个page进行编程的时候发生了错误就要把这个块标记为坏块,首先就要把其他好的page里面的内容备份到另外一个空的好块里面,然后,把这个块标记为坏块。

    当然,这可能会犯"错杀"之误,一个补救的办法,就是在进行完页备份之后,再将这个块擦除一遍,如果BlockErase发生错误,那就证明这个块是个真正的坏块,那就毫不犹豫地将它打个"戳"吧!

   (5)可能有人会问,为什么要使用sparearea的第六个Byte作为坏块标记。这是NANDFlash生产商的默认约定。

Nand Flash寄存器说明:

    NFCONF0x4E000000 Nand flash配置寄存器

TACLS [13:12] 表示CLE/ALE命令地址锁定信号建立后到nWE信号建立时间(setuptime)。

TWRPH0 [10:8] 表示nWE的持续时间。

TWRPH1 [6:4]  表示nWE锁存结束后CLE/ALE维持时间(hold time)。

TQ2440配有K9F2G08U0A-P 256M Nand Flash

因为HCLK为100MHZ,所以一个clock为10ns

TACLS  = tCLS- tWP = 12ns - 12ns = 0ns = 0/HCLK

TWRPH0 = tWP = 12ns = 2/HCLK

TWRPH1 = max(tCLH, tALH) = max(5ns, 5ns) = 5ns =1/HCLK

    NFCONT0x4E000004 Nand flash控制寄存器

Lock-tight [13] 0:Disable 1:Enable

此位一旦设置为1,不能清除,唯有在复位和唤醒时能够使此位无效(软件不能清除)当设置为1时,范围为NFSBLK(0X4E000038)到NFEBLK(0X4E00003C)-1不被锁定,在这范围之外,写和擦除命令是无效,只有读命令是允许的。当你试图写或擦除锁定区域,违规存取将发生,NFSTAT[3]被设置NFSBLK和NFEBLK相同,全部区域将被锁定

Soft-lock [12] 0: Disable 1: Enable

软件锁定能在任何时间被软件修改,当设置为1时,范围为NFSBLK(0X4E000038)到NFEBLK(0X4E00003C)-1不被锁定,在这范围之外,写和擦除命令是无效,只有读命令是允许的。当你试图写或擦除锁定区域,违规存取将发生,NFSTAT[3]被设置,NFSBLK和NFEBLK相同,全部区域将被锁定

EnblllegalAccINT [10] 0: Disable 1: Enable

访问锁定的区域时是否触发中断。

EnbRnBINT   [9]   0: Disable 1: Enable

Nand Flash ready or Busy是否通过中断方式通知

RnB_TransMode       [8]        RnB转换检测信号设置

0:上升沿 1:下降沿

SpareECCLock  [6]  ECC硬件校验,校验OOB区

MainECCLock   [5]  检验data区

InitECC       [4]  初始化ECC (只写寄存器)

Reg_nCE       [1]  控制发出片选信号

0: 选中芯片   1: 取消选中

MODE          [0]  Nand flash 控制器开关

0: 关闭      1: 打开

 

    NFCMMD0x4E000008   Nand Flash 命令寄存器

想向Nand Flash发命令,只要把命令写到这个寄存器里面就行了。

    NFADDR0x4E00000C   Nand Flash 地址寄存器

    NFDATA0x4E000010   Nand Flash 数据寄存器

    NFSTAT0x4E000020   Nand Flash 状态寄存器

IllegalAccess [3]  当softlock或tightlock,非法操作后这一位被置'1'

RnB_TransDetect [2] 当RnB由低向高电平转变是,该位被设置并发出中断,如果中断允许,要清除该位向该位写'1'

RnB [0] 只读 0: busy 1:ready

K9F2G08容量为256MB,分为131072行(页),2112 x 8列。每页大小为2048字节,另外有64字节的额外空间,这64字节的空间的列地址为2048—2111。命令、地址、数据都通过8个I/O口输入/输出,这种形式减少了芯片的引脚个数,并使得系统很容易升级到更大的容量,写入命令、地址或数据时,都需要将WE#、CE#信号同时拉低。数据在WE#信号的上升沿被锁存,其中CLE为命令锁存信号、ALE为地址锁存信号。整个芯片为(256+8)MB,因此,需要29根地址线来寻址,这样,如果我们以字节为单位发出寻址信号,总共需要5个周期,其中2周期列地址信号,3周期的行地址信号。

地址疑惑:

我们知道,K9F2G08容量为256M,故其需要28位地址进行寻址,每一页容量为2K,需11位地址,共有131072行,需要地址17位,页和行地址相加为28位正好寻址256M,,而上表中用的地址为29位,再看看页地址[A0~A11]12位,可寻址空间为4K,行地址[A12~A28]17位,可寻址空间为131072行,显然页地址多出一位,其寻址空间扩大了一倍。当我们考虑地址[0x800=2048=2^11]寻址时,由于一页大小为2048,其地址范围为[0~2047],0x800应为第一页第一个字节。其列地址为0,行地址为1(A11为行地址第一个位)。但当我们按上表分析该地址时,其列地址为0x800(2048)行地址为0,那么该地址读取的数据为第0页第2048个字节(即SPACE区域的第一个字节),显然问题的关键在A11上,也就是说当A11为1时,我们寻

址空间为页2048~2111(共64字节)。通过实际检验,可以断定,我们地址addr[11]应为行地址第一位,读取Main页地址(0~2047)范围内时,A11必须置0,访问space区域时,A11必须置1,由我们根据需要决定,不从地址中取值,故行地址应从a[11]位开始。

操作命令字介绍

操作NAND FLASH时,先传输命令,接着输出地址,最后读/写数据,期间还要检查FLASH的状态。具体的命令字见下表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值