分享
 
 
 

AT45DB021B在电力参数监测中的应用

王朝厨房·作者佚名  2007-01-04
窄屏简体版  字體: |||超大  

西北工业大学自动化学院 梅晓东

概述

在智能电力设备中,往往要对电网的一些历史数据进行记录,以便更好的了解电网的运行状况,因此需要一个大容量、接口方式简单的存储器,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。

工作原理

AT45DB021B 主存储区共分1024页(PAGE),每页264字节,共2,162,688位,此外,还有2个SRAM数据缓冲区(264字节/BUFFER),可以对主存储区任一页和任一数据缓冲区中的任一起始地址进行数据读或写操作,对主存储区的读写操作可以直接进行也可以通过任一数据缓冲区,另外一个显著的特点就是在对主存储区进行操作的同时,还可以对任一数据缓冲区进行读写。由于AT45DB021B具有SPI串行接口,因此硬件连接十分简单。该芯片具有在线可编程功能且不需要高的编程电压(编程电压仍为电源电压)。图2为AT45DB021B的内部结构框图。

对AT45DB021B的操作由主机发出的指令控制,一个有效的指令在 /CS的下降沿开始,包括一个8位的操作码,要进行操作的页地址和缓冲区地址的位置,所有指令和数据都从最高位开始。表2是AT45DB021B的主要的操作命令。

操作命令说明:

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时序要求,在此不再详述。

#include <Msp430x14x.h>

#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<mm; j++) //对目的地址写操作,先写低字节后写高字节

{

lowData = (char)(*(pInData + j));

Wr1byte(lowData);

highData = (char)((*(pInData + 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<mm; j++)

{

lowData= Rd1byte();

highData= Rd1byte();

tempArray[j] = ((int)highData << 8) + lowData;

}

ENDOP;

SI_1;

_NOP();

DIR_OUT;

}

本文摘自《世界电子元器件》

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有