一.前言
ZLG500B 是串行读写模块, 内含主要器件有符合ISO14443A标准的读卡芯片、微控制器和印制板天线。它可以读写符合ISO14443A标准的的Mifare 1无线智能卡,应用广泛,如制作各种刷卡器[1]。
此模块的主要特点如下。
.四层电路板设计双面表贴,EMC性能优良;
.UART串行接口能外接RS232 或RS485芯片;
.自动波特率探测;
.控制线输出口;
.能读写无线智能卡芯片内部EEPROM;
.发光二极管指示模块当前状态;
实际尺寸:约41.5mm ×25.3mm,见下图1。
图1 ZLG500B的非接触读卡模块
图 2 液晶屏显示卡号
应用此模块制作的刷卡器显示卡号的图片见上图2。
下面对与此模块使用有关的内容逐一介绍。
二.模块硬件电路设计
(一)射频芯片介绍
模块内含的读卡芯片将标准的调制和解调电路完整的集成起来,支持所有的以13.56Mhz频率通信的非接触式IC卡通讯协议[2]。
读卡芯片内部的发射部分能够在不需要额外的激活电路的情况下就可驱动一个针对近离耦合(最大到100毫米)而设计的天线。接收电路部分则能够健壮和高效的执行将符合ISO14443A兼容的信号解调和解码。
数字电路部分则采用符合ISO14443A标准的帧和错误检测(校验和CRC),另外还支持快
速CRYPTO 1的安全算法去验证MIFARE类的卡片。
完善的并行接口能够直接连接到通用的8位微处理器上,以便灵活的设计读卡终端。
射频芯片特征如下。
.输出缓冲驱动和连接外部天线,使外部器件数目最小化;
.并行微处理器接口,外部地址锁存,自动识别接口类型;
.有IRQ中断脚,灵活的中断操作;
.硬件复位,掉电模式,低功耗功能,可编程定时器;
.唯一的产品序列号。
(二)模块与单片机的接口
ZLG500B模块可方便地与单片机进行连接,接口如下图4所示。通常采用8位单片机即可实现与模块通过串口连接的功能。读出的卡号由1602液晶显示器显示。
图4 模块与单片机的接口电路原理图
三.ZLG500B 读卡模块数据传输协议
(一)Mifare 1非接触式IC射频卡工作原理
为了理解好下面介绍的ZLG500B 读卡模块数据传输协议,有必要先对Mifare 1非接触式
IC射频卡工作原理了解清楚[3-4]。
- Mifare 1非接触式IC射频卡特点
Mifare 1 IC智能(射频)卡采用先进的芯片制造工艺制作。内建有高速的CMOS EEPROM,MCU等。卡片上除了IC微晶片及一副高效率天线外,无任何其他元件。
卡片上无源(无任何电池),工作时的电源能量由卡片读写器天线发送无线电载波信号耦合到卡片上天线而产生电能,一般可达2V以上,供卡片上IC工作。工作频率 13.56MHZ。
整个卡片包含了两个部分,RF射频接口电路和数字电路部分。
- RF射频接口电路
在RF射频接口电路中,主要包括有波形转换模块。它可将卡片读写器上的13.56MHZ的无线电调制频率接收,一方面送调制/解调模块,另一方面进行波形转换,将正弦波转换为方波,然后对其整流滤波,由电压调节模块对电压进行进一步的处理,包括稳压等,最终输出供给卡片上的各电路。
- Mifare 1非接触式IC射频卡工作过程
(1)ATR模块:Answer to Request(“请求之应答“)
当一张Mifare 1卡片处在卡片读写器的天线的工作范围之内时,程序员控制读写器向卡片发出REQUEST all(或REQUEST std) 命令后,卡片的ATR将启动,将卡片Block 0 中的卡片类型(TagType)号共2个字节传送给读写器,建立卡片与读写器的第一步通信联络。
如果不进行第一步的ATR工作,读写器对卡片的其他操作(Read/Write等)将不会进行。
卡片的类型(TagType)号共2个字节,可能为:0004H
(2)AntiCollision模块:防止(卡片)重叠功能
如果有多张Mifare 1卡片处在卡片读写器的天线的工作范围之内时,AntiCollision模块的防重叠功能将被启动工作。在程序员控制下的卡片读写器将会首先与每一张卡片进行通信,取得每一张卡片的系列号。由于Mifare 1卡片每一张都具有其唯一的系列号,决不会相同,因此卡片读写器根据卡片的序列号来识别、区分已选的卡片,卡片读写器中的MCM中的AntiCollision防重叠功能配合卡片上的防重叠功能模块,由程序员来控制读写器,根据卡片的序列号来选定一张卡片。被选中的卡片将直接与读写器进行数据交换,未被选择的卡片处于等待状态,随时准备与卡片读写器进行通信。
AntiCollision模块(防重叠功能)启动工作时,卡片读写器将得到卡片的序列号Serial Number。序列号Serial Number存储在卡片的Block 0中,共有5个字节,实际有用的为4个字节,另一个字节为序列号Serial Number的校验字节。
序列号Serial Number中实际有用的4个字节,可能为:007e0a42h 。
(3) Select Application 模块:主要用于卡片的选择。
当卡片与读写器完成了上述的二个步骤,程序员控制的读写器要想对卡片进行读写操
作,必须对卡片进行“Select” 操作。以使卡片真正地被选中。
被选中的卡片将卡片上存储在Block 0中的卡片的容量“Size” 字节传送给读写器。当读写器收到这一字节后,将明确可以对卡片进行进一步的操作了。例如,可以进行密码验证等等。
读写器收到的“Size” 字节可能为:88h。
(4)Authentication & Access Control 模块: 认证及存取控制模块
在确认了上述的三个步骤,确认已经选择了一张卡片时,程序员对卡片进行读写操作之前,必须对卡片上已经设置的密码进行认证,如果匹配,则允许进一步的Read/Write操作。
Mifare 1 卡片上有16个扇区,每个扇区都可分别设置各自的密码,互不干涉。因此每个扇区可独立地应用于一个应用场合。整个卡片可以设计成“一卡通”形式来应用。
(5)Control & Arithmetic Unit 控制及算术运算单元
这一单元是整个卡片的控制中心,是卡片的“头脑”。它主要进行对整个卡片的各个单位进行微操作控制,协调卡片的各个步骤;同时它还对各种收/发的数据进行算术运算处理,递增/递减处理,CRC运算处理等等。是卡片中内建的中央微处理机(MCU)单元。
(6) RAM/ROM 单元
RAM主要配合控制及算术运算单元,将运算的结果进行暂时存储,如果某些数据需要存储到EEPROM,则由控制及算术运算单元取出送到EEPROM存储器中;如果某些数据需要传送给读写器,则由控制及算术运算单元取出,经过RF射频接口电路的处理,通过卡片上的天线传送给卡片读写器。RAM中的数据在卡片失掉电源后(卡片离开读写器天线的有效工作范围内)将被清除。
同时,ROM中还固化了卡片运行所需要的必要的程序指令,由控制及算术运算单元取出去对每个单元进行微指令控制。使卡片能有条不紊地与卡片的读写器进行数据通信。
(7) Crypto Unit 数据加密单元
该单元完成对数据的加密处理及密码保护。加密的算法可以为DES标准算法或其他。
(8) EEPROM INTERFACE/EEPROM MEMORY EEPROM存储器及其接口电路
该单元主要用于存储数据。EEPROM中的数据在卡片失掉电源后(卡片离开读写器天线的有效工作范围内)仍将被保持。用户所要存储的数据被存放在该单元中。Mifare 1卡片中的这一单元容量为8196bit(1 Kbyte)。分为16个扇区。
在ZLG500B模块中,已经固化了上述操作的程序,应用ZLG500B模块制作产品的主要工作就是:熟悉读卡模块ZLG500B 与主机微处理器之间的串行通信软件的通信协议和命令。
(二) ZLG500B 读卡模块数据传输协议
1.自动波特率探测
UART 接口一帧的数据格式为1 个起始位,8 个数据位,无奇偶校验位,1 个停止位,自动波特率探测。ZLG500B上电后将读卡芯片内EEPROM中地址为0x7F单元的内容读出,取其低3位来初始化自己的波特率。在接收主机发出的STX的同时,测量波特率,若一致,则继续通信;若不一致,则修改自己的波特率与主机一致,存入0x7F单元,准备接收下一个STX。
ZLG500B波特率与读卡芯片内EEPROM中0x7F单元低3位值的对应关系见表1。
2.控制字符定义
控制字符定义见表2。
3.协议描述
通信必须先由主机发送命令和数据给ZLG500B, ZLG500B执行命令完毕后,将命令执行的状态和响应数据发回主机。开始通信前,收发双方必须处于就绪状态。首先主机发出STX, 然后等待ZLG500B的响应ACK。 若在10ms 内未检测到此响应,或收到NAK ,则再次发送STX, 如此反复3次,若3次均未收到正确应答ACK, 则退出本次传输,将错误代码返回给主程序,由主程序进行错误处理。若主机收到ZLG500B 正确响应ACK ,则可将数据块发送出去,最后发送1 个终止符ETX结束本次发送。主机发送格式见表3。
然后主机等待ZLG500B发回的状态和响应数据。若在300ms内未检测到响应,则退出本次传输,且向主程序报告错误代码。ZLG500B发送格式见表4 。
- ZLG500B 和微处理器命令C51 函数
(1)底层函数和高级函数
底层函数和高级函数见表5,已经固化在ZLG500B模块中,使用时直接调用即可。
(2) 函数描述举例
下面是C51 函数声明,包含在头文件ZLG500B.h 中,写应用程序时将其包含在应用函数中即可。
举一个例子: 请求Request equest函数介绍如下。
声明:
uchar mifs_request(uchar _Mode,uchar idata *_TagType);
MCU ⇒ ZLG500:
命令符:0x41
长度:1
Data[0]: _Mode
ZLG500 ⇒ MCU:
状态值:MI_OK, MI_QUIT ,MI_NOTAGERR, MI_BITCOUNTERR ,COMM_ERR
长度:2
Data[0]: tagtype (低字节)
Data[1]: tagtype (高字节)
参数:
_Mode:
ALL=0 :请求天线范围内IDLE 状态的卡HALT状态的除外。
ALL=1: 请求天线范围内的所有卡。
_tagtype :当发生错误时不返回任何内容Len=0
描述:
此函数发送Request 命令检查在有效范围内是否有卡存在这个函数在选择一个新的卡是必须调用的。
四.应用程序设计
(一)总的流程图
应用ZLG500B模块,读取非接触卡卡号并在液晶屏上显示出来的流程图见下图4。
图4 应用程序流程图
在上图中,初始化部分包括对读卡模块复位以及单片机和读卡芯片内部各硬件寄存器设定初始值。
(二)具体程序
程序由三大部分组成。
主程序:由main.c 和main.h构成。其中main.c部分完成读写卡片的功能,对射频芯片的操作都是通过访问和更改射频芯片内的寄存器来实现射频信号的收发的,并实现对液晶屏的显示控制。
ZLG500B 与主机微处理器之间的串行通信软件的通信协议和命令函数:由zlg500B.C 和zlg500B.H构成。在主程序中出现的各种命令都在zlg500B.C中具体实现。
液晶屏显示程序:由lcd.h构成。由于此液晶显示模块本身不带字库,故需要字符点阵显示数据,在lcd.h提供。
由于篇幅限制,下面只介绍程序的概要 。
1.主程序部分
#define __SRC
#include "main.h"
#undef __SRC
#include "zlg500B.h"//主要是ZIG500B模块里内嵌的所有函数的定义
#include "lcd.h"//主要是液晶显示模块里显示字符的点阵数据
……
sbit zlg500B_RST=P1^4;//定义复位读卡模块的管脚
……
uchar code Nkey_a[6] = {0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5};
uchar code Nkey_b[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
……
void ASCII2BCD(void)//读取卡号并显示在液晶屏上
{
write_ch(31,2,num[card_snr[3]/16]);write_ch(39,2,num[card_snr[3]%16]);
write_ch(47,2,num[card_snr[2]/16]);write_ch(55,2,num[card_snr[2]%16]);
write_ch(63,2,num[card_snr[1]/16]);write_ch(72,2,num[card_snr[1]%16]);
write_ch(80,2,num[card_snr[0]/16]);write_ch(88,2,num[card_snr[0]%16]);
}
main( )
{
……
serial_init();//串口初始化
//定时器工作方式设置
/*TMOD=0x21;
TH0=0x4C;
TL0=0x00;
ET0=1;
ES=1;*/
EA=1;
……
}
- ZLG500B 与主机微处理器之间的串行通信软件的通信协议和命令函数
#include "main.h"
#define __SRC
#include "zlg500B.h"
#undef __SRC
#if mifs_read_en
uchar mifs_read(uchar _Adr,uchar idata *_Data)// 从卡中相应地址中读出一个 16字节的块
{
ser_buffer[SEQNR]=0;
ser_buffer[COMMAND]=0x46;
ser_buffer[LENGTH]=0x01;
ser_buffer[DATA]=_Adr;
if(ser_comm()!=COMM_OK)
return COMM_ERR;
if(ser_buffer[STATUS]==MI_OK)
{
memcpy(_Data,&ser_buffer[DATA],16);
}
return ser_buffer[STATUS];
}
#endif
……
}
五.结束语
本文介绍了内含符合ISO14443A标准的读卡芯片的非接触读卡模块ZLG500B的使用。文中首先介绍了Mifare 1非接触式IC射频卡的工作过程,然后对非接触读卡模块本身的硬件电路的核心部分也做了介绍;其次还介绍了读卡模块与8位微处理器之间的串行通信协议和命令;最后介绍了实现通信协议的具体软件中的主要部分。通过本模块的应用,可达到降低设计难度,提高产品质量,和减少开发费用的目的。这也是现在通用的一种开发思路和做法。
特别说明:本文中ZLG500B模块本身部分的原理图和ZLG500B模块本身部分的软件版权归其开发者周立功单片机科技公司所有。