通用射频卡读写模块的设计流程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
通用射频卡读写模块的设计流程
本设计为非接触式射频卡读卡器,它是基于单片机AT89S52与Philips公司的MF RC500嵌入式读写芯片设计开发的,整个系统包括由A T89S52构成控制模块,由MF RC500构成的射频模块,天线模块,由LCD1602构成的显示模块,通信模块以及若干标签等组成。
它能完成对Mifare1卡所有读写及控制操作,并且还可以方便的嵌入到其他系统(如:门禁,公交)中,成为用户系统的一部分。
一.设计思想
本设计所研究的读卡器为非接触式的静距离无限读卡系统。
该系统为无线通信系统,对通信距离和通信信息的可靠性等都需进行研究。
主要考虑的问题在以下几个方面:
①不同的射频读卡器系统拥有不同的通信频带,RFID按应用频率的不同分为低频(LF)、高频(HF)、超高频(UHF)、微波(MW),相对应的代表性频率分别为:低频135KHz以下、高频13.56MHz、超高频860M-960MHz、微波2.4G、5.8G,在设计系统时,标签与天线和读卡芯片模块的带宽需严格匹配,否则将无法进行通行或出现通信错误。
本设计中采用的为高频频带,在天线设计过程中需严格遵守天线设计的参数要求,设计与高频相匹配的天线,并选用合适的标签,并且标签和射频芯片的需遵守相同的通信标准才能够成功的进行通信。
②由于RFID通信采用的无线通信方式,无线通信的通信信道是开放性信道,因此对通信安全有比较严格的要求,因此在通信时需要有严格的通信加密方式,才能够确保信息的安全性。
③在读卡的过程中,由于可能同时存在有多个标签在读写范围内,要能识别正确的标签,则需设计相应的防碰撞法则,以能够选择出对应的标签进行操作并防止出现通信混乱。
二.MF RC500芯片概述
1. MF RC500芯片特点
MF RC500是PHILIPS公司生产的高集成度TYPEA读写器芯片。
其主要性能如下:
●载波频率为13. 56MHz;
●集成了编码调制和解调解码的收发电路;
●天线驱动电路仅需很少的外围元件,有效距离可达10cm;
●内部集成有并行接口控制电路,可自动检测外部微控制器(MCU) 的接口类型;
●具有内部地址锁存和IRQ线,可以很方便地与MCU接口;
●集成有64 字节的收发FIFO缓存器;
●内部寄存器、命令集、加密算法可支持TYPE A 标准的各项功能,同时支持MIFARE 类卡的有关协议;
●数字、模拟、发送电路都有各自独立的供电电源。
基于以上特点,用MF RC500极易设计TYPE A型卡的读写器,可广泛用于非接触式公共电话、仪器仪表、非接触式手持终端等领域。
2.引脚功能
MF RC500为32脚SO封装,其引脚功能如表1-1 所列。
需说明的是:某些引脚(带*号) 依据其所用MCU(微控制器) 的接口情况具有不同功能。
3. 工作原理
MF RC500 的内部电路框图如图 1.1 所示,它由并行接口及控制电路、密钥存贮及加密算法(Cypto1)、状态机与寄存器、数据处理电路、模拟电路(调制、解调及输出驱动电路)等组成。
4.MF RC500寄存器设置
MF RC500芯片的内部寄存器按页分配, 并通过相应寻址方法获得地址。
内部寄存器共分8页,每页有8个寄存器,每页的第一个寄存器称为页寄存器, 用于选择该寄存器页。
每个寄存器由8位组成,其位特性有四种: 读/ 写(r/ w) 、只读(r) 、仅写(w) 和动态(dy) 。
其中dy 属性位可由微控制器读写, 也可以在执行实际命令后自动由内部状态机改变位值。
微控制器MCU 通过对内部寄存器的写和读,可以预置和读出系统运行状况。
寄存器在芯片复位状态为其预置初始值。
了解内部寄存器的设置对于软件编程至关重要,表1-2 给出了寄存器的配置情况。
NWR NRD NCS ALE A0 A1 A2 D0 D1 D2 D7
PSTPD IRQ
DSCIN AVSS VMID
图1-1 MF RC5OO 芯片内部寄存器
3 接受与解码控制 18~1F Page ,RxControl1,DecodeControl ,BitPhase ,RxThreshold ,PreSet1D ,RxControl2,ClockQControl
4 定时和通道冗余码
20~27 Page ,RxWait ,ChannelRedundancy ,CRCPresetLSB , CRCPresetMSB ,CRCPreSet25,MFOUTSelect ,PreSet27 5 FIFO ,定时器和IRQ 引脚 28~2F Page ,FIFOLevel ,TimerClock ,TimerControl ,TimerReload , IRQPinConfig ,PreSet2E ,PreSet2F 6 备用 30~37 Page ,RFU
7
测试控制
38~3F
Page ,RFU ,TestAnaSelect ,PreSet3B ,PreSet3C ,TestDigiSelect ,RFU ,
5.并行接口
MF RC500芯片可直接支持各种微控制器(MCU) , 也可直接和PC 机的增强型并行接口(EPP) 相连接,每次上电(PON) 或
硬启动(Reset) 后,芯片会复原其
并行接口模式并检测当前的MCU 接
口类型, 通常用检测控制引脚逻辑
电平的方法来识别MCU 接口, 并利
用固定引脚连接和初始化相结合的
方法实现正确的接口。
图1-2给出
了本次设计相应的连接接线图。
6. EEPROM 存贮器
MF RC500 的EEPROM 共有32 块, 每块16 字节。
EEPROM 存贮区分为四部分:第一部分为块0, 属性
为只读,用于保存产品的有关信息;第二部分为块1 和块2, 它们具有读/ 写属性,用于存放寄存器初始化启动文件; 第三部分从块3 至块7, 用于存放寄存器初始化文件, 属性为读/ 写; 第四部分从块8 至块31,属性为只写, 用于存放加密运算的密钥, 存放一个密钥需要12 字节, EEPROM 密钥存放区共可存放32 个密钥, 实际密钥长度为6 字节, 存放在紧邻的12 个EEPROM 字节地址中。
一个密钥字节的8 位必须分开存放, 若设密钥8 位为K7,K6,K5,K4,K3,K2,K1,K0。
则存放在两个相邻字节时为k7k6k5k4 K7K6K5K4 和k3k2k1k0 K3K2K1K0 , 例如密钥字节为A0H 时, 则存放内容为5AH 、F0H 两个字节。
7. FIFO 缓存
8×64位的FIFO 用于缓存微控制器与芯片之间的输入/输出数据流。
可处理数据流长度达64字节。
FIFOData 寄存器作为输入/输出数据流的并/并转换口; FIFOLength 寄存器用于指示FIFO 缓冲器的字节存储量、写时增量、读时减量; FIFO 缓冲器的状态(如空、溢出等) 可由寄存器PrimaryStatus 、FIFOLevel 的相关位指示;对FIFO 的访问则可通过微控制器送出有效命令来实现。
8.中断请求
芯片的中断请求有定时设置到、发送请求、接收请求、一个命令执行完、FIFO 满、FIFO 空等六种。
0页寄存器InterruptEn 的相应位(r/w 属性)用于相应中断请求使能设置; InterruptRq 的相应位(dy 属性)用于指示使能情况下的相应中断出现。
任何允许中断产生时,0 页寄存器PrimaryStatus 的IRQ 位(r 属性)可用于指示中断的产生,同时可由引脚IRQ 和微控制器进行连接以产生中断请求信号。
9. 定时器
MF RC500内有定时器,其时钟源于13.56MHz 晶振信号,13.56MHz 信号由晶振电路(外
NCS A2 A1 A0 D0~D7 ALE NRD NWR 片选
低
高 高
复用地址/数据线 地址所存使能 读选通 写选通
图1-2 复用方式连接图
接石英晶体)产生。
微处理器可借助于定时器完成有关定时任务的管理。
定时器可用于定时输出计数、看门狗计数、停止监测、定时触发等工作。
10.模拟电路
a. 发送电路
RF信号从引脚TX1和TX2输出可直接驱动天线线圈。
调制信号及TX1 、TX2 输出的射频信号类型(已调或无调制载波)均可由寄存器TxControl 控制。
b. 接收电路
载波解调采用正交解调电路,正交解调所需的I和Q时钟(两者相差为90°)可在芯片内产生。
解调后由所得副载波调制信号要经放大、滤波相关器、判决电路进行副载波解调,其中放大电路的增益可由寄存器RxControl的设置来控制。
11.串行信号开关
串行信号开关用于桥接芯片数字电路和模拟电路两部分,两部分电路的输入/输出和外部应用所需的输入/输出可以灵活组合。
这种组合可借助MFIN和MFOUT引脚和相关寄存器来控制实现。
MFIN可输入曼彻斯特码、带副载波的曼彻斯特码,并由寄存器RxControl2 的设置选择送至解码器。
若输入的是修正密勒码,则由寄存器TxControl设置选择送至发送通道的调制器。
MFOUT引脚上可输出曼彻斯特码、带副载波的曼彻斯特码、NRZ 码、修正密勒码以及测试信号,具体可通过寄存器MFOUTSelect 的不同设置来选择。
12. 命令设置
MC RF500 的性能由内部状态机保证,状态机可以完成命令功能。
寄存器Command 的相应位存贮R命令码(属性为dy) 可用于启动或停止命令执行。
命令大多可由写入相应命令码至Command 寄存器实现,其所需变量和数据主要由FIFO缓冲器交换。
有关命令及功能如表1-3所列。
Mifare类产品中加密算法的实现被称之为CRYPT01 ,它是一种密钥长度为48bit的流密码。
要访问一个Mifare 类卡的数据,首先要完成认证, Mifare 卡的认证采用三次认证的过程,这个过程可由自动执行Authbent1和Authbent2命令来实现。
三. Mifare1 射频卡的结构和工作原理 1. 工作原理
射频卡的电气部分由天线、1个高速(106KB 波特率)的RF 接口、1个控制单元和1个8K 位EEPROM 组成。
其工作原理如下:读写器向射频卡发一组固定频率的电磁波,卡片内有1个LC 串联谐振电路,其频率与读写器发射的频率相同,在电磁波的激励下,LC 谐振电路产生共振,从而使电容内有了电荷,在这个电容的另一端,接有1个单向导通的电子泵,将电容内的电荷送到另一个电容内储存,当所积累的电荷达到2V 时,此电容可作为电源为其他电路提供工作电压,将卡内数据发射出去或接收读写器的数据。
2. Mifare1结构和组成
每张卡有唯一的32位序列号,其工作频率为13. 56 MHz , 存储量为1 KB , 分为16个
扇区,每扇区一组密码,各扇区的存储区域相互独立,每区可作为不同用途(第0区一般不用),实现一卡多用。
Mifare1卡可擦写10万次以上,其密码验证机制严密,可保证存储存信息的安全可靠;同时该卡具有防冲突机制,可支持多卡同时操作。
Mifare1卡有16个扇区,每个扇区又分为4块(块0 、块1 、块2 和块3) ,每块16 个字节,以块为存取单位。
除第0 扇区的块0(即绝对地址0 块) 已经固化,用于存放厂商代码,不可更改之外,其余每个扇区的块0、块1、块2为数据块,可用于存贮数据,块3为控制块,包括密码A(6字节)、存取控制(4字节)和密码B(6字节).
Mifare1卡每个扇区的密码和存取控制都是独立的,可以根据实际需要设定各自的密码及存取控制,存取控制决定各块的读写权限与密码验证。
16扇区中的每块(包括数据块和控制块)的存取条件是由密码和存取控制共同决定的。
四.系统结构组成和工作原理 1.系统基本结构和工作原理
一个比较完整的读卡器系统主要包括有微控制器模块,射频处理模块,天线模块,显示模块以及与PC 机得的信模块,其中MF RC 模块可以产生载波信号驱动天线发射能量并能够处理经天线反射回来的载有标签信息的模拟信号,使之转化为数字电平。
MCU 则用于控制其余模块。
液晶显示器可以系统获得的标签信息显示出来。
读卡器系统的结构框图如图1-3(a )
所示。
系统工作原理图如图1-3(b )所示。
系统数据存储在无源Mifare1卡,也就是PICC (应答器)中。
PCD (读写器)的主要任务是传输能量给PICC ,并建立与之的通信。
PICC 是由一个电子数据作载体,通常由单个微型芯片以及用作天线的大面积线圈等组成;而PCD 产生高频的强电磁场,这种磁场穿过线圈横截面和线圈周围的空间。
因为MF RC500提供的频率为13.56MHz ,所以其波长比PCD 的天线和PICC 之间的距离大好多倍,可以把PICC 到天线之间的电磁场当作简单的交变磁场来对待。
PICC 中存在一个LC 串联谐振电路, 其频率与读卡器的频率相同,在电磁波的激励下,LC
谐振电路产生共振,从而是电容中有了电荷,
图1-3 读卡器结构框图
在这个电容的另一端,接有一个单项导通的电子泵,将电容内的电荷存储到另外一个电容内,当所积累的电荷达到2V时,此电容可作为电源为其他的器件提供工作电压,将卡内的数据通过电磁波发送出去。
当天线接收到含有卡片信息的载波后,经过滤波得到的携带卡片信息的有用信号,该模拟信号经MF RC500处理后得到表示Mifare1卡信息的数字信号送入单片机中。
如上所述可以看出,PCD 的性能与天线的参数有着直接的关系。
在对天线的性能进行优化之后,PCD 的读卡距离可以达到10cm。
2.人机接口电路设计(显示器)
在本设计中,液晶显示屏主要功能是显示标签的信息,如标签的序列号等。
液晶显示屏有很多不同的种类,显示屏与单片机之间需要有驱动电路,本设计中选择的LCD1602液晶显
图1-4 单片机与显示器接口电路
示屏。
液晶显示屏也单片机的接口电路如图1-4所示。
3. MF RC500应用电路设计
MF RC500为32脚SO封装,使用了3个独立的电源以实现在EMC特性和信号解耦方面达到最佳性能。
除了模拟电源和数字电源外,MF RC500还对天线驱动电路单独设有电源,以此提高天线的驱动能力。
MF RC500具有出色的RF性能,并且模拟和数字部分可适应不同的操作电压。
方便的并行接口可直接连接到任何8位微处理器,这样给读写器的设计提供了极大的灵活性。
工作时需接一个13.56MHz的晶振。
4.与天线连接电路
MF RC500提供TXI和TX2两个发送端,采用中心抽头设计方法,以此提高抗干扰能力。
系统的工作频率由一个石英振荡器产生,它同时也产生高次谐波,因此在发送端需要使用低通滤波器:低通滤波器由L0和CO构成。
天线接收到的信号经过天线匹配电路送到RX脚,使用内部产生的电势作为RX管脚的输入,另外还需在RX和VMID引脚之间连接一个分压器。
为了减少干扰,VMID引脚接一个电容到地。
MF RC500集成了一个正交调制电路,该电路从输入到RX脚的13.56MHz ASK调制信号中解析出ISO14443-A副载波信号。
发送器管脚 TX1和TX2上传递的信号是由包络信号调制的13.56MHz能量载波,只需要很少的用于匹配和滤波就可以直接驱动天线。
MF RC500与天线的连接电路如图1-5所示。
5.与单片机连接电路
MF RC500与AT89S52的连接电路主要包括地址、数据及控制线的连接。
MF RC500 提供了8位并行数据AD0~AD7,地址A0~A2,片选信号口,读写控制口,复位口,中断请求口,地址数据复用时的地址锁存使能口。
当地址线和数据线复用时,A0、A1接高电平,A2接低电平,AD0~AD7同为数据地址线。
非复用时,A0,A2为低3位地址,其它3位由MF RC500内部的页选寄存器PAGESELECT 的后三位确定。
本设计中采用地址数据总线复用的方式。
MF RC500与单片机的连接电路图如图1-6所示:
6.PCD 的天线设计 由于MF RC500 的频率是13.56MHz ,属于短波段,因此可以采用小环天线。
小环天线有方型、圆形、椭圆型、三角型等,本系统采用方型天线。
天线的最大几何尺寸同工作波长之间没有一个严格的界限,一般定义为:
πλ
21
=
L
(1)
式(1)中,L 是天线的最大尺寸,λ是工作波长。
对于13.56MHz 的系统来说,天线的最大尺寸在50cm 左右。
在天线设计中, 品质因数Q 是一个非常重要的参数。
对于电感耦合式射频识别系统的PCD 天线来说, 较高品质因数的值会使天线线圈中的电流强度大些,由此改善对PICC 的功率传送。
品质因数的计算公式为:
coil coil
0R L f 2⋅=
πQ (2) 频率,是天线的尺寸,R coil 是天线的半径。
通过品质因
式(2)中的f
是工作
数可以很容易计算出天线的带宽:
Q f B 0
=
(3)
coil
L 图1-5 MF RC500与天线连接电路
RX1
TX11
TGND
0.5R1
图1-6 与单片机硬件连接图
40 39383736353433323130292827262524232221
1234567891011121314151617181920
P1.0
P1.1P1.2P1.3P1.4
P1.5P1.6
P1.7RST P3.0
P3.1P3.2P3.3P3.4
P3.5P3.6P3.7XTAL1XTAL2GND
VCC P0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7EA/VPP ALE/PROG PSEN P2.7P2.6P2.5P2.4P2.3P2.2P2.1P2.0
AT89S52
OSCIN IRQ
MFIN MFOUT TX1
TVDD TX2TVSS NCS
NWR NRD DVSS D0D1D2D3
OSCOUT RSTPD VMID RX AVSS AUX AVDD DVDD A2A1A0ALE D7D6D5D4
15p F
15pF
13.56MHZ
RX1
TX11
TX22
15pF
27pF
27pF
TGND
Cp1
Cp2
0.5R1
0.5R1
TX11
TX22
10u
5.1K
30pF
30pF
2uH
2uH
51pF 51pF
820
2.7K
15pF
VSS VDD VEE RS RW E D0 D1 D2 D3 D4 D5 D6 D7
LCD1602
P2.4 P2.5
D0D1D2D3D4D5D6D7
从式(3)中可以看出,天线的传输带宽与品质因数成反比关系。
因此,过高的品质因数会导致带宽缩小,从而减弱PCD 的调制边带,会导致PCD 无法与卡通信。
一般系统的最佳品质因数为10~30,最大值不能超过60。
五. 系统软件的设计
1.主程序设计
图1-7为单片机系统主程序框图。
读写器在完成各项初始化后,就进入检测标签、扫描键盘、上位机的命令的循环,等待转入标签处理或各功能键处理子程序。
初始化过程包括对单片机、MF RC500、LCD 的
初始化
主程序如下:
#define __SRC #include "main.h" #undef __SRC #include <string.h> #include <intrins.h> #include <stdio.h> #include <m500a.h> #include <p89c51rx.h>
#define MIS_CHK_OK (0) #define MIS_CHK_FAILED (-1) #define MIS_CHK_COMPERR (-2) // Function: mifs_request
#define IDLE 0x00 #define ALL 0x01 sbit RC500RST = P2^7; sbit RC500_CS = P2^6;
sbit LED
= P3^4;
uchar code SW_Rel[] = "\n\r MFRC500 V1.0 22.06.02 \n\r";// 释放标签序列号 static uint Crc ; // MR RC500序列号 void init(void);
code Nkey_a[6] = {0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5}; code Nkey_b[6] = {0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF}; void main (void) {
unsigned char counter ,counter2; unsigned char mfout=2;//readbuf[16]; unsigned char tt1[2]; unsigned char status1; unsigned char cardserialno[4]; unsigned char *sak1; unsigned char blockdata[16]; init();
图1-7 初始化流程图
M500PcdConfig();//初始化RC500
PcdReadE2(8,4,Snr_RC500);//读MF2RC500的系列号并存贮它
M500PcdMfOutSelect(mfout);
for (counter=0;counter<20;counter++)
{
status1 = M500PiccRequest(PICC_REQALL,tt1);
if (status1==MI_OK)
status1=M500PiccAnticoll(0,cardserialno);
if (status1==MI_OK)
status1=M500PiccSelect(cardserialno,sak1);
if (status1==MI_OK)
status1 = M500PiccAuth(PICC_AUTHENT1A,cardserialno,1,4);
if (status1 ==MI_OK)
status1=M500PiccRead(4,blockdata);
for ( counter2=0;counter2<16;counter2++)
blockdata[counter2]=counter;
if (status1 ==MI_OK)
status1 = M500PiccWrite(4,blockdata);
}
}
/*************************************************************
功能:初始化
***************************************************************/
void init (void)
{
RC500RST = FALSE;
RC500_CS = TRUE;// Enable the CS for RC500
CmdReceived = FALSE;
CmdValid = FALSE;
Quit = FALSE;
LLfReady = TRUE;
SendReady = TRUE;
Idle = TRUE;
RepCnt = 0;
RecvState = RECV_STX;
EnableTransferCmd = FALSE;
CheckByteCnt = BCC_CHECKBYTECNT;
#ifdef AUTODELAY
DelayRate = 0;
DelayRateLocked = TRUE;
#endif
PCON = 0x80;// SMOD = 1;
SCON = 0x50;// Mode 1,8-bit UART,enable receiption
AutoBaud = TRUE;
TMOD = 0x20;// Timer 1,mode 2,8-bit auto reload,
// Timer 0,mode 0,13-bit counter
Capt_L = 0;
Capt_H = 0;
LED = OFF;
delay_10ms(50);
LED = ON;
IT0 = 1;// 将定时器0作为MF RC500边缘触发
EX0 = 1;// 使能定时器0中断
EA = TRUE;// 使能所有中断
}
void delay_50us (uchar _50us)
{
RCAP2LH = RCAP2_50us;
T2LH = RCAP2_50us;
ET2 = 0;// 阻止定时器1中断
T2CON = 0x04;// 16-bit auto-reload,clear TF2,start timer
while (_50us--)
{
while (!TF2);
TF2 = FALSE;
}
TR2 = FALSE;
}
void delay_1ms (uchar _1ms) //延迟1ms
{
RCAP2LH = RCAP2_1ms;
T2LH = RCAP2_1ms;
ET2 = 0;
T2CON = 0x04;
while (_1ms--)
{
while (!TF2);
TF2 = FALSE;
}
TR2 = FALSE;
}
void delay_10ms (uint _10ms)
{
RCAP2LH = RCAP2_10ms;
T2LH = RCAP2_10ms;
ET2 = 0;// Disable timer2 interrupt
T2CON = 0x04;// 16-bit auto-reload,clear TF2,start timer while (_10ms--)
{
while (!TF2)
{
if (CmdValid || CmdReceived)
{
TR2 = FALSE;
TF2 = FALSE;
return;
}
}
TF2 = FALSE;
}
TR2 = FALSE;
}
#ifdef NOP_DELAY
void delay_50us_NOP (void)
{
uchar i;
for(i=0;i<81;i++) _nop_();
}
#endif
void delay_8us_NOP (void)
{
uchar i;
for(i=0;i<14;i++) _nop_();
}
#pragma aregs
uchar xtoa_h (uchar _byte)
{
uchar nibble = _byte >> 4;
return ((nibble > 9)? nibble + 'A' - 10 : nibble + '0');
}
uchar xtoa_l (uchar _byte)
{
uchar nibble = _byte & 0x0F;
return ((nibble > 9)? nibble + 'A' - 10 : nibble + '0');
}
void isr_timer0 (void) interrupt 1 using 2
{
if (Timer0Cnt)
{
--Timer0Cnt;
}
else
{
STOP_T0();
#ifdef AUTODELAY
if (DelayRate < MAXDELAYRATE && CmdCnt > 0)
{
DelayRate++;
DelayRateLocked = FALSE ;
}
#endif
RecvState = RECV_STX ;
if (!SendReady && LLfReady)
{
if (RepCnt < MAXREPCNT)
{
RepCnt++;
CALL_isr_UART(); }
else
{
RepCnt = 0;
Quit = FALSE ;
SendReady = TRUE ; }
}
}
} 2.对标签的操作
(1)对Mifare1 卡操作流程 整个系统的工作由对Mifare1卡操作
和系统后台处理两大部分组成。
Mifare1 卡的操作流程图如图1-8所示,主要分为
以下几项。
①复位请求
当一张Mifare1卡片处在卡片读写器的天线的工作范围之内时,程序员控制读
卡器向卡片发出REQUEST all (或REQUEST
std) 命令。
卡片的ATR 将启动,将卡片
Block 0 中的卡片类型(TagType)号共2 个字节传送给读卡器, 建立卡片与读卡器的第一步通信联络。
如果不进行复位请求操作,读写器对卡片的其它操作将不会进行。
②反碰撞操作
如果有多张Mifare1卡片处在卡片读卡器的天线的工作范围之内时,PCD 将首先与每一张卡片进行通信,取得每一张卡片的系列号。
由于每一张Mifare1 卡片都具有其唯一的序复位及配置MF RC500 读固件信息MF RC500序列号,并保存 装载密钥,将新密钥写入MF RC500内EEPROM 中
请求读卡,检测在有效范围内有否有射频卡存在 防碰撞处理:获得射频卡序号,以后就直接到处理完该序号的射频卡的通信过程,在此期间不与其它卡通信,来实现防碰撞 单片机与射频卡建立通信连接,进行数据读写通信
结束操作,刮起HALT ,等待下一次通信
开始验证操作,并证实为合法卡
选择PICC 卡型,返回卡的存储容量
单片机复位 图1-8 对Mifare1卡操作流程图
列号,决不会相同,因此PCD 根据卡片的序列号来保证一次只对一张卡操作。
该操作PCD 得到PICC的返回值为卡的序列号。
③卡选择操作
完成了上述二个步骤之后,PCD必须对卡片进行选择操作。
执行操作后,返回卡上的SIZE 字节。
(4)认证操作
经过上述三个步骤,在确认已经选择了一张卡片时,PCD在对卡进行读写操作之前,必须对卡片上已经设置的密码进行认证。
如果匹配,才允许进一步的读写操作。
④读写操作
对卡的最后操作是读、写、增值、减值、存储和传送等操作。
3. 读卡程序
利用MF RC500 的函数库,可直接对符合ISO14443A 标准的非接触式卡和感应器进行操作如下:
void main (void)
{
init () ;
M500PcdConfig () ;//初始化RC500
PcdReadE2 (8 ,4 ,Snr-RC500) ;//读MF2RC500的系列号并存贮它
M500PcdMfOutSelect (mfout) ;
For (count = 0 ;count < 100 ;count + + )
{
status1 = M500PiccRequest ( PICC-REQALL ,tt1) ;//发送请求代码给卡,并等待应答if (status1 = = MI-OK)
status1 = M500PiccAnticoll (0 ,cardserialno) ;//读卡的系列号
if (status1 = = MI-OK)
status1 = M500PiccSelect (cardserialno ,sak1) ;//选择一指定的卡
if (status1 = = MI-OK)
status1 = M500PiccAuth (PICCAUTHENT1A ,cardserialno ,1 ,4) ;//鉴定卡
if (status1 = = MI-OK)
status1 = M500PiccRead(4 ,blockdata) ;//读卡
}
}
4.显示程序
#include "CONFIG.h"
void charfill(unsigned char c) //整屏显示A代表的ASCII字符子程序
{ for(CXPOS=CYPOS=0;1;)
{ putchar(c);//定位写字符
charcursornext();//置字符位置为下一个有效位置
if((CXPOS==0) && (CYPOS==0)) break;
}
}
void putstrxy(unsigned char cx,unsigned char cy,unsigned char code *s)
{ //在(cx,cy)字符位置写字符串子程序
CXPOS=cx;//置当前X位置为cx
CYPOS=cy;//置当前Y位置为cy
for(;*s!=0;s++) //为零表示字符串结束,退出
{ putchar(*s);//写1个字符
charcursornext();//字符位置移到下一个
}
}
void putstr(unsigned char code *s) //定位写字符串子程序
{ for(;*s!=0;s++) //为零表示字符串结束,退出{ putchar(*s);//写1个字符
charcursornext();//字符位置移到下一个
}
}
void putchar(unsigned char c) //在(CXPOS,CYPOS)字符位置写字符子程序
{
charlcdpos();//设置(CXPOS,CYPOS)字符位置的DDRAM地址lcdwd(c);//写字符
}
unsigned char getchar(void) //在(CXPOS,CYPOS)字符位置读字符子程序
{
charlcdpos();//设置(CXPOS,CYPOS)字符位置的DDRAM地址return lcdrd();//读字符
}
void charlcdpos(void) //设置(CXPOS,CYPOS)字符位置的DDRAM地址
{
CXPOS&=0X0f;//X位置范围(0到15)
CYPOS&=0X01;//Y位置范围(0到1)
if(CYPOS==0) //(第一行)X: 第0----15个字符
lcdwc(CXPOS|0x80);// DDRAM: 0----0FH else //(第二行)X: 第0----15个字符
lcdwc(CXPOS|0xC0);// DDRAM: 40----4FH
}
void charcursornext(void) //置字符位置为下一个有效位置子程序
{
CXPOS++;//字符位置加1
if(CXPOS>15) //字符位置CXPOS>15表示要换行
{ CXPOS=0;//置列位置为最左边
CYPOS++;//行位置加1
CYPOS&=0X1;//字符位置CYPOS的有效范围为(0到1) }
}
void lcdreset(void) //SMC1602系列液晶显示控制器初始化子程序
{ //1602的显示模式字为0x38 lcdwc(0x38);//显示模式设置第一次
delay3ms();//延时3MS
lcdwc(0x38);//显示模式设置第二次
delay3ms();//延时3MS
lcdwc(0x38);//显示模式设置第三次
delay3ms();//延时3MS
lcdwc(0x38);//显示模式设置第四次
delay3ms();//延时3MS
lcdwc(0x08);//显示关闭
lcdwc(0x01);//清屏
delay3ms();//延时3MS
lcdwc(0x06);//显示光标移动设置
lcdwc(0x0C);//显示开及光标设置
}
void delay3ms(void) //延时3MS子程序
{ unsigned char i,j,k;
for(i=0;i<3;i++)
for(j=0;j<64;j++)
for(k=0;k<51;k++);
}
void lcdwc(unsigned char c) //送控制字到液晶显示控制器子程序{
lcdwaitidle();//HD44780液晶显示控制器忙检测RSPIN=0;//RS=0 RW=0 E=高电平
RWPIN=0;
DA TA=c;
EPIN=1;
_nop_();
EPIN=0;
}
void lcdwd(unsigned char d) //送控制字到液晶显示控制器子程序{
lcdwaitidle();//HD44780液晶显示控制器忙检测RSPIN=1;//RS=1 RW=0 E=高电平
RWPIN=0;
DA TA=d;
EPIN=1;
_nop_();
EPIN=0;
}
unsigned char lcdrd(void) //读数据子程序
{ unsigned char d;
lcdwaitidle();//HD44780液晶显示控制器忙检测DA TA=0xff;
RSPIN=1;//RS=1 RW=1 E=高电平
RWPIN=1;
EPIN=1;
_nop_();
d=DA TA;
EPIN=0;
return d;
}
void lcdwaitidle(void) //忙检测子程序
{ unsigned char i;
DA TA=0xff;
RSPIN=0;//RS=0 RW=1 E=高电平
RWPIN=1;
EPIN=1;
for(i=0;i<20;i++)
if((DATA&0x80) == 0) break;//D7=0 表示LCD控制器空闲,则退出检测EPIN=0;
}。