引言
非接触式IC卡又称“射频卡”,由IC芯片、感应天线组成,封装在一个标准的PVC卡片内,芯片及天线无任何外露部分。它成功地将射频识别技术和IC卡技术结合起来,解决了无源(卡中无电源)和免接触这一难题,是电子器件领域的一大突破。卡片在一定距离范围(通常为5~10 mm)内靠近读写器表面,通过无线电波的传递来完成数据的读写操作。非接触式IC卡具有可靠性高、操作方便、安全防冲突的特点,越来越多地被应用于各种场合。目前,射频卡按工作频率分为两种:13.6 MHz与125 kHz。本文中介绍的电路适用于工作频率为125 kHz射频卡的信息读取。
1 EM4001芯片介绍
EM4100是由瑞士微电生产的一款用于只读射频卡信息传输的集成芯片。射频卡由IC芯片、感应线圈组成,COIL1与COIL2为感应线圈接口。全波整流电路、Csup可以将线圈感应产生的能量保存供给芯片作为工作电源;时钟选取电路将筛选频率125 kHz的载波作为时序发生电路的基准时钟源;内存中64位数据依次串行输出,通过编码模块输出曼彻斯特码;最后信号通过调制电路再由感应线圈发射出去。
图1为EM4001芯片内部功能图。EM4001内部64位数据阵列由5个区组成:9个引导位“1”,10个行奇校验位(P0~P9),4个列奇校验位(PC0~PC3),40个数据位(D00~D93)和1个停止位“S0”。9个引导位是出厂时就掩膜到晶片内的,其值为“111111111”。当输出数据流时,首先是输出9个引导位,然后是10组由4个数据位和1个行奇校验位组成的数据串,之后是1组由4个列奇校验位组成的数据串,最后是停止位“0”。“D00~D13”是一个8位的晶片版本号或ID识别码。“D20~D93”是4组32位的晶片信息,即卡号。当EM4001上电初始化后,便依次将这64位数据反复输出,直到卡片离开基站读写器失电为止。

图1 EM4001芯片内部功能图
数据信息采用曼彻斯特编码,然后调制到载波上,影响感应线圈工作。数据“1”对应着电平下跳,数据“0”对应着电平上跳。在一串传送的数据序列中,两个相邻的位数据传送跳变时间间隔设为t。在曼彻斯特编码方式下EM4001每传送一位数据的时间是64个振荡周期,其值由载波频率决定。若载波频率为125 kHz,则每传送一位的时间为振荡周期的64分频,故位传送时间:

2 射频卡读卡电路原理与设计分析
2.1 读卡电路原理
一般射频卡电路中,125 kHz频率由分频器对晶体振荡器分频得到。图2中直接利用单片机定时器T0中断控制I/O产生125 klHz的方波;推挽式LC谐振放大电路将信号放大后通过L1(读卡电路的感应线圈)产生一个具有一定能量的磁场,射频卡接近线圈上电初始化后,便依次将数据信息反复输出,直到卡片离开线圈失电为止;射频卡利用自身的感应线圈通过磁场影响读卡电路中的感应线圈,L1产生的调幅信号经过包络检波电路后,将125 kHz的载波信号滤除,得到正弦波信号;限幅比较电路的作用就是将正弦波转化为波形平坦的方波信号,并送单片机处理。

图2 硬件模块功能图
2.2 硬件电路设计与分析
硬件电路如图3所示。

图3 系统硬件图
2.2.1 125 kHz频率产生
STC12C5410系列单片机I/O可以由软件配置成4种工作类型之一。要保证Q2、Q3构成的推挽式电路正常工作,单片机I/O口需要具有一定的驱动能力。单片机I/O口默认配置为准双向口模式,驱动能力有限,所以配置产生125 kHz方波输出的I/O口为强上拉模式,可以上拉输出达20 mA的电流。同时,灌电流也是20 mA,电路中需要加限流电阻R12。
单片机定时器T0设置工作模式2(8位自动重装),通过寄存器AUXR设置定时器时钟频率为11.059 2 MHz。11.059 2 MHz/125 kHz = 88.473 6,所以TH0 = 256-88/2 = 212,TL0 = 212。实际频率计测量结果为125.3 kHz,完全可以满足射频卡工作频率的要求。
推挽式放大电路输出后接LC串联谐振电路,当回路固有谐振频率与输入信号频率相等时,电路发生串联谐振。本文只要求对125 kHz频率的信号放大,所以根据串联谐振公式f=1/(2π·LC)计算电路中器件参数,可得L=0.16 mH,C=10 nF。
2.2.2 包络检波电路
感应线圈产生谐振电压约有20 V,所以载波信号的电压也约为20 V。对输入电压高于500 mV检波,称为“大信号检波”,利用二极管单向导电特性及检波负载RC充放电过程实现。RC参数的确定需要满足两个条件: ① 不产生惰性失真,一般工程上按fmax×R×C≤1.5计算,f为载波频率。② 不产生负峰切割失真,即m≤R1/R0,m为调幅系数,R1是交流阻值,R0是直流阻值。联立上述两个条件,确定检波电路中R、C分别为470 kΩ、4 700 pF。
2.2.3 波形整形电路
在单片机处理之前,整形电路将检波后的信号变成单片机可以识别的高低电平。LM358内部集成两个运放,经过两次整形后可以得到很好的方波信号。电路中R17、R18起到分压作用,确定输出翻转门限为2.5 V;R13将同向输入的电压叠加在反向输入端;C6、C8为耦合电容,能够隔离直流分量,传递交流信号。当U+大于U+2.5 V时,输出高电平;当U+小于U+2.5 V时,输出低电平。
3 单片机软件设计
3.1 读卡程序流程
读卡程序是根据EM4100射频卡的特点量身定做的一段程序,如图4所示。射频卡以曼彻斯特编码,传输一个数据的时间t=64/125 kHz=512 μs。实际使用中,一般传输时间为490 μs<t<520 μs,230 μs<0.5t<280 μs 。所以本文中采样波形时,定时器时间设定为300 μs,保证为采样留有足够的时间。

图4读卡程序流程
3.2 软件代码实现
(1) 125 kHz频率产生程序
//系统初始化
void initial() {
AUXR=0x80;//T0工作1T模式
P3M0=0x04;
P3M1=0x20;//P3.5为推挽式输出
CMOD=0x80;
CCON=0x00;
CL=0x00;
CH=0x00;
CCAP0L=0x20;//配置PCA
CCAP0H=0x01;//工作在16位
CCAPM0=0x48;//软件定时模式
CR=0;//PCA定时器关闭
SCON=0x50;
TMOD=0x22;
TH1=0xfd;
TL1=0xfd;//波特率为9 600 bps
TR1=1;
TH0=212;
TL0=212;
PT0=1;//设置T0中断优先级最高
EA=1;
ET0=1;
TR0=1;
}
//控制I/O产生125 kHz方波
void T0_serv() interrupt 1 using 2 {
fangbo=~fangbo;
}
(2) 读卡程序
//采样16字节数据,即128位
str:temp=0;
temp1=0;
head=0;
CR=0;
CH=0;CL=0;
CR=1;
for(bytec=0;bytec<16;bytec++) {
for(bitc=0;bitc<8;bitc++){
while(CCF0==0);
CCF0=0;
CH=0;CL=0;
if(RF_DATA_IN==1)
temp=1;
else temp=0;
while(RF_DATA_IN==temp) {
if(CCF0==1) {
CR=0;
CCF0=0;
goto str;
}
}
CH=0;CL=0;
temp=~RF_DATA_IN;
temp1=(temp1<<1)|temp;
}
}
CR=0;
//确定数据起始位置
for(bytec=0;bytec<16;bytec++) {
temp1=0x80;
for(bitc=0;bitc<8;bitc++) {
if(head==9) break;
if((Read_RF_Data[bytec]&temp1)==0)
head=0;
else head++;
temp1=temp1>>1;
}
if(head==9) break;
}
//检验数据的奇偶校验是否正确
for(head=0;head<5;head++) {
temp=((ID_Data[bytec]&0x10)>>4)+((ID_Data[bytec]&0x08)>>3)+((ID_Data[bytec]&0x04)>>2)+((ID_Data[bytec]&0x02)>>1);
if((temp&0x01)==(ID_Data[bytec]&0x01)) {
temp1=(ID_Data[bytec]&0xfe)<<3;
bytec++;
temp=((ID_Data[bytec]&0x10)>>4)+((ID_Data[bytec]&0x08)>>3)+((ID_Data[bytec]&0x04)>>2)+((ID_Data[bytec]&0x02)>>1);
if((temp&0x01)==(ID_Data[bytec]&0x01)) {
ID_Data[head]=temp1|((ID_Data[bytec]&0xfe)>>1);
bytec++;
}
else goto str;//校验失败,重新读取
}
else goto str;
}
结语
本文中的读卡电路经过多次试验验证,工作稳定可靠,能够正确识别、读取射频卡内信息,而且器件成本低。理论上,不仅可以实现对射频卡读取的功能,而且能够通过定时器T0的TR0控制125 kHz频率方波的产生,改变感应线圈磁场的方式对可读写射频卡进行编码,实现写卡功能。