串行EEPROM(24C02)接口方法
在新一代单片机中,无论总线型还是非总线型单片机,为了简化系统结构,提高系统的可靠性,都推出了芯片间的串行数据传输技术,设置了芯片间的串行传输接口或串行总线。串行总线扩展接线灵活,极易形成用户的模块化结构,同时将大大简化其系统结构。串行器件不仅占用很少的资源和I/O 线,而且体积大大缩小,同时还具有工作电压宽,抗干扰能力强,功耗低,数据不宜丢失和支持在线编程等特点。目前,各式各样的串行接口器件层出不穷,如:串行EEPROM,串行ADC/DAC,串行时钟芯片,串行数字电位器,串行微处理器监控芯片,串行温度传感器等等。
串行EEPROM 是在各种串行器件应用中使用较频繁的器件,和并行EEPROM 相比,串行EEPROM 的数据传送的速度较低,但是其体积较小,容量小,所含的引脚也较少。所以,它特别适合于需要存放非挥发数据,要求速度不高,引脚少的单片机的应用。这里绍
串行EEPROM 芯片,以及它们和单片机的接口技术。
1、串行EEPROM 及其工作原理
串行EEPROM 中,较为典型的有ATMEL 公司的AT24CXX 系列以及该公司生产的
AT93CXX 系列,较为著名的半导体厂家,包括Microchip,国家半导体厂家等,都有AT93CXX系列EEPROM 产品。
AT24CXX 系列EEPROM
AT24CXX 系列的串行电可改写及可编程只读存储器EEPROM 有10 种型号,其中典型
的型号有AT24C01A/02/04/08/16 等5 种,它们的存储容量分别是
1024/2048/4096/8192/16384位,也就是128/256/512/1 024/2048 字节。这个系列一般用于低电压,低功耗的工业和商业用途, 并且可以组成优化的系统。这个系统还有多种电压级别, 包括5V(4.5~5.5V),2.7V(2.7~5.5V),2.5V(2.5~5.5V),1.8V(1.8~5.5V)等4 种电压级别。它们的封装有8引脚PDIP 方式,8 引脚和16 引脚SOIC 方式。信息存取采用2 线串行接口。这里我们就24C02的结构特点,其他系列比较类似。
2、结构原理及引脚
AT24C02 有地址线A0~A2,串行数据引脚SDA,串行时钟输入引脚SCL,写保护引
脚WP 等引脚。很明显,其引脚较少,对组成的应用系统可以减少布线,提高可靠性。
各引脚的功能和意义如下。
(8):VCC 引脚,电源+5V。
(4):GND 引脚,地线。
(6):SCL 引脚,串行时钟输入端。在时钟的正跳沿即上升沿时把数据写入EEPROM;在时钟的负跳沿即下降沿时把数据从EEPROM 中读出来。
(5):SDA 引脚,串行数据I/O 端,用于输入和输出串行数据。这个引脚是漏极开路的端
口,故可以组成“线或”结构。
(1)、(2)、(3):A0,A1,A2 引脚,是芯片地址引脚。在型号不同时意义有些不同,但都要接固定电平。
(7):WP 引脚,写保护端。这个端提供了硬件数据保护。当把WP 接地时,允许芯片执行一般读写操作;当把WP 接VCC 时,则对芯片实施写保护。
3、存储器的组织及运行
存储器的组织:对于不同的型号,存储器的组织不一样,其关键原因在于存储器容
量存在差异。对于AT24CXX 系列的EEPROM,其典型型号的存储器组织如下。
AT24C01A:内部含有128 个字节,故需要7 位地址对其内部字节进行寻址
AT24C02:内部含有256 个字节, 故需要8 位地址对其内部字节进行读写。
4、运行方式:
对于时钟及数据传送,串行数据I/O 端口SDA 一般需要用外部上拉电阻将其电平拉高。加到SDA
的数据只有在串行时钟SCL 对于低电平的时间周期内可以改变。当串行时钟SCL处于高电平时,SDA 的数据变化用于指明起始或停止状态。在SCL 为高电平期间,如果SDA从低电平上升到高电平,则表示起始状态;如果SDA 从高电平下降到低电平,则表示停止状态。
起始状态:当SCL 为高电平时,SDA 由高电平变到低电平则处于起始状态。起始状态
应处于任何其他命令之前。
停止状态:当SCL 处于高电平时,SDA 从低电平变到高电平则处于停止状态。在执行
完读序列信号之后,停止命令将把EEPROM 置于低功耗的备用方式(Standby Mode).
应答信号:应答信号是由接受数据的器件发出的。当EEPROM 接受完一个写入数据之
后,会在SDA 上发一个”0”应答信号。反之,当单片机接受完来自EEPROM 的数据后单片机也应向SDA 发ACK 信号。ACK 信号在第9 个时钟周期时出现。
备用方式(Standby Mode):AT24C01A/02/04/08/16 都具有备用方式,以保证在没有读写操作时芯片处于低功耗状态。在下面两种情况中,EEPROM 都会进入备用方式:
第一, 芯片通电的时候;
第二,在接到停止位和完成了任何内部操作之后。
AT24C02 等5 种典型的EEPROM 在进入起始状态之后,需要一个8 位的“器件地址字”去启动存储器进行读或写操作。在写操作中,它们有“字节写”,“页面写”两种不同的写入方法。在读操作中,有“现行地址读”,“随机读”和“顺序读”三种各具特点的读出方法。下面分别介绍器件寻址,写操作和读操作。
① 器件寻址:所谓器件寻址(Device Addressing)就是用一个8 位的器件地址字(Device Address Word)去选择存储器芯片。在逻辑电路中的AT24CXX 系列的5 种芯片种,即AT24C01A/02/04/08/16 中,如果和器件地址字相比较结果一致,则读芯片被选中。下面对器件寻址的过程和意义加以说明。
② 芯片的操作地址
D7 D6 D5 D4 D3 D2 D1 D0 1 0 1 0 A2 A1 A0 R/W
图1:命令字格式
用于存储器EEPROM 芯片寻址的器件地址字如图1所示。它有4 种方式,分别对应于
1K/2K,4K,8K 和16K 位的EEPROM 芯片。从图中看出:器件地址字含有3 个部分。第一部分是高4 位,它们称为EEPROM AT24C01A/02/04/08/16 的标识第二部分称为硬布线地址,它们是标识后的3 位。第三部分是最低位,它是读/写操作选择位。
第一部分:器件标识,器件地址字的最高4 位。这4 位的内容恒为”1010”,用于标识EEPROM 器件AT24C01A/02/04/08/16。
第二部分:硬布线地址,是与器件地址字的最高4 位相接的低3 位。硬布线地址的3 位有2 种符号:Ai(i=0~2),Pj(j=0~2)其中Ai 表示外部硬布线地址位
对于AT24C10A/02 这两种1K/2K 位的EEPROM 芯片,硬布线地址为”A2,A1,A0”.在应用
时,”A2,A1,A0”的内容必须和EEPROM 芯片的A2,A1,A0 的硬布线情况,即逻辑连接情况相比较,如果一样,则芯片被选中;否则,不选中。AT24C01A/02:真正地址=字地址
第三部分:读/写选择位,器件地址字的最低位,并用R/W 表示。当R/W=1 时,执行读操作;当R/W=0 时,执行写操作。
当EEPROM 芯片被选中时,则输出”0”;如果EEPROM 芯片没有被选中,则它回到备用方式。被选中的芯片。其以后的输入,输出情况视写入和读出的内容而定。
③写操作:AT24C01A/02/04/08/16 这5 种EEPROM 芯片的写操作有2 种:一种是字节写,另一种是页面写。
字节写:这种写方式只执行1 个字节的写入。其写入过程分外部写和内部写两部分,分别说明如下:
在起始状态中,首先写入8 位的器件地址。则EEPROM 芯片会产生一个”0”信号ACK输出作为应答;接着,写入8 位的字地址,在接受了字地址之后,EEPROM 芯片又产生一个”0”应答信号ACK;随后,写入8 位数据,在接受了数据之后,芯片又产生一个”0”信号ACK 作为应答。到此为止,完成了一个字节写过程,故应在SDA 端产生一个停止状态,这是外部写过程。
在这个过程中,控制EEPROM 的单片机应在EEPROM 的SCL,SDA 端送入恰当的信号。
当然在一个字节写过程结束时,单片机应以停止状态结束写过程。在这时,EEPROM 进入内部定时的写周期,以便把接受的数据写入到存储单元中。在EEPROM 的内部写周期中,其所有输入被屏蔽,同时不响应外部信号直到写周期完成。这是内部写过程。内部写过程大约需要10ms 时间。内部写过程处于停止状态与下一次起始状态之间。
页面写:这种写入方式执行含若干字节的1 个页面的写入。对于AT24C01A/02,它们的1 个页面含8 个字节;页面写的开头部分和字节写一样。在起始状态,首先写入8 位器件地址;待EEPROM 答当了”0”信号ACK 之后,写入8 位字地址;又待芯片应了”0”信号ACK 之后,写入8 位数据。随后页面写的过程则和字节写有区别。
当芯片接受了第一个8 位数据并产生应答信号ACK 之后,单片机可以连续向EEPROM
芯片发送共为1 页面的数据。对于AT24C01A/02,可发送共1 个页面的8 个字节(连第一个8 位数据在内)。对于AT24C04/08/16,则共可发送1 个页面共16 个字节(连第一个8 位数据在内)。当然,每发一个字节都要等待芯片的应答信号ACK。之所以可以连续向芯片发送1 个页面数据,
是因为字地址的低3~4 位在EEPROM 芯片内部可实现加1,字地址的高位不变,用于保持页面的行地址。页面写和字节写两者一样可,都分为外部写和内部写过程。
应答查询:应答查询是单片机对EEPROM 各种状态的一种检测。单片机查询到EEPROM
有应答”0”信号ACK 输出,则说明其内部定时写的周期结束,可以写入新的内容。单片机是通过发送起始状态及器件地址进行应答查询的。由于器件地址可以选择芯片,则检测芯片送出到SDA 的状态就可以知道其是否有应答了。
④读操作:读操作的启动是和写操作类同的。它一样需要图1所示的器件地址字。和写操纵不同的就是信号下降沿时执行读操作。
读操纵有3 种方式,即现行地址读,随机读和顺序读。下面分别说明它们的工作过程。
现行地址读:在上次读或写操纵完成之后。芯片内部字地址计数器会加1,产生现行地址。只要没有再执行读或写操作,这个现行地址就会在EEPROM 芯片保持接电的期间一直保存。一旦器件地址选中EEPROM 芯片,并且有R/W=1,则在芯片的应答信号ACK 之后把读出的现行地址的数据送出。现行地址的数据输出时,就由单片机一位一位接受,接收后单片机不用向EEPROM 发应答信号ACK”0”电平,但应保证发出停止状态的信号以结束现行地址读操作。现行地址读会产生地址循环覆盖现象,但和写操纵的循环覆盖不同。在写操纵中,地址的循环覆盖是现行页面的最后一个字节写入之后,再行写入则覆盖同一页面的第一个字节。而在现行地址读操纵中,地址的循环覆盖是在最后页面的最后一个字节读出之后,再行读出才覆盖第一个页面的第一个字节。
随机读:随机读和现行地址读的最大区别在于随机读会执行一个伪写入过程以把字地址装入EEPROM 芯片中,然后执行读出,显然,随机读有2 个步骤。
第一,执行伪写入——把字地址送入EEPROM,以选择需读的字节。
第二,执行读出——根据字地址读出对应内容。
当EEPROM 芯片接收了器件地址及字地址时,在芯片产生应答信号ACK 之后,单片机必须再产生一个起始状态,执行现行地址读,这时单片机再发出器件地址并且令R/W=1,则EEPROM 应答器件地址并输出被读数据。在数据读出时由单片机执行一位一位接收,接收完毕后,单片机不用发”0”应答信号ACK,但必须产生停止状态以结束随机读过程。
应该注意:在随机读的第二个步骤是执行现行地址读的,由于第一个步骤时芯片接收了字地址,故现行地址就是所送入的字地址。
顺序读:顺序读可以用现行地址读或随机读进行启动。它和现行地址读、随机读的最大区别在于:顺序读在读出一批数据之后才由单片机产生停止状态结束读操作;而现行地址读和随机读在读出一个数据之后就由单片机产生停止状态结束读操作。执行顺序读时,首先执行现行读或随机读的有关过程,在读出第一个数据之后,单片机输出“0”应答信号ACK。在芯片接收应答信号ACK 后,就会对字地址进行计数加1,随后串行输出对应的字节。当字地址计数达到存储器地址的极限时,则字地址会产生覆盖,顺序读将继续进行。只有在单片机不再产生“0”应答信号ACK,而在接收数据之后马上产生停止状态,才会结束顺序读操作。
在对AT24CXX 系列执行读写的2 线串行总线工作中,其有关信号是由单片机的程序和EEPROM 产生的。有两点特别要记住:串行时钟必须由单片机程序产生,而应答信号ACK则是由接收数据的器件产生,也就是写地址或数据时由EEPROM 产生ACK,而读数据时由单片机产生。
串行EEPROM(24C02)参考程序
;=========================================
;写24C02 EEPROM数据子程序
;R0:RAM地址指针,R2:8位移位计数器
;R3:数据字节计数器
;R4:24C02 存储地址
;------------------------------------------
WR_EEROM:
NOP
W_LOOP: ACALL START24
MOV A,#0A0H
ACALL WBYTE
MOV A,R4
ACALL MOV ACALL ACALL ACALL INC R0
INC DJNZ RET
WBYTE
A,@R0
WBYTE
STOP24
DLY10MS
R3,W_LOOP
R4
;===============================
;读24C02 EEPROM数据子程序
;R0:RAM地址指针,R2:8位移位计数器
;R3:数据字节计数器
;R4:24C02 存储地址
;----------------------------------------
RD_EEROM: NOP
R_LOOP1: ACALL START24
MOV A,#0A0H
ACALL WBYTE
MOV A,R4
ACALL WBYTE
ACALL START24
MOV A,#0A1H
ACALL WBYTE
ACALL RBYTE
MOV @R0,A
INC R0
INC R4
DJNZ R3,R_LOOP1
ACALL STOP24
RET
;-----------------------------------
RBYTE: NOP
CLR SCL
MOV R2,#08H
SETB SDA
RBY0: CLR SCL
NOP
SETB SCL
NOP
MOV C,SDA
RLC A
DJNZ R2,RBY0
CLR SCL
NOP
CLR SCL
SETB SDA
NOP
SETB SCL
RET
;-------------------------------------
WBYTE: NOP
MOV R2,#08H
WBY0: CLR SCL
RLC A
MOV SDA,C
NOP
SETB SCL
DJNZ CLR NOP
SETB NOP
JB CLR NOP
RET
R2,WBY0
SCL
SCL
SDA,$
SCL
;---------------------------------
START24: CLR SCL
NOP
SETB NOP
SETB NOP
CLR NOP
CLR RET
SDA
SCL
SDA
SCL
;---------------------------------
STOP24: CLR SCL
NOP
CLR SDA
NOP
SETB SCL
NOP
SETB SDA
NOP
CLR SCL
RET
;---------------------------------
DLY10MS:MOV R6,#35
DLYR7: MOV R7,#177
DJNZ R7,$
DJNZ RET
R6,DLYR7