新型大容量闪存AT45DB041
AT45DB041: New High capability Flash Memory
■北方交通大学 现代通信研究所 熊磊 张鹏 姚冬苹
AT45DB041是ATMEL公司的新型FLASH芯片。该芯片具有容量大、读写速度快、外围电路少等诸多优点,更为重要的是该芯片可最低工作在2.5V,工作电流仅为4mA,因此在移动通信、便携等场合得到了广泛的应用。
芯片工作原理与硬件连接
AT45DB041中的数据按页存放,主存共2048页,每页264字节,所以总容量为528K字节(约4M比特)。存放在主存中的数据掉电不丢失。除了主存以外,AT45DB041还有两个容量为264字节的数据缓存。缓存可以用作主存与外部进行数据交换时的缓冲区域,也可以暂存一些临时数据。缓存读写方便迅速,但掉电数据会丢失。AT45DB041数据读写采用串行方式,读写速度快,从页到缓存的传输时间为80 s左右,并且兼容CMOS和TTL输入和输出。
AT45DB041通过片选管脚/CS使能,通过串行输出(SO)和串行输入(SI)进行数据读和写。由串行时钟(SCK)对读写进行控制。
设备运行受微处理器的指令控制。一条有效的指令起始于/CS管脚的下降沿,并跟随相应的8位操作码和指定的缓存或主存地址码。当/CS管脚为低时,轮换时钟管脚(SCK)控制操作码和指定的缓存或主存地址码通过SI口的载入。所有的指令、地址和数据都从高字节开始传送。
数据读取
读缓存:通过不同的操作码可选择读取两个缓存中的其中一个(操作码54H用作读缓存1,而操作码56H用作读缓存2)。为了实现读缓存的操作,在8位操作码后必须跟有15位任意码,9位地址码和8位任意码。其中9位地址码(BFA8-BFA0)被用作指定要读取的首字节。在轮换时钟SCK的控制下,从SI载入操作码、地址码、任意码。当载入结束后,在SCK轮换时钟的控制下,缓存中的数据就可以从SO读出。当读到缓存的末尾时,设备将继续从缓存的开端重读。在这整个过程中/CS必须保持低电平。读缓存结束后,/CS上一个从低到高的电平跳变将终止读操作。
主存页到缓存的传送:一页数据可以从主存传至缓存1或2。8位操作码(53H用于缓存1,55H用于缓存2)后跟有4位保留位,11位用于指定目的页的地址位(PA10-PA0),和9位任意码,在轮换时钟SCK的控制下从SI载入。在这一过程中/CS管脚必须保持低电位。当载入结束后,在/CS上检测到一个由低到高的电平跳变后,主存页中的数据开始传送至缓存。在数据传送的过程中,状态寄存器将指示状态忙。
数据写入
写缓存:在SCK的控制下,8位的操作码(84H用于缓存1,87H用于缓存2)后面跟着15位任意码和9位地址码(BFA8-BFA0)由SI载入,其中9位地址码指定了缓存中被写的首字节,数据紧随着地址码输入。/CS上一个由低到高的跳变,将结束写缓存操作。
带有内置擦除的缓存至主存页的传送:8位的操作码(83H用于缓存1,86H用于缓存2)后跟有4位保留位,11位指定要写入的主存页的地址码(PA10-PA0),和9位任意码,在轮换时钟SCK的控制下从SI载入。当/CS上检测到一个由低到高的跳变时,器件将首先擦除被选中的主存页,然后将储存在缓存中的数据写入该页。擦除和写入的过程都是自动进行的,这一进程不超过20ms。在这个时间里,状态寄存器将指示状态忙。 状态寄存器值读取:读状态寄存器的值可以用来确定设备的忙闲状态。忙闲状态通过寄存器的第7位指示。如果第7位为1,则设备位于空闲状态并可接收下一条指令。如果为0,则设备忙。在载入8位操作码57H后,从SO上可以读出1字节的状态寄存器的值。
写保护(/WP) B041具有的写保护功能仅对主存的前256页有效。当/WP管脚为低电平时,FLASH禁止对主存的前256页进行写操作(只读),但主存的其它页并不受影响,仍然可以进行读写。AT45DB041的选择性写保护功能为用户的使用提供了很大的便利,用户可以将非常重要的数据,如系统参数、密码和身份信息等存入主存的前256页,并将/WP置低,使这些数据处于写保护状态,以保证这些数据不会被误擦除。而与此同时,用户仍能对其它地址进行读写。如果用户将/WP管脚悬空或接地,FLASH将不具备写保护功能,所有的主存页都可进行读写。
复位(/RESET) B041采用低电平复位,即当/RESET管脚出现低电平(<0.6V)时,芯片停止工作,待/RESET管脚的电平被拉高(>2.0V)后,恢复正常工作。为了避免接通电源时,由于电压不稳可能会对芯片正常工作造成影响,所以在使用时,最好在系统开机后延时10ms,再对FLASH进行操作。
与微处理器的接口
B041外围电路非常简单,可以很方便地与微控制器连接。SO、SI、SCK、/CS,/WP分别与微处理器的通用I/O相连即可。
软件
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
下面主要对AT45DB041的数据读写作简要介绍。
AT45DB041进行数据读写主要包括操作码、保留位、地址码、任意码、用户数据的载入和用户数据和状态字的读出两部分。
数据载入子程序
要载入的数据(操作码、保留位、地址码、任意码和用户数据)寄存从R0开始的地址单元里
;数据个数放在R6中 DADAIN:PUSH ACC
CLR CS ;使能R0
TRSMIT:MOV A,@R0
MOV R7,#08H 1字节=8比特
LOOPT: RLC A ;将要发送的数据由高位到低位依次移出
CLR SCK
MOV SI, 将1比特的数据送入SI
NOP
SETB SCK ;在SCK的上升沿AT45DBO41从SI上取数
DJNZ R7,LOOPT ;一字节的数据发送完毕
INC R0
DJNZ R6,TRSMIT
SETB CS ;所有数据发送完毕
POP ACC
RET
数据读取子程序:
;将取出的数据(用户数据和状态字)寄存从R1开始的地址单元里
;数据个数放在R6中
DATAOUT:PUSH ACC
CLR, A
CLR C
CLR CS ;使能
RECEIVE:CLR SCK
MOV R7,#08H
LOOPR: SETB SCK 在SCK的上升沿AT45DB041将数据放在S0上
MOV C,SO ;将1比特的数据取出
NOP
SETB SCK
RLC A
DJNZ R7,LOOPR ;一字节的数据接收完毕
MOV @R1,A
INC R1
DJNZ R6,RECEIVE
SETB CSp ;所有数据接收完毕
POP ACC
RET
AT45D081/AT45DB021/AT45DB0xx驱动程序(C语言)用于大型存储的串行Flash
/*---------------------------------------------------------
版 本: V2.2
作 者:梁衍龙
创作时间:2002年9月
==========================================================*/
#include "reg51.h"
#include "intrins.h"
#define NOP() { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); }
sbit SPI45D081_CS =P1^5;//片选接口
sbit SPI45D081_SK =P1^6;//时钟接口
sbit SPI45D081_DI =P1^7;//数据输入接口
sbit SPI45D081_DO =P1^4;//数据输出接口
delay(unsigned int t)
{
while(t--);
}
// SPI_SK上升沿数据有效 _/-
SPI45D081_WriteBits(unsigned char byte,unsigned char num_of_bits)
{
unsigned char count;
byte=byte<<(8-num_of_bits);
for(count=0;count
>8) , 4 );
SPI45D081_WriteBits( (unsigned char)(page) , 8 );
// fill 9 sk,don't care.
SPI45D081_WriteBits( 0x00 , 4 );
SPI45D081_WriteBits( 0x00 , 5 );//total 32 bit
SPI45D081_CS=1; // end
delay(200);}//
unsigned char ReadDataFromBuffer1(unsigned int address)
{
unsigned char dat;
SPI45D081_SK=1; //?? start
NOP();
SPI45D081_CS=0; //start
NOP();
//send 8 bit opcode:0x54
SPI45D081_WriteBits(0x54,8);// fill 15 sk,don't care.
SPI45D081_WriteBits(0x00,8);
SPI45D081_WriteBits(0x00,7);//send 9 bit address to 45D081 buffer1
SPI45D081_WriteBits( (unsigned char)(address>>8) , 1 );
SPI45D081_WriteBits( (unsigned char)(address) , 8 );//fill 8 bits blank
SPI45D081_WriteBits( 0x00 , 8 );// receive data
dat=SPI45D081_ReadByte() ;
SPI45D081_CS=1; // end
return(dat);
}
串行FLASH存储器AT45DB021B在电力参数监测中的应用
Application of Serial Flash Memory AT45DB021B in the Monitoring of Power Parameter
西北工业大学自动化学院 梅晓东
摘 要: AT45DB021B是2.7V电压供电,存储容量为264Kbyte的SPI串行接口的FLASH型大容量存储器,本文介绍了该器件的主要特性和工作原理,并给出了其与MSP430超低功耗单片机的接口电路和相应的C语言读写程序。
关键词:串行FLASH ;MSP430 ; SPI接口
概述
在智能电力设备中,往往要对电网的一些历史数据进行记录,以便更好的了解电网的运行状况,因此需要一个大容量、接口方式简单的存储器,AT45DB021系列是一个较好的选择。AT45DB021B是264Kbyte串行接口可编程闪速存储器,该器件具有SPI串行接口,可以方便的与单片机和微机通讯,同时还具有体积小、存储量大、电压低等优点。
主要特性
AT45DB021B的主要特点如下:
1.单电源供电(2.7V-3.6V),SPI串行接口符合SPI标准;
2.具有264Kbyte主存储器,1024页,每页264字节;
3.低功耗,4mA的典型读电流,休眠电流2 A;
4.20MHz的最大时钟频率,具有硬件写保护功能;
5.带有双264 字节的数据缓冲器,可在对主存储区操作同时对缓冲区写入或读取数据;
6.具有多种封装形式。
本文采用8管脚的SOIC封装形式,具有体积小的优势,其封装外形见图1及引脚功能见表1。
图1 (略)
表1 (略)
工作原理
AT45DB021B主存储区共分1024页(PAGE),每页264字节,共2,162,688位,此外,还有2个SRAM数据缓冲区(264字节/BUFFER),可以对主存储区任一页和任一数据缓冲区中的任一起始地址进行数据读或写操作,对主存储区的读写操作可以直接进行也可以通过任一数据缓冲区,另外一个显著的特点就是在对主存储区进行操作的同时,还可以对任一数据缓冲区进行读写。由于AT45DB021B具有SPI串行接口,因此硬件连接十分简单。该芯片具有在线可编程功能且不需要高的编程电压(编程电压仍为电源电压)。图2为AT45DB021B的内部结构框图。
对AT45DB021B的操作由主机发出的指令控制,一个有效的指令在 /CS的下降沿开始,包括一个8位的操作码,要进行操作的页地址和缓冲区地址的位置,所有指令和数据都从最高位开始。表2是AT45DB021B的主要的操作命令。
图2 (略)
表2 (略)
操作命令说明:
1.关于状态存储器:它是一个8位的只读存储器,用于指示AT45DB021B的工作状况,如图所示:
(略)
BIT7用于显示AT45DB021B的状态,BIT7位=1时,说明AT45DB021B不忙,可以对其进行指令操作,BIT7位=0时,指示AT45DB021B忙,可以通过检测BIT7位来实时了解AT45DB021B的状态,以下几种操作将导致BIT7位=0:使用内建擦除周期从缓存到主存传送操作,不使用内建擦除周期从缓存到主存传送操作,页擦除操作,主存储器页读写操作等。
2.主存储器页读:主存储器页读指令可以对1024页中的任意页进行读操作,命令码为:8位操作码+5位保留码+10位页地址码+9位页内起始地址码+32位无关码;操作码为52H或D2H,5位保留码用于对片子的上下兼容,10位页地址码用于确定对主存储器的哪一页进行操作,9位页内起始地址码来确定页内操作的起始地址,后32为无关码用来配合时序。当/CS为0时,主机向器件的SCK引脚发送时钟信号,引导操作码和地址从SI引脚写入器件,当最后一位写入后的下一个时钟周期,页内数据将从SO引脚输出。
3.通过缓冲存储器对主存储器写操作:
命令码为:操作码+5位保留码+10位页地址码+9位页内起始地址码,其中操作码为82H时,数据通过缓冲存储器1向主存储器写,为85H时,数据通过缓冲存储器2向主存储器写操作。
应用实例
AT45DB021B具有264Kbyte的主存储区,因此可广泛应用于数据存储等领域 ,可与单片机构成一个大容量的数据采集系统,在智能高压无功补偿器中,AT45DB021B用于存储过去60天的电压、电流的有效值和电网的一些运行参数,以便了解电网的历史运行状况,这是一般存储器达不到的。图3给出了由MSP430F149超低功耗FLASH型单片机与AT45DB021B构成的数据存储电路,并给出了对AT45DB021B读写操作的C语言程序,由于AT45DB021B具有SPI接口,具体的时序要满足SPI时序
要求
对教师党员的评价套管和固井爆破片与爆破装置仓库管理基本要求三甲医院都需要复审吗
,在此不再详述。
图3 (略)
#include
#define SCK_1 P4OUT |= BIT7 //SCK=1
#define SCK_0 P4OUT &=~ BIT7 //SCK=0
#define SI_1 P5OUT |= BIT0 //CPU向AT写1
#define SI_0 P5OUT &=~ BIT0 //CPU向AT写0
#define SO_IN ((P5IN & 0x02) == 0x02) //CPU读.
#define DIR_IN P5DIR &=~ BIT1; P5OUT |= BIT1 //I/O输入,接受AT的数据
#define DIR_OUT P5DIR |= BIT1; P5OUT |= BIT1 //I/O输出
#define STARTOP P4OUT |= BIT6; _NOP(); P4OUT &=~ BIT6
#define ENDOP P4OUT &=~ BIT6; _NOP(); P4OUT |= BIT6
#define HIGHTOLOW {_NOP(); SCK_1; _NOP(); SCK_0; _NOP();}
int tempArray[150];
void Init(void) //MSP430F149引脚初始化;
{
P4DIR |= BIT6;
P4OUT |= BIT6;
P4DIR |= BIT7;
P4OUT |= BIT7;
P5DIR |= BIT0;
P5OUT |= BIT0;
P5DIR |= BIT1;
P5OUT |= BIT1;
}
写一字节子程序:
void Wr1byte(unsigned char tt)
{ unsigned char i;
for (i=0; i<8; j++)
{
if ((tt & 0x80) == 0x80)
SI_1;
else
SI_0;
HIGHTOLOW;
tt = tt<< 1;
}
}
读一字节子程序:
unsigned char Rd1byte(void)
{unsigned char i,medBit=0;
char Data=0;
for (i=0; i<8; i++)
{ HIGHTOLOW;
_NOP();
if (SO_IN )
medBit = 1; //if(SO==1)medBit=1;
else
medBit = 0;
Data = (Data << 1) | medBit;
return Data;
}
}
对AT45DB021进行写操作子函数: (通过缓冲存储器2对主存储器写操作)
参数:pInData 指向要写入数据的指针
mm 写入数据数组的大小
startPage 将数据写入主存的起始页地址
startByte 将数据写入主存的起始页地址中的起始字节地址
void WriteMemory(const int *pInData, unsigned char mm, unsigned int startPage, unsigned int startByte)
{
unsigned char i, j;
unsigned char opCode;
char lowData;
char highData;
opCode = 0x85; //opCode=0x82 is also available.
lowData = highData = 0;
SCK_0;
_NOP();
STARTOP;
_NOP();
Wr1byte(opCode );
for (j=0; j<5; j++)
HIGHTOLOW;
//send startPage address //发送起始页地址子程序;
//send startByte address //发送页内起始地址子程序;
for (j=0; j> 8);
Wr1byte(highData);
}
ENDOP;
_NOP();
SI_1;
}
读出AT45DB021存储的数据(主存储器页读, 读出字)
参数:mm 读出数据数组的大小
startPage 读出数据的起始页地址
startByte 读出数据的起始页地址中的起始字节地址
返回值:无
void ReadMemory(unsigned char mm, unsigned int startPage, unsigned int startByte)
{
unsigned char i, j;
unsigned char opCode;
unsigned char medBit;
char lowData;
char highData;
opCode = 0x52;
lowData = highData = 0;
medBit = 0;
SCK_0;
_NOP();
STARTOP;
_NOP();
Wr1byte(opCode );
for (j=0; j<5; j++)
HIGHTOLOW; //5位保留码;
//send startPage address //发送起始页地址子程序;
//send startByte address //发送页内起始地址子程序;
for (j=0; j<32; j++)
HIGHTOLOW; //32位无关码;
DIR_IN;
for (j=0; j
本文档为【新型大容量闪存AT45DB041】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。