用单片机实现通用存贮器IC卡的读写
作者:电子工程师
来源:RFID世界网
日期:2005-05-19 10:18:28
摘要:本文对AT24系列存贮器和AT89系列单片机的特征及总线状态作为介绍,并以AT24C01与AT89C2051为例详细描述了通用存贮器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卡等。
通用存贮器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卡等。