FLASH的读写.docx

上传人:b****8 文档编号:30036565 上传时间:2023-08-04 格式:DOCX 页数:19 大小:200.86KB
下载 相关 举报
FLASH的读写.docx_第1页
第1页 / 共19页
FLASH的读写.docx_第2页
第2页 / 共19页
FLASH的读写.docx_第3页
第3页 / 共19页
FLASH的读写.docx_第4页
第4页 / 共19页
FLASH的读写.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

FLASH的读写.docx

《FLASH的读写.docx》由会员分享,可在线阅读,更多相关《FLASH的读写.docx(19页珍藏版)》请在冰豆网上搜索。

FLASH的读写.docx

FLASH的读写

   所谓Flash,是内存(Memory)的一种,但兼有RAM和ROM的优点,是一种可在系统(In-System)进行电擦写,掉电后信息不丢失的存储器,同时它的高集成度和低成本使它成为市场主流。

芯片是由内部成千上万个存储单元组成的,每个单元存储一个bit。

具有低功耗、大容量、擦写速度快、可整片或分扇区在系统编程(烧写)、擦除等特点,并且可由内部嵌入的算法完成对芯片的操作,因而在各种嵌入式系统中得到了广泛的应用。

作为一种非易失性存储器,Flash在系统中通常用于存放程序代码、常量表以及一些在系统掉电后需要保存的用户数据等。

常用的Flash为8位或16位的数据宽度,编程电压为单3.3V。

主要的生产厂商为INTEL、ATMEL、AMD、HYUNDAI等。

Flash技术根据不同的应用场合也分为不同的发展方向,有擅长存储代码的NORFlash和擅长存储数据的NANDFlash。

一下对NORFlash和NANDFlash的技术分别作了相应的介绍。

随着技术的发展,愈来愈多的电子产品需要更多的智能化,这也对这些产品的程序存储提出了更高的要求。

Flash作为一种低成本、高集成度的存储技术在电子产品领域的应用非常广泛。

今天90%的PC、超过90%的手机、超过50%的Modem,都是用了Flash,如今Flash市场规模已经超过了100亿美元。

如此巨大的市场规模,也导致市场上的Flash品牌层出不穷。

在NORFlash市场中,Intel公司是非常重要的一家生产厂商。

Intel公司生产的Flash芯片多年来占据着市场的很大份额,而它的芯片封装形式和接口也成为业界标准,从而为不同品牌的Flash带来了兼容的方便。

首先,Flash要通过系统总线接在处理器上,即保持一个高速的数据交换的通道。

那么就必须了解一下Flash在系统总线上的基本操作。

1)先了解一下处理器存储空间BANK的概念。

以32位处理器S3C2410为例,理论上可以寻址的空间为4GB,但其中有3GB的空间都预留给处理器内部的寄存器和其他设备了,留给外部可寻址的空间只有1GB,也就是0X00000000~0X3fffffff,总共应该有30根地址线。

这1GB的空间,2410处理器又根据所支持的设备的特点将它分为了8份,每份空间有128MB,这每一份的空间又称为一个BANK。

为方便操作,2410独立地给了每个BANK一个片选信号(nGCS7~nGCS0)。

其实这8个片选信号可以看作是2410处理器内部30根地址线的最高三位所做的地址译码的结果。

正因为这3根地址线所代表的地址信息已经由8个片选信号来传递了,因此2410处理器最后输出的实际地址线就只有A26~A0(如下图1)

)以图2(带nWAIT信号)为例,描述一下处理器的总线的读操作过程,来说明Flash整体读、写的流程。

第一个时钟周期开始,系统地址总线给出需要访问的存储空间地址,经过Tacs时间后,片选信号也相应给出(锁存当前地址线上地址信息),再经过Tcso时间后,处理器给出当前操作是读(nOE为低)还是写(new为低),并在Tacc时间内将数据数据准备好放之总线上,Tacc时间后(并查看nWAIT信号,为低则延长本次总线操作),nOE拉高,锁存数据线数据。

这样一个总线操作就基本完成

29LV160存储容量为8M字节,工作电压为3.3V,采用56脚TSOP封装或48脚FBGA封装,16位数据宽度。

29LV160仅需单3.3V电压即可完成在系统的编程与擦除操作,通过对其内部的命令寄存器写入标准的命令序列,可对Flash进行编程(烧写)、整片擦除、按扇区擦除以及其他操作。

引脚信号描述和接口电路分别如图3和图4所示。

可以从信号引脚图3和总线操作图2看出,NORFlash的接口和系统总线接口完全匹配,可以很容易地接到系统总线上。

Flash的命令很多,但常用到的命令就3种:

识别、擦除、编程命令。

以下就对3种命令作分别的简要介绍:

29lv160_CheckId()

{

   

   printf("ManufactureID(0x22C4)=%4x,DeviceID(0x2249)=%4x\n",manId,devId);

}

NORFlash的识别程序由四个读写周期就可以完成,在Flash的相关命令表中可以查到相应ID识别的命令。

要对NORFlash进行写操作,就一定要先进性擦除操作。

NORFlash的擦除都是以块(sector)为单位进行的,但是每一种型号的Flash的sector的大小不同,即使在同一片的Flash内,,不同sector的大小也是不完全一样的。

void29lv160db_EraseSector(inttargetAddr)

{

      printf("SectorEraseisstarted!

\n");

_WR(0x2aa,0x55);

   

/**************

如上图5所示,擦除操作时还要有一个关键的操作擦除查询算法,即等待Flash擦除的过程,并返回擦除是否成功的结果。

算法如右图6所示

{

unsignedintstate,flashStatus,old;

old=_RD(BADDR2WADDR(0x0));

while

(1)

      flashStatus=_RD(BADDR2WADDR(0x0));

       if((old&0x40)==(flashStatus&0x40))

       //printf("[DQ5=1:

%x]\n",flashStatus);

       flashStatus=_RD(BADDR2WADDR(0x0));

       if((old&0x40)==(flashStatus&0x40))

   }                                           //printf("!

\n");

}

       

以上的方法为查询数据线上的一个特定位Toggle位。

此外还有2种检测方法,一种为提供额外的Busy信号,处理器通过不断查询Busy信号来得知Flash的擦除操作是否完成,一般较少应用;一种为查询Polling

int29lv160db_ProgFlash(U32realAddr,U16data)

{

       _WR(BADDR2WADDR(realAddr),data);

_WAIT(BADDR2WADDR(realAddr);

}

对擦除过的Flash进行编程比较简单,但仍然用到以上提到的查询算法,速度比较慢,一般为20uS,最长的达到500uS。

NANDFLASH在对大容量的数据存储需要中日益发展,到现今,所有的数码相机、多数MP3播放器、各种类型的U盘、很多PDA里面都有NANDFLASH的身影。

程序和数据可存放在同一片芯片上,拥有独立的数据总线和地址总线,能快速随机地读取,允许系统直接从Flash中读取代码执行,而无需先将代码下载至RAM中再执行

可以单字节或单字编程,但不能单字节擦除,必须以块为单位或对整片执行擦除操作,在对存储器进行编程之前需要对块或整片进行预编程和擦除操作。

NANDFLASH

以页为单位进行读写操作,1页为256B或512B;以块为单位进行擦除操作,1块为4KB、8KB或16KB。

具有快编程和快擦除的功能

芯片存储位错误率较高,推荐使用ECC校验,并包含有冗余块,其数目大概占1%,当某个存储块发生错误后可以进行标注,并以冗余块代替

Samsung、TOSHIBA和Fujistu三家公司支持采用NAND技术NANDFlash。

目前,Samsung公司推出的最大存储容量可达8Gbit。

NAND主要作为SmartMedia卡、CompactFlash卡、PCMCIAATA卡、固态盘的存储介质,并正成为Flash磁盘技术的核心。

闪存是非易失存储器,可以对称为块的存储器单元块进行擦写和再编程。

任何flash器件的写入操作只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前必须先执行擦除。

NAND器件执行擦除操作是十分简单的,而NOR则要求在进行擦除前先要将目标块内所有的位都写为0。

   由于擦除NOR器件时是以64~128KB的块进行的,执行一个写入/擦除操作的时间为5s,与此相反,擦除NAND器件是以8~32KB的块进行的,执行相同的操作最多只需要4ms。

   执行擦除时块尺寸的不同进一步拉大了NOR和NADN之间的性能差距,统计表明,对于给定的一套写入操作(尤其是更新小文件时),更多的擦除操作必须在基于NOR的单元中进行。

这样,当选择存储解决方案时,设计师必须权衡以下的各项因素。

带有SRAM接口,有足够的地址引脚来寻址,可以很容易地存取其内部的每一个字节。

NAND器件使用复杂的I/O口来串行地存取数据,共用8位总线(各个产品或厂商的方法可能各不相同)。

8个引脚用来传送控制、地址和数据信息。

NAND读和写操作采用512字节的页和32KB的块为单位,这一点有点像硬盘管理此类操作,很自然地,基于NAND的存储器就可以取代硬盘或其他块设备。

NANDflash的单元尺寸几乎是NOR器件的一半,由于生产过程更为简单,NAND结构可以在给定的模具尺寸内提供更高的容量,也就相应地降低了价格,大概只有NOR的十分之一。

NORflash占据了容量为1~16MB闪存市场的大部分,而NANDflash只是用在8~128MB的产品当中,这也说明NOR主要应用在代码存储介质中,NAND适合于数据存储,NAND在CompactFlash、SecureDigital、PCCards和MMC存储卡市场上所占份额最大。

采用flahs介质时一个需要重点考虑的问题是可靠性。

对于需要扩展MTBF的系统来说,Flash是非常合适的存储方案。

可以从寿命(耐用性)、位交换和坏块处理三个方面来比较NOR和NAND的可靠性。

在NAND闪存中每个块的最大擦写次数是一百万次,而NOR的擦写次数是十万次。

NAND存储器除了具有10比1的块擦除周期优势,典型的NAND块尺寸要比NOR器件小8倍,每个NAND存储器块在给定的时间内的删除次数要少一些。

所有flash器件都受位交换现象的困扰。

在某些情况下(很少见,NAND发生的次数要比NOR多),一个比特位会发生反转或被报告反转了。

一位的变化可能不很明显,但是如果发生在一个关键文件上,这个小小的故障可能导致系统停机。

如果只是报告有问题,多读几次就可能解决了。

当然,如果这个位真的改变了,就必须采用错误探测/错误更正(EDC/ECC)算法。

位反转的问题更多见于NAND闪存,NAND的供应商建议使用NAND闪存的时候,同时使用EDC/ECC算法。

这个问题对于用NAND存储多媒体信息时倒不是致命的。

当然,如果用本地存储设备来存储操作系统、配置文件或其他敏感信息时,必须使用EDC/ECC系统以确保可靠性。

NAND器件中的坏块是随机分布的。

以前也曾有过消除坏块的努力,但发现成品率太低,代价太高,根本不划算。

NAND器件需要对介质进行初始化扫描以发现坏块,并将坏块标记为不可用。

现在的FLSAH一般都提供冗余块来代替坏块如发现某个块的数据发生错误(ECC校验),则将该块标注成坏块,并以冗余块代替。

这导致了在NANDFlash中,一般都需要对坏块进行编号管理,让每一个块都有自己的逻辑地址。

可以非常直接地使用基于NOR的闪存,可以像其他存储器那样连接,并可以在上面直接运行代码。

由于需要I/O接口,NAND要复杂得多。

各种NAND器件的存取方法因厂家而异。

在使用NAND器件时,必须先写入驱动程序,才能继续执行其他操作。

向NAND器件写入信息需要相当的技巧,因为设计师绝不能向坏块写入,这就意味着在NAND器件上自始至终都必须进行虚拟映射。

当讨论软件支持的时候,应该区别基本的读/写/擦操作和高一级的用于磁盘仿真和闪存管理算法的软件,包括性能优化。

在NOR器件上运行代码不需要任何的软件支持,在NAND器件上进行同样操作时,通常需要驱动程序,也就是内存技术驱动程序(MTD),NAND和NOR器件在进行写入和擦除操作时都需要MTD。

使用NOR器件时所需要的MTD要相对少一些,许多厂商都提供用于NOR器件的更高级软件,这其中包括M-System的TrueFFS驱动,该驱动被WindRiverSystem、Microsoft、QNXSoftwareSystem、Symbian和Intel等厂商所采用。

驱动还用于对DiskOnChip产品进行仿真和NAND闪存的管理,包括纠错、坏块处理和损耗平衡。

在掌上电脑里要使用NANDFLASH存储数据和程序,但是必须有NORFLASH来启动。

除了SAMSUNG处理器,其他用在掌上电脑的主流处理器还不支持直接由NANDFLASH启动程序。

因此,必须先用一片小的NORFLASH启动机器,在把OS等软件从NANDFLASH载入SDRAM中运行才行。

NORFLASH的主要供应商是INTEL,MICRO等厂商,曾经是FLASH的主流产品,但现在被NANDFLASH挤的比较难受。

它的优点是可以直接从FLASH中运行程序,但是工艺复杂,价格比较贵。

NANDFLASH的主要供应商是SAMSUNG和东芝,在U盘、各种存储卡、MP3播放器里面的都是这种FLASH,由于工艺上的不同,它比NORFLASH拥有更大存储容量,而且便宜。

但也有缺点,就是无法寻址直接运行程序,只能存储数据。

另外NANDFLASH非常容易出现坏区,所以需要有校验的算法。

NANDFLASH是采用与非门结构技术的非易失存储器,有8位和16位两种组织形式,下面以8位的NANDFLASH进行讨论。

与NORFlash相比较,其数据线宽度只有8bit,没有地址总线,I/O接口可用于控制命令和地址的输入,也可用于数据的输入和输出,多了CLE和ALE来区分总线上的数据类别。

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

FLASH页的大小和块的大小因不同类型块结构而不同,块结构有两种:

小块(图7)和大块(图8),小块NANDFLASH包含32个页,每页512+16字节;大块NANDFLASH包含64页,每页2048+64字节。

其中,512B(或1024B)用于存放数据,16B(64B)用于存放其他信息(包括:

块好坏的标记、块的逻辑地址、页内数据的ECC校验和等)。

NAND设备的随机读取得效率很低,一般以页为单位进行读操作。

系统在每次读一页后会计算其校验和,并和存储在页内的冗余的16B内的校验和做比较,以此来判断读出的数据是否正确。

大块和小块NANDFLASH都有与页大小相同的页寄存器,用于数据缓存。

当读数据时,先从NANDFLASH内存单元把数据读到页寄存器,外部通过访问NANDFLASHI/O端口获得页寄存器中数据(地址自动累加);当写数据时,外部通过NANDFLASHI/O端口输入的数据首先缓存在页寄存器,写命令发出后才写入到内存单元中。

2410处理器拥有专门针对NAND设备的接口,可以很方便地和NAND设备对接,如图9所示。

虽然NAND设备的接口比较简单,容易接到系统总线上,但2410处理器针对NAND设备还集成了硬件ECC校验,这将大大提高NAND设备的读写效率。

当没有处理器的ECC支持时,就需要由软件来完成ECC校验,这将消耗大量的CPU资源,使读写速度下降。

   NAND设备的软件调试一般分为以下几个步骤:

设置相关寄存器、NAND设备的初始化、NAND设备的识别、NAND设备的读擦写(带ECC校验)

设备的操作都是需要通过命令来完成,不同厂家的命令稍有不同,以下一Samsung公司的K9F1208U0M命令表为例介绍NAND设备的软件编写。

#defineNF_nFCE_L(){rNFCONF&=~(1<<11);}

#defineNF_nFCE_H(){rNFCONF|=(1<<11);}

#defineNF_RSTECC(){rNFCONF|=(1<<12);}

#defineNF_WRDATA(data){rNFDATA=data;}

#defineNF_WAITRB()   {while(!

(rNFSTAT&(1<<0)));}

staticvoidNF_Init(void)                         //Flash

{

rNFCONF=(1<<15)|(1<<14)|(1<<13)|(1<<12)|(1<<11)|(TACLS<<8)|(TWRPH0<<4)|(TWRPH1<<0);                                          //

   //1 1   1    1,  1     xxx, rxxx,  rxxx       

   //En512B4stepECCRnFCE="H"tACLS  tWRPH0  tWRPH1

   

}

staticvoidNF_Reset(void)                          //Flash

{

 

   NF_CMD(0xFF);                    //resetcommand

   NF_WAITRB();                      //wait200~500us;

}

NAND设备的识别          //#defineID_K9F1208U0M 0xec76

staticU16NF_CheckId(void)                          

{

   

   

   for(i=0;i<10;i++);                //waittWB(100ns)

   

                  //Makercode(K9F1208U:

0xec)

   id|=NF_RDDATA();                  //Devidecode(K9F1208U:

0x76)

   

}

staticintNF_EraseBlock(U32block)

{

   

0x60);                         //Eraseoneblock1stcommand

   NF_ADDR(blockPage&0xff);             //Pagenumber="0"

   NF_ADDR((blockPage>>8)&0xff);  

0xd0);                         //Eraseoneblcok2ndcommand

   

  for(i=0;i<10;i++);                      //waittWB(100ns)//?

?

?

?

?

?

   NF_WAITRB();                          //WaittBERSmax3ms.

   NF_CMD(0x70);                         //Readstatuscommand

   if(NF_RDDATA()&0x1)                  //Eraseerror

   Uart_Printf("[ERASE_ERROR:

block#=%d]\n",block);

}

staticintNF_ReadPage(U32block,U32page,U8*buffer) 

{

   

   page=page&0x1f;                               //32页

   blockPage=(block<<5)+page;                     //1Bolck包含32页

   NF_RSTECC();                                  //InitializeECC

   

   NF_CMD(0x00);                                 //Readcommand

   NF_ADDR(0);                                  //Column=0

   NF_ADDR(blockPage&0xff);                     //

   NF_ADDR((blockPage>>8)&0xff);                 //Block&Pagenum.

 NF_ADDR((blockPage>>16)&0xff);                //

   for(i=0;i<10;i++);                            //waittWB(100ns)

   

   NF_WAITRB();                                  //WaittR(max12us)

      *bufPt++=NF_RDDATA();                     //Readonepage

}

/************************ECC校验***************************/

      se[i]=NF_RDDATA();                        //Readsparearray

                                                   //

   if(ecc0==se[0]&&ecc1==se[1]&&ecc2==se[2])  //

   {                                              //比较数据结果是否正确

   Uart_Printf("[ECCOK:

%x,%x,%x]\n",se[0],se[1],se[2]);

   Uart_Printf("[ECCERROR(RD):

read:

%x,%x,%x,reg:

%x,%x,%x]\n",

       se[0],se[1],se[2],ecc0,ecc1,ecc2);

}

staticintNF_WritePage(U32block,U32page,U8*buffer)          

{

   NF_RSTECC();                              //InitializeECC

   

0x0);                               //?

?

?

?

?

\\ReadMode1

   NF_CMD(0x80);                             //Write1stcommand,数据输入

   NF_ADDR(0);

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

当前位置:首页 > 高等教育 > 院校资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1