基于单片机的RFID读写器设计
更新时间:2024-01-02 07:54:01 阅读量: 教育文库 文档下载
基于单片机的RFID读写器设计
摘 要
射频识别(Radiofrequency identification ,RFID),又称电子标签(E-Tag),是一种利用射频信号自动识别目标对象并获取相关信息的技术。随着技术的进步,RFID应用领域日益扩大,现已涉及到人们日常生活的各个方面,并将成为未来信息社会建设的一项基础技术。因此,研究、设计和开发RFID系统具有十分重要的理论意义和实际意义。
论文系统地论述了射频识别系统和读卡器的理论分析,研究了射频识别系统中的许多关键技术,并提出了射频识别读卡器的设计方案。
本文首先分析了射频识别技术的基本原理、研究方向和应用情况。在充分研究了射频卡的基本原理、技术特点、国际相关标准后,进而提出了基于STC11F32单片机的射频读卡器系统设计的方法。设计采用MFRC522射频读写模块在STC11F32单片机的控制下实现对Mifare卡的读写访问操作。
硬件部分设计主要包括单片机控制电路设计,射频模块设计,天线电路设计,串行通信电路设计,声音提示及显示电路设计等,其中详细讨论了读卡器的软件设计方法。软件设计包括单片机处理程序,射频基站芯片RC522的基本操作、Mifare卡操作程序设计、声音提示及显示部分程序等。论文中系统地讨论了软件实现读卡器与Mifare卡之间通信所要求的请求应答、防冲撞、选卡片、认证、读写等功能模块的实现原理。
关键词:射频识别,读卡器,IC卡,STC11F32,MFRC522
Abstract
Radio frequency identification (radio frequency identification, RFID), also known as electronic tags (e-Tag), is an RF signal automatic target recognition and access to relevant information technology. With the advances in technology, RFID applications widening, has been involved in all aspects of people's daily lives, and will become a basic technology of the future information society. Therefore, research, design and development of RFID systems has important theoretical and practical significance.
Discusses the theoretical analysis of radio frequency identification system and card reader to the paper system, many of the key technology of radio frequency identification system, and the design of radio frequency identification reader.
This paper firstly analyzes the basic principle of radio frequency identification technology, the research direction and application. In the full study of RF Card basic principle, technical characteristics, relevant international standards, and then put forward based on STC11F32 single chip RF card reader system design method. The design adopts MFRC522radio frequency read write module in STC11F32under the control of a single-chip microcomputer to realize Mifare card read and write access operations.
The hardware part of the design including the MCU control circuit design, design of the RF module, Antenna circuit design, circuit design of the serial communication, voice prompts and display circuit design, including detailed discussion of the reader software design methods. Software design, including the microcontroller handler, the basic operation of the RF base station chip RC522, Mifare card operating procedures, voice prompts and display part of the program. The paper discussed the request response communication between the software implementation of the reader with Mifare card required, anti-collision, election card, certification, read and write function module principle.
Key words:RFID, reader, IC card, STC11F32, MFRC522
目录
1 绪论………………………………………………………………5
1.1课题研究的背景与意义 1.2 RFID读卡器国内外现状及前景
2 射频识别系统技术及相关理论 ……………………………………7
2.1射频识别系统原理 2.2射频识别系统组成 2.3射频识别系统的分类 2.4 非接触式IC卡 -- S50
2.5读卡器的工作原理
3 非接触式IC卡国际标准…………………………………………10
3.1 TYPEA的初始化和防冲突
4 读卡器系统硬件设计……………………………………………14
4.1 MCU控制部分 4.2射频部分 4.3天线设计
4.4声音提示及显示部分
5 读卡器系统软件驱动程序设计………………………………16
5.1 RC522命令集的实现
5.2 Mifare卡操作程序设计 5.3 软硬件的联合测试运行
总结………………………………………………………………24 致谢…………………………………………………………25 参考文献……………………………………………………26
附录??????????????????????27
第一章 绪 论
1.1课题研究的背景与意义
射频识别技术是二十世纪九十年代兴起的一种天线的、非接触方式的自动识别技术,是近几年发展起来的前沿科技项目。该技术主要是利用射频信号通过空间耦合实现无接触信息传递并通过所传递的信息达到识别目的。射频识别技术的显著优点在于非接触性,因此完成识别工作时无需人工干预,能够实现识别自动化且不易损坏;可识别高速运动并可同时识别多个射频标签,操作快捷方便;射频标签不怕油渍、灰尘污染等恶劣环境,且可以穿透非金属物体进行识别,抗干扰能力强。REID技术与互联网、通讯等技术相结合,可实现全球范围内物品跟踪与信息共享。研究RFID技术,发展RFID产业对提升社会信息化水平、促进经济可持续发展、提高人民生活质量、增强公共安全与国防安全等方面产生深远影响,具有战略性的重大意义。
因此,RFID技术已在世界各地得到广泛的应用,以美国、日本和欧洲的发达国家对该技术应用研究已达到相当高的水平,而我国处于岂不状态,大多采用了引进的技术成果。所以研究该技术已成为我国当今社会发展的必然趋势。另外RFID技术是一个崭新的技术应用领域,它不仅涵盖了微波技术与电磁学理论,而且包括通信原理及半导体集成电路技术,是一个多学科综合的新兴学科。因此对RFID技术的认识和应用研究具有深远的理论意义。
现在,射频识别技术作为一种新型的自动识别技术,也将在中国很快地普及。典型的射频识别应用系统由非接触式IC卡、非接触式IC卡读卡器和应用系统组成,其中非接触式IC卡读卡器是连接非接触式IC卡和应用系统的桥梁,是射频识别应用系统中的关键部件,而且现在的发展趋势要求射频识别系统要有更高的安全性,因此设计一款安全有效地读卡器有着重要的商业价值意义。
1.2 RFID读卡器国内外现状及前景
RFID相比传统的识别系统具有信息量大,通过无线通信方式可重复读写数据,保密性极好,环境适应能力强,使用寿命更长。随着技术的进步,RFID应用领域日益扩大,现已涉及到人们的日常生活的各个方面,并将成为未来信息社
会建设的一项基础技术。目前第二代身份证、公共交通等都广泛采用了这项技术,超市如沃尔玛采用电子标签管理商品。现射频识别技术在中国还处于一个迅猛发展的阶段,前景十分广阔,相信随着技术越来越成熟,射频识别技术与其它技术一样走进我们日常生活的各个角落,使我们的生活更加方便快捷。
RFID技术在国外的发展较早也较快,在美国、英国、德国、瑞典、日本等国家目前都有成熟且先进的RFID系统。其中低频近距离RFID系统主要集中在125KHz 、13.56MHz,高频远距离RFID系统主要集中在UHF频段915MHz、2.45GHz、5.8GHz,UHF频段远距离系统在北美得到了很好的发展,在欧洲有源2.45GHz得到了较多的应用,5.8GHz在日本和欧洲均有较为成熟的有源RFID系统。
国内RFID读卡器按照应用场合的不同出现全面发展的态势,有读写器模块便携式读写器、超高频(UHF)读写器、高频读写器、双频标签读写微波读写器、低频读写器等各种各样的产品供应,这些产品有适合远距离读写、有近距离读写的。他们都有一个共同的特点,同质化严重,各产品之间的差别不大,性能也相近,基本上采用读卡器芯片加单片机的结构,而核心技术并不在自己手中,缺乏成套系统的自主知识产权。
目前,RFID典型应用领域包括:(1)车辆道路交通自动收费管理(2)旅客航空行包自动识别、分拣转运管理(3)车辆出入控制(4)RFID金融卡(5)产品加工过程自动控制(6)物流仓库自动管理(7)门禁管理(8)图书馆图书管理(9)防伪技术。随着技术的进步,读卡器会朝着多功能如条码识别、无线数据传输、以太网传输等方向发展,读卡器的成本也会越来越低,同时阅读器将实现多制式多频段兼容,多功能、多制式、小型化、模块化、嵌入式方向是读卡器发展的趋势。
// 1.3 本课题主要研究内容及论文主要内容
//在本课题主要研究内容中说明一下你所负责研究的重点内容,即软件设计
第二章 射频识别系统技术及相关理论
2.1射频识别系统原理
从信息传递的基本原理来说,射频识别技术在低频段基于变压器耦合模型(初级与次级之间的能量传递及信号传递),在高频段基于雷达探测目标的空间耦合模型(雷达发射的电磁波信号碰到目标后携带目标信息返回雷达接收机)。
射频标签与读卡器之间的电磁耦合包含两种情况:一种情况是电感耦合。在电感耦合方式中读卡器的天线相当于变压器的初级线圈,射频标签的天线相当于变压器的次级,因而也称电感耦合方式为变压器方式。电感耦合方式通过空间磁场实现耦合,耦合磁场在读卡器线圈(初级)与射频识别标签(次级)之间构成闭合电路。电感耦合方式是低频段近距离无接触射频识别的耦合方式。另一种是电磁耦合方式,在电磁耦合方式中,读卡器的天线将读卡器产生的射频信号以电磁波方式定向发送到空间范围内,形成读卡器的有效阅读区域,位于读卡器有效阅读区域中射频标签从读卡器天线发出得电磁场中提取工作电源,并通过射频标签的内部电路及标签天线将标签内存的数据信息传送到读卡器。电磁耦合与电感耦合的差别在于电磁耦合方式中得读卡器将射频信号以电磁波的形式发送出去;在电感耦合方式中,读卡器将射频信号束缚在读卡器电感线圈的周围,通过交变闭合的线圈磁场,沟通读卡器与射频标签天线之间的射频通道,而没有向空间辐射电磁能量。
2.2射频识别系统组成
射频识别系统一般由以下三部分组成: ①读写器(Reader)
一台典型的读写器应包含射频信号发射单元器,高频接收单元金额控制单元,此外,许多读写器还都有附加的接口(RS232、USB),以便将获得的数据传输给另外系统作进一步的处理或存储。
②标签(Tag)
RFID标签是一种以无线方式传送数据的信息载体形势,它具有数据处理及
安全认证等特有的优点。RFID标签是射频识别系统真正的数据载体,主要有天线、谐振电容以及IC芯片组成,其种类可以分为无源标签和有源标签两种。
射频标签与读卡器之间采用双向验证机制,即读卡器验证射频标签的合法性,同时射频标签也验证读卡器的合法性;处理前,标签要与读卡器进行三次互相认证,而且在通讯过程中所有数据都加密。此外,标签中各个扇区都有自己的操作密码和访问条件。
③天线(Antenna)
射频识别系统中的天线用于产生磁通量,而磁通量用于向无源标签提供能量并在读卡器和标签之间传送信息。13.56 MHz射频天线及其匹配电路共有三块:天线线圈、匹配电路(LC谐振电路)和EMC滤波电路。在天线的匹配设计中必须保证产生一个尽可能强的电磁场,以使卡片能够获得足够的能量给自己供电,而且考虑到调谐电路的带通特性,天线的输出能量必须保证足够的通带范围来传送调制后的信号。
2.3 射频识别系统的分类
按照读写距离来划分,RFID系统可分为接触式和非接触式,而非接触式又分为近距离(密耦合)、中距离(遥耦合)和远距离。按照工作频段来划分,RFID系统可分为低频、中高频、超高频和微波频段。
2.4 非接触式IC卡--S50
Mifare1 IC智能(射频)卡的核心是NXP公司的Mifare1 IC S50(-01,-02,-03,-04)系列微晶片,他确定了卡片的也行以及卡片读写器的诸多性能。Mifare1 IC智能卡采用先进的芯片制造工艺制作,内建有高速的CMOS EEPROM,MCU等。卡片上除了微晶片及一副高效率天线外,无任何其他元件。卡片上无源(无任何电池),工作时的电源能量由卡片读写器天线发送电载波信号耦合到卡片上天线而产生电能,一般可达2V以上,供卡片上得IC工作。工作频率为13.56MHz。Mifare1射频卡所具有的独特的MIFARA RE(射频)非接触式接口标准已被指定为国际标准:ISO/IEC 14443 TYPEA标准。
Mifare1 IC S50是多应用的智能卡,它使用起来方便、高速、安全,经常应用在支付领域,它与读写器通信使用握手式半双工通信协议;卡片上有高速的CRC协处理器,符合CCITT标准,卡片制造是具有唯一的卡片序列号,没有重复
的相同的两张Mifare卡片。卡片上内奸8K(bit)EEPROM存储容量并划分为16个扇区,每个扇区划分为4个数据存储块,每个扇区可由多种方式的密码来管理。卡片上还内建有增值/减值的专项的数学运算电路,非常适合公交、地铁等行业的检票收费系统。典型的检票交易时间最长不超过100ms。卡片上的数据读写可超过10万次以上;数据保存期可达10年以上。
本文设计的读卡器正是用于读写Mifare1 IC S50卡的应用系统,可以对Mifare 1 IC S50进行读写操作、电子钱包操作、密码操作以及认证方式设置等操作。
2.5读卡器的工作原理
MCU通过对读卡器芯片内寄存器的读写来控制读卡器芯片,读卡器芯片搜到MCU发来的命令后,按照非接触式射频卡协议格式,通过天线及其匹配电路向附近发出一组固定频率的调制信号(13.56MHZ)进行寻卡,若此范围内有卡片存在,卡片内部的LC谐振电路(谐振频率与读卡器发送的电磁波频率相同)在电磁波的激励下,产生共振,在卡片内部电压泵的作用下不断为其另一端的电容充电,获得能量,当该电压达到2V时,即可作为电源为卡片的其他电路提供工作电压。
当有卡片在读卡器的有效工作范围内时,MCU向卡片发出寻卡命令,卡片将回复卡片类型,建立卡片与读卡器的第一步联系,若同时有多张卡片在天线的工作范围内,读卡器通过启动防冲撞机制,根据卡片序列号选定一张卡片,被选中的卡片再与读卡器进行密码校验,确保读卡器对卡片有操作权限以及卡片的合法性,而未被选中的则仍然处在闲置状态,等待下一次寻卡命令。密码验证通过后就可以对卡片进行读写等应用操作。
第三章 非接触式IC卡国际标准
非接触式IC卡以作用距离的不同而分为三个不同的标准。。密耦合IC卡标准ISO/IEC10536主要是在1992年到1995年间发展的。近耦合和疏耦合IC卡标准的制定工作——国际标准ISO/IEC 14443和ISO/IEC 15693——大约是1995年开始着手进行的,两项标准在2000年后才开始有效完成。远耦合卡暂未出统一技术标准。
非接触式IC读卡器对应的国际标准
近耦合IC卡的作用距离在10CM左右,目前绝大部分的民用系统都采用的是近耦合IC卡,因此本章着重介绍该标准内容。
近耦合卡采用的国际标准ISO/IEC 14443标准分为四个部分: ISO/IEC14443-1物理特性 ISO/IEC14443-1射频能量和信号接口, ISO/IEC14443-3初始化和防冲突 ISO/IEC14443-4传输协议,下面将着重介绍ISO/IEC14443-3初始化和防冲突。
ISO/IEC14443-3初始化和防冲突这部分描述了在一个PCD设备的射频区域里查询PICC卡,字节和帧的格式,初始化请求命令和请求命令的响应的内容,在记账卡中对一张卡的检测和通讯的方法(即防冲突)和其他一些需要初始化的参数。这里只介绍TYPEA 3.1 TYPEA的初始化和防冲突
3.1.1帧的格式和时序
PCD或PICC发送的帧都包含一个帧头和帧尾和中间的数据信息或错误检测位。PCD或PICC之间采用半双工的通信方式,帧与帧之间的延时时间也在标准里做了具体的规定。
帧分为短帧(数据长度只有一个字节)和标准帧(数据长度大于1个字节)
以及基于位数据传送的防冲突帧。
3.1.2命令集
①PCD设备间隔一定时间就发送请求命令(REQA),REQA命令组成如下: REQA编码
REQA帧包括以下内容: ? 通信起始位S
? 7位数据,低位先发送,REQA的命令代码是\? 通信结束位E
②PICC接收到REQA命令后,在PCD能量场内的所有PICC同步发出ATQA应答。编码如下表所示:
ATQA的编码:
b8b7表示UID比特帧的大小。UID比特帧的定义将在售后介绍。UID的长度不是固定的,可以由1,2,或3部分组成,对应于ATQA的B8B7位分别为00、01和10.
b5~b1中有且只有1位置为1,表示采用的是比特帧防冲突方式。RFU为保留位,均置为0.
③PCD接收ATQA应答,PICC和PCD进入防冲突循环,PCD的ANTICOLLISION和SELECT命令用于防冲突循环。命令组成式如表所示:
BCC在UID CLn为40bit才有,是前5个字节的异或,此时为SELECT命令(NVB=‘70’);不足40个bit时,则为ANTICOLISION命令。
SEL表示CLn的层叠级数,其编码如下表所示: SEL的编码
如果PICC已经发送了完整的UID,则该卡将是从准备状态转为活动状态,并在其SAK的响应里表明UID是完整的。否则,PICC仍保持准备状态,则PCD设备将初始化一个新的增加了层叠级别的防冲突循环。
一个select的时序目的是取得一张PICC卡的UID,并选择该卡来做将来的通信对象。
④PCD发送SELECT命令后,与40位UID CLn匹配的PICC,以SAK作为应答。SAK的编码如表所示。
SAK编码
其中,b3(层叠位)表示UID是否完整,0表示完整,即PICC的UID已被PCD所确认。位1表示还有部分UID CLn(n=2或3)未经确认。RFU全置为0。
3.1.3 防冲突流程
PCD初始化和防冲突流程如下图所示,包括以下步骤:
①PCD指定防冲突命令SEL的代码为93、95或97,分别对应于UID CL1、UID CL2或UID CL3。
②PCD指定NVB的值为‘20’,此值表示PCD不发出UID CLn的任一部分,而迫使所有在场的PICC发回完整的UID CLn作为应答。
③PCD发送SEL和NVB。
④所有在场的PICC发回完整的UID CLn作为应答。
⑤假如多余1张PICC发回应答,则发生了冲突,假如不发生冲突,可跳过6~10。
⑥PCD应认出发生第1个冲突的位置。
⑦PCD指示NVB值说明UID CLn的有效位数目,这些有效位是接收到的UID CLn发生冲突之前的部分,后面再由PCD加一位‘0’或一位‘1’,一般加‘1’。
⑧PCD发送SEL、NVB和有效数据位。
⑨只有这样的PICC,他们的UID CLn部分与PCD发送的有效数据位内容相等,才发送出UID CLn的其余位。
⑩ 假如还有冲突发生,重复6~9。最大循环次数为32.
11 假如没有再发生冲突,PCD指定NVB为‘70’,此值表示PCD将发送完整○
的UID CLn。
12 PCD发送SEL 和NVB,接着发送40位UID CLn,后面是CRC校验码。 ○
13 与40位的UID CLn匹配的PICC,以SAK作为应答。 ○
14 如果UID是完整的,PICC将发送带有层叠为‘0’的SAK,同时从准备状○
态转换到活动状态。
15 如果PCD检查层叠位为‘1’的SAK,将CL加1,并再次进入防冲突循环。 ○
第四章 读卡器系统硬件设计
//
系统硬件电路分为控制电路,读写驱动电路和液晶显示电路等。RFID卡读写设备的基本结构包括以下几个部分(参见图3):
图3
4.1 MCU控制部分
MCU是读写设备的数据处理控制核心。它不仅要控制射频处理模块完成对RFID卡的读写,还要负责通过通信接口与主机或应用系统进行通信以及键盘、显示设备等其他外部设备的控制。单片机选用的是STC11F32是宏晶科技公司生产的单时钟/机器周期(1T)的单片机,是高速、低功耗、具有超强抗干扰能力的新一代8051单片机,指令代码完全兼容传统8051,但速度快8~12倍。内部集成高可靠复位电路,可用在高速通信、智能控制、强干扰等场合;内部有32 KB的Flash、29KB的EEPROM和1 280字节的SRAM;EA、ALE、PSEN和RST引脚可以定义为通用I/O,即4个P4引脚;编程支持ISP下载功能,使用起来比较方便。
4.2 射频部分
射频部分是非接触式IC卡读写器的关键部件,通过该部分与非接触式IC卡进行数据通信。射频部分的主要部件就是射频基站芯片,这里选用的是MFRC522。
MF RC522 是应用于 13.56MHz 非接触式通信中高集成度读写卡系列芯片中的一员。是 NXP 公司针对“三表”应用推出的一款低电压、低成本、体积小的非接触式读写卡芯片,是智能仪表和便携式手持设备研发的较好选择。
MF RC522 利用了先进的调制和解调概念,完全集成了在13.56MHz 下所有类型的被动非接触式通信方式和协议。支持ISO14443A的多层应用。其内部发送器部分可驱动读写器天线与 ISO 14443A/MIFARE?卡和应答机的通信,无需其它的电路。接收器部分提供一个坚固而有效的解调和解码电路,用于处理
ISO14443A 兼容的应答器信号。数字部分处理 ISO14443A 帧和错误检测(奇偶&CRC)。 此外,它还支持快速 CRYPTO1 加密算法, 用于验证 MIFARE 系列产品。 MFRC522支持 MIFARE?更高速的非接触式通信,双向数据传输速率高达 424kbit/s。
作为 13.56MHz 高集成度读写卡系列芯片家族的新成员,MF RC522与 MF RC500 和MF RC530 有不少相似之处,同时也具备诸多特点和差异。它与主机间的通信采用连线较少的串行通信,且可根据不同的用户需求,选取 SPI、I2C 或串行 UART(类似 RS232)模式之一,有利于减少连线,缩小 PCB板体积,降低成本。
? MFRC522支持SPI、I2C、UART接口; ? 64字节发送和接收的FIFO缓存;
? 4页,每页16个寄存器,共64个寄存器;
? 具有硬件掉电、软件掉电、发送掉电三种节电模式; ? 支持 ISO/IEC 14443 TypeA和 MIFARE?通信协议;
4.3 天线设计
天线的作用就是产生磁通量,为卡片提供电源,在读写设备和卡片之间传送信息,天线的有效电磁场范围就是系统的工作区域。
4.4 声音提示及显示部分
非接触式IC卡读写器进行读写 操作时发出提示音,发声的器件选用蜂鸣器,该器件使用方便、价格便宜。单片机的IO口驱动能力有限,不能直接驱动蜂鸣器发声,通过三极管来驱动蜂鸣器。显示部分采用LCD12864液晶显示模块。
第五章 读卡器系统软件驱动程序设计
读卡器硬件必须在软件的控制下进行工作,第四章主要描述读卡器系统软件设计的原理,读卡器和Mifare1卡的通信的流程,系统的初始化、防碰撞、身份验证和读写操作等模块。所有驱动程序是在Philips公司的基准程序基础上进行
的开发,开发环境采用Keil C51.程序的每一部分按模块化设计成一个文件,单独调试通过后,再在Keil C51环境下加入到工程文件中会变成HEX文件,写入STC11F32单片机芯片中进行调试运行。
相对于Philips公司生产的其他14443基站芯片(如RC500、RC530等),RC522简化了内部系统结构,去掉了片内E2PROM。从而大大缩减了芯片命令集。另外,对载波调制电路,发送电路和解调、解码电路的控制也相应简化,去掉了校准接收电路I时钟、Q时钟、校准发送与接收时钟相位等繁琐的操作。一般而言,单片机与RC522的通信流程如图4-1所示。
图4-1
根据RC522和MIFARE卡问传送的控制流数据的不同,通信过程中可能会出现不同的状态。对各种状态须作不同处理,这正是软件系统开发的难度所在。下面给出RC522命令集中2个最基本命令(Tranceive和MFAuthe-nt)执行过程中可能遇到的通信状态及处理。这两个命令分别实现向MIFARE卡发送/接收数据和加密认证功能。实际上,通过它们即可完成对MIFARE卡的所有操作,包括Request、Anticollision、Select、READ、WRITE等。
5.1 RC522命令集的实现
RC522主要的状态指示寄存器包括ComIrqReg、Er-rorReg、Status2Reg和
FIFOLevelReg等。软件处理的思路:通过ComIrgReg得到RC522内部中断状态;由中断判断RC522与MIFARE卡的通信流程信息,从而决定是否进行下一流程处理;若中断指示有错误发生,则需进一步读取ErrorReg的内容,据此返回错误字。
5.1.1 Tranceive命令
Tranceive命令的具体执行过程;读取RC522 FIFO中的所有数据,经基带编码和数字载波调制后通过通信接口以射频形式发送到MIFARE卡;发送完毕后通过通信接口检测有无MIFARE卡发送的射频信号回应,并将收到的信号解调、解码后放入FIFO中。分析以上Ttanceive命令执行过程,可以得到处理该命令的算法流程图,如图4-2所示。
图4-2
为了处理Mifare卡在读卡器产生的电磁场中激励后,未完成处理义从激励
场中拿开的情况,软件中启用了RC522芯片内部的定时器。若超过设定的时间未得到卡片应答,则中止与卡的通信,返回“卡无反应”的错误信息。
从图4-2中可以看出Tranceive命令的核心处理方法:根据相关通信状态指示寄存器的内容返回各种错误状态字,若有位冲突错误,则进一步返回位冲突位置。Tranceive命令不处理面向比特的帧,这种帧只可能在MIFARE卡防冲突循环中出现。为了保持Tranceive命令对各种MI-FARE卡命令的普适性,该命令只完成帧的发送和接收,不对帧信息作处理,所有位冲突处理留在函数外进行。
需要注意的是,Tranceive命令不能自动中止,在任何情况下从该命令返回时必须先执行IDLE指令使RC522转入空闲态。
5.1.2 MFAuthent命令
RC522简化了与MIFARE卡的加密认证操作,用一个MFAuthent命令代替了原来RC500需要的Authentl和Authent2两条命令。MFAuthent命令执行的最终目的在于开启RC522的加密认证单元。该指令执行成功后,RC522芯片与MIFARE卡间的通信信息将首先加密,然后再通过射频接口发送。从本质上讲,MFAuthent是一条变相的Tranceive命令,其算法流程图与图4一致。但RC522芯片内部已经对通信过程中的各种通信状态作了相应处理,且该命令执行完后自动中止,因此用户只须检测定时器状态和错误寄存器状态来判断执行情况。实际上,MFAuthent只可能有一种错误状态(RC522与MI-FARE卡通信帧格式错误),此时该命令不能打开加密认证单元,用户必须重新执行认证操作。
MFAuthent执行过程中RC522将依次从FIFO中读取1字节认证模式、l字节要认证的E2PROM块号、6字节密钥和4字节射频卡UID号等信息,在命令执行前必须保证这12字节数据完整地保存在FIFO中。认证模式有A密钥认证和B密钥认证两种,一般选用A密钥认证。
一次MFAutllent认证只能保证对MIFARE卡的一个扇区中的4个数据块解密,若要操作其他扇区的数据用户还须另外启动对该扇区的认证操作。
5.2 Mifare卡操作程序设计
对Mifare卡的操作分为请求、反碰撞、选择、认证、读、写、增值、减值、存取和传输,对Mifare卡的操作流程图如图所示,具体描述如下:
1请求操作
当有Mifare卡进入读写器天线作用范围内,读写器发出Request命令。卡上的ATR将启动,将卡上的第0扇区的第0块上得卡片类型号(TagType)共2个字节数据发给读写器,建立卡与读写器的第一步通信联络。如果不进行请求操作,接下去的操作无法进行。
请求函数如下:
char PcdRequest(unsigned char data req_code,unsigned char *pTagType) req_mode是输入参数,Request All时输入命令代码52H,Request Idle时输入参数26H.
pTagType是输出,返回2个字节的卡类型号。
操作成功返回值为0 。 2 反碰撞操作
在请求操作之后,要进行的是反碰撞操作,得到一张卡的序列号。当多张Mifare卡同时处于读写器天线作用范围内,读写器与一张Mifare卡进行通信,取得徐序列号。由于Mifare卡的序列号全球唯一,不可能重复,保证下一步只对一张Mifare卡操作。
反碰撞函数如下:
char PcdAnticoll(unsigned char *pSnr)
pSnr是输入,存放序列号(4byte)的内存单元首地址。 操作成功时函数返回值为0. 3卡选择操作
在Mifare卡成功完成请求,反碰撞操作后,进行的操作是卡选择。对指定序列号的卡进行选择操作,选中的卡可以进一步同RC522进行通信,其余的卡恢复到初始状态。
卡选择操作函数:
char PcdSelect(unsigned char *pSnr) pSnr是输入,Mifare卡的序列号。 操作成功时函数返回值为0. 4 认证操作
为了访问Mifare卡的EEPROM存储器中存放的数据,必须进行认证操作。认证的过程从RC522内部开始。用户首先要将正确的密钥放入RC522的密钥缓冲区中,然后比较RC522的密钥缓冲区中存放的密钥与Mifare卡尾块中存放的密钥是否相同,相同可以对Mifare卡进行下一步操作,不相同不允许对Mifare进行下一步操作。
认证的程序流程一般分为三步:(1)为了进行认证操作,密钥必须转化为标准的格式,然后存入RC522的内部密钥缓冲区中,将6字节的未编码的密钥转化成12字节的编码密钥,有米要编码函数char ChangeCodeKey( )实现;(2)讲已转换格式后的密钥送到RC522的FIFO中,有函数char PcdAuthKey( )实现;(3)用存放RC522的FIFO 中得密钥和卡上的密钥进行验证,由函数char PcdAuthState( )完成。
相关函数如下:
Char ChangeCodeKey(unsigned char *pUncode,unsigned char *pCoded ) pUncode 输入函数,6字节未转换的密钥。 pCoded输出函数,12字节转换后的密钥。 Char PcdAuthKey(unsigned char *pKeys) pKeys 输入函数,转换后的密钥。
char PcdAuthState(unsigned char data auth_mode,unsigned char data addr,unsigned char *pKey,unsigned char *pSnr)
auth_mode输入函数,0x60:验证A密钥,0x61:验证B密钥。 以上函数返回值类型均为char。操作正确时返回 0. 5.读操作
经过认证操作,Mifare卡的访问控制条件为允许读时,可以从Mifare卡中读出其EEPROM的值。每次读出16字节一块的数据。
读操作函数:
char PcdRead(unsigned char data addr,unsigned char *pData) 该函数从指定的块中读取16字节的数据。 addr输入块号,取值范围0—63.
pData输出16字节来自Mifare卡的数据。 操作成功返回0. 6 写操作
经过认证,Mifare卡的访问控制条件为允许写时,可以通过写操作将数据写入到Mifare卡的EEPROM中。每次写入16字节一整块数据。
写操作函数:
char PcdWrite(unsigned char data addr,unsigned char *pData) 该函数可以将16字节的数据写入到指定的块中。发送完该命令后等待卡的响应信号,收到响应信号后,MFRC522发送16字节的数据,再次等待响应信号。
addr输入块号,取值范围0—63. pData输入16字节的数据。 操作成功返回0. 7 值操作
当Mifare的块的属性设定为值块时,可以进行值操作,值操作包括增加、减少取值、传输。
增加操作:读取Mifare卡指定块的值,检查值的合法性,增加指定的值,将结果存放到Mifare卡的内部中间寄存器中。
减少操作:读取Mifare卡指定块的值,检查值的合法性,减少指定的值,将结果存放到Mifare卡的内部中间寄存器中。
取值操作:读取Mifare卡指定块的值,检查值的合法性,将值存放到Mifare卡的内部中间寄存器中。
传输操作:将Mifare卡内部中间寄存器的内容传送到Mifare卡的EEPROM中。该函数是在增值操作、简直操作或取值操作后调用的。
值操作函数:char PcdValue(unsigned dd_mode,usigned char addr,unsigned char *pValue)
dd_mode输入选择操作,即PICC_INC事增值操作,PICC_DEC是简直操作,PICC_REST是去值操作。
addr是钱包的绝对值块号,取值范围0-63.
Value输入4字节增(减)值首地址,16进制数,低位在前。函数操作成功返回0.
5.3 软硬件的联合测试运行
所有函数均在一个工程文件中,工程中包含了3个主要C51文件,分别是main.c、rc522和ks0108.c。分别包含了主函数、MF RC522处理函数和显示程序。每个C文件都对应的有一个头文件,头文件里定义了各个C文件中用到的相关参数。整个工程编译成一个HEX二进制代码文件,利用单片机的烧录软件把HEX文件送入STC11F32单片机内部ROM。然后把单片机加电、复位,自动运行程序,把卡靠近读卡器天线,看系统是否获得卡的序列号,如果获得成功,说明系统初始化等工作正常,如果失败则寻找原因,再次调试。
在调试的过程中,一定要仔细分析问题,确保硬件能正常工作时,不断调试程序,直至成功,最终实现了系统初始化、MF RC522初始化、读取序列号、请求应答握手过程、防冲突操作、选择和认证操作、读写操作的整个过程。
总结
在整个系统设计的过程中,通过对文献资料的查阅和相关技术手册的研读,我比较全面的掌握了RFID系统的基本原理和实现方法,特别是对于非接触式IC卡类型的RFID系统。
RFID识别技术作为当前发展迅速,应用日趋广泛的技术形势,正在改变着我们周围的世界,改变着我们的生活方式。研究RFID识别技术是促进识别技术及其应用的必然要求,作为读卡设备为了适应日益丰富的需求,其性能能够以及功能也在不断的进步中。本文的读卡器是具体应用需求的一次尝试,做了以下工作:
对RFID技术原理、能量的传输以及数据的传输、电子标签以及读卡器的构造做了较全面的研究,分析了单片机在RFID读卡器上的优势及可行性。
完成了读写器的软件设计,包括对RC522的基本操作函数的编写、对非接触式IC卡各种操作的程序的编写。
经过整个系统的调试与实验,本文涉及的读写器能够对Mifare 1 S50卡进行寻卡、防碰撞、认证、读写数据、读写值等各种操作,由于天线尺寸的限制,操作距离约为50mm。在此读写器上进行了安全认证机制的设计 以及实验,对于开发安全有效的RFID系统提供可靠的实验平台。
致谢
光阴似箭,岁月如梭,短暂而充实的四年大学生活即将接近尾声。本文是大学四年来最后一个学期的学习任务,伴随着时间的流逝,论文也到了敲定之际,在此,我想表达一下我的感激之情。
在论文完成之际,首先要感谢我的导师潘盛辉老师。本文从前期选题,到整个设计制作过程,到最后论文的完成,都是在导师的细心指导和严格要求下进行的。潘老师学识渊博、治学严谨、思维敏捷。他不仅在学习上给了我很多帮助和启发,而且让我学会做人做事以及做学问的态度和方法,将使我受益终身。再次,向导师表示衷心的感谢和深深地敬意!
同时,我要感谢我们学院给我们授课的各位老师,正是由于他们的传道、授业、解惑,让我学到了许多知识,并从他们身上学到了如何求知治学、如何为人处事。我也要感谢我的母校广西工学院,是她提供了良好的学习环境和生活环境,让我的大学生活丰富多姿,为我的人生留下精彩的一笔。
衷心感谢测控082班的同学们,我们一起学习、一起研究,共同进步,平日里大家关于毕业设计的讨论给了我很多启发,我在此深表谢意;
最后再次向四年来关心和帮助我的老师和同学表示衷心的感谢。
参考文献
[1]赵军辉,射频识别技术与应用,机械工业出版社,2008年5月 [2]周晓光,王晓华,射频识别(RFID)技术原理与应用实例。人民邮电出版社,2006年5月
[3]康东.李勇鹏 射频识别(RFID)核心技术与典型应用开发实例 2008 [4]严光文,张其善;射频识别卡读写模块的设计[J];北京航空航天大学学报;2003年02期
[5] 游战清 ,李苏建 无线射频识别技术(RFID)理论与应用[M].北京:电子工业出版社。2004.
[6] 李朝清.单片机原理及接口技术. 北京航空航天大学出版社.1994 [7] STC11/10xx系列单片机器件手册 2010
[8]慈新新,王苏滨,王硕。无线射频识别(RFID)系统技术与应用。北京:人民邮电出版社,2007.7
[9]郎为民 射频识别
[11]NXP Inc. MFRC522 Contactless Reader IC product data sheet (Rev.3.2) [EB/OL]. 2007. http://www.nxp.com.
[12]
NXP
Inc.Mifare
ISO/IEC
14443
PICC
Selection
(Rev.1.0)[EB/OL].2006.
附录
RC522驱动程序
#include \
void ClearBitMask(unsigned char data reg,unsigned char data mask); void WriteRawRC(unsigned char data Address, unsigned char data value); void SetBitMask(unsigned char data reg,unsigned char data mask); char PcdComMF522(unsigned char data Command, unsigned char *pInData,
unsigned char data InLenByte, unsigned char *pOutData, unsigned int *pOutLenBit);
void CalulateCRC(unsigned char *pIndata,unsigned char data len,unsigned char *pOutData);
unsigned char ReadRawRC(unsigned char data Address); void PcdAntennaOn(void);
void delay_ns(unsigned int data ns) {
unsigned int data i; for(i=0;i nop(); nop(); nop(); } } unsigned char SPIReadByte(void) { unsigned char data SPICount; // Counter used to clock out the data unsigned char data SPIData; SPIData = 0; for (SPICount = 0; SPICount < 8; SPICount++) // Prepare to clock in the data to be read { SPIData <<=1; // Rotate the data CLR_SPI_CK; nop();nop(); // Raise the clock to clock the data out of the MAX7456 if(STU_SPI_MISO) { SPIData|=0x01; } SET_SPI_CK; nop();nop(); // Drop the clock ready for the next bit } // and loop back return (SPIData); // Finally return the read data } void SPIWriteByte(unsigned char data SPIData) { unsigned char data SPICount; // Counter used to clock out the data for (SPICount = 0; SPICount < 8; SPICount++) { if (SPIData & 0x80) { SET_SPI_MOSI; } else { CLR_SPI_MOSI; } nop();nop(); CLR_SPI_CK;nop();nop(); SET_SPI_CK;nop();nop(); SPIData <<= 1; } } ///////////////////////////////////////////////////////////////////// //功 能:寻卡 //参数说明: req_code[IN]:寻卡方式 // 0x52 = 寻感应区内所有符合14443A标准的卡 // 0x26 = 寻未进入休眠状态的卡 // pTagType[OUT]:卡片类型代码 // 0x4400 = Mifare_UltraLight // 0x0400 = Mifare_One(S50) // 0x0200 = Mifare_One(S70) // 0x0800 = Mifare_Pro(X) // 0x4403 = Mifare_DESFire //返 回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// char PcdRequest(unsigned char data req_code,unsigned char *pTagType) { char data status; unsigned int data unLen; unsigned char data ucComMF522Buf[MAXRLEN]; ClearBitMask(Status2Reg,0x08); WriteRawRC(BitFramingReg,0x07); SetBitMask(TxControlReg,0x03); ucComMF522Buf[0] = req_code; status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen); if ((status == MI_OK) && (unLen == 0x10)) { *pTagType = ucComMF522Buf[0]; *(pTagType+1) = ucComMF522Buf[1]; } else { status = MI_ERR; } return status; } ///////////////////////////////////////////////////////////////////// //功 能:防冲撞 //参数说明: pSnr[OUT]:卡片序列号,4字节 //返 回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// char PcdAnticoll(unsigned char *pSnr) { char data status; unsigned char data i,snr_check=0; unsigned int data unLen; unsigned char data ucComMF522Buf[MAXRLEN]; ClearBitMask(Status2Reg,0x08); WriteRawRC(BitFramingReg,0x00); ClearBitMask(CollReg,0x80); ucComMF522Buf[0] = PICC_ANTICOLL1; ucComMF522Buf[1] = 0x20; status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen); if (status == MI_OK) { for (i=0; i<4; i++) { *(pSnr+i) = ucComMF522Buf[i]; snr_check ^= ucComMF522Buf[i]; } if (snr_check != ucComMF522Buf[i]) { status = MI_ERR; } } SetBitMask(CollReg,0x80); return status; } ///////////////////////////////////////////////////////////////////// //功 能:选定卡片 //参数说明: pSnr[IN]:卡片序列号,4字节 //返 回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// char PcdSelect(unsigned char *pSnr) { char data status; unsigned char data i; unsigned int data unLen; unsigned char data ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] = PICC_ANTICOLL1; ucComMF522Buf[1] = 0x70; ucComMF522Buf[6] = 0; for (i=0; i<4; i++) { ucComMF522Buf[i+2] = *(pSnr+i); ucComMF522Buf[6] ^= *(pSnr+i); } CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]); ClearBitMask(Status2Reg,0x08); status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen); if ((status == MI_OK) && (unLen == 0x18)) { status = MI_OK; } else { status = MI_ERR; } return status; } ///////////////////////////////////////////////////////////////////// //功 能:验证卡片密码 //参数说明: auth_mode[IN]: 密码验证模式 // 0x60 = 验证A密钥 // 0x61 = 验证B密钥 // addr[IN]:块地址 // pKey[IN]:密码 // pSnr[IN]:卡片序列号,4字节 //返 回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// char PcdAuthState(unsigned char data auth_mode,unsigned char data addr,unsigned char *pKey,unsigned char *pSnr) { char data status; unsigned int data unLen; unsigned char data i,ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] = auth_mode; ucComMF522Buf[1] = addr; for (i=0; i<6; i++) { ucComMF522Buf[i+2] = *(pKey+i); } for (i=0; i<6; i++) { ucComMF522Buf[i+8] = *(pSnr+i); } // memcpy(&ucComMF522Buf[2], pKey, 6); // memcpy(&ucComMF522Buf[8], pSnr, 4); status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen); if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08))) { status = MI_ERR; } return status; } ///////////////////////////////////////////////////////////////////// //功 能:读取M1卡一块数据 //参数说明: addr[IN]:块地址 // pData[OUT]:读出的数据,16字节 //返 回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// char PcdRead(unsigned char data addr,unsigned char *pData) { char data status; unsigned int data unLen; unsigned char data i,ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] = PICC_READ; ucComMF522Buf[1] = addr; CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]); status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen); if ((status == MI_OK) && (unLen == 0x90)) // { memcpy(pData, ucComMF522Buf, 16); } { for (i=0; i<16; i++) { *(pData+i) = ucComMF522Buf[i]; } } else { status = MI_ERR; } return status; } ///////////////////////////////////////////////////////////////////// //功 能:写数据到M1卡一块 //参数说明: addr[IN]:块地址 // pData[IN]:写入的数据,16字节 //返 回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// char PcdWrite(unsigned char data addr,unsigned char *pData) { char data status; unsigned int data unLen; unsigned char data i,ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] = PICC_WRITE; ucComMF522Buf[1] = addr; CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]); status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen); if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)) { status = MI_ERR; } if (status == MI_OK) { //memcpy(ucComMF522Buf, pData, 16); for (i=0; i<16; i++) { ucComMF522Buf[i] = *(pData+i); } CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]); status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen); if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)) { status = MI_ERR; } } return status; } ///////////////////////////////////////////////////////////////////// //功 能:命令卡片进入休眠状态 //返 回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// char PcdHalt(void) { char data status; unsigned int data unLen; unsigned char data ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] = PICC_HALT; ucComMF522Buf[1] = 0; CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]); status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen); return MI_OK; } ///////////////////////////////////////////////////////////////////// //用MF522计算CRC16函数 ///////////////////////////////////////////////////////////////////// void CalulateCRC(unsigned char *pIndata,unsigned char data len,unsigned char *pOutData) { unsigned char data i,n; ClearBitMask(DivIrqReg,0x04); WriteRawRC(CommandReg,PCD_IDLE); SetBitMask(FIFOLevelReg,0x80); for (i=0; i { WriteRawRC(FIFODataReg, *(pIndata+i)); } WriteRawRC(CommandReg, PCD_CALCCRC); i = 0xFF; do { n = ReadRawRC(DivIrqReg); i--; } while ((i!=0) && !(n&0x04)); pOutData[0] = ReadRawRC(CRCResultRegL); pOutData[1] = ReadRawRC(CRCResultRegM); } ///////////////////////////////////////////////////////////////////// //功 能:复位RC522 //返 回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// char PcdReset(void) { //PORTD|=(1< //PORTD&=~(1< //PORTD|=(1< WriteRawRC(CommandReg,PCD_RESETPHASE); delay_ns(10); WriteRawRC(ModeReg,0x3D); //和Mifare卡通讯,CRC初始值0x6363 WriteRawRC(TReloadRegL,30); WriteRawRC(TReloadRegH,0); WriteRawRC(TModeReg,0x8D); WriteRawRC(TPrescalerReg,0x3E); WriteRawRC(TxAutoReg,0x40);//必须要 return MI_OK; } ////////////////////////////////////////////////////////////////////// //设置RC632的工作方式 ////////////////////////////////////////////////////////////////////// char M500PcdConfigISOType(unsigned char data type) { if (type == 'A') //ISO14443_A { ClearBitMask(Status2Reg,0x08); WriteRawRC(ModeReg,0x3D);//3F WriteRawRC(RxSelReg,0x86);//84 WriteRawRC(RFCfgReg,0x7F); //4F WriteRawRC(TReloadRegL,30);//tmoLength);// TReloadVal = =tmoLength(dec) WriteRawRC(TReloadRegH,0); WriteRawRC(TModeReg,0x8D); WriteRawRC(TPrescalerReg,0x3E); delay_ns(1000); PcdAntennaOn(); } else{ return -1; } return MI_OK; } ///////////////////////////////////////////////////////////////////// //功 能:读RC632寄存器 //参数说明:Address[IN]:寄存器地址 //返 回:读出的值 ///////////////////////////////////////////////////////////////////// unsigned char ReadRawRC(unsigned char data Address) { unsigned char data ucAddr; unsigned char data ucResult=0; CLR_SPI_CS; ucAddr = ((Address<<1)&0x7E)|0x80; 'h6a SPIWriteByte(ucAddr); ucResult=SPIReadByte(); SET_SPI_CS; return ucResult; } ///////////////////////////////////////////////////////////////////// //功 能:写RC632寄存器 //参数说明:Address[IN]:寄存器地址 // value[IN]:写入的值 ///////////////////////////////////////////////////////////////////// void WriteRawRC(unsigned char data Address, unsigned char data value) { unsigned char data ucAddr; CLR_SPI_CS; ucAddr = ((Address<<1)&0x7E); SPIWriteByte(ucAddr); SPIWriteByte(value); SET_SPI_CS; } ///////////////////////////////////////////////////////////////////// //功 能:置RC522寄存器位 //参数说明:reg[IN]:寄存器地址 // mask[IN]:置位值 ///////////////////////////////////////////////////////////////////// void SetBitMask(unsigned char data reg,unsigned char data mask) { char data tmp = 0x0; tmp = ReadRawRC(reg); WriteRawRC(reg,tmp | mask); // set bit mask } ///////////////////////////////////////////////////////////////////// //功 能:清RC522寄存器位 //参数说明:reg[IN]:寄存器地址 // mask[IN]:清位值 ///////////////////////////////////////////////////////////////////// void ClearBitMask(unsigned char data reg,unsigned char data mask) { char data tmp = 0x0; tmp = ReadRawRC(reg); WriteRawRC(reg, tmp & ~mask); // clear bit mask } ///////////////////////////////////////////////////////////////////// //功 能:通过RC522和ISO14443卡通讯 //参数说明:Command[IN]:RC522命令字 // pInData[IN]:通过RC522发送到卡片的数据 // InLenByte[IN]:发送数据的字节长度 // pOutData[OUT]:接收到的卡片返回数据 // *pOutLenBit[OUT]:返回数据的位长度 ///////////////////////////////////////////////////////////////////// char PcdComMF522(unsigned char data Command, unsigned char *pInData, unsigned char data InLenByte, unsigned char *pOutData, unsigned int *pOutLenBit) { char data status = MI_ERR; unsigned char data irqEn = 0x00; unsigned char data waitFor = 0x00; unsigned char data lastBits; unsigned char data n; unsigned int data i; switch (Command) { case PCD_AUTHENT: irqEn = 0x12; waitFor = 0x10; break; case PCD_TRANSCEIVE: irqEn = 0x77; waitFor = 0x30; break; default: break; } WriteRawRC(ComIEnReg,irqEn|0x80); ClearBitMask(ComIrqReg,0x80); WriteRawRC(CommandReg,PCD_IDLE); SetBitMask(FIFOLevelReg,0x80); for (i=0; i { WriteRawRC(FIFODataReg, pInData[i]); } WriteRawRC(CommandReg, Command); if (Command == PCD_TRANSCEIVE) { SetBitMask(BitFramingReg,0x80); } //i = 600;//根据时钟频率调整,操作M1卡最大等待时间25ms i = 2000; do { n = ReadRawRC(ComIrqReg); i--; } while ((i!=0) && !(n&0x01) && !(n&waitFor)); ClearBitMask(BitFramingReg,0x80); if (i!=0) { if(!(ReadRawRC(ErrorReg)&0x1B)) { status = MI_OK; if (n & irqEn & 0x01) { status = MI_NOTAGERR; } if (Command == PCD_TRANSCEIVE) { n = ReadRawRC(FIFOLevelReg); lastBits = ReadRawRC(ControlReg) & 0x07; if (lastBits) { *pOutLenBit = (n-1)*8 + lastBits; } else { *pOutLenBit = n*8; } if (n == 0) { n = 1; } if (n > MAXRLEN) { n = MAXRLEN; } for (i=0; i { pOutData[i] = ReadRawRC(FIFODataReg); } } } else { status = MI_ERR; } } SetBitMask(ControlReg,0x80); // stop timer now WriteRawRC(CommandReg,PCD_IDLE); return status; } ///////////////////////////////////////////////////////////////////// //开启天线 //每次启动或关闭天险发射之间应至少有1ms的间隔 ///////////////////////////////////////////////////////////////////// void PcdAntennaOn(void) { unsigned char data i; i = ReadRawRC(TxControlReg); if (!(i & 0x03)) { SetBitMask(TxControlReg, 0x03); } } ///////////////////////////////////////////////////////////////////// //关闭天线 ///////////////////////////////////////////////////////////////////// void PcdAntennaOff(void) { ClearBitMask(TxControlReg, 0x03); } ///////////////////////////////////////////////////////////////////// //功 能:扣款和充值 //参数说明: dd_mode[IN]:命令字 // 0xC0 = 扣款 // 0xC1 = 充值 // addr[IN]:钱包地址 // pValue[IN]:4字节增(减)值,低位在前 //返 回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// /*char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue) { char status; unsigned int unLen; unsigned char ucComMF522Buf[MAXRLEN]; //unsigned char i; ucComMF522Buf[0] = dd_mode; ucComMF522Buf[1] = addr; CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]); status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen); if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)) { status = MI_ERR; } if (status == MI_OK) { memcpy(ucComMF522Buf, pValue, 4); //for (i=0; i<16; i++) //{ ucComMF522Buf[i] = *(pValue+i); } CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]); unLen = 0; status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen); if (status != MI_ERR) { status = MI_OK; } } if (status == MI_OK) { ucComMF522Buf[0] = PICC_TRANSFER; ucComMF522Buf[1] = addr; CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]); status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen); if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)) { status = MI_ERR; } } return status; }*/ ///////////////////////////////////////////////////////////////////// //功 能:备份钱包 //参数说明: sourceaddr[IN]:源地址 // goaladdr[IN]:目标地址 //返 回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// /*char PcdBakValue(unsigned char sourceaddr, unsigned char goaladdr) { char status; unsigned int unLen; unsigned char ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] = PICC_RESTORE; ucComMF522Buf[1] = sourceaddr; CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]); status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen); if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)) { status = MI_ERR; } if (status == MI_OK) { ucComMF522Buf[0] = 0; ucComMF522Buf[1] = 0; ucComMF522Buf[2] = 0; ucComMF522Buf[3] = 0; CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]); status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen); if (status != MI_ERR) { status = MI_OK; } } if (status != MI_OK) { return MI_ERR; } ucComMF522Buf[0] = PICC_TRANSFER; ucComMF522Buf[1] = goaladdr; CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]); status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen); if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)) { status = MI_ERR; } return status; }*/
正在阅读:
基于单片机的RFID读写器设计01-02
家庭社会工作论文07-08
小学四年级上册第一单元作文写作指导02-28
大学英语一课本翻译题答案09-05
行政案例分析范文02-17
药理学 离线作业2 - 图文09-17
身边的小能人作文500字07-09
共享单车作文700字06-19
Ch04市场营销调研与预测07-26
新外研版英语八年级下M5练习题06-09
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 读写器
- 单片机
- 基于
- 设计
- RFID
- 新媒体时代大学生思想政治教育的创新
- STC15W4K32S4-PWM-2014-8-11
- 静电敏感区域的人员防静电安全技术规范
- 广东省化州市实验中学高中化学第四章421糖类学案 新人教版选修5
- 监利县2011年政府工作报告
- 医学影像学 呼吸系统 复习题
- 热工测量及仪表2009(A)最新修改 - 图文
- Linux0.12内存管理学习笔记
- 环境监测综合评价试题集
- 语文西师版小学二年级下册《花孩子》原文
- 超星泛雅网课社会学与中国社会答案
- 外交部翻译眼中的中国领导人
- 对建筑工程施工监理问题的思考
- 氧气瓶安全操作规程
- 五官科护理的心得体会
- 面试指导:智能型问题应答最佳方案4
- 幼儿园教案小班
- 肺癌肝转移会有什么症状
- 三年级科学期末上册测试题
- 女环卫工作先进事迹材料