1.概述
近年来,以单片机为核心构成的智能仪器仪表与数据采集系统获得了愈来愈广泛的应用。传统的数据存储方法均是通过总线型非易失数据存储器来保存采集的数据。随着单片机技术的不断发展及各种非总线型单片机的不断涌现,采用非总线型单片机并配合大容量串行E2PROM构成的数据存储系统,将是一种非常好的数据存储方法。该方法一方面可提高系统的可靠性,另一方面又可降低系统成本。
AT24C512是ATMEL公司新近推出的具有I2C总线容量达512Kbit(64K×8)的E2PROM,该芯片的主要特性如下:存储容量为65536byte;与100kHz、400kHz、1MHzI2C总线兼容;100000次编程/擦写周期;单电源、读写电压为1.8V~5.5V;ESD保护电压>4kV;数据可保存40年;写保护功能,当WP为高电平时,进入写保护状态;CMOS低功耗技术,最大写入电流为3mA;128byte页写入缓存器;自动定时的写周期;具有8引脚DIP及20引脚SOIC封装等多种封装形式。
2.引脚排列及功能
AT24C512的DIP型封装及20引脚的SOIC型封装的引脚排列如图1所示,各个引脚的功能如下:
SCL:串行时钟该引脚为一输入引脚,用于产生器件所有数据发送或接收的时钟。
SDA:串行数据/地址双向串行数据/地址引脚,用于器件所有数据的发送或接收。SDA是1个开漏输出引脚,可与其它开漏输出或集电极开路输出进行线接。
WP:写保护当引脚WP连接到VCC时,所有存储数据变为写保护。当引脚WP接VSS时,则允许器件进行正常读写操作。
A0,A1:器件地址输入这两个引脚为硬件连线或者不连接,通过连接VCC或VSS的组合可使单总线最多寻址4个AT24C512,当这些引脚没有连接时其默认值为0。
3.器件功能描述
AT24C512是具有I2C总线的存储芯片,因此该器件必须严格遵守I2C总线传输协议。I2C总线简单的硬件接口是以复杂的时序及软件编程为代价的,下面首先对该器件的时序进行描述。
(1)起停信号
时钟线保持高电平期间,数据线电平从高到低的跳变代为I2C总线的起始信号。时钟线保持高电平期间,数据线电平从低到高的跳变代为I2C总线的停止信号。
(2)器件寻址
主器件通过发送1个起始信号启动发送过程,然后发送它所需要寻址的从器件地址,8位从器件地址的高5位固定为10100,接下来的2位(A0,A1)为器件的地址位,因此最多可以将4个AT24C512连接到同一总线上使存储容量扩展至256Kbyte。注意,这两位必须与A0和A1两引脚的输入状态相对应,从器件地址的最低位为读写控制位,“1”表示对从器件进行读操作,“0”表示对从器件进行写操作,在主器件发送起始信号和从器件发送地址字节后,AT24C512监测总线并当其地址与发送的从地址相符时发出1个应答信号(通过SDA线),AT24C512再根据读写控制位(R/W)的状态进行读写操作,从器件地址字节内容如表1所示。
表1 从器件地址内容
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
1
0
1
0
0
A1
A0
R/W
(3)应答信号
I2C总线传送数据时,每成功传送1个字节,接收器都必须产生1个应答信号,应答的器件在第9个时钟周期将SDA线拉低表示其已收到1个8位数据。AT24C512在接收到起始信号和从器件地址之后产生应答信号,如果器件已选择了写操作,则在每接收1个8位字节之后1个应答信号。
当该器件工作于读模式时,在发送1个8位数据后释放SDA线并监测1个应答信号,一旦接收到应答信号,则继续发送数据,若主器件没有发送应答信号,器件停止传送数据并等待1个停止信号。
掌握了AT24C512的操作时序后再配合一定的地址/数据信息就可完成该器件的读写操作。
(4)写操作
写操作可分为字节写和页写两种写入方式。通常E2PROM的写入占用一定的写入时间,但AT24C512内部设有128字节的页写缓存,使得操作该器件如同操作SRAM一样方便,页面缓存使得两种写入方式的操作过程相同,区别仅在于写入数据字节的多少。下面以字节写入为例介绍写操作过程。
在字节写操作模式下,主器件首先给从器件发送起始信号和从器件地址信息,在从器件送回应答信号后,主器件在发送两字节的16位地址信息写入到AT24C512地址指针,主器件在收到从器件的应答信号后,再发送1个字节的数据到被寻址的存储单元,从器件在此应答,并在主器件产生停止信号后开始内部数据擦写,在内部擦写过程中,从器件不再应答主器件的任何请求,字节写入操作时序如图2所示。
(5)读操作
读操作分为立即读、随机读和连续读。立即读是在最后操作字节的地址上加1进行读取,而连续读则是在立即读和随机读起动后主器件通过应答信号响应完成多个数据的读取,在主器件发出停止信号后结束读取过程。下面以随机读为例介绍读操作过程。
随机读操作允许主器件对存储器的任意字节进行读操作。操作过程为主器件首先发送起始信号,从器件地址和欲读取字节的地址执行1个伪写操作,此时R/W位应置0,在AT24C512应答后,主器件重新发送起始信号和从器件地址,此时R/W位应置1,AT24C512响应并发送应答信号,然后输出所要求的1个8位字节数据。主器件不发送应答信号,但产生1个停止信号。字节读操作时序如图3所示。
4应用
AT24C512与AT89C2051单片机的硬件连接电路如图4所示。这里使用了2个AT24C512组成寻址空间为128K字节的E2PROM存储器电路。其中U2的器件地址为A0H,存储地址空间为0000-0FFFFH;U3的器件地址为A2H,存储地址空间为0000-0FFFFH。
由于AT89C2051不具有I2C总线,因此采用P1.0和P1.1口线来模拟I2C总线,AT24C512的SDA和SCL为开漏输出,故接入10kΩ的上拉电阻器。下面是与上述电路配套的E2PROM读写程序:
;内存数据定义
BitCnt DATA 30H;读/写数据位数计数器
ByteCnt DATA 31H;读/写数据字节数计数器
SlvAddr DATA 32H;E2PROM器件地址
SubAdrl DATA 33H;存储单元地址高8位
SubAdr2 DATA 34H;存储单元地址低8位
ReadDat DATA 50H;读操作数据缓冲区
WriteDat DATA 40H;写操作数据缓冲区
;端口位定义
SDA BIT P1.0;模拟I2C数据传送位
SCL BIT P1.1;模拟I2C时钟控制位
ACK BIT 20H;读非应答标志
;主程序
MAIN: MOV SP #60H;设堆栈
Write: MOV SlvAdr, #A0H;选择1个器件地址
MOV ByteCnt, #08H;设写入数据长度为8字节
MOV SubAdr1, #00H;设写入单元首址为0020H
MOV SubAdr2, #20H;
LCALL WriteData ; 写数据
……
Read: MOV Slvadr, #A0H;选择1个器件地址
MOV Bytecnt, #08H;设读出数据长度为8字节
MOV SubAdr1, #00H;设读出单元
MOV SubAdr2, #20H;首址为0020H
LCALL ReadData; 读数据
……
WriteData:LCALL Start; I2C总线起始条件
MOV A,SlvAdr; 取器件地址
LCALL writeByte; 发送器件地址
MOV A,SubAdr1
LCALL writeByte;发送高8位地址
MOV A,SubAdr2
LCALLwriteByte;发送低8位地址
MOVR0,#WriteDat;取写入数据的首地址
Next:MOVA,@R0
LCALLwriteByte;写入1字节数据
LNCR0;取下1个数据
DJNZByteCnt,Next;重复操作直到写完全部数据
LCALLStop;发送I2C总线停止条件
LCALLDL10ms;延时10ms等待E2PROM内部数据
;写完
RET
;读数据子程序
ReadData:LCALLStart
MOVA,SlvAdr
LCALLWriteByte
MOVA,Subadr1
LCALLWriteByte
MOVA,Subadr2
LCALLWriteByte
LCALLStart;重复发送I2C总线起始条件
MOVA,Slvadr
SETBACC.0;R/W位置1
LCALLWriteByte
CLRACK;请读非应答标志
MOVR0,#RdadData;读缓冲区首址
DJNZByteCnt,Next1
SJMPLast
Next1:LCALLReadByte;接收1个字节数据
MOV@R0,A;接收数据送缓冲区
INCR0
DJNZByteCnt,Next1;重复接收
Last:SETBACK;接收最后1个字节数据
ACALLReadByte
MOV#R0,A
LCALLStop
RET