NANDFLASH原理分析与编程.doc

上传人:laozhun 文档编号:2386591 上传时间:2023-02-17 格式:DOC 页数:4 大小:70.50KB
返回 下载 相关 举报
NANDFLASH原理分析与编程.doc_第1页
第1页 / 共4页
NANDFLASH原理分析与编程.doc_第2页
第2页 / 共4页
NANDFLASH原理分析与编程.doc_第3页
第3页 / 共4页
NANDFLASH原理分析与编程.doc_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《NANDFLASH原理分析与编程.doc》由会员分享,可在线阅读,更多相关《NANDFLASH原理分析与编程.doc(4页珍藏版)》请在三一办公上搜索。

1、NAND Flash 在嵌入式系统中的地位与PC机上的硬盘是类似的。用于保存系统运行所必需的操作系统,应用程序,用户数据,运行过程中产生的各类数据,系统掉电后数据不会护丢失。现在的Flash主要有两咱,一种是NAND Flash 一种是Nor Flash。NOR Flash是由Intel公司于1988年发明的,用以代替EERPOM,NAND Flash由Toshiba 公司在1989年发明的。 网上有很多介绍两者区别的文章,在此就不做介绍了,主要介绍关于NAND Flash的组织结构和编写程序的方法。 在三星的NAND Flash 中,当CPU从NAND Flash开始启动时,CPU会通过内部

2、的硬件将NAND Flash开始的4KB数据复制到称为“Steppingstone”的4KB的内部RAM中,起始地址为0,然后跳到地址0处开始执行。这也就是我们为什么可以把小于4KB的程序烧到NAND Flash中,可以运行,而当大于4KB时,却没有办法运行,必须借助于NAND Flash的读操作,读取4KB以后的程序到内存中。 NAND Flash的寻址方式和NAND Flash的memory组织方式紧密相关。NAND Flash的数据是以bit的方式保存在 memory cell(存储单元)。一般情况下,一个cell中只能存储一个bit。这些cell以8个或者16个为单位,连成 bit l

3、ine ,形成所谓的byte(x8)/word(x16),这就是NAND Flash的位宽。 这些Line会再组成Pape(页)。然后是每32个page形成一个Block,所以一个Block(块)大小是16k.Block是NAND Flash中最大的操作单元,其中的擦除操作是以Block为单位进行擦除的,而读写和编程是以page为单位进行操作的,并且读写之前必须进行flash的擦写。我们这里以三星K9F1208U0M的NAND Flash 为例,它的大小是64MB的。1block = 32page1page = 512bytes(datafield) + 16bytes(oob) K9F120

4、8U0B总共有4096 个Blocks,故我们可以知道这块flash的容量为4096 *(32 *528)= 69206016 Bytes = 66 MB但事实上每个Page上的最后16Bytes是用于存贮检验码用的,并不能存放实际的数据,所以实际上我们可以操作的芯片容量为4096 *(32 *512) = 67108864 Bytes = 64 MB Nand Flash物理结构图 在NAND Flash中有8个I/O引脚(IO0IO7)、5个全能信号(nWE ALE CLE nCE nRE)、一个引脚,1个写保护引脚。操作NAND Flash时,先传输命令,然后传输地址,最后读写数据。对于

5、64MB的NAND Flash,需要一个26位的地址。只能8个I/O引脚充当地址、数据、命令的复用端口,所以每次传地址只能传8位。这样就需要4个地址序列。因此读写一次nand flash需要传送4次(A7:0 A16:9 A24:17 A25)。64M的NAND Flash的地址范围为0x000000000x03FFFFFF。128M的NAND Flash的地址范围为0x00000000-0x07FFFFFF。1KB = 0x000-0x3FF.128字节=0x00H-7FH。 一页有528个字节,而在前512B中存放着用户的数据。在后面的16字节中(OOB)中存放着执行命令后的状态信息。主要

6、是ECC校验的标识。列地址A0-A7可以寻址的范围是256个字节,要寻址528字节的话,将一页分为了A.(1 half array)B(2 half array) C(spare array)。A区0255字节,B区 256-511 字节C区512527字节。访问某页时必须选定特定的区。这可以使地址指针指向特定的区实现。 在NAND Flash 中存在三类地址,分别为Block Address 、Column Address Page Address.。 Column Address 用来选择是在上半页寻址还是在下半页寻址A0A7.也就相当于页内的偏移地址。在进行擦除时不需要列地址,因为擦除是

7、以块为单位擦除。32个Page需要5bit来表示。也就是A13:9;也就是页在块内的相对地址。A8这一位用来设置512字节的上半页,还是下半页,1表示是在上半页,而2表示是在下半页。Block的地址有A25:14组成。存储操作特点:1.擦除操作的最小单位是块2.Nand Flash芯片每一位只能从1变为0,而不能从0变为1,所以在对其进行写入操作之前一定要将相应块擦除(擦除就是将相应块的位全部变为13 OOB部分的第六字节(即517字节)标志是否坏块,如果不是坏块该值为FF,否则为坏块4 除OOB第六字节外,通常至少把OOB前3字节存放Nand Flash硬件ECC码 一个容量为64M(512

8、Mbit)的NAND Flash,分为131072页,528列。(实际中由于存在spare area,故都大于这个值),有4096块,需要12bit来表示即A25:14.如果是128M(1Gbit)的话,blodk Address为A26:14.由于地址只能在IO0IO7上传送。编程时通常通过移位来实现地址的传送。传送过程如下:第1个地址序列:传递column address,也就是NAND Flash7:0,这一周期不需要移位即可传递到I/O7:0上,而half page pointer 即A8是由操作指令决定,00h,在A区,01h在B区,指令决定在哪个half page上进行读写,而真正

9、A8的值是不需要程序员关心的;第2个地址序列:就是将NAND_ADDR 右移9位,而不是8位,将NAND_ADDR16:9传递到I/O7:0上;第3个地址序列:将NAND_ADDR24:17 传递到I/O7:0上;第4个地址序列:将NAND_ADDR25传送到I/O上。 整个地址的传送过程需要4步才能完成。如果NAND Flash 的大小是32MB的以下的话,那么block address 最高位只到bit24,因此寻址只需要3步,就可以完成。 在进行擦除操作时由于是以块进行擦除,所以只需要3个地址序列,也就是只传递块的地址,即A14:25。NAND Flash地址的计算: Column Ad

10、dress 翻译过来是列地址,也就是在一页里的偏移地址。其实是指定Page上的某个Byte,指定这个Byte,其实也就是指定此页的读写起始地址。 Page Address:页地址。页的地址总是以512Bytes对齐的,所以它的低9位问题0,确定读写操作在NAND Flash中的哪个页进行。 当我们得到一个Nand Flash地址addr时,我们可以这样分解出Column Address和Page Address。Columnaddr = addr % 512 / column addressPageaddr = addr9 / page address 也就是一个Nand Flash地址的A0

11、-A7是它的column address ,A9A25是它的Page Address,地址A8被忽略。现在假设我要从Nand Flash中的第5000字节处开始读取1024个字节到内存的0x30000000处,我们这样调用read函数NF_Read(5000, 0x30000000,1024);我们来分析5000这个src_addr.根据 column_addr=src_addr%512; page_address=(src_addr9); 我们可得出column_addr=5000%512=392page_address=(50009)=9于是我们可以知道5000这个地址是在第9页的第392

12、个字节处,于是我们的NF_read函数将这样发送命令和参数column_addr=5000%512;page_address=(50009);NF_CMD=0x01; /要从2nd half开始读取 所以要发送命令0x01NF_ADDR= column_addr &0xff; /1st Cycle A7:0NF_ADDR=page_address& 0xffNF_ADDR=(page_address8)&0xff; /3rd.Cycle A24:17NF_ADDR=(page_address16)&0xff; /4th.Cycle A25 向NandFlash的命令寄存器和地址寄存器发送完以上命令和参数之后,我们就可以从rNFDATA寄存器(NandFlash数据寄存器)读取数据了.我用下面的代码进行数据的读取.for(i=column_addr;i512;i+) *buf+=NF_RDDATA();每当读取完一个Page之后,数据指针会落在下一个Page的0号Column(0号Byte).

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号