NOR-Flash存储器介绍及编程
- 格式:doc
- 大小:23.00 KB
- 文档页数:8
一、概述随着微控制器单片机(MCU)在嵌入式系统中的广泛应用,对存储器件的需求也日益增加。
在嵌入式系统开发中,常常需要对外部存储器进行读写操作,以实现数据的存储和访问。
而在嵌入式系统中,常用的存储器件之一就是NOR Flash。
开发一套MCU与NOR Flash进行读写操作的例程对于嵌入式系统开发具有重要意义。
二、MCU与NOR Flash介绍1. MCU介绍作为嵌入式系统的核心控制芯片,MCU具有集成度高、功耗低、性能稳定等特点,被广泛应用于各类嵌入式系统中。
MCU通常搭载有内置的存储器,但对于一些应用需求较大的情况,需要外接存储器扩展其存储容量。
2. NOR Flash介绍NOR Flash是一种非易失性存储器,广泛应用于嵌入式系统中。
NOR Flash通常具有较大的存储容量和较高的读写速度,因此被广泛应用于嵌入式系统的代码存储和数据存储中。
三、MCU NOR Flash读写例程设计1. 硬件设计1)选择合适的MCU按照系统需求选择合适的MCU芯片,需要考虑MCU的存储器容量和外设接口支持。
2)连接NOR Flash将NOR Flash与MCU进行连接,通常使用SPI或Parallel等接口进行连接。
3)引脚连接根据MCU和NOR Flash的接口定义进行引脚连接,确保连接正确稳定。
2. 软件设计1)MCU驱动程序设计设计MCU的驱动程序,包括对外部存储器的读写操作。
2)NOR Flash读写算法设计设计NOR Flash的读写算法,包括位置区域编址、数据传输等操作。
3)例程编写编写MCU与NOR Flash进行读写操作的例程,包括初始化、读取数据、写入数据等功能。
3. 调试验证1)例程验证将例程下载到MCU中,通过调试工具对例程进行验证,并观察读写操作的结果。
2)性能测试对MCU与NOR Flash的读写性能进行测试,包括读取速度、写入速度等指标。
四、MCU NOR Flash读写例程实现1. 硬件连接采用STM32F4系列MCU,通过SPI接口连接外部NOR Flash 存储器。
Nand-Flash存储器1概述NOR和NAND是目前市场上两种主要的非易失闪存技术。
Nor-flash存储器的容量较小、写入速度较慢,但因其随机读取速度快,因此在嵌入式系统中,常应用在程序代码的存储中。
Nor-flash存储器的内部结构决定它不适合朝大容量发展;而NAND-flash存储器结构则能提供极高的单元密度,可以达到很大的存储容量,并且写入和擦除的速度也很快。
但NAND-flash存储器需要特殊的接口来操作,因此它的随机读取速度不及Nor-flash存储器。
二者以其各自的特点,在不同场合发挥着各自的作用。
NAND-flash存储器是flash存储器的一种技术规格,其内部采用非线性宏单元模式,为固态大容量存储器的实现提供了廉价有效的解决方案,因而现在得到了越来越广泛的应用。
例如体积小巧的U盘就是采用NAND-flash存储器的嵌入式产品。
由于NAND-flash(非线性flash)存储器内部结构不同于Nor-flash(线性flash)存储器,因此对它的读写操作也有较大的区别。
BF533中没有像支持SDRAM一样提供直接与NAND-flash存储器的接口,读写的过程要靠软件编程来完成。
本实验将以东芝公司的TC58DVM82A1FT芯片为例,介绍NAND-flash存储器芯片的读写流程和时序。
2 实验内容和目标包括以下几点。
2编写程序,读出器件的识别码(ID)。
3对NAND-flash的一个或若干个块进行擦除操作。
4在被擦除的一个或若干个块写入数据。
5将写入的数据读出并进行验证。
6查找坏块。
3NAND-flash介绍及编程指导NAND-flash存储器中的宏单元彼此相连,仅第一个和最后一个Cell分别与Work Line和BIT Line相连,因此NAND-flash架构的存储容量较Nor-flash架构的高。
NAND-flash存储器的容量较大,改写速度快,主要应用在大量资料的存储,如嵌入式产品中,包括数码相机、MP3随身听记忆卡等。
nor flash原理
Nor Flash是一种非易失性存储器,它采用了NAND闪存和NOR闪存的结合技术。
它的工作原理类似于NOR闪存,但又
具有NAND闪存的高密度和低成本优势。
Nor Flash的存储单元由一对互补的MOSFET(金属-氧化物-
半导体场效应晶体管)构成,其中一个MOSFET称为选择MOSFET,另一个称为传输MOSFET。
传输MOSFET与普通
的NOR闪存单元相似,负责数据传输和读写操作。
选择MOSFET用于选择要读取和写入的存储单元,与传输MOSFET之间共享同一栅极线。
Nor Flash的数据存储是通过在多个存储单元中存储电荷量来
实现的。
将电荷量设置为高电荷表示“1”,低电荷表示“0”。
在
写入数据时,选择MOSFET将所需存储单元暴露给外部电源,并在该单元的传输MOSFET上施加电压。
当传输MOSFET导
通时,电荷被注入或释放到存储单元中,从而改变存储单元的电荷量和存储值。
Nor Flash的读取操作与NOR闪存类似。
选择MOSFET选择
要读取的存储单元,并通过传输MOSFET上的引脚检测存储
单元中的电荷量。
根据电荷量的高低,从而确定存储单元的存储值。
总的来说,Nor Flash利用选择MOSFET和传输MOSFET的组合来实现数据的读写和存储。
这种结构将NAND闪存的高密
度和低成本结合了NOR闪存的高速读取和修改功能,适用于许多应用,如嵌入式系统和存储器设备。
norflash读写原理
NorFlash是一种基于NOR门的闪存存储器,常用于嵌入式系统和移
动设备中。
NorFlash读写原理详细如下:
1. NorFlash的存储单元是基于NOR门的,NOR门是一种由两个并
联的晶体管构成的门电路。
这意味着每个存储单元都需要两个晶体管
来读取或写入数据。
2. 由于它使用的是NOR门,Norflash的读操作是直接的。
读操作的
时候,将地址放置于地址总线上,然后该地址将直接映射到存储器单元。
当地址被选中时,数据被从存储单元读取到存储器的输出引脚。
读操作不会影响存储器单元的数据。
3. NorFlash的写操作比读操作复杂。
它需要进行多个步骤,例如擦除,编程和校验。
擦除操作将存储器中的数据全部清除为1。
编程操作将操作码和数据写入存储器中的指定地址。
校验操作用于验证编程操作是
否成功。
4. NorFlash的写操作需要一个称为“写使能控制器”的特殊控制器。
写使能控制器向存储器发出一个信号,告诉存储器将数据写入指定的
地址。
写使能控制器还确保编程操作在操作码和数据被成功编程之后,
存储器单元返回正确的状态值。
总之,NorFlash的读写原理是基于NOR门,并且需要进行多个步骤来完成写操作。
了解NorFlash的读写原理可以帮助我们更好地理解如何在嵌入式系统或移动设备中储存和读取数据。
nor flash program原理NORFlash芯片是一种非易失性存储器,它可以在电源正常的情况下保持数据,并且在掉电后数据也不会丢失。
NORFlash广泛应用于嵌入式系统中,用于存储操作系统、应用程序和配置信息等重要数据。
本文将介绍NORFlash的编程原理。
一、NORFlash存储单元NORFlash芯片的存储单元通常采用浮栅晶体管结构,其基本单元包括一个浮栅晶体管和一个电荷存储单元。
浮栅晶体管将电荷存储在存储单元中,从而控制数据的写入和擦除操作。
NORFlash芯片的存储单元具有较高的数据密度和较低的功耗,但擦除操作需要消耗较多的时间和能量。
二、NORFlash编程原理NORFlash的编程通常采用Flash编程标准协议,如IAP(In-ApplicationProgramming)协议或SFDP(Single-ByteFlashDataProtocol)。
在进行编程时,需要通过专门的编程设备(如编程器或主机控制器)将数据写入NORFlash芯片中。
NORFlash编程原理如下:1.初始化阶段:首先需要与NORFlash芯片建立通信连接,并进行初始化设置。
2.写入数据阶段:将需要写入的数据通过编程设备传输到NORFlash芯片中。
由于NORFlash芯片具有较高的读取速度和较低的功耗,因此适合进行数据写入操作。
3.擦除操作阶段:在进行数据写入之前,需要先对存储单元进行擦除操作。
擦除操作通常采用全块擦除方式,即将整个芯片或部分芯片进行擦除。
4.校验阶段:在完成数据写入和擦除操作后,需要进行校验和验证,以确保数据正确性。
NORFlash编程过程涉及到许多细节和注意事项,例如选择合适的编程协议、设置适当的擦除块大小、避免损坏芯片等。
在进行编程时,需要根据具体情况选择合适的工具和方法,并确保数据的准确性和完整性。
三、NORFlash编程步骤以下是一般的NORFlash编程步骤:1.连接NORFlash芯片与编程设备,并进行初始化设置。
nor flash工作原理Nor Flash,即非易失性闪存,是一种常见的存储器设备,被广泛应用于数字产品和嵌入式系统中。
它的工作原理是通过电子擦除和编程的方式实现数据的存储和读取。
本文将深入探讨Nor Flash的工作原理及其应用。
一、Nor Flash的组成和结构Nor Flash由多个存储单元组成,每个存储单元由一个浮栅晶体管和一个选择晶体管组成。
浮栅晶体管用于存储数据,而选择晶体管则用于控制数据的读取和写入操作。
这些存储单元按照阵列的方式排列在晶片上,形成一个存储矩阵。
二、Nor Flash的工作原理1. 读取操作:当需要读取数据时,首先通过地址线选中特定的存储单元。
然后,选择晶体管将存储单元的电荷传递到位线上,并经过放大器放大,最终形成可读取的电压信号。
2. 编程操作:Nor Flash的编程操作是通过电子注入和散射实现的。
通过地址线选中特定的存储单元,并施加编程电压,即高电压。
这个高电压会使得浮栅晶体管中的电子被注入到栅极上,改变晶体管的导电特性,从而改变存储单元的电荷状态。
3. 擦除操作:Nor Flash的擦除操作是通过电子隧道效应实现的。
当需要擦除数据时,首先通过地址线选中特定的存储块,一个存储块通常由多个存储单元组成。
然后,施加一个较高的擦除电压,即高电压。
这个高电压会使得存储单元中的电荷通过隧道效应流出,从而擦除数据。
三、Nor Flash的应用领域1. 嵌入式系统:Nor Flash广泛应用于嵌入式系统中,如智能手机、平板电脑、车载导航、物联网设备等。
由于Nor Flash具有快速读取速度和较长的数据存储寿命,能够满足嵌入式系统对数据存储和快速读取的需求。
2. 数字产品:Nor Flash也被广泛应用于数字产品中,如数码相机、MP3播放器、游戏机等。
Nor Flash的可靠性和稳定性使得这些数字产品能够稳定地存储和读取大量的数据。
3. 软件存储:Nor Flash还常用于存储系统软件,如操作系统和引导程序。
SPI NOR FLASH存储器的原理与常见问题分析1.前言FLASH闪存,一般简称为“FLASH”,它属于内存器件的一种,是一种非易失性(Non-Volatile)内存。
FLASH因其特殊的浮栅结构得以在掉电后长久地保存数据,这使得Flash成为各类便携型数字设备的存储介质。
本文主要介绍了SPI NOR FLASH存储器的基本原理以及常见的问题,可以帮助读者进一步了解和应对产品中的FLASH相关问题。
2.SPI NOR FLASH存储器的原理介绍1.FLASH的基础介绍FLASH是使用浮栅场效应管(Floating Gate FET)作为基本存储单元来存储数据的,图一(a)的模型中可以看出,与普通的MOSFET相比,区别仅在于浮栅,FLASH就是利用浮栅中是否存储电荷来表征数字0和1的。
对NPN的场效应管来说,在栅极和源极之间加一个VTH电压后,MOS管就可以导通,但如果在图示的浮栅中增加了一些电子,这些电子抵消了VTH的部分电压,原先的VTH可能就无法使MOS管导通,通过判断MOS管是否导通可以判断浮栅当中有无电子,即可以对应状态0和1。
图一、FLASH基础单元原理而FLASH就是由如上的存储单元组成,通常的FLASH可以按单元结构分为NOR和NAND FLASH,其主要区别在于单独存储单元的排列上,如图二所示,NOR FLASH的每个CELL之间是并联的关系,其中漏极一同连接到位线(Bit line)上,栅极接到字线(Word line)上,而NAND FLASH的每个CELL之间是串联的关系,其中源极和漏极CELL之间互连,栅极接到字线上。
这部分是FLASH存储单元的结构区分。
图二、FLASH单元结构区分如果要对FLASH内部的数据进行操作,还需要控制器去控制擦除、编程、读取的电压,根据控制器与外部通信的总线,可以分为Parallel(CFI)和SPI两种类型。
并口的FLASH数据位宽大,可以满足大量数据快速读取的需求,但管脚多也反映着其占用面积大;SPI FLASH使用SPI总线通信,只需要4根线即可通信,较为便捷,适用于一些小型化的设备中。
norflash存储器常见的8个特征是什么本文主要是关于norflash的相关介绍,并着重对norflash的特征进行了详尽的阐述。
norflash存储器常见的8个特征是什么NOR FlashNOR FLASH 是很常见的一种存储芯片,数据掉电不会丢失.NOR FLASH支持Execute On Chip,即程序可以直接在FLASH片内执行(这意味着存储在NOR FLASH上的程序不需要复制到RAM就可以直接运行)。
这点和NAND FLASH不一样。
因此,在嵌入式系统中,NOR FLASH很适合作为启动程序的存储介质.NOR FLASH的读取和RAM很类似(只要能够提供数据的地址,数据总线就能够正确的给出数据),但不可以直接进行写操作。
对NOR FLASH的写操作需要遵循特定的命令序列,最终由芯片内部的控制单元完成写操作。
NOR和NAND是现在市场上两种主要的非易失闪存技术。
Intel于1988年首先开发出NOR flash技术,彻底改变了原先由EPROM和EEPROM一统天下的局面。
紧接着,1989年,东芝公司发表了NAND flash结构,强调降低每比特的成本,更高的性能,并且象磁盘一样可以通过接口轻松升级。
但是经过了十多年之后,仍然有相当多的硬件工程师分不清NOR和NAND闪存。
像“flash存储器”经常可以与相“NOR存储器”互换使用。
许多业内人士也搞不清楚NAND 闪存技术相对于NOR技术的优越之处,因为大多数情况下闪存只是用来存储少量的代码,这时NOR闪存更适合一些。
而NAND则是高数据存储密度的理想解决方案。
NOR的特点是芯片内执行(XIP,eXecute In Place),这样应用程序可以直接在flash闪存内运行,不必再把代码读到系统RAM中。
NOR的传输效率很高,在1~4MB的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响了它的性能。
NAND结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。
nor flash读写速度计算方法详解下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by the editor. I hope that after you download them, they can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you!In addition, our shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!NOR Flash 存储器在现代电子设备中扮演着至关重要的角色,其读写速度直接影响着设备的性能和响应速度。
NOR FLASH:大容量存储芯片的原理及应用解析
VDRF256M16 是珠海欧比特公司自主研发的一种高速、大容量的NOR FLASH,可利用其对大容量数据进行高速缓存。
文中介绍了该芯片的结构和原理,并同时给出了一个系统中大容量、高速数据传输要求的设计方案。
1 引言
NOR FLASH 是很常见的一种存储芯片,数据掉电不会丢失。
NOR FLASH 支持Execute On Chip,即程序可以直接在FLASH 片内执行。
这点
和NAND FLASH 不一样。
因此,在嵌入是系统中,NOR FLAS H 很适合作
为启动程序的存储介质。
NOR FLAS H 的读取和RAM 很类似,但不可以直
接进行写操作。
对NOR FLAS H 的写操作需要遵循特定的命令序列,最终由芯片内部的控制单元完成写操作。
所以,NOR FLASH 一般是作为用于程序的存储与运行的工具。
NOR 的特点是芯片内执行(XIP,Execute In Place),这样应用程序可以直
接在FLASH 闪存内运行,不必再把代码读到系统RAM 中。
NOR FLASH 的
传输效率很高,在1~4MB 的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响了它的性能。
Flash Nor Nand闪存简介:闪存是可通过电擦写和重编程的非挥发性计算机存储器。
闪存技术主要应用在计算机和其他数字设备间传输数据的存储卡和USB盘上。
它是一种可用大块擦写和重编程技术访问的特殊类型的EEPROM (Electrically Erasable Programmable Read-Only Memory)。
闪存不需要电源维持芯片内保存的数据。
另外闪存相比硬盘有数倍的访问速度并且更抗震动。
它可以经受很大的压力,极端的温度,甚至可以浸泡在水中仍然保持可用。
FLASH MEMORY主要采用两种规格的技术:NAND和NOR。
NOR型与NAND型闪存的区别很大,打个比方说,NOR型闪存更像内存,有独立的地址线和数据线,但价格比较贵,容量比较小;而NAND型更像硬盘,地址线和数据线是共用的I/O线,类似硬盘的所有信息都通过一条硬盘线传送一般,而且NAND型与NOR型闪存相比,成本要低一些,而容量大得多。
因此,NOR型闪存比较适合频繁随机读写的场合,通常用于存储程序代码并直接在闪存内运行,手机就是使用NOR型闪存的大户,所以手机的“内存”容量通常不大;NAND型闪存主要用来存储资料,我们常用的闪存产品,如闪存盘、数码存储卡都是用NAND型闪存。
在大部分应用中都采用NAND FLASH,以下的芯片选型都是关于NAND FLASH。
NAND型闪存的技术特点:内存和NOR型闪存的基本存储单元是bit,用户可以随机访问任何一个bit的信息。
而NAND型闪存的基本存储单元是页(Page)(可以看到,NAND型闪存的页就类似硬盘的扇区,硬盘的一个扇区也为512字节)。
每一页的有效容量是512字节的倍数。
所谓的有效容量是指用于数据存储的部分,实际上还要加上16字节的校验信息,因此我们可以在闪存厂商的技术资料当中看到“(512+16)Byte”的表示方式。
目前2Gb以下容量的NAND型闪存绝大多数是(512+16)字节的页面容量,2Gb以上容量的NAND型闪存则将页容量扩大到(2048+64)字节。
NOR Flash 编程//*********************************************************************** ***************************//*** norflash操作原理:假设现在讨论的norflash连接在cpu的地址空间的0x0C000000位置的intel L18F256 32MB norflash(块大小为128KB)/*intel E28F128J3A150 16MB 16bit norflash 和bf561相连的接法为:bf561 <=> E28F128J3A150A[23:1] => A[23:1] //bf561给norflash的地址信号D[15:0] => D[15:0] //bf561给norflash的数据信号/AMS0 => /CE //bf561给norflash的片选信号/AOE => /OE //bf561给norflash的读信号/AWE => /WE //bf561给norflash的写信号/BYTE //上拉为高VPEN //上拉为高/RP //上拉为高*/1.norflash读取生产ID和设备ID的步骤:1)执行相应的命令序列:=>向norflash的基地址发送命*(0x0C000000 + 0x5555) = 0x00AA;*(0x0C000000 + 0x2AAA) = 0x0055;*(0x0C000000 + 0x5555) = 0x0090;2)开始读取生产ID:(u16)mnfID=*(0x0C000000+0x0);3)开始读取设备ID:(u16)devID=*(0x0C000000+0x2);2.以块为单位擦除norflash的步骤:(假设擦除uboot所在分区:0x0C100000)1)禁止flash的写保护://设置EMIFS_CONFIG寄存器的最低位为1(即让wp引脚输出为高)2)Block unlock*((short*)0x0C100000) = 0x0060; //块对齐地址*((short*)0x0C100000) = 0x00D0; //块对齐地址while(!(*((short*)0x0C100000) & 0x0080)); //块对齐地址*((short*)0x0C100000) = 0x00FF; //设置norflash为read array模式3)执行擦除命令序列:=>向要操作的块地址发送命令*((short*)0x0C100000) = 0x0020; //块对齐地址,INTEL_ERASE_CMD0*((short*)0x0C100000) = 0x00D0; //块对齐地址,INTEL_ERASE_CMD1while (!(*((short*)0x0C100000) & 0x0080)); //块对齐地址,等待直到擦除结束5)设置norflash为read array模式*((short*)0x0C100000) = 0x00FF; //让norflash重新进入read array模式6)使能flash的写保护://设置EMIFS_CONFIG寄存器的最低位为0(即让wp引脚输出为低)3.以块为单位写norflash的步骤:(假设写uboot所在分区:0x0C100000)/*发送写命令(0xE8)->发送数据->发送确认写命令(0xD0)->确认状态寄存器命令(0x70)->清掉状态寄存器命令(0x50)块对齐字对齐块对齐字对齐字对齐*/1)禁止flash的写保护://设置EMIFS_CONFIG寄存器的最低位为1(即让wp引脚输出为高)2)发送写命令://块对齐地址*((short*)0x0C100000)=0x00E8; //块对齐地址,program setup commandwhile(!(*0x0C100000 & 0x0080)); //块对齐地址3)开始发送要写到flash的数据=>(这些数据会在norflash芯片内部的buffer中锁存起来) =>每次2个字节,因为数据总线宽度为16位(short *)ulData = 0x10010000 =>SDRAM的地址(long *)psAddress = 0x0C000000 =>Norflash的地址for(i=0; i<15; i++){*psAddress = ulData[i];psAddress++;}4)通知norflash将存在自己buffer中的数据写到norflash的介质上:*((short*)0x0C100000)=0x00D0; //块对齐地址5)读状态寄存器,确保步骤4)已经完成*0x0C100000 = 0x0070; //Check Status Register ,这里是字对齐的地址while(!(*0x0C100000 & BIT7)); //字对齐地址6)// Check program status.if ( *0x0C100000 & 0x0010 ) //字对齐地址{*0x0C100000 = 0x0050; //字对齐地址, Clear Status*((short*)0x0C100000) = 0x00FF; //块对齐地址Put chip back into read array mode.return 1;}7)使能flash的写保护://设置EMIFS_CONFIG寄存器的最低位为0(即让wp引脚输出为低)//*********************************************************************** ***************************//*** norflash操作原理:假设现在讨论的norflash连接在cpu的地址空间的0x0C000000位置的st stm29w640d 8MB norflash(块大小为64KB,16位宽度)//=> 注意ST和intel norflash是有区别的:// ST的norflash A0可用,故对16bit的接法为A1接A0,后面引脚类推//intel的norflash A0不可用,故对16bit的接法为A1接A1,后面引脚类推///*1).st stm29w640d 8MB 16bit norflash 和bf561相连的接法为:bf561 <=> stm29w640d/ABE3 => A0 //注意ABE[3]在这里被当成A1来使用:A[22:2] => A[21:1] //bf561给norflash的地址信号D[15:0] => D[15:0] //bf561给norflash的数据信号/AMS0 => /CE //bf561给norflash的片选信号/AOE => /OE //bf561给norflash的读信号/AWE => /WE //bf561给norflash的写信号RDY //上拉为高/BYTE //上拉为高WP_/VPP //上拉为高/RP //上拉为高2).注意ABE[3]在这里被当成A1来使用:The ABE[3] pin of bf561 has two different functions. When the AMC is configuredto do 16-bit data packing via the Asynchronous Memory Global ControlRegister,the ABE[3] pin of bf561 functions as the least significant bit of the address bus (ABE[3] = A1).*/1.norflash读取生产ID和设备ID的步骤:1)执行相应的命令序列:=>向norflash的基地址发送命*(0x0C000000 + 0x5555) = 0x00AA;*(0x0C000000 + 0x2AAA) = 0x0055;*(0x0C000000 + 0x5555) = 0x0090;2)开始读取生产ID:(u16)mnfID=*(0x0C000000+0x0);3)开始读取设备ID:(u16)devID=*(0x0C000000+0x2);2.以块为单位擦除norflash的步骤:(假设擦除uboot所在分区:0x0C100000)1)禁止flash的写保护://设置EMIFS_CONFIG寄存器的最低位为1(即让wp引脚输出为高)2)Block unlock //无3)执行擦除命令序列:=>向要操作的块地址发送命令*((short*)0x0C100000 + 0x555) = 0x00AA;*((short*)0x0C100000 + 0x2AA) = 0x0055;*((short*)0x0C100000 + 0x555) = 0x0080;*((short*)0x0C100000 + 0x555) = 0x00AA;*((short*)0x0C100000 + 0x2AA) = 0x0055;*((short*)0x0C100000) = 0x0030; //块对齐地址while (!(*((short*)0x0C100000) & 0x0080)); //块对齐地址,等待直到擦除结束5)设置norflash为read array模式*((short*)0x0C100000) = 0x00FF; //让norflash重新进入read array模式6)使能flash的写保护://设置EMIFS_CONFIG寄存器的最低位为0(即让wp引脚输出为低)3.以块为单位写norflash的步骤:(假设写uboot所在分区:0x0C100000)/**/1)禁止flash的写保护://设置EMIFS_CONFIG寄存器的最低位为1(即让wp引脚输出为高)2)发送写命令://块对齐地址*((short*)0x0C100000 + 0x555) = 0x00AA;*((short*)0x0C100000 + 0x2AA) = 0x0055;*((short*)0x0C100000 + 0x555) = 0x00A0;3)开始发送要写到flash的数据=>(这些数据会在norflash芯片内部的buffer中锁存起来) =>每次2个字节,因为数据总线宽度为16位*(volatile U16 *)0x0C100000 = j;4)通知norflash将存在自己buffer中的数据写到norflash的介质上:5)读状态寄存器,确保步骤4)已经完成while(!(*0x0C100000 & 0x80)); //字对齐地址6)// Check program status.7)使能flash的写保护://设置EMIFS_CONFIG寄存器的最低位为0(即让wp引脚输出为低)4.读norflash的步骤:(假设写uboot所在分区:0x0C100000)1)方法一:*((short*)0x0C100000 + 0x555) = 0x00AA;*((short*)0x0C100000 + 0x2AA) = 0x0055;(short)data = *((short *)0x0C100000+);2)方法二:直接读(short)data = *((short *)0x0C100000+);NandFlash系列】之一:NorFlash与NandFlash对比FLASH存储器又称闪存,主要有两种:NorFlash和NandFlash,下面我们从多个角度来对比介绍一下。
NORFlash的原理与操作1、了解nor flash存储芯⽚的概念和特性2、掌握使⽤s3c2440芯⽚对外挂的nor flash进⾏读写擦除操作1、NOR Flash的简单介绍NOR Flash最早是由Intel公司于1988年开发出的,是现在市场上两种主要的⾮易失性存储器之⼀,它的出现彻底改变了存储器市场上由EPROM(Erasable Programmable Read-Only-Memory电可编程序只读存储器)和EEPROM(电可擦只读存储器Electrically Erasable Programmable Read - Only Memory)⼀统天下的局⾯。
NOR Flash最⼤特点是⽀持XIP(Execute On Chip),既程序可以直接在NOR flash 的⽚内执⾏,在NOR Flash中的代码运⾏时不需要重定位复制到RAM内。
NOR Flash的地址线和数据线分开,数据的读取和RAM很类似,只要能够提供数据地址,数据总线就能正确给出数据。
不过不能直接对它进⾏写操作,执⾏写操作之前需要先发送固定的命令序列,然后发送写操作的地址和数据。
NOR Flash存储器的最⼩访问单元⼀般分为8位和16位的,也有⼀些NOR Flash器件同时⽀持8位和16位模式,这种Flash的位宽可以在设计硬件时选择,当芯⽚的BYTE#引脚接为⾼电平,芯⽚⼯作在位宽16位模式,BYTE#引脚设为低电平时,芯⽚⼯作在位宽8位模式。
NOR Flash⼀般有多个扇区,扇区是NOR Flash擦除的最⼩单位,Nor Flash中每个扇区的⼤⼩也不是固定的,扇区的排放⼀般分为两种模式Top Boot part 和Bottom Boot part 。
这两种形式的区别是⼩块的扇区在NOR Flash芯⽚中放置的位置不同,Bottom Boot类型的NOR Flash⼩块地址位于芯⽚0地址,⽽Top Boot part类型的NOR Flash⼩块地址位于芯⽚的⾼地址上。
NOR-Flash存储器1概述ADSP-BF532自身不具有ROM,因此必须外接ROM器件来存储放电后仍需要保存的代码和数据。
NOR Flash具有非易失性,并且可轻易擦写。
Flash技术结合了OTP存储器的成本优势和EEPROM的可再编程性能,因此得到了越来越广泛的使用。
在本实验中将主要介绍NOR Flash 器件——Am29LV160D在Blackfin处理器系统中的应用。
NOR Flash采用标准总线接口与处理器交互,对它的读取不需要任何特殊的代码。
作为代码存储器,NOR Flash映射在处理器的异步存储区的0x2000,0000到0x201F,FFFF地址上。
若设定系统从Flash启动,则系统上电复位时,处理器就自动从Flash中取得指令运行。
因此NOR Flash中要存放系统启动代码,这些代码必须在系统上电时完成一系列初始化的工作。
经过了这些初始化,系统才得以正确启动并开始工作。
2 实验内容和目标本实验要实现的内容和目标读出FLASH的manufacturer ID和device ID。
对FLASH芯片进行整片擦出,并验证擦除是否成功(读出数据是否为为全0xFFFF)。
往FLASH起始地址写入0x5555,并读出,验证写入是否正确。
3实验分析1.Am29LV160D介绍进行实际编程之前,首先应了解NOR Flash器件Am29LV160D的特性和读写操作的要求。
Am29LV160D是由AMD公司推出的1M×16bit的CMOS多用途Flash。
它的主要特性如下。
存储空间组织1M×16bit。
读写操作采用单一电源 2.7~3.6V。
可靠性-可擦写100 000个周期(典型值);-数据可保存100年。
低功耗- 动态电流15mA(典型值);-静态电流4μA(典型值);-自动低功耗模式4μA(典型值)。
扇区擦除能力统一为2K×16b大小的扇区。
快速读操作时间70ns和90ns。
NOR FLASH 编程实现与原理分析1. NOR FLASH 的简单介绍NOR FLASH 是很常见的一种存储芯片,数据掉电不会丢失.NOR FLASH支持Execute On Chip,即程序可以直接在FLASH片内执行(这意味着存储在NOR FLASH上的程序不需要复制到RAM就可以直接运行).这点和NAND FLASH不一样.因此,在嵌入式系统中,NOR FLASH很适合作为启动程序的存储介质.NOR FLASH的读取和RAM很类似(只要能够提供数据的地址,数据总线就能够正确的给出数据),但不可以直接进行写操作.对NOR FLASH的写操作需要遵循特定的命令序列,最终由芯片内部的控制单元完成写操作.从支持的最小访问单元来看,NOR FLASH一般分为8 位的和16位的(当然,也有很多NOR FLASH芯片同时支持8位模式和是16 位模式,具体的工作模式通过特定的管脚进行选择).对8位的NOR FLASH芯片,或是工作在8-BIT模式的芯片来说,一个地址对应一个BYTE(8-BIT)的数据.例如一块8-BIT的NOR FLASH,假设容量为4个BYTE.那芯片应该有8个数据信号D7-D0 和2个地址信号,A1-A0.地址0x0对应第0个BYTE,地址0x1对应于1BYTE,地址0x2对应于第2个BYTE,而地址0x3则对应于第3 个BYTE.对16位的NOR FLASH芯片,或是工作在16-BIT模式的芯片来说,一个地址对应于一个HALF-WORD(16-BIT)的数据.例如,一块16-BIT的NOR FLASH,假设其容量为4个BYTE.那芯片应该有16 个数据信号线D15-D0 和1个地址信号A0.地址0x0对应于芯片内部的第0个HALF-WORD,地址0x1对应于芯片内部的第1个HALF-WORDFLASH一般都分为很多个SECTOR,每个SECTOR包括一定数量的存储单元.对有些大容量的FLASH,还分为不同的BANK,每个BANK包括一定数目的SECTOR.FLASH的擦除操作一般都是以SECTOR,BANK 或是整片FLASH为单位的.在对FLASH进行写操作的时候,每个BIT可以通过编程由1变为0,但不可以有0修改为1.为了保证写操作的正确性,在执行写操作前,都要执行擦除操作.擦除操作会把FLASH的一个SECTOR,一个BANK或是整片FLASH的值全修改为0xFF.这样,写操作就可以正确完成了.由于NOR FLASH没有本地坏区管理,所以一旦存储区块发生毁损,软件或驱动程序必须接手这个问题,否则可能会导致设备发生异常. 在解锁、抹除或写入NOR FLASH区块时,特殊的指令会先写入已绘测的记忆区的第一页(Page).接着快闪记忆芯片会提供可用的指令清单给实体驱动程序,而这些指令是由一般性闪存接口(CommON FLASH memory Interface, CFI)所界定的. 与用于随机存取的ROM不同,NOR FLASH 也可以用在存储设备上;不过与NAND FLASH相比,NOR FLASH的写入速度一般来说会慢很多.2. NOR Flash的烧写方式以下内容,如无特别说明,处理器指的是ARM 处理器,FLASH 指的都是NOR FLASH.另外,BYTE指的是8-BIT的数据单元,HALF-WORD代表的是16-BIT的数据单元,而WORD 则代表了32-BIT的数据单元.2.1 处理器寻址ARM 可以说是目前最流行的32位嵌进式处理器.在这里只提一下ARM处理器的寻址,为后面做个展垫.从处理器的角度来看,系统中每个地址对应的是一个BYTE的数据单元.这和很多别的处理器都是一样的.2.2 处理器和NOR FLASH的硬件连接从前面的先容,我们知道从处理器的角度来看,每个地址对应的是一个BYTE 的数据单元.而,NOR FLASH 的每个地址有可能对应的是一个BYTE的数据单元,也有可能对应的是一个HALF-WORD的数据单元.所以在硬件设计中,连接ARM处理器和NOR FLASH时,必须根据实际情况对地址信号做特别的处理.假如ARM处理器外部扩展的是8-BIT的NOR FLASH, 数据线和地址线的连接应该如图1所示. 从图中我们可以看到,处理器的数据信号D0-D7和FLASH的数据信号D0-D7是逐一对应连接的,处理器的地址信号A0-An和NOR FLASH的地址信号A0-An 也是逐一对应连接的.假如ARM处理器外部扩展的是16-BIT的NOR FLASH, 地址线必须要错位连接. 图2给了一个ARM处理器和16-BIT NOR FLASH的连接示意图.如图2所示,ARM处理器的数据信号D0-D15和FLASH 的数据信号D0-D15是逐一对应的.而ARM处理器的地址信号和NOR FLASH 的地址信号是错位连接的,ARM的A0悬空,ARM 的A1 连接FLASH 的A0,ARM 的A2连接FLASH的A1,依次类推.需要错位连接的原因是:ARM处理器的每个地址对应的是一个BYTE 的数据单元,而16-BIT 的FLASH 的每个地址对应的是一个HALF-WORD(16-BIT)的数据单元.为了保持匹配,所以必须错位连接.这样,从ARM处理器发送出来的地址信号的最低位A0对16-BIT FLASH来说就被屏蔽掉了.补充说明:∙一般来说,ARM处理器内部要设置相应的寄存器,告诉处理器外部扩展的FLASH的位宽(8-BIT/16-BIT/32-BIT) .这样,处理器才知道在访问的时候如何从FLASH正确的读取数据;∙有些ARM处理器内部可以设置地址的错位.对于支持软件选择地址错位的处理器,在连接16-BIT FLASH的时候,硬件上可以不需要把地址线错位.读者设计的时候,请参考MCU的数据手册,以手册为准,以免造成不必要的麻烦;∙假如处理器支持内部设置地址错位,在实际访问的时候,送出的地址实际上是在MCU内部做了错位处理,其作用是等效于硬件连接上的错位的.上面的描述可能比较抽象,下面让我们来看2个ARM处理器访问16-BIT FLASH的例子:例子1:ARM处理器需要从地址0x0读取一个BYTE1.ARM处理器在地址线An-A0上送出信号0x0;2.16-BIT FLASH在自己的地址信号An-A0上看到的地址是0x0,然后将地址0x0对应的16-BIT数据单元输出到D15-D0上;3.ARM处理器知道访问的是16-BIT的FLASH,从D7-D0上读取所需要的一个BYTE的数据.例子2:ARM处理器需要从地址0x1读取一个BYTE1.ARM处理器在地址线An-A0上送出信号0x1;2.16-BIT FLASH在自己的地址信号An-A0上看到的地址依然是0x0, 然后将地址0x0对应的16-BIT数据单元输出到D15-D0上;3.ARM处理器知道访问的是16-BIT的FLASH,从D15-D8 上读取所需要的一个BYTE 的数据.2.3 从软件角度来看ARM 处理器和NOR FLASH 的连接从软件的角度来理解ARM处理器和FLASH的连接.对于8-BIT的FLASH的连接,很好理解,由于ARM处理器和8-BIT FLASH的每个地址对应的都是一个BYTE 的数据单元.所以地址连接毫无疑问是逐一对应的.假如ARM 处理器连接的是16-BIT 的处理器,由于ARM 处理器的每个地址对应的是一个BYTE的数据单元,而16-BIT FLASH 的每个地址对应的是一个HALF-WORD 的16-BIT的数据单元.所以,也毫无疑问,ARM处理器访问16-BIT处理器的时候,地址肯定是要错开一位的.在写FLASH驱动的时候,我们不需要知道地址错位是由硬件实现的,还是是通过设置ARM处理器内部的寄存器来实现的,只需要记住2点:1.ARM处理器访问8-BIT FLASH的时候,地址是逐一对应的;2.ARM处理器访问16-BIT FLASH的时候,地址肯定是错位的.2.4 8-BIT FLASH 烧写驱动实例- HY29F040HY29F040是现代公司的一款8-BIT的NOR FLASH.在这个小节里,我们以这个芯片为例子,讲述如何对8-BIT NOR FLASH进行操作.HY29F040的容量为512K-BYTE,总共包括8 个SECTOR,每个SECTOR 的容量是64K-BYTE.该芯片支持SECTOR擦除,整片擦除和以BYTE 为基本单位的写操纵.HY29F040的命令定义如表-1所示.下面,我们来看看如何实现基本的擦除和编程操作.在本节后面的描述中,我们使用了下面的2 个定义:U32 sysbase; //该变量用来表示 FLASH 的起始地址#define SysAddr8(sysbase, offset) ((volatile U8*)(sysbase)+(offset)) //用来方便对指定的 FALSH 地址进行操作宏SysAddr8定义了一个BYTE(8-BIT)指针,其地址为(sysbase + offset).假设FLASH的起始地址为0x10000000,假如要将0xAB写到FLASH的第一个BYTE中往,可以用下面的代码:*SysAddr8(0x10000000, 0x1) = 0xAB;注意:在本节后面的描述中,sysbase代表的是FLASH的起始地址,而SysAddr8中的offset则代表了相对于FLASH起始地址的BYTE偏移量.offset也是8-BIT FLASH在自己的地址信号An-A0上看到的地址.a. 整片擦除操作整片擦除操纵共需要6个周期的总线写操作:1.将0xAA写到FLASH 地址0x5555;2.将0x55 写到FLASH 地址0x2AAA;3.将0x80 写到FLASH 地址0x5555;4.将0xAA写到FLASH 地址0x5555;5.将0x55 写到FLASH 地址0x2AAA;6.将0x10 写到FLASH 地址0x5555.对应的代码:*SysAddr8(sysbase, 0x5555) = 0xAA; //将值 0xAA写到 FLASH 地址0x5555*SysAddr8(sysbase, 0x2AAA) = 0x55; //将值 0x55 写到 FLASH 地址0x2AAA*SysAddr8(sysbase, 0x5555) = 0x80; //将值 0x80 写到 FLASH 地址0x5555*SysAddr8(sysbase, 0x5555) = 0xAA; //将值 0xAA写到 FLASH 地址0x55550x2AAA*SysAddr8(sysbase, 0x5555) = 0x10; //将值 0x10 写到 FLASH 地址0x5555b. SECTOR擦除操作SECTOR的擦除操纵共需要6个周期的总线写操作:1.将0xAA写到FLASH 地址0x5555;2.将0x55 写到FLASH 地址0x2AAA;3.将0x80 写到FLASH 地址0x5555;4.将0xAA写到FLASH 地址0x5555;5.将0x55 写到FLASH 地址0x2AAA;6.将0x30 写到要擦除的SECTOR 对应的地址.对应的代码:*SysAddr8(sysbase, 0x5555) = 0xAA; //将值 0xAA写到 FLASH 地址0x5555*SysAddr8(sysbase, 0x2AAA) = 0x55; //将值 0x55 写到 FLASH 地址0x2AAA*SysAddr8(sysbase, 0x5555) = 0x80; //将值 0x80 写到 FLASH 地址0x5555*SysAddr8(sysbase, 0x5555) = 0xAA; //将值 0xAA写到 FLASH 地址0x5555*SysAddr8(sysbase, 0x2AAA) = 0x55; //将值 0x55 写到 FLASH 地址0x2AAA*SysAddr8(sysbase, addr) = 0x30; //将值 0x30 写到要擦除的 SECTOR 对应的地址c. BYTE擦除操作写一个BYTE 的数据到FLASH中往,需要4个周期的总线写操作:1.将0xAA写到FLASH 地址0x5555;2.将0x55 写到FLASH 地址0x2AAA;3.将0xA0 写到FLASH 地址0x5555;4.将编程数据(BYTE)写到对应的编程地址上.对应的代码:*SysAddr8(sysbase, 0x5555) = 0xAA; //将值 0xAA写到 FLASH 地址0x5555*SysAddr8(sysbase, 0x2AAA) = 0x55; //将值 0x55 写到 FLASH 地址0x2AAA0x5555*SysAddr8(sysbase, addr) = data; //将一个 BYTE的数据写到期看的地址2.5 16-BIT FLASH 烧写驱动实例- SST39VF160SST39VF160是SST公司的一款16-BIT的NOR FLASH. 在这个小节里, 我们以SST39VF160为例子, 讲述如何对16-BIT NOR FLASH进行操作.对8-BIT FLASH的操作很好理解,但对16-BIT FLASH 的操作理解起来要晦涩很多.我尽力描述得清楚些.SST39VF160的容量为2M-BYTE , 总共包括512个SECTOR, 每个SECTOR 的容量是4K-BYTE. 该芯片支持SECTOR擦除,整片擦除和以HALF-WORD 为基本单位的写操纵.SST39VF160 的命令定义如表-2 所示.在表2 中,由于所有命令都是从FLASH的角度来定义的. 所以, 所有的地址都是HALF-WORD地址, 指的是16-BIT FLASH在自己的地址信号An-A0上看到的地址.在本节后面的描述中,我们使用了下面的2个定义:U32 sysbase; //该变量用来表示 FLASH 的起始地址#define SysAddr16(sysbase, offset) ((volatile U16*)(sysbase)+(offset)) //用来方便对指定的 FALSH 地址进行操作SysAddr16(sysbase, offset)首先定义了一个16-BIT HALF-WORD的指针,指针的地址为sysbase,然后根据offset做个偏移操纵. 由于HALF-WORD指针的地址是2个BYTE对齐的, 所以每个偏移操纵会使得地址加2. 终极, SysAddr16 (sysbase, offset)相当于定义了一个HALF-WORD的指针,其终极地址为(sysbase + 2offset) .在使用SysAddr16的时候,将sysbase设置成FLASH 的起始地址,offset 则可以理解为相对于FLASH 起始地址的HALF-WORD 偏移量或是偏移地址.假设FLASH 的起始地址为0x10000000,SysAddr16(0x10000000, 0)指向16-BIT FLASH 的第0 个HALF-WORD, SysAddr16(0x10000000, 1指向16-BIT FLASH的第1个HALF-WORD.依次类推.假如要将0xABCD分别写到FLASH 的第0个和第1个HALF-WORD 中往,可以用下面的代码:*SysAddr16(0x10000000, 0x0) = 0xABCD;*SysAddr16(0x10000000, 0x1) = 0xABCD;接下来,我们分别从ARM处理器的角度和FLASH的角度来具体分析一下.从ARM 的角度来看:假设FLASH 的起始地址为0x10000000,由于ARM 处理器知道FLASH 的地址空间为0x10000000 ~ (0x10000000 +FLASH容量–1),所以在对这个地址空间进行访问的时候,会设置好FLASH的片选信号,并将低位的地址输出到地址信号上.以*SysAddr16(0x10000000, 0x1) =0xABCD 为例.从ARM 处理器的角度来看,该操纵是把0xABCD写到地址0x10000002上往.所以ARM处理器终极会在它的地址信号An-A0输出地址0x2,同时会在D15-D0 上输出0xABCD.从FLASH 的角度来看:还是以*SysAddr16(0x10000000, 0x1) = 0xABCD 为例,FLASH看到的地址是多少呢?接着分析.ARM 处理器在执行操纵的时候,会设置好相应的FLASH片选使能信号,并在ARM的地址信号An-A0上输出0x2.由于ARM和16-BIT FLASH的地址信号的连接是错开一位的, 所以, FLASH终极在自己的地址An-A0上看到的信号是0x1, 相当于将ARM处理器输出的地址往右做了一个移位操纵,恰好对应的是FLASH的第1 个HALF-WORD.同时,FLASH会在自己的D15-D0上看到数据0xABCD.通过上面的分析,我们知道SysAddr16 中指定的offset 的值就是16-BIT FLASH 在自己的地址An-A0 上看到的值.所以,我们可以很方便的通过SysAddr16(sysbase, offset) 对FLASH 进行操纵,其中sysbase 代表FLASH 起始地址,offset 则代表了FLASH 的第几个HALF-WORD(HALF-WORD偏移量或偏移地址)注意:1.在本节后面的描述中,SysAddr16中的SYSBASE代表的是FLASH的起始地址,而SysAddr16中的OFFSET则代表了相对于FLASH起始地址的HALF-WORD 偏移量或偏移地址.OFFSET 的值也是16-BIT FLASH在自己的地址信号An-A0上看到的值;2.在SST39VF160的命令定义中,所有的地址都是针对FLASH的HALF-WORD地址,指的是在FLASH自己的地址信号An-A0上看到的地址.整片擦除操作整片擦除操纵共需要6个周期的总线写操作:1.将0x00AA写到FLASH HALF-WORD 地址0x5555;2.将0x0055 写到FLASH HALF-WORD地址0x2AAA;3.将0x0080 写到FLASH HALF-WORD地址0x5555;4.将0x00AA写到FLASH HALF-WORD 地址0x5555;5.将0x0055 写到FLASH HALF-WORD地址0x2AAA;6.将0x0010 写到FLASH HALF-WORD地址0x5555.对应的代码:*SysAddr16(sysbase, 0x5555) = 0x00AA; //将值 0x00AA 写到 FLASH HALF-WORD地址 0x5555*SysAddr16(sysbase, 0x2AAA) = 0x0055; //将值 0x0055 写到 FLASH HALF-WORD地址 0x2AAA*SysAddr16(sysbase, 0x5555) = 0x0080; //将值 0x0080 写到 FLASH HALF-WORD地址 0x5555*SysAddr16(sysbase, 0x5555) = 0x00AA; //将值 0x00AA 写到 FLASH HALF-WORD地址 0x5555*SysAddr16(sysbase, 0x2AAA) = 0x0055; //将值 0x0055 写到 FLASH HALF-WORD地址 0x2AAA*SysAddr16(sysbase, 0x5555) = 0x0010; //将值 0x0010 写到 FLASH HALF-WORD地址 0x5555SECTOR擦除操作SECTOR的擦除操纵共需要6个周期的总线写操作:1.将0x00AA写到FLASH HALF-WORD 地址0x5555;2.将0x0055 写到FLASH HALF-WORD地址0x2AAA;3.将0x0080 写到FLASH HALF-WORD地址0x5555;4.将0x00AA写到FLASH HALF-WORD 地址0x5555;5.将0x0055 写到FLASH HALF-WORD地址0x2AAA;6.将0x0030 写到要擦除的SECTOR 对应的HALF-WORD地址.对应的代码:*SysAddr16(sysbase, 0x5555) = 0x00AA; //将值 0x00AA 写到 FLASH HALF-WORD地址 0x5555*SysAddr16(sysbase, 0x2AAA) = 0x0055; //将值 0x0055 写到 FLASH HALF-WORD地址 0x2AAA*SysAddr16(sysbase, 0x5555) = 0x0080; //将值 0x0080 写到 FLASH HALF-WORD地址 0x5555*SysAddr16(sysbase, 0x5555) = 0x00AA; //将值 0x00AA 写到 FLASH HALF-WORD地址 0x5555*SysAddr16(sysbase, 0x2AAA) = 0x0055; //将值 0x0055 写到 FLASH HALF-WORD地址 0x2AAA*SysAddr16(sysbase, addr >> 1) = 0x0030; //将值 0x0030 写到要擦除的SECTOR 对应的HALF-WORD地址注意:上面的代码中第6个操纵周期中的ADDR 是从ARM处理器的角度来看的BYTE地址,由于在擦除的时候,用户希看指定的是从ARM 的角度看到的地址,这样更方便和更直观.而在SysAddr16 的宏定义中,OFFSET 表示的是相对于FLASH起始地址的HALF-WORD 偏移量,或是FLASH在自己的地址信号An-A0上看到的地址.所以需要执行一个右移操作,把ADDR转换成HALF-WORD 地址.举例说明,SST39VF160 每个SECTOR 的大小是4K-BYTE.从ARM 处器的角度和用户的角度来看,SECTOR-0 相对于FLASH起始地址的BYTE地址是0x0;从FLASH来看SECTOR-0 的HALF-WORD地址是0x0.从ARM处理器的角度和用户的角度来看, FLASH SECTOR-1相对于FLASH 起始地址的BYTE地址0x1000; 从FLASH来看, SECTOR-1的HALF-WORD地址应该是(0x1000 >> 1) = 0x800.假如要擦除SECTOR-0,上面代码的第6条指令应该是:*SysAddr16(sysbase, 0x0 >> 1) = 0x0030;假如要擦除SECTOR-1,上面代码的第6条指令应该是:*SysAddr16(sysbase, 0x1000 >> 1) = 0x0030;HALF-WORD 编程操作写一个HALF-WORD的数据到FLASH中往,需要4个周期的总线写操作:1.将0x00AA写到FLASH HALF-WORD 地址0x5555;2.将0x0055 写到FLASH HALF-WORD地址0x2AAA;3.将0x00A0 写到FLASH HALF-WORD 地址0x5555;4.将编程数据(HALF-WORD)写到对应的HALF-WORD地址.对应的代码:*SysAddr16(sysbase, 0x5555) = 0x00AA; //将值 0x00AA 写到 FLASH 地址 0x5555*SysAddr16(sysbase, 0x2AAA) = 0x0055; //将值 0x0055 写到 FLASH 地址 0x2AAA*SysAddr16(sysbase, 0x5555) = 0x00A0; //将值 0x00A0 写到 FLASH 地址 0x5555*SysAddr16(sysbase, addr >> 1) = data; //将数据写到对应的HALF-WORD 地址注意:上面的代码中第4个操作周期中的ADDR是从ARM处理器的角度来看的BYTE地址, 由于在执行写操作的时候,用户希看指定的是从ARM 的角度看到的地址,这样会更方便和更直观.而在SysAddr16 的宏定义中,OFFSET表示的是相对于FLASH起始地址的HALF-WORD偏移量. 所以需要执行一个右移操纵, 把它转换成HALF-WORD地址.例如要将数据0x0123 写到地址0x0处,对应的是FLASH 的第0 个HAFL-WORD,对应的HALF-WORD 地址应该是0x0,上面代码的第4条指令应该是:*SysAddr16(sysbase, 0x0 >> 1) = 0x0123;又如要将数据0x4567写到地址0x2处, 对应的是FLASH的第1个HALF-WORD, 对应的HALF-WORD地址应该是0x1, 上面代码的第4条指令应该是:*SysAddr16(sysbase, 0x2 >> 1) = 0x4567;再如要将数据0x89AB写到地址0x4处, 对应的是FLASH的第2个HALF-WORD, 对应的HALF-WORD 地址应该是0x2,上面代码的第4条指令应该是:*SysAddr16(sysbase, 0x4 >> 1) = 0x89AB;还如要将数据0xCDEF 写到地址0x6处,对应的是FLASH 的第3 个HALF-WORD,对应的HALF-WORD 地址应该是0x3,上面代码的第4条指令应该是:*SysAddr16(sysbase, 0x6 >> 1) = 0xCDEF;2.6 结束语以上简单介绍了NOR FLASH原理,以及如何对NOR FLASH进行操作, 但没有包括状态查询, 保护等其他操纵. 对于更复杂的多片FLASH并联的情况也没有讨论,如有需要者,可自行分析。
NANDNORFLASH闪存产品概述随着国内对集成电路,特别是存储芯片的重视,前来咨询我们关于NOR Flash,NAND Flash,SD NAND, eMMC, Raw NAND的客户越来越多了。
这里我们专门写了这篇文章:1,把常用的存储产品做了分类; 2把一些产品的特点做一个描述。
在正式开始介绍之前,我们给大家推(an)荐(li)一款非常易用稳定的Flash产品:CS创世 SD NAND。
具备如下特点:1,免驱动使用;2,可机贴;3,尺寸小巧。
6*8mm,LGA-8封装;4,擦写寿命长;5,耐高低温冲击;6,容量适宜(128MB~4GB)具体可以可以看链接:我们把存储产品大概分为E2PROM,NOR,NAND 3类,他们框架如下:一,E2PROM容量非常小,目前存在于一些MCU内部,遥控器,电风扇等小家电里。
用来存储一些基础信息。
用户基本不关心这个。
因此这里不做详细描述。
二,NOR Flash是目前应用领域最广泛的一种存储芯片了.基本上主流的电子产品里都有使用。
甚至我们手机摄像头内部,屏幕驱动电路板上都会用到。
主要用来存储代码和一些比较小的数据文件。
主流是SPI NOR接口; 主流容量:1Mbit~128Mbit; 封装:SOP-8居多,也有更小的;尺寸也都比较小。
NOR Flash架构决定了它的容量不能做大,而且读取速度比较慢。
好处在于比较简单易用。
甚至可以直接用地址访问到数据,不需要建立文件系统。
(这点攻城狮朋友们比较喜欢)三,NAND Flash应该是目前最热门的存储芯片了。
因为我们生活中经常使用的电子产品都会涉及到它。
比如你买手机,肯定会考虑64GB,还是256GB?买笔记本是买256GB,还是512GB容量的硬盘呢?(目前电脑大部分采用了基于NAND Flash产品的固态硬盘)。
这里我们从如下几方面做一个分类:3.1 内部材质NAND FLASH从材质上可以分为SLC/MLC/TLC/QLC,本质区别就是在最小的存储单元内能存放多少bit的信息。
Flash ROM基础知识及其编程关键词:闪存,NOR/NAND Flash, 接口一、闪存简介Flash-ROM(闪存)已经成为了目前最成功、流行的一种固态内存,与 EEPROM 相比具有读写速度快,而与 SRAM 相比具有非易失、以及价廉等优势。
而基于 NOR 和 NAND 结构的闪存是现在市场上两种主要的非易失闪存技术。
Intel 于 1988 年首先开发出 NOR flash 技术,彻底改变了原先由 EPROM 和EEPROM 一统天下的局面。
紧接着,1989 年东芝公司发表了 NAND flash 技术(后将该技术无偿转让给韩国 Samsung公司),强调降低每比特的成本,更高的性能,并且象磁盘一样可以通过接口轻松升级。
但是经过了十多年之后,仍然有相当多的工程师分不清 NOR 和 NAND 闪存,也搞不清楚 NAND 闪存技术相对于 NOR 技术的优越之处,因为大多数情况下闪存只是用来存储少量的代码,这时 NOR 闪存更适合一些。
而 NAND 则是高资料存储密度的理想解决方案。
NOR 的特点是芯片内执行(XIP,eXecute In Place),这样应用程序可以直接在闪存内运行,不必再把代码读到系统 RAM 中。
NOR 的传输效率很高,在1~4MB 的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响了它的性能。
NAND 结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快,这也是为何所有的 U 盘都使用 NAND 闪存做为存储介质的原因。
应用 NAND 的困难在于闪存和需要特殊的系统接口。
二、性能比较闪存是非易失内存,可以对称为块的内存单元块进行擦写和再编程。
任何闪存器件的写入操作只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前必须先执行擦除。
NAND器件执行擦除操作是十分简单的,而 NOR则要求在进行擦除前先要将目标块内所有的位都写为 0。
NOR-Flash存储器介绍及编程NOR-Flash存储器1概述ADSP-BF532自身不具有ROM,因此必须外接ROM器件来存储放电后仍需要保存的代码和数据。
NOR Flash具有非易失性,并且可轻易擦写。
Flash技术结合了OTP存储器的成本优势和EEPROM的可再编程性能,因此得到了越来越广泛的使用。
在本实验中将主要介绍NOR Flash器件——Am29LV160D在Blackfin处理器系统中的应用。
NOR Flash采用标准总线接口与处理器交互,对它的读取不需要任何特殊的代码。
作为代码存储器,NOR Flash映射在处理器的异步存储区的0x2000,0000到0x201F,FFFF地址上。
若设定系统从Flash启动,则系统上电复位时,处理器就自动从Flash中取得指令运行。
因此NOR Flash中要存放系统启动代码,这些代码必须在系统上电时完成一系列初始化的工作。
经过了这些初始化,系统才得以正确启动并开始工作。
2 实验内容和目标本实验要实现的内容和目标读出FLASH的manufacturer ID和device ID。
对FLASH芯片进行整片擦出,并验证擦除是否成功(读出数据是否为为全0xFFFF)。
往FLASH起始地址写入0x5555,并读出,验证写入是否正确。
3实验分析1(Am29LV160D介绍进行实际编程之前,首先应了解NOR Flash器件Am29LV160D的特性和读写操作的要求。
Am29LV160D是由AMD公司推出的1M×16bit的CMOS 多用途Flash。
它的主要特性如下。
存储空间组织1M×16bit。
读写操作采用单一电源 2.7,3.6V。
可靠性, 可擦写100 000个周期(典型值);, 数据可保存100年。
低功耗- 动态电流 15mA(典型值);, 静态电流 4?A(典型值);, 自动低功耗模式4?A(典型值)。
扇区擦除能力统一为2K×16b大小的扇区。
快速读操作时间 70ns和90ns。
具有锁地址和数据功能。
快速擦除和以字为单位编程。
扇区擦除时间 18ms(典型值);快擦除时间 18ms(典型值);片擦除时间 70ms(典型值);字擦除时间 14?s(典型值);片重写时间 15s(典型值).自动写时序内部产生VPP写结束的检测, 翻转位;, 数据轮流检测。
与CMOS电平的I/O口兼容。
符合JEDEC标准采用Flash EEPROM的标准引脚排布和指令集。
芯片引脚分布(TSOP封装)如图1所示。
图1 Am29LV160D的引脚分布图引脚描述如表1所示。
表1 Am29LV160D引脚功能描述Am29LV160D的电路连接方式如图2所示。
图2 Am29LV160D的电路连接图5编程指导NOR Flash映射在处理器的异步存储区的0x2000,0000到0x201F,FFFF地址上。
本实验将要对NOR Flash进行的操作包括“读”、“写”和“擦除”。
对与“读”操作,可以直接从相应地址读出数据,但对于“写”和“擦除”操作,应遵循NOR Flash的操作步骤,通常应根据地址定义的类型,向特定的地址处写入特定的命令字,如果需要,再读出数据,验证操作是否成功。
图3与图4分别是Am29LV160D的“写”与“整片擦除”操作流程图,表2是Am29LV160D的操作命令。
基本操作应按照表中所示的步骤进行,在进行各种操作前,应首先确定地址类型为“字(16位)”还是“字节(8位)”,例如:当进行“写”操作时,如果地址定义成“字”类型,则应首先向NOR Flash的地址0x555处写入0xAA,其次向地址0x2AA处写入0x55,再向地址0x555处写入0xA0,最后向指定地址写入数据。
“擦除”操作与“写”操作类似。
表中其它操作的含义,请参考Am29LV160D的数据手册。
内部操作不需要干预图3 “写”操作流程图4 “整片擦除”操作流程表2 Am29LV160D操作命令6 程序代码#include "ccblkfn.h"#include "sysreg.h"#include <sys\exception.h>#include <cdefBF532.h>#define pFlashAStartAddress #define pFlashAUnlock1Address0x555)#define pFlashAUnlock2Address 0x2aa)#define pFlashAManufacturerIDAddress #define pFlashADeviceIDAddress 0x01)#define DelayLength 100void delay(unsigned int DelayValue) {int i;for(i=0;i<DelayValue;i++) {;}}void Init_EBIU(void){*pEBIU_AMBCTL0 = 0xfff0fff0; (volatile unsigned short *)0x20000000 (volatile unsigned short *)(pFlashAStartAddress + (volatile unsigned short *)(pFlashAStartAddress + (volatile unsigned short*)(pFlashAStartAddress + 0x00) (volatile unsigned short*)(pFlashAStartAddress +*pEBIU_AMBCTL1 = 0xfff0fff0; *pEBIU_AMGCTL = 0x000f;}void FlashReset(void){*pFlashAStartAddress = 0xf0;delay(DelayLength);}unsigned short FlashGetManufacturerID(void) {unsigned short FlashValue;*pFlashAUnlock1Address = 0xaa;delay(DelayLength);*pFlashAUnlock2Address = 0x55;delay(DelayLength);*pFlashAUnlock1Address = 0x90;delay(DelayLength);FlashValue = *pFlashAManufacturerIDAddress; delay(DelayLength); return(FlashValue);}unsigned short FlashGetDeviceID(void){unsigned short FlashValue;*pFlashAUnlock1Address = 0xaa;delay(DelayLength);*pFlashAUnlock2Address = 0x55;delay(DelayLength);*pFlashAUnlock1Address = 0x90;delay(DelayLength);FlashValue = *pFlashADeviceIDAddress; delay(DelayLength); return(FlashValue);}void FlashEraserChip(void){*pFlashAUnlock1Address = 0xaa;delay(DelayLength);*pFlashAUnlock2Address = 0x55;delay(DelayLength);*pFlashAUnlock1Address = 0x80;delay(DelayLength);*pFlashAUnlock1Address = 0xaa;delay(DelayLength);*pFlashAUnlock2Address = 0x55;delay(DelayLength);*pFlashAUnlock1Address = 0x10;delay(DelayLength);while((*pFlashAStartAddress) != 0xffff){;}}void FlashProgarmmeWord( unsigned short Value,unsigned int pFlashOffsetAddress) {*pFlashAUnlock1Address = 0xaa;delay(DelayLength);*pFlashAUnlock2Address = 0x55;delay(DelayLength);*pFlashAUnlock1Address = 0xa0;delay(DelayLength);*(volatile unsigned short *)(0x20000000 + pFlashOffsetAddress) = Value;delay(DelayLength);while((*(volatile unsigned short *)(0x20000000 +pFlashOffsetAddress)) != Value) {;}}void main(void){unsigned short a;Init_EBIU();FlashReset();//reset flasha = FlashGetManufacturerID();//manufacturer ID is 0x0001a = FlashGetDeviceID();//device ID is 0x2249FlashReset();//reset flashFlashEraserChip();//eraser flash chipa = *(volatile unsigned short *)0x20000000;//read out is 0xffffFlashProgarmmeWord(0x5555,0x00);a = *(volatile unsigned short *)0x20000000;//read out is 0x5555while(1) {;}}。