NOR-Flash存储器介绍及编程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 pFlashAUnlock1Address
0x555)
#define pFlashAUnlock2Address 0x2aa)
#define pFlashAManufacturerIDAddress #define pFlashADeviceIDAddress 0x01)
#define DelayLength 100
void 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 flash
a = FlashGetManufacturerID();//manufacturer ID is 0x0001
a = FlashGetDeviceID();//device ID is 0x2249
FlashReset();//reset flash
FlashEraserChip();//eraser flash chip
a = *(volatile unsigned short *)0x20000000;//read out is 0xffff
FlashProgarmmeWord(0x5555,0x00);
a = *(volatile unsigned short *)0x20000000;//read out is 0x5555
while(1) {;}
}。