SJMP RDN
;******************************************************* (2) 具有内部单元地址的多字节写子程序(参见图7.14)
;*******************************************************
;通用的I2C通讯子程序(多字节写操作)
;R7字节数;
;R0源数据块首地址;R2从器件内部子地址;
;R3器件地址(写);R4器件地址(读)
;相关子程序 WRBYT、STOP、CACK、STA、MNACK
;********************************************************
WRNBYT: PUSH PSW
PUSH ACC
WRADD: MOV A,R3 ;取外围器件地地址(包含r/w=0)
LCALL STA ;发送起始信号S
LCALL WRBYT ;发送外围地址
LCALL CACK ;检测外围器件的应答信号
JB F0,WRADD ;如果应答不正确返回重来
MOV A,R2 ;区内部单元地址
LCALL WRBYT ;发送内部寄存器首地址
LCALL CACK ;检测外围器件的应答信号
JB F0,WRADD ;如果应答不正确返回重来
WRDA: MOV A,@R0
LCALL WRBYT ;写数据代外围器件
LCALL CACK ;检测外围器件的应答信号
JB F0,WRADD ;如果应答不正确返回重来
INC R0
DJNZ R7,WRDA
LCALL STOP
POP ACC
POP PSW
RET
;**********************************************************
I2C总线外围器件编程实验
在DP-51PROC综合实验台的D5区,分别设计了三种具有I2C总线接口的外围器件。它们分别是:
1.PCF8563T 实时时钟RCT芯片(芯片外围地址A2H/A3H);
2.CAT24WC02 EEPROM芯片(芯片外围地址A0H/A1H);
3.ZLG7290 LED动态显示、键盘扫描芯片(芯片外围地址70H/71H)。
运用第七章所描述的模拟编程方法可以很方便的实现对上述器件的读写控制及各种实验练习。在完成每一个独立的芯片实验基础上,还可以将它们有机的结合起来构成一个具有一定使用价值的综合设计题目。
通过这一章的实践,不仅可以帮助我们掌握对I2C外围器件的编程方法,而且还可以进一步感受到I2C系统的简洁、方便的硬件结构,为将来实际工程应用打下一个良好的基础。
8.1 24系列EEPROM 芯片CAT24WC02 结构原理及实验
24系列E2PROM是目前单片机系统中应用比较广泛的存储芯片。采用I2C总线接口,占用单片机的资源少、使用方便、功耗低、容量大,被广泛应用于智能化产品设计中。
8.1.1 24系列EEPROM器件简介
24系列E2PROM为串行接口的用电来擦除的可编程COMS只读存储器。擦除次数高达10万次以上,典型的擦除时间为5ms,片内数据存储时间可达40年以上。采用单+5V供电,工作电流1mA,备用状态10μA。
(1) 24系列E2PROM芯片的引脚定义 引脚说明如下:
使用时必须外接一个5.1k的上拉电阻。通信时高位在先;
SCL:串行时钟输入端,用于对输入数据的同步;
WP:写保护。用于对写入数据的保护。WP=0不保护;WP=1保护,即所有的写操作失效,此时的E2PROM实际上就是一个只读存储器;
A0~A2:器件地址编码输入。I2C总线外围器件的地址由7位组成:其中高4位为生产厂家为每一型号芯片固定设置的地址也称“特征码”;低3位以“器件地址编码输入”的形式留给用户自行定义地址。理论上在同一个I 2C总线系统中最多可以使用8个同一型号的外围器件;
TEST:测试端。生产厂家用于对产品的检验,用户可以忽略;
Vcc:+5V 电源输入端;
NC:空脚。
(2) 24系列E 2PROM芯片特性及分类
在24系列产品中芯片可以划分4种类型。由于设计的年代不同,其性能、容量、器件地址编码的方式等各不相同。
其中:第一类的芯片属于早期产品,不支持用户引脚自定义地址功能,所以在一个系统中只能使用一个该型号的芯片。同时还不具备数据保护功能;
第二类的芯片是目前常用的类型。不仅具备数据保护,还有用户引脚地址定义功能,所以在一个系统中可以同时使用1~8个该信号的芯片;
第三类芯片基本上类似于第二类,区别在于器件地址的控制比较特殊;
第四类芯片的主要特点是大容量,并支持全部的器件定义地址,因此在一个系统中可同时使用8个该型号的芯片。
命令字节格式 、型号特征地址 、引脚页地址 、R/W 类别 、型 号 容 量 、页数 、连续写入数据个数、器件地址编码
系统可用数量硬件保护区域D7 D6 D5 D4 D3 D2 D1 D0 一
AT24C01 128 × 8 不支持 1 不支持 1 0 1 0 × × × 1/0AT24C01A 128 × 8 A2 A1 A08 全 部 1 0 1 0 A2 A1 A0 1/0AT24C02
256 × 8 A2 A1 A08 全 部 1 0 1 0 A2 A1 A0 1/0AT24C04 512 2 16 A2 A1 NC 4 高256 1 0 1 0 A2 A1 P0 1/0AT24C08 1K 4 16 A2 NC NC 2 不支持 1 0 1 0 A2 P1 P0 1/0二 AT24C16
2K 8 16 NC NC NC 1 高1K 1 0 1 0 P2 P1 P0 1/0三 AT24C164 2K 8 16 A2 A2 A08 高1K 1 A2 A1 A0 P2 P1 P0 1/0AT24C32 4K × 32 A2 A2 A08 高1K 1 0 1 0 A2 A1 A0 1/0四
AT24C64 8K×32 A2 A2 A0 8高2K 1 0 1 0 A2 A1 A0 1/0
表8.1 24系列E 2PROM芯片特性、分类表
表8.1列出了24系列E2PROM 芯片的特性与分类。对于表中内容说明如下:
① “容量”是指字节数,如128 是指128×8,即128个字节、每个字节为8bit ;
② “页数”是指将存储器中每256个字节为一页。当芯片的存储容量小于等于256个字节时其容量实际上局限于一页的范围之内;
③ “连续写入块字节数”是指主控器向E 2PROM存储器一次连续写入的字节数的数量。与普通的SRAM存储器不同,在写数据过程中E2PROM要占用大量的时间来完成存储器单元的擦除、写入操作。为了提高整个的系统运行速度,在芯片的设计中采用了“写入数据缓冲器”结构,即主控器通过总线高速将待写入的数据先送入到E2PROM内部的数据缓冲器中,然后留给E2PROM自己逐一写入。这种设计方法可以极大地提高主控器的工作效率,当E2PROM在烧写数据时主控器可以进行其他的工作。在24系列E2PROM中,不同的芯片其内部的缓冲单元的数量是不同的,在编程中一次连续写入E2PROM的数据字节数不能超过缓冲器的单元数,否则会出现错误。因此所谓的“写入块字节数”实际上就是指E2PROM “写入数据缓冲器”的数量;
④ “器件地址编码”指器件7位地址码中低3位引脚地址的定义功能。理论上I2C总线外围的低3位地址是由器件本身的3个引脚的电平来确定的,这种方法为在一个系统中使用多个同一型号的芯片带来了灵活性。但在实际设计中7位地址码中的低3位不全留给使用者使用和定义。这在I2C总线外围器件中也是常见的;
⑤ “系统可用数量”是指在同一个I2C总线系统中可同时使用某一型号芯片的数量。不难看出,这个数据实际上是由芯片本身的“器件地址编码”功能来决定的;
⑥ “硬件写保护区域”是指对E2PROM存储器中原先写入的数据进行保护。与普通的SRAM不
同,E2PROM存储的数据往往是一些重要的参数(如表格、程序运行参数等),采用保护措施后可以防止误操作而破坏系统的软件系统。保护功能是通过芯片的WP引脚接高电平实现的。在实际应用中可由主控器(单片机)的一个I/O口线控制或直接与Vcc或接地处理;
⑦ “命令字节格式”是指芯片的地址码加方向控制R/W位。这实际上是主控器寻址外围器件的命令字。在这个字节中,除了最低位D0是由主控器发出的“读”或“写”控制码外,高7位中的高4位由厂家已经定义为1010(AT24C164除外),其余低3位根据芯片型号(容量)的不同而不同。这低3位(d3、d2、d1)的定义实际上与芯片的“器件地址编码”即引脚地址定义功能有关:
(Ⅰ)对于A2~A0引脚全部参与器件地址定义的情况,注意这也是存储单元不分页的芯片。
因此,7位地址码实际上是一种规范的“4+3” 格式,即4位特征码加上3位器件
地址码。只要使用者在硬件上将芯片的A2~A0引脚处理好,则该芯片的地址就被唯一的确定下来。以AT24C01A为例:将芯片的A2~A0全部接地,这样芯片的7位地址为1010000,主控器要去读该芯片中的数据,其命令字节为10100001(R/W=1);
(Ⅱ)对于芯片引脚A2~A0部分参与器件地址定义的芯片(如AT24C04/08),其没有参与地址定义的引脚(如A0/A0、A1)实际上在命令字的对应位置上起到一个“页选Pi”的功能,其页选数正好与不参与器件地址定义引脚的个数有关;
(Ⅲ)对于芯片引脚A2~A0全不介入器件引脚定义的芯片(如AT24C16),虽然其硬件引脚A2~A0无用,但在命令字对应的位置上实际上成为页地址的选择位,所以主控器寻址该器件时,其命令字中的7位地址实际上是4位特征码加3位“页地址”。 (Ⅳ)对于第三类芯片AT24C164而言,其A2~A0全部参与器件地址定义,存储区域又分为8页。那么如何将这些“器件地址”和“页地址”信息通过命令字表达出来呢? 只有占用原来特征码的三个位的位置了,这是一种较为特殊的寻址方式;
(Ⅴ)对于第四类芯片(AT24C32/64),虽然其存储容量大大超过了256字节,但采用了不分页的处理方法。这就意味着主控器必须使用双字节的地址信息来确定具体的存储单元(而其它型号的存储单元地址为单字节)。
⑧ “R/W”读写控制位,也称方向位。R/W=1为读操作;R/W=0为写操作;
(3)芯片寻址与存储单元寻址
E2PROM作为I2C总线的外围器件不仅需要芯片的地址(4位特征码+3位器件地址)供主控器寻址,还要有与读写操作相关的存储单元地址。这就决定了主控器对E2PROM的访问不同于其它常规外围器件的操作过程。
对于绝大多数的24系列E2PROM芯片对于容量超过256字节的芯片都具有页选功能,这样通过芯片地址来指向芯片和要访问的页,然后再使用一个字节的“页内地址”来指明存储单元。所以在这种情况下其存储单元地址是单字节结构;而对AT24C32/64型号的芯片,因为其存储区域没有分页,而存储容量又大大的超出256个字节。所以对4K/8K的访问只能采用13位地址,实际上就不得不采用二个字节的形式来指明访问的存储单元。
8.1.2 24系列EEPROM芯片的读写操作
(一) 写操作
写操作分为字节写和数据块写两种模式。
(1) 字节写
在这种方式中,主控器首先发送一个命令字(特征码+器件地址+R/W),待得到外围器件的应答信号ACK后,再发送一个字节/二个字节的内部单元地址,这个内部单元地址被写入到E2PROM的地址指针中去。主控器收到E2PROM的应答信号后就向E2PROM发送一个字节的数据(高位在先),E2PROM将SDA线上的数据逐位接收存入输入缓冲器中,并向主控器反馈应答信号。当主控器收到应答信号后,向E2PROM发出停止信号P并结束操作、释放总线。而E2PROM收到P 信号后,激活内部的数据编程周期,将缓冲器中的数据烧写到指定的存储单元中。在E2PROM 的数据编程周期中为了保证数据烧写的正确性和完整性,对所有的输入都采取无效处理、不产生任何的应答信号,直到数据编程周期结束,数据被写入指定的单元后,E2PROM才恢复正
常的工作状态。
(2) 数据块写
基本操作类同字节写,但有几点应当注意:
①连续写入的数据数量不能超过芯片本身“数据缓冲器”单元的数量(详见表8.1);
② 主控器通过发送停止信号P作为操作过程的结束,实际上起到控制写入数量的作用;
③当存储器收到主控器的停止信号后,激活“数据编程周期”,开始数据的烧写过程。
在这个过程结束前,存储器不接收外部的任何信号;
④ 烧写数据的时间取决于数据的数量,如数量N=8,则时间约为8ms;如果N=32,则时间为32ms。
AT24C32/64的数据块类同AT24C01/02/04/08/16(见图2.3)。
(二) 读操作
与写操作不同,读操作分为两个步骤完成:
① 利用一个写操作(R/W=0)发出寻址命令并将内部的存储单元地址写入E 2PROM的地址指针中。在这个过程中E 2PROM反馈应答信号,以保证主控器判断操作的正确性;
② 主控器重新发出一个开始信号S、再发送一个读操作的命令字(R/W=1),当E 2PROM收到命令字后,返回应答信号并从指定的存储单元中取出数据通过SDA线送出。;
另外,因为读操作没有“数据烧写”操作,因此不使用数据缓冲器。这样连续读数据的数量不受数据缓冲器数量的限制。
读操作有三种情况:
(1)读当前地址单元中的数据
在串行E 2PROM芯片内部有一个可以自动
加一的地址指针。每当完成一次读/写操作时,其指针都会自动加一指向下一个单元。只要芯片不断电,指针中的内容就一直保留。当主控器没有指定某一存储单元地址时,则E 2PROM就按当前地址指针中的地址内容寻址、操作。在这种情况下,因为不用对E 2PROM中的地址指针重新赋值,所以省去对E 2PROM的写操作(见图8.5)。
(2)读指定地址存储单元中的数据
首先利用一个写操作(R/W=0)发出寻址命令以便将后续的内部地址写入E2PROM的地址指针中。然后主控器重新发出一个开始信号S、再发送一个读操作的命令字(R/W=1),当E2PROM收到命令字后,回应答信号并从指定的存储单元中取出数据通过SDA线送出(参见图8.6)。
(3)读取连续地址单元中的数据
在进行连续数据读操作时应当注意:连续操作时地址不要超出该芯片所规定的页内地址的范围,否则将发生地址重叠错误。在图2.7中给出的是AT24C01/02/04/08/16芯片的操作帧格式,AT24C32/64型号的区别在于第一次写操作时的存储单元地址为双字节字节(参见图8.3),其余部分是一样的。
8.1.3 24系列EEPROM芯片的读写软件编程(参见7.7.3 的内容) 。
8.1.4 CAT24WC02 EEPROM 读写编程实验
与24系列E2PROM芯片相同,在DP-51PROC实验台上的CAT24WC02与前面描述的AT24C02具有相同的参数和特征。利用DP-51PROC 上的硬件资源、编写对AT24C02的数据写入、数据读出来验证其功能,掌握I2C总线外围器件的编程方法。
(1)实验内容及要求
整个实验分为两种运行模式:
烧写数据、读出数据。当烧写、读出操作正常后,关闭实验台的电源系统;
重新为实验台上电,直接读出EEPROM中前一次所烧写的数据,以验证EEPROM中数据的“非易失性”。
两种运行模式由SW1控制:当运行于第一种模式时,SW1必须事先至于高电平(逻辑“1”);第二种运行模式时,SW1要事先置于低电平(逻辑“0”)。两种模式之间要有一次停电的过程,以验证EEPROM 掉电时数据不丢失的特点。
(2)实验电路与连接
使用两条连接线实现I2C的组网联接,另使用一条连接线将P1.7与SW1连接作为程序的读写控制信号(如图8.9所示)。
首先在单片机的30H-37H中建立一个内容为00H-07H的数据块,然后分别将其烧写到EEPROM的00H-07H单元中。再将EEPROM中所烧写进的8个数据读回到单片机内存38H-3FH 中来。在调试程序时,采用“断点”的运行方式,在EEPROM所烧写的数据读回到单片机的存储器后,利用观察窗口对存储器中的38H-3FH数据进行观察、验证,看一下是否为烧写的数据。
(4) 实验的参考程序清单
;***************************************************************
;这是一个I2C总线EEPROM_24C02的实验程序
;***************************************************************
SDA BIT P1.0
SCL BIT P1.1
WSLA EQU 0A0H
RSLA EQU 0A1H
ORG 8000H
LJMP 8100H
;***************************************************************
; 主程序
;***************************************************************
ORG 8100H
START: SETB P1.7 ;P1.7设定为输入口 Array JNB P1.7,LOOP11 ;如果P1.7=0则读EEPROM数据
MOV R7,#08H ;如果P1.7=1则先写入后读出
MOV R0,#30H
CLR A
LOOP: MOV @R0,A
INC R0
INC A
DJNZ R7,LOOP
AA: ;数据块的写操作开始
MOV R7,#08H ;设定写入数据字节个数
MOV R0,#30H ;设定源数据块的首地址
MOV R2,#00H
MOV R3,#WSLA
LCALL WRNBYT
;数据块读操作开始
LOOP11: MOV R7,#08H ;设定数据字节数
MOV R0,#38H ;设定目标数据地址
MOV R2,#00H ;设定外围器件内部地址
MOV R4,#RSLA ;设定读命令
MOV R3,#WSLA ;设定写命令
LCALL RDADD ;调用读数据块子程序
SJMP LOOP11 ;在此处设定一个断点
;之所以不返回到START是为了减少不必要的写
; 延长EEPROM使用寿命
;*******************************************************************
;通用的I2C通讯子程序(多字节写操作)
;入口参数R7字节数,R0:源数据块首地址
;R0原数据块首地址;R2从器件内部子地址;R3:外围器件地址(写)
;相关子程序 WRBYT、STOP、CACK、STA
【提示】:可以将I2C所有信号的子程序、多字节数据写、多字节数据读子程序作为库函数保留起来,对于后续的I2C总线编程会带来极大的方便。