用单片机实现通用存贮器IC卡的读写
本文对 AT24 系列存贮器和 AT89 系列单片机的特征及总线状态作为介绍,并以 AT24C01 与 AT89C2051 为例详细描述了通用存贮器 IC 卡的工作原理及用单片机对其进行读写操作的基本电路连接和软件编程方法。 通用存贮器 IC 卡是由通用存贮器芯片封装而成的,由于它的结构和功能简单,生产成本低,使用方便,因此在各领域都得到了广泛的应用。目前用于 IC 卡的通用存贮器芯片多为 E2PROM,其常用的协议主要有两线串行连接协议(I2C)和三线串行链接协议,其中比较常用的是 ATMEL 公司生产的 AT24 系列芯片。
以该系列中的 AT24C01 为例,它具有 1k 的存贮容量,适用于 2V~5V 的低电压/标准电压的操作,具有低功耗和高可靠性等优点。而 AT89C2051 虽是 ATMEL 公司 89 系列单片机的低档型,但它具有 2k 的 FLASH ROM(可重编闪速存贮器)、128×8 位内部 RAM 及全静态操作方式,同样也具有低功耗和较强的功能。下面以 AT24C2051 为例,对通用存贮器 IC 卡的工作原理及基本电路连线作一介绍,该线路简单,使用灵活,能可靠地对通用存贮器 IC 卡进行读写。2 硬件特性
2.1 AT24 系列存贮器的特性 AT24 系列存贮器芯片采用 CMOS 工艺制造,内置有高压泵,可在单电压供电条件下工作。其标准封装为 8 脚 DIP 封装形式,各引脚的功能说明如下: SCL:串行时钟。在该脚的上升沿时,系统将数据输入到每个 EEPROM 器件,在下降沿时输出。 SDA:串行数据。该引脚为开漏极驱动,可双向传送数据。 A0、A1、A2:器件/页面寻址。为器件地址输入端。在 AT24C01/02 中,该引脚被硬连接。
Vcc:一般输入+5V 的工作电压。 图 1 是符合 ISO7816-2 标准的 IC 卡的触点图。对于 AT24 系列通用存贮器 IC 卡来说,通常只需使用四个触点。AT24C01 的内部组态为 128 个 8 位字节,而对随机字寻址则需要一个 7 位地址。
2.2 总线状态及时序 A24C01 的 SCL 及 SDA 两总线可通过一个电阻上拉为高电平,SDA 上的数据仅在 SCL 为低电平时周期才能改变。当 SCL 为高电平时,SDA 的改变表示“开始”和“停止”状态。此时,所有地址和数据字都以 8 位串行码方式输入输出 EEPROM。 开始状态:SCL 为高电平时,SDA 由高电平转入低电平。该命令必须在其它命令前执行。 停止状态:SCL 为高电平时,SDA 由低电平转入高电平。该命令可终止所有通讯。 确认:相同总线上的设备在收到数据后,以置 SDA 为低电平的方式对其进行确认。
2.3 器件寻址 AT24 系列 EEPROM 在开始状态后需紧接一个 8 位器件地址,以进行应读写操作。设备寻址码的高 4 位为 1、0、1、0,对于 AT24C01/02,寻址码高 4 位后面的三位是器件寻址码,与它们的硬连线管脚相对应。最低应是读写选择位,置 0 时可激发读操作。 具体的格式如下: 1010A2A1A0R/W
2.4 AT89C2051 芯片 AT89C2051 是 MCS-51 产品的兼容型,它具有 2k 的 FLASH ROM、128 字节 ROM,15 根 I/O 引线、两个 16 位定时/计数器、一个五向量两级中断结构、一个全双工串行口、一个精密模拟比较器以及片内振荡电路和时钟电路。它的 P1 口和 P3 口是双向 I/O 口,其中 P1.2~P1.7、P3.0~P3.5 和 P3.7 带有内部上拉电阻。在 AT89C2051 用作输入端时,将首先向引脚写“1”而使内部 MOS 管截止以便引脚处于悬浮状态,从而可获得高阻抗输入。
图 2 为通用存贮器 IC 卡的基本电路连接图。 3 读写操作软件当系统采用 6MHz 晶体振荡器时所定义的 I/O 口线及器件地址如下: SCL BIT P1.7 SDA BIT P1.6 DEVICEAD_W DATA 10100000B;写卡器件地址 DEVICEAD_R DATA 10100001B;读卡器件地址
3.1 开始条件(START_IC) 在开始条件下,当 SCL 为高电平时,SDA 由高转为低。程序如下: START_IC:CLR SCL;SCL 低电平时才允许 SDA 更改 NOP;加入空指令延时以确保信号可靠 NOP SETB SDA NOP NOP SETB SCL NOP NOP CLR SDA NOP NOP CLR SCL NOP RET
3.2 停止条件(STOP_C) 在停止条件下,当 SCL 为高电平时,SDA 由低转为高。程序如下: STOP_IC:CLR SCL NOP NOP CLR SDA NOP NOP SETB SCL NOP NOP SETB SDA NOP NOP CLR SCL NOP NOP CLR SDA RET
3.3 确认信号(ACK_IC) 在接收方应答下,每收到一字节后便将 SDA 电平拉低,程序如下: ACK_IC:CLR SCL NOP NOP CLR SDA NOP NOP SEIB SCL NOP NOP CLR SCL NOP SETB SDA NOP RET
3.4 写一字节数据到 IC 卡(WR_BYTE) 在下列程序中,参数 A 表示源数据,R5 表示字节位数。 WR_BYTE:MOV R5,#08;一字节 8 位数据 CLR SCL NOP NOP WR_BYTE1:RLC A;带进位位左移,A.8->C MOV SDA,C;SCL 低电平时改变 SDA 上的数据 NOP SETB SCL;拉高 SCL 把数据发送出去 NOP NOP CLR SCL NOP NOP DJNZ R5,WR_BYTE1;依次发送 A 中的 8 位数据 SETB SDA SETB SCL JB SDA,$;等待 IC 卡确认信号 CLR SCL NOP RET 此子程序的主要作用是按照定义的时序,顺序左移 A 中一字节 8 位数据,并通过引脚传送出去。当一字节发完后,等待 IC 卡发回的确认信号。
3.5 从 IC 卡读一字节(RD+BYTE) 从 IC 卡中读一字节的源程序如下: RD_BYTE:MOV R5,#08 SETB SDA;设备 SDA 为读状态 CLR A;清空 A 寄存器 RD_BTYE1:MOV C,SDA;读一位数据到进位位 RLC A;左移数据到 A.0 SETB SCL NOP NOP CLR SCL NOP NOP DJNZ R5,RD_BYTE1;依次读出 8 位数据到 A 中 RET;无应答信号利用该程序可将读出的数据存放在 A 中。需要注意的是:读数据的器件不是通过确认状态来应答的,而是随后产生一个停止状态。
3.6 字节写入模式写数据(WRITE_BYTE) 下列程序中的参数为:R6= =目的地址,A= =数据;数据如下: WRITE_BYTE:PUSH ACC;保存 A 中的数据 LCALL START_IC;发开始信号 MOV A,#DEVICEAD_W;写入器件地址 LCAL WR_BYTE MOV A,R6;写入字节地址 LCALL WR_BYTE POP ACC;恢复 A 中数据 LCALL WR_BYTE;写入数据 LCALL STOP_IC RET 在收到 8 位数据后,EEPROM 将通过 SDA 来回送确认信号,而传送设备必须用停止状态来终止写操作。
这时,EEPROM 将进入一个内时固定存贮器的写入周期并且禁止在此其间的所有输入,直到写操作完成后才对通讯应答。其写入周期可自定义,最大为 10ms。
3.7 页面写入模式写数据(WRITE_PAGE) 以下程序中的参数为 P0= =源指针,R6= =目的地址,R7= =页面长度。 WRITE_PAGE:LCALL START_IC MOV A,#DEVICEAD_W LCALL WR_BYTE MOV A,R6 LCALL WR_BYTE WRITE_PAGE1:MOV A,@R0 LCALL WR_BYTE INC R0 DJNZ R7,WRITE_PAGE1 LCALL STOP_IC RET AT24C01/02 可利用上述程序进行 8 字节的页面写入,它的操作类似于写字节。
不同的是,它无需在第一个字节送出后才以停止状态,不同在收到确认信号后,再传送 7 个字节的数据码,最后以停止状态来终止页面写序列。AT24C04/08/16 的页面为 16 字节。
3.8 立即地址读模式(READ_BYTEC) 立即地址读模式读一字节数据的程序如下:READ_BYTEC:LCALL START_IC MOV A,#DEVICEAD_R LCALL WR_BYTE LCALL RD_BYTE;读出默认地址数据 LCALL STOP_IC;发停止状态应答 RET 该程序执行后,其内部数据字地址指针将保持在上次读写操作访问的最后一个地址,并按 1 递增且在芯片上电期间一直有效。只有当地址为页面的最末时,下次访问才滚动到该页面的首地址。
3.9 随机地址读模式(READ_BYTER) 在下列程序中,R6= =源地址,程序如下: READ_BYTER:LCALL START_IC MOV A,#DEVICEAD_W;执行空字节写序列 LCALL WR_BYTE;载入数据地址 MOV A,R6 LCALL WR_BYTE LCALL START_IC MOV A,#DEVICEAD_R;立即地址读取 LCALL WR_BYTE LCALL DR_BYTE LCALL STOP_IC RET 读操作模式需要一个字节写序列载入数据地址。在器件和数据地址写入并得到确认后,将再产生另一个开始条件,并送出读操作器件的地址,同时激发一个立即地址读取。
3.10 顺序地址读取(READ_BYTES) 在下列程序中:R0= =目的指针;R7= =数据长度,程序如下: READ+BYTES:LCALL START_IC MOV A,#DEVICEAD_R LCALL WR_BYTE READ_BYTES2:LCALL RD_BYTE MOV @R0,A;存放数据到目的地址 INC R0 DJNZ R7,READ_BYTES1 LCALL STOP_IC;读写指定长度后停止 RET READ_BYTES1:LCALL ACK_IC;收到数据后发确认信号 SJMP READ_BYTES2 其中顺序读取由立即寻址读或随机地址读激发,并在收到一字节数据后发确认信号应答。
当读数器件以停止状态应答时,操作被终止。 4 总结该系统结构简单,在实际运行时具有很高的可靠性,同时具有一定的可扩展性,并可通过单片机的串行口经电平转换后直接与计算机相连,以进行数据通讯。另外,也可根据需要连接到其它引脚或卡座触点,如果适当改进电路和程序,还可读写加密卡和 CPU 卡等 :D