非接触式IC卡读写器设计论文

2022-08-18 09:51:29   文档大全网     [ 字体: ] [ 阅读: ]

#文档大全网# 导语】以下是®文档大全网的小编为您整理的《非接触式IC卡读写器设计论文》,欢迎阅读!
读写器,非接触式,论文,设计




2008届毕业生



: 非接触式IC卡读写器设计



院系名称: 专业班级: 学生姓名: 号: 指导教师: 教师职称:



2011 05 10








本文介绍了以AT89S52单片机作为微控制器,以射频技术为核心,基于PHILIPS公司MF-RC500模块的非接触式IC卡读写器,阐述了该系统的组成、工作原理以及相应的软硬件设计

本文阐述了非接触式IC卡技术的基本原理,并对其读卡器在工程上的设计和开发作了研究。论文描述了IC卡系统的发展和现状,通过对射频识别技术原理的研究揭示了射频IC卡系统的工作原理。介绍了Type A 型常用的卡片MF1 IC S50和对应读卡器的设计方法和电路 (使用专用射频读卡集成芯片RC500)并详细阐述了系统各个模块的组成和原理,给出了天线的设计规范然后根据课题要求详细介绍了自主设计的一款Type A 型读卡器的核心部件射频模块的实现方案和具体电路。最后介绍了系统设计软件部分,重点介绍了RC500的主要特性、基本指令集以及与Mifare1非接触IC卡数据通信的一些重要模块的编程思路和编程方法,给出了两个编程实例。实际测试证明该读写器完成了基本功能,运行稳定。

关键词微控制器;非接触式IC卡;读写器;MF-RC500;射频识别



I




Title Design of Reader for Contactless IC Card



Abstract

With micro-computer AT89S52 as controller, the radio frequency technology as core, this paper describes the system’s compositionwork principle and design of hardware and software of contactless IC card read-write device base on MF-RC500 of PHILIPS Company .

This paper introduces the basic principle of the contactless IC card technology and the application of IC card reader. First the paper describes the development and the status quo of the IC cards system. Then the work principle of the radio frequency IC card system is discovered through studying the principium of the radio frequency technology. Whereafter, the paper introduces the card MF1 IC S50 what is usually used in the cards of Type A, the design method and the circuit of the card reader device (the device use the radio frequence chip reader module RC500), and in detail analyzes the principle of every module, simply Points to the design rules of the antenna circuit. Then, the paper in detail introduces the implement project about circuit and program of the kemel components of a Type A IC cards reader, the RF module, what is completely made by do-it-yourself. In the end, the paper introduces the software of the system, and the main property and basic intruction set of a contactless IC card reader RC500 based on Philips’MIFARE1 are introduced. And some ideals and methods of programme about the basilic module with data communication between the cards and RC500 are presented. Finally the two examples of programme are given. The Read-Write Device is stabilized through test.

Keywords: MCUContactless IC CardRead-Write DeviceMF-RC500Radio

Frequency Identification





II








1 绪论 .......................................................................................................................................... 1 1.1 课题研究背景和意义 .................................................................................................... 1 1.2 目前国内外研究现状 ........................................................................................................ 2 1.3 本课题设计的主要工作和任务 ...................................................................................... 3 2 读卡器系统方案设计与实现 ............................................................................................. 4 2.1 IC卡介绍 .............................................................................................................................. 4 2.2 读卡器基本原理.................................................................................................................. 4 2.3 总体方案论证 ...................................................................................................................... 5 3 系统硬件设计与实现........................................................................................................... 8 3.1 电源模块 ............................................................................................................................... 8 3.2 人机接口模块 ...................................................................................................................... 8 3.3 系统时钟模块 ...................................................................................................................... 9 3.4 存储模块 ............................................................................................................................. 10 3.5 MF-RC500读写模块 ....................................................................................................... 11 3.6 通信模块 ............................................................................................................................. 17 4 系统软件设计与实现......................................................................................................... 19 4.1 软件设计环境 .................................................................................................................... 19 4.2 主程序的设计 .................................................................................................................... 19 4.3 /写卡程序设计 ............................................................................................................. 20 4.4 读卡器外围基本电路程序的设计 ................................................................................ 24 4.5 通信部分程序设计 ........................................................................................................... 28 5 系统调试 ............................................................................................................................... 29 ........................................................................................................................................... 30 ........................................................................................................................................... 31 ............................................................................................................................... 32 附录A 电路 ....................................................................................................................... 33 附录B /写卡源程序 ............................................................................................................ 33

III


1 绪论

1.1 课题研究背景和意义

IC卡是集成电路(Integrated Circuit Card)的英文简称,在有些国家也称之为智能卡、微芯片卡等,IC卡是在较为原始的磁卡的基础上发展起来的,它的最初设想是由日本人提出来的。196912月,日本的有村国孝提出一种制造安全可靠的信用卡方法,并于1970年获得专利,那时叫ID(Identification Card)1974年,法国的罗兰·莫雷诺(Roland Moreno)发明了带集成电路芯片的塑料卡片,并取得了专利权,这就是早期的IC卡。1976年法国布尔(Bull)公司研制出世界第一枚IC[1]

早期的IC卡系统是接触式的,它有其本身不可克服的缺点,如接触磨损、交易速率慢、难以维护、基础设施投入大等。随着信息业和服务业的全球化,在一些场合,信息载体的便携性、安全性及易用性等方面提出更高的要求,于是非接触式IC卡以其无机械磨损、容易维护、方便使用等优点,成为IC卡中潜力最大的新军而备受国内外业界的瞩目。

非接触式IC卡系统是当今世界先进的射频技术和IC卡技术相结合的产物,是世界上最近几年发展起来的一项新技术,它成功地将射频识别技术和IC技术结合起来,解决了无源和免接触这一难题,电子器件领域的一大突破,使卡片在靠近读写器表面时即可完成卡中数据的读写操作。非接触式IC卡一经问世,便立即引起广泛的关注。非接触式IC卡操作方便、抗干扰性高、可靠性高、安全性高的特点,使得它在一些接触式IC卡不适用或者无法使用的场所,具有无可比拟的优势,被广泛应用于公交、收费、门禁系统、考勤系统等领域[2]

目前非接触式IC卡有很多不同的标准,如IS014443AIS014443B等,符合不同标准的卡片在不同的领域内相互渗透和竞争。卡片类型的多样性决定了读卡器的多样性,市场的多样性则决定了即使是同类型的应用也可能使用不同类型的卡片,若读卡器只能读取某一种类型的卡片,那么在处理这个应用时,将需要多台读卡器,造成资源的重复浪费,这样的读卡器必将不能适应市场的需求,这就对读卡器的读卡能力提出了更高的要求。设计出一种能读取多种类型卡片的读卡器,既是市场应用的需求,也是未来的发展趋势。目前,读卡器已经开始大量应用于各种“一卡通”系统中,这些应用对读卡器的功能要求越来越高,



1


除了传统的对卡号的读取之外,需要能够对卡片进行更高层的数据操作,与PC设备之间能进行信息交流。为了适应这种发展趋势,非接触式IC卡的读卡器的开发与设计也迅速发展起来[3]

1.2 目前国内外研究现状

智能卡的发展历史并不久远,而且全球各地发展不均衡,其中欧洲发展得最早、最好。智能IC卡源于七十年代的欧洲和日本,后来由法国人提出的将处理器置入IC卡卡片中的思想得到了广泛接受,由于其具有完善的密码功能从而有效的解决了智能卡的舞弊行为。随后智能卡在1977-1998年间得到了迅速发展。九十年代初期,智能卡开始应用GSM数字移动通讯、有线电视的收费等领域。在美国,智能卡发展相对迟缓,但随着智能卡在欧洲的成功使用,其在美国产生巨大影响,尽管如此,美国在智能卡技术等领域仍处于世界领先地位。

Innovation国际发明组织统计,200510月到20069月全世界IC硬件产业中,IC卡及其读写设备数量分别为42000万张和877000台,其中法国分别占98%71%,处于世界领先地位。目前,法国生产制造的IC卡不仅在数量上领先各国,其应用领域也灵活多样,如在金融、电信、医疗和交通运输等各个领域都有IC卡的应用,其中电子金融卡等己经达到经济生产规模。

我国对IC卡行业的发展始于1994年,当时的中央领导特别是江泽民同志高度重视IC卡行业,高瞻远瞩,指示要发展我国自己的IC卡事业,建立金卡工。虽然至今也只有短短的十几年左右时间,但是己经取得了不小的成就。我国自1994年实施金卡工程以来,推动了金融电子化、商业和流通领域电子的步伐,使我国银行业务得到迅速发展,并逐渐波及医疗、交通、社会保险、税务等领域。在我国,智能卡在各种应用领域全面开花,目前超过10个政府部门和行业推广应用了智能卡。近年来,我国的发卡量年增长率达到30%40%,成为世界智能卡应用发展最快的国家之一[4]

目前在我国,随着金卡工程建设的不断深入发展,IC卡系统已在众多领域获得广泛应用并取得了初步的社会效益。随着政府管理和支持力度的加大、术研发水平的提升IC市场竞争格局将发生深刻的变化。随着政府智能卡项目的启动,国内企业技术实力和工艺流程的优化,使得国外品牌市场份额受到很大程度的限制,而国内品牌将会有快速的发展。今后的几年,是我国IC卡系统



2


应用向纵深发展的时期。我国IC卡系统市场格局必将由无序走向有序,市场争必将由有限走向无限,IC卡系统市场将逐步走向成熟。但是对于尖端的CPU卡及非接触式IC智能射频卡的制卡技术及其相应的读/写卡设备技术,仍处于落后状态。这极大地制约了IC卡行业的发展,特别是在要求有极高安全性和保密性的金融行业中,制约了我国金卡工程的实施和发展。设计和开发出更好的读卡设备,对加快我国IC卡行业的发展,特别是尖端的CPU卡及非接触式IC智能射频卡的推广应用,有着重大的意义[5]

1.3 本课题设计的主要工作和任务

非接触式IC卡代表了IC卡发展的方向,同接触式IC卡相比其独有的优点使其能够在绝大多数场合代替接触式IC卡的使用,而在非接触式IC 应用统中非接触式IC卡读卡器是关键设备。根据课题设计要求,本课题将开发一种基于飞利浦公司MF-RC500读卡芯片的非接触式IC卡读卡器,其具有以下特点:能识别TYPEA型卡片,读取卡号,并有防冲突功能;能对TYPEA 的卡片进行高层操作;可以使用RS232通信接口输出来与上位机之间通信;可根据实际需求将其作为门禁系统中的读卡器,或者一卡通系统中的读卡器。设计完成后所要达到的主要指标有:

(1) 显示系统:液晶屏显示,能显示系统时钟和卡片信息等; (2) 按键操作:能实现对系统的设置和卡上数据的操作;

(3) 机器读卡速度:0.5秒可完成一次打卡过程,读卡距离为510厘米; (4) 保密性和防伪性:能辨认卡的密码,非授权范围内的卡作报警处理; (5) 存储容量:每台读写器最多可存储2000条记录。 设计中需要解决的若干关键技术有: (1) 射频识别技术; (2) 软件的安全机制;

(3) 由于射频的特殊性给系统调试带来的困难。

该读写器完成以后,既可独立使用,完成基本功能,外扩简单接口后,就能构成IC卡考勤、门禁、售饭一卡通等系统,在公交、校园、娱乐场所等方面有广泛的应用前景。



3


2 读卡器系统方案设计与实现

2.1 IC卡介绍

目前经常接触到的IC卡有两种:接触式和非接触式的IC卡。接触式的IC卡通机械触点从读写器获取能量和交换数据;非接触式IC卡通过线圈射频感应从读写器获取能量和交换数据,所以又称射频卡。日前在社会上常见的是接触IC卡,它具有存储量大,可实现一卡多用等功能。但是,这类卡的读写操作速度较慢,操作也不方便,每次读写时必须把卡插入到读写器中才能完成数据交换,这样在读写卡片频繁的场合就很不方便,而且读写器的触点和卡片上IC的触脚暴露在外,容易损坏和搞脏而造成接触不良。

非接触式智能卡又称射频卡,是近几年发展起来的新技术。它是根据射频电磁感应原理产生的,它的操作只需将卡放在读写器一定距离内就能实现数据交换。它成功地将射频识别技术和IC卡技术结合起来,将具有微处理器的集成电路芯片和天线封装于塑料基片之中。读写器采用兆频段及磁感应技术,通过无线方式对卡片中的信息进行读写并采用高速率的半双工通信协议其优点是应用围广、操作方便。因此,在公交、门禁、娱乐场所等方面有广泛的应用前景。目前我国引进的射频卡主要以PHILIPS公司的MIFARE卡为主[6]

本系统在调试过程中使用的是PHILIPS公司的MFI IC S50其属于TYPEA型卡,下面对其做一些简述:Mifare1 IC 卡的核心是PHILIPS公司MF1 IC S50系列微模块,它确定了卡片的特性以及卡片读写器的诸多性能。Mifare1 IC智能卡内建有高速的MCU卡片上除了IC微晶片及一副高效率天线外,无任何其他元件;卡片上无源,工作时的电源能量由读写器天线发送无线电载波信号耦合到卡片上天线而产生电能;它与读写器通信使用握手式半双工通信协议

2.2 读卡器基本原理

非接触式IC卡读写器以射频识别技术为核心,读写器内主要使用专用的读写处理芯片,它是读/写操作的核心器件,其功能包括调制、解调、产生射频信号、安全管理和防碰撞机制。其内部结构分为射频区和接口区:射频区内含调制解调器和电源供电电路直接与天线连接;接口区有与单片机相连的端口,还具有与射频区相连的收/发器、数据缓冲器、防碰撞模块和控制单元。这是与智能

4


IC卡实现无线通信的核心模块,也是读写器读写智能IC卡的关键接口芯片。写器工作时,不断地向外发出一组固定频率的电磁波,当有卡靠近时,卡片内有一个LG串联谐振电路,其频率与读写器的发射频率相同,这样在电磁波的激励下,LG谐振电路产生共振,从而使电容充电有了电荷。在这个电容另一端,接有一个单向导电的电子泵,将电容内的电荷送到另一个电容内存储。当电容器充电达到一定电压值时,此电容就作为电源为卡片上的其他电路提供工作电压,卡内数据发射出去或接收读写器发出的数据与保存[7]。读卡器的工作过程如下:

(1) 读卡器将载波信号经天线向外发送;

(2) 卡进入读卡器的工作区域后,卡内天线和电容组成的谐振回路接收读卡器发射的载波信号,射频接口模块将其转换成电源电压、复位信号,使卡片激活;

(3) 存取控制模块将存储器中信息调制到载波上,经卡上天线送给读卡器; (4) 读卡器对接收到的信号进行解调、解码后送至后台计算机

(5) 后台计算机根据卡号的合法性,针对不同应用做出相应的处理和控制。

2.3 总体方案论证

2.3.1 各模块方案选择与论证

(1)控制器的选择

方案一:采用ATMEL公司的AT89S52作为系统的控制器。AT89S52单片机算术运算功能强、软件编程灵活、自由度大,可用软件编程实现各种算法和逻辑控制,并且由于其功耗低、体积小、技术成熟和成本低等特点,使其在各个领应用广泛。AT89S52是我们熟悉的控制器,编程比较熟悉,易于掌握。

方案二:采用FPGA(现场可编程门阵列)作为系统的控制器。由于本设计对数据处理的速度要求不高,FPGA的高速处理优势得不到充分的体现,并且由于集成度高,使其成本偏高,同时由于芯片的引脚较多,实物硬件电路板布线复杂,加重了电路设计和实际焊接的工作。由于AT89S52控制器能够很好的实现该系统的各项功能,成本低,技术成熟,故采用方案一。

(2)RFID读卡芯片的选择

随着RFID市场的迅猛增长,各大传统IC芯片制造商都加入到RFID读卡芯片的开发当中,可供选择的芯片很多,下面介绍几款主流的RFID读写芯片:

1) TI公司的TRF7960芯片。TRF7960是一个整合的13.56MHz RFID读卡



5


器系统的模拟前端和数据帧系统,可以用于较宽范围的近耦合RFID系统。它的特点是完全整合协议处理,内部独立的模拟与数字电源,AMPM双信号输入接收解调,读卡器与读卡器之间反冲突算法,输出功率可调,内建带通滤波器并且用户可选择边界频率,低功耗设计掉电模式下电流小于A激活状态10mA与微处理器接口为8位并行接口或者4线SPI接口[8]

2) NXP公司(原飞利浦半导体公司)是较早进入RFID芯片行业的国际半导体公司,在射频读写芯片上产品较全。MF-RC500芯片就是NXP公司生产的。MF-RC500是高整合的13.56MHz非接触IC卡读写芯片,整合了所有主动非接通信方式和协议MF-RC500支持ISO 14443A&B的所有层的通信方案;内部收发器部分能够驱动近耦合设计的天线而不需要另外的电路数字部分能处理完整的ISO14443帧数据还有错误检测;具有合适的并行接口,可以直接与8位的微处理器相连,并且支持SPI兼容接口。

由于MF-RC500能够满足设计需求,而且应用范围比其他的芯片更广,资料齐备,于是选择MF-RC500作为本设计的射频接口芯片。

(3)显示模块的选择

方案一:使用LED显示。数码管显示,对外界环境要求低,操作简单,但需要采用动态扫描,占用资源比较多,而且其不能很好的显示字符,由于本系统要显示的信息量较多,所以虽然该方案在程序上容易实现,但并不能满足要求。

方案二:使用液晶显示屏显示各种信息液晶显示屏具有轻薄短小、低耗电量、平面直角显示以及影像稳定不闪烁等优势,并且符合本系统显示信息量多的需求,利用LCD自带的字符库,进行编程就可以实现所需信息的显示,其不必利用控制芯片创建字符库,既节省了资源,又省去了该部分的大量编程任务。了使人机界面更加友好,操作更加方便,采用LCD液晶显示。

(4)键盘模块的选择

方案一:采用独立式按键。独立式按键接口设计优点是电路的配置灵活,件实现简单。但缺点也很明显,每个按键需要占用一跟口线,若按键较多,资源浪费将比较严重。因此本方法主要用于按键较少或对操作速度要求较高的场合。

方案二:采用矩阵式按键。矩阵式按键接口适用于按键数量较多,又不想使用专用键盘芯片的场合。这种方式的按键接口由行线和列线组成,按键位于行、

6


列的交叉点上。这种方的优点是可以节省很多I/O资源,相对于专用键盘可以节省成本,且更为灵活。缺点是需要用软件处理消抖、重键等。由于该系统要求具有对卡片进行读/写操作,系统时钟的设置等,用到的按键较多,故采用方案二。

(5)系统时钟和存储芯片的选择

刷卡时要记录刷卡的时间,用外接硬件时钟芯片的办法,为系统提供一个准确可靠的时钟,用3V备用电池保证在系统掉电时也能正常走时。在此选用体积小、接口简单的实时时钟芯片DS1302。它是美国Dallas公司推出的低功耗串行通信接口专用芯片,采用3线串行方式与单片机进行数据通信[9]

采用AT24C64作数据存储器。AT24C64是串行E2PROM存储器,支持I2C总线数据传输协议8K存储器容量,用两根线与CPU构成串行接口。由于本设计采用的AT89S52单片机不具备I2C总线接口,因此采用软件法加以解决。 2.3.2 总体方案确定

根据上述分析,系统设计方案如下:本IC卡读写器拟以ATMEL公司的AT89S52单片机作为微控制器,采用MF-RC500芯片作为射频卡读/写模块,采DS1302作为系统时钟,以AT24C64作为不掉电存储器,采用LCD显示,并RS232接口和计算机通信组成一套功能齐全的非接触IC卡读写系统。IC卡在天线区域经过时,单片机自动需求对IC卡进行读写,再把读/写卡的时间一起存到存储器中,计算机可以通过串口把相关读/写卡信息读到计算机上,再进行统计、报表和打印输出等。系统框图如图2.1所示。

射频芯片MF-RC500

键盘及其接口电路

系统时钟模块LCD显示电路

AT89S52

E2PROM存储模块

报警电路

看门狗及复位电路RS232接口电路

电源模块



2.1 IC卡读写器系统结构框图

7


3 系统硬件设计与实现

3.1 电源模块

该电源按常规设计,为系统工作提供所需电源,其输入为220V50Hz交流电,输出电压等级为±5V电路原理图如图3.1所示。该部分主要采用78系列稳压器,结构简单,调整方便,输出电压纹波小。当所需电流超过稳压器标定值时,可采用外接功率管的方法来扩大输出电流。市电交流220V经变压器降压为交流6V,经过全桥整流输出直流电流,再经过1000μF的电解电容滤波,除去整流后的交流成分,送至各三端稳压器,输出需要的电压。经过各三端稳压器稳压后,LM7805输出端输出+5V直流电压,LM7905输出的端输出-5V直流电压[10]

Port1

LM78051

GND

VinVout

3

1

T0

220V

C1

1000μF

4

2

C5220μF

BRIDGE1

3

C2

1000μF

2

12

GND

C6220μF

Vout

3

VinLM7905

Port2



3.1 ±5V直流稳压电源

3.2 人机接口模块

本系统的人机接口部分采用LCD显示、2矩阵式键盘,用来实现对IC 的操作和系统设置等功能。LCD型号为ACM1602A,该字符型液晶显示模块由字符型液晶显示屏,具有字符发生器ROM可显示192种字符,有64个字节的自定义字符RAM,可自定义858点阵字符或四个511点阵字符。

在此系统中采用LCD分屏显示,每一屏第一行的首地址是80H,第二行的首地址是0C0H;每行写入16个字节,每屏写入二行(第一行为系统的时间,第二行为卡片的信息ACM1602A集成度高,其内部已经带有驱动电路,所以不用再为其设计驱动电路,由于1602是一个并口器件所以占用单片机的接口资

3

4

源较多,为节省单片机接口资源使用了一个74HC595进行串口转并口,使1602



8


与单片机进行间接连接,LCD与单片机的连结图如图3.2所示。

VCC

U1

R5

R6

12345678

VCC9

10

C51122μF12

131415

R3161K17

181920R710K×3Y1

11.0592M

P1.0VCCP1.1P0.0P1.2P0.1P1.3P0.2P1.4P0.3P1.5P0.4P1.6P0.5P1.7P0.6RSTAT89S52P0.7P3.0EAP3.1ALEP3.2/INT0PSENP3.3/INT1P2.7P3.4P2.6P3.5P2.5P3.6/WRP2.4P3.7/RDP2.3XTAL2P2.2XTAL1P2.1GNDP2.0

+5V

4039383736353433323130292827262524232221+5V

K1R1200Ω

+5V

R410k

U4

ACM160212345678910111213141516

VSSVDDV0RSR/WED0D1D2D3D4D5D6D7BLABLK

C630P

C730P

SCLKRCLKSEROH'SCLRVCCGGNDQ0Q1Q2Q3Q4Q5Q6Q7

U574HC595



3.2 LCD显示电路

3.3 系统时钟模块

刷卡时要记录刷卡的时间,用外接硬件实时时钟芯片的办法,为系统提供一个准确可靠的时钟,用3V备用电池保证在系统掉电时也能正常走时,在此选用体积小、接口简单的实时时钟芯片DS1302

(1)时钟芯片介绍

DS1302是美国DALLAS公司开发的具备功耗低、接口容易串行实时时钟芯片。在本设计中使用的DS13028DIP封装形式,其中1脚和8脚为电源电压引脚,单电源供电时接8脚,双电源供电时,主工作电源接1脚,备份电源接

SizeTitle

8脚。2脚和3脚为32.768KHz晶振引脚;5RST为复位端,若其被置为低电平,则中止所有数据传送,I/O脚变为高阻态,系统复位;6I/O为数据输人/

3

BDate:

File:5

输出端;7SCLK为串行时钟输入端,所有地址/命令字节和数据字节都是在时钟的同步控制下从I/O脚串行输入输出的。DS1302通过SCLKI/ORST三根线与外部进行同步串行通信

(2)DS1302与单片机的连接



9

4


在本设计中采用单片机的P1.0-P1.2DS1302进行数据通信,以提供系统所需的时钟,其连接方法如图3.3所示。

U7

DS13021234

Vcc1Vcc2X1SCLKX2I/OGND~RST

8765

VCC

U1

1234567891011121314151617181920

P1.0VCCP1.1P0.0P1.2P0.1P1.3P0.2P1.4P0.3P1.5P0.4P1.6P0.5P1.7P0.6RSTAT89S52P0.7P3.0EAP3.1ALEP3.2/INT0PSENP3.3/INT1P2.7P3.4P2.6P3.5P2.5P3.6/WRP2.4P3.7/RDP2.3XTAL2P2.2XTAL1P2.1GNDP2.0

40

39383736353433323130292827262524232221VCC

Y3

32.768KHz

K1R1200Ω

VCC

C522μFR31K

C630P

Y1

11.0592M

C730P



3.3 DS1302与单片机接口电路

3.4 存储模块

在本设计中采用串行E2PROM芯片AT24C64作数据存储器。AT24C64 ATMEL公司生产的采用I2C 总线标准常用的串行E2PROM 存储芯片,其支持I2C总线数据传输协议64Kbit存储器容量,用两根线与CPU构成串行接口。AT24C64一般具有两种写入方式,一种是字节写入方式,还有一种是页写入方式。AT24C64的读操作有当前地址读、随机读、多字节读三种方式。AT24C64其主要管脚功能描述如下:SCL,串行时钟。这是一个输入管脚,用于产生器件所有数据发送或接收的时钟;SDA,串行数据/地址。这是一个双向传输端,用于传送地址和所有数据的发送或接收;A0A1A2,器件地址输入端,这些输入端用于多个器件并联时设置器件地址[11]

在系统中采用单片机的P3.3P3.4口与AT24C64进行连接,其与单片机的接口接法电路如图3.4所示,由于本系统中采用到的AT89S52单片机不具备I2C

3总线接口,因此采用软件法加以解决。

4





10


K1R1200Ω

VCC

12

C5322μF4

56

R371K8

910111213141516

Y11711.0592M18

1920

U1

P1.0VCCP1.1P0.0P1.2P0.1P1.3P0.2P1.4P0.3P1.5P0.4P1.6P0.5P1.7P0.6RSTAT89S52P0.7P3.0EAP3.1ALEP3.2/INT0PSENP3.3/INT1P2.7P3.4P2.6P3.5P2.5P3.6/WRP2.4P3.7/RDP2.3XTAL2P2.2XTAL1P2.1GNDP2.0

C6

30P

C730P

VCC403938373635+5V343332

31R8R9

3010K10K8297286275262524232221

U6

AT24C64VCCA0WPA1SCLA2SDAGND

1234



3.4 AT24C64与单片机接口电路

3.5 MF-RC500读写模块

3.5.1 MF-RC500介绍

PHILIPS公司的MF-RC500应用13.56MHz非接触式通信中高集成读卡IC系列中的一员。该读卡IC系列利用先进的调制和解调概念,完全集成了在13.56MHz下所有类型的被动非接触式通信方式和协议MF-RC500支持IS014443A所有的层,其功能框图如下:

数据总线

64FIFO缓冲的微控制器接口

Cryptol安全密钥存储器状态和控制单元数据转换处理单CRC校验、帧校验、位检测和位译码处理单元

模拟单元包括:位信号的制和解调及线驱动

Mifareclassic

ISO14443AMifarepro

Title

控制总线

地址总线

SizeB



3.5 MF-RC500的功能框图

3

Date:File:5

MF-RC500内部包括并行微控制器接口、双向FIFO缓冲区、中断、数据处

4

理单元、状态控制单元、安全和密码控制单元、模拟电路接口及天线接口。MF-RC500外部接口包括数据总线、地址总线、控制总线、电源等。MF-RC500

11


的并行微控制器接口自动检测连接的8位并行接口的类型。它包含了一个双向FIFO缓冲区和一个可配置的中断输出,这样就为连接各种MCU提供了很大的灵活性,即使使用非常低成本的器件也能满足高速非接触式通信的要求。数据处理部分执行数据的并行-串行转换[12]。状态和控制部分允许对器件进行配置以使性能调节到最佳状态。模拟电路包含一个具有非常低阻抗桥驱动器输出的发送部分,这使得最大操作距离可达100mm,接收器可以检测到非常弱的应答信号。MF-RC500管脚如图3.6所示。



3.6 MF-RC500管脚图

该器件为32SO封装,器件使用了3个独立的电源以实现在EMC特性和信号解耦方面达到最佳性能。MF-RC500具有出色的RF性能并且模拟和数字部分可适应不同的操作电压,其驱动、模拟、数字部分分别使用单独电源供电。

3.1 天线连接管脚

名称 TX1TX2 VMID RX

类型 输出缓冲 模拟 输入模拟

功能 天线驱动器 参考电压 天线输入信号

为了驱动天线,MF-RC500通过TXlTX2提供13.56MHz的能量载波。根据寄存器的设定对发送数据进行调制得到发送的信号。智能卡采用RF场的负载调制进行响应。天线拾取的信号经过天线匹配电路送到RX脚,RC500内部接

12


收器对信号进行检测、处理,然后将数据发送到并行接口由微控制器进行读取。

3.2 MF-RC500并行口控制管脚

名称 D0...D7 A0...A2 NCS ALE LRQ

类型

带施密特触发器的I/O 带施密特触发器的I/O 带施密特触发器的I/O 带施密特触发器的I/O

输出

功能 双向数据总线 地址线 片选 地址锁存使用 中断请求

3.5.2 天线模块的设计

为了同非接触式智能卡通信,读卡器内必须有能发射和接收射频信号的天线。天线用于产生磁通量Ø而磁通量用于向应答器提供电源并在阅读器和应答器之间传送信息。因此,对读卡器天线的构造有了三个基本的要求:

使天线线圈的电流i1最大,用于产生最大的磁通量Ø 功率匹配,以最大程度地利用产生磁通量的可用能量; 足够的带宽,以无失真地传送数据调制的载波信号[13] (1)天线尺寸和读写距离

由于MF-RC500是低功耗设计,因此卡和天线之间的耦合系数必须符合一定的值,卡和天线之间的耦合系数不能低于0.3。天线一般设计为三圈,可以设计为圆形或者方形天线。天线的直径必须介于0.5-1.5mm之间。3.3 给出了卡和天线的耦合系数为0.3 时的天线大小和读写距离关系表。

3.3 天线大小和读写距离关系表

大小(mm×mm

50×50 65×54 85×54

读写距离(mm

7 10 12

根据技术指标以及尺寸等方面的要求,要本设计中读写器天线参数如下: 天线形状:方形天线 天线圈数:三圈 几何尺寸:65mm×54mm 天线导体直径:1mm (2)天线电感的计算



13


天线的电感必须介于800nH4.2μH之间。天线的电感通过下列公式计算:

p

LnH2*IcmlnImm/Dmm1.04*N (3.1)

其中:

L—读卡器天线电感,μH I—天线导体长度,cm 1 D—天线导体宽度,cm N—天线导体圈数;

P—由天线线圈的技术而定的N的指数因子。

上述天线线圈的电感公式只能作为首次估测之用,实际的天线线圈的电感必

D

2

3

须通过仪器测量而定,但偏差不会很大。根据以上公式以及本设计中的参数,P值取1.6,计算出的天线的电感L1895μH

(3)EMC电路及接收电路

EMC电路射频识别系统的工作频率为13.56MHz是由一个石英晶振产生的,同时它还产生更高频率的谐波,为了确保能够有效抑制三次,五次和更高次的谐波对信号的干扰作用,需要有一个低通滤波器来滤除这些高次谐波。

接收电路MF-RC500内部的信号接收部分使用由子载波的双边带调制出的信号,为了减少干扰,在地和VMID间接了一个电容,接收部分需要在RxVMID

C

脚之间接一个电阻分压结构。另外,在天线线圈和分压器之间串一个电容会获得

[14]

质量更高的信号。滤波器与接收电路电路原理图如图3.6所示。 Receiving Circuitry and EMC filter

VMID

C9

R10820Ω (To AVSS)

C10

0.1μF

RX

L11μH

R9560Ω

15pF

TX1

J2

C11

68pF

(To TVSS)L21μH

B

TX1

1

TGND

2

TX2

3

RX1

4

C1368pF

TX2



3.7 EMC及接收电路

(4)天线电路

天线电路图如图3.8所示。

14


J21234

C1_A47P

C2A_a80P

C2A_b80P

C1_B47P

C2B_a80PC2B_b80P



3.8 天线电路

图中电容C2A_aC2A_bC2A_aC2A_b(通称C2)的值是由天线的电感值决定的,且需要根据天线的形状进行调整。C2电容的大小严格影响读卡器的性能,这就需要在确定了卡的类型之后在实际的使用环境中进行试验,确定不同的C2值,使读卡器具有最好的性能表现。

RC500有一个内部信号驱动管脚AUX,当读卡器发出某一指令时,可以使用示波器观察该引脚的输出信号,不断改变卡与读卡器之间的距离和C2值,示波器输出不同的波形,根据不同的波形即可确定读卡器最好性能的C2[15]。在本课题设计中,根据天线的参数进行试验,得到的最终C2值如表3.4所示。

3.4 C2电容值表

电容 C2A_a C2A_b C2A_a C2A_b

值(pF

80 80 80 80

(5)天线的品质因数和匹配电阻

用于电感耦合式射频识别系统的天线,其特征值是谐振频率f0和品质因数Q较高的品质因数Q值会使天线线圈中的电流强度大,由此改善对应答器的功率改善情况。与之相反,天线的传输带宽刚好与品质因数成反比例变化,选择的品质因数过高会导致带宽缩小从而明显地减弱应答器接收到的调制边带。

电感读卡器天线的品质因数可以通过线圈电阻与线圈电阻的欧姆损耗和/串联电阻的比值计算出来,公式如下:

3

4

15


Q

RLANT

,R2fR (3.2) RANT

其中fR=13.56MHz,由前面的分析可以知道天线的感抗LANT和阻抗RANT,也可以用仪器测出来。一般情况下Q值在1050之间,作为数据传输过程这个值还会减小,数据从读卡器到射频卡使用米勒编码,脉冲宽度为T=3µs带宽B义如下:



B

fR

,BT1 (3.3) Q

所以Q值:



QfRT

13.56MHz3s

(3.4)

40.68



考虑到温度漂移等其他因素的影响,实际上可以把Q值定在35是一个比较合理的值。考虑到在估算中减小了Q值,所以这里需要外加一个电阻来调节天线的品质因素,可以用下面的公式来计算REXT

REXT



RLANT

Q

RANT



RLANT

RANT (3.5) 35

3.5.3 MF-RC500AT89S52连接图

MF-RC500AT89S52连接图如图3.9所示,图中单片机AT89S52作为控制核心,主要完成数据采集、处理、存储及控制电路工作MF-RC500 支持不同的微控制器接口,一个智能的自动检测逻辑可以自动适应系统总线的并行接口。图中使用信号NCS选择芯片。对于MF-RC500,若要使用独立的地址和数据总线与微控制器相连,必须将ALE脚连接到DVDD,若使用复用的地址和数据总线与控制器接口,必须将ALE脚连到微控制器的ALE信号。在本设计中,该读写器采用地址数据总线复用方式与微控制器相连。在对MF-RC500进行读写操作时,若要使用NWRNRD与微控制器相连,则这两个引脚应该连接到微控制器的读写管脚上。图中使AT89S52WRRD管脚分别与MF-RC500NWR管脚和NRD管脚相连来控制读写使能;MF-RC500工作频率由石英晶



16


体而产生,同时与OSCIN管脚相连可作为外部时钟;P3.2管脚与MF-RC500IRQ管脚相连用以接收中断请求;由图可以看出,本系统采用中断(INT0)工作模式,即MCU利用MF-RC500提供中断信息对其进行控制。另外,根据系统的需要,可以采用查询方式对MF-RC500进行操作。

Y2C1615pF

VCCK1

R1200Ω

1C5222μF3

456

R371K8

9

TTL_RX10TTL_TX11RC500_IRQ12RC500_PD13RC500_CS14

15

WR16RD17

181920Y111.0592M

U1

P1.0VCCP1.1P0.0P1.2P0.1P1.3P0.2P1.4P0.3P1.5P0.4P1.6P0.5P1.7P0.6RSTAT89S52P0.7P3.0EAP3.1ALEP3.2/INT0PSENP3.3/INT1P2.7P3.4P2.6P3.5P2.5P3.6/WRP2.4P3.7/RDP2.3XTAL2P2.2XTAL1P2.1GNDP2.0

40

39383736353433323130292827262524232221

VCCAD0AD1AD2AD3AD4AD5AD6AD7ALE

1

RC500_IRQ2

34

TX15TVDD6TX27

8

RC500_CS9WR10RD11

1213141516

U2

MFRC500OSCINIRQMFINMFOUTTX1TVDDTX2TVSSNCSNWRNRDDVSSD0D1D2D3VCC

VCC

LRF210μH

C180.1μF

C191nF

C204.7μF

C214.7μFTVSS

C221nF

C230.1μF

AVDD

OSCOUTRSTPDVMIDRXAVSSAUXAVDDDVDDA2A1A0ALED7D6D5D4

32

31RC500_PD30VMID29RX282726AVDD25

VCC242322

VCC

21ALE20AD719AD618AD517AD4

13.56MHz

C1715pF

AD0AD1AD2AD3

C630P

LRF110μH

TVDD

C730P



3.9 MF-RC500AT89S52连接图

3.6 通信模块

本智能卡读写器采用RS232标准来实现读卡器和上位机之间的通信,能实RS232通信协议的芯片很多,其中MAXIM公司生产MAX232是一款比较优良的RS232通信芯片。选取它的主要依据在于:单5V电源供电,与读卡器里其它芯片的工作电压相同;符合所有EIA/232E标准;多路输入输出。MAX232其引脚功能说明如表3.5所示。

3

Title

SizeBDate:File:

4

5

Number





16-Jun-2008Sheet of F:\\\\66666\Drawn By:\BACK

17


34

3.5 MAX232引脚说明

引脚名 T2out R2in R2out T2in T1in

引脚说明 RS232输出 RS232输入 TTL/CMOS输出 TTL/CMOS输入 TTL/CMOS输入

引脚名 R1in T1out GND VCC R1out

引脚说明 RS232输入 RS232输出

电源 TTL/CMOS输出

硬件电路连接上采用三线制(RXDTXDGND)软握手的零MODEM方式,即将PC机和单片机的发送数据线TXD与接收数据RXD交叉连接,二者的地线(GND)直接相连,而其它信号线、如握手信号均不用,而采用软件握手,这样既可以实现预定的任务又可以简化电路设计、节约成本。MAX232AT89S52电路连接如图3.10所示。

C121μFU3

MAX2322

J3

16

2RS232RX7

3RS232TX8495DB9

RS232TX7RS232RX8

1413

C141μF

4

V+

VCC

16

10TTL_TX9TTL_RX1112

C151μF3VCC

T2outT2inR2inR2outT1outT1inR1inR1outC2+

C1-

56

C2-V-C24

C1+GND1μF

115



3.10 MAX232AT89S52的连接图





18


4 系统软件设计与实现

非接触智能卡系统的软件设计可分为四部分,分别为主程序设计RC500的读/写程序的设计、读卡器外围基本电路应用程序设计通信部分程序的设计。主程序主要包括:IC卡读//密码验证/擦除操作程序,RC500通信中断处理程序,键盘中断处理程序,PC通信中断处理程序,显示程序及存储器读写程序等,对MF-RC500应用程序的设计也即是对MF-RC500操作指令的程序设计,对读卡器外围基本电路程序的设计包括LCD显示程序设计、键盘扫描程设计、数据存储程序设计RS232通信程序设计

4.1 软件设计环境

一个好的程序设计思想,加上适当的编译软件仿真器和编程器,是单片机软件开发的基本要求。本系统程序的设计以模块化和结构化的设计思想为指导。单片机开发所使用的语言一般为汇编语言。汇编语言的优点是代码生成效率高,程序运行速度快,其缺点是程序的可读性和可移植性都较差,而且用汇编语言编写单片机应用系统程序的周期长,调试和排错比较困难。C语言是一种通用的计算机程序设计语言,在国际上十分流行,它既可用来编写计算机的系统程序,可用来编写一般的应用程序。用它编写的程序,具有较好的可读性和可移植性。经验表明,用C语言编写的程序生成代码的效率仅比用汇编语言编写的程序1020%。德国Keil软件公司的C51编译器可以直接对8051单片机的内部特殊功能寄存器和I/O口进行操作,直接访问片内或片外存储器,还可以进行各种位操作,能产生简洁、高效率的程序代码,在代码质量上可以与汇编语言相媲美。因此系统在设计中多数的程序使用了C语言进行设计,少数的一些程序用汇编语言编写,用C语言进行调用。

4.2 主程序的设计

读卡器工作的过程是一个复杂的程序执行过程,要执行一系列的操作指令,调用多个函数。其主要包括键盘扫描、LCD显示、读写E2PROM、读/写卡及与上位机通信等。这一系列的操作必须按固定的顺序进行。在没MF1卡进入射频天线有效范围内时,LCD液晶上显示当前时钟,当有MF1卡进入到射频天线的有效范围内时,读卡程序验证卡及密码成功后,将卡号和读卡时间作为一条记



19


录存入E2PROM存储器中,并在LCD显示器上显示该卡的卡号等信息

读卡器的主程序主要由下位机来完成,单片机中的程序主要包括:IC卡读//密码验证/擦除操作程序,与RC500通信中断处理程序,键盘中断处理程序,PC通信中断处理程序,显示程序及存储器读写程序等等[16]。读卡器的主程序流程图如图4.1所示。



显示时钟,主界面

有无中断?



有卡进入



按键按下

/写卡片信息查询模块功能设置模块

数据写入E2PROM

结果回送上位机





4.1 读卡器主程序流程图

4.3 /写卡程序设计

4.3.1 MF-RC500指令说明

MCUMIFARE非接触式智能卡的控制是通过MF-RC500来实现的,MF-RC500MCUMIFARE非接触式智能卡之间的通信载体。MCUMF-RC500的控制是以MCU发出MF-RC500的指令来达到的,MF-RC500收到指令之后执行这些指令。MF-RC500的指令主要有:Request stdRequest allAnticollisionSelectAuthenticationReadWrite它们可以完成MCUMIFARE



20


非接触式智能卡的很多应用场合的控制。

MCUMF-RC500的某一指令操作不是简单的一条指令所能完成的,必须有一个程序的序列来完成,其中有对MF-RC500硬件内核寄存器的读/写以及根据读出的硬件内核寄存器的内容进行语言软件上的判断和设置。不同的指令将设置不同的MF-RC500内部寄存器以及应有不同的编程语言程序序列。MF-RC500具体指令说明及程序设计如下:

(1)Answer to Request(应答或复位应答)

4.1 复位应答指令

指令 Request std Request all

指令代码(hex

26 52

相关的出错标志

TEBE

接收卡片上数据

Tag type

Request指令将通知MF-RC500在天线有效的工作范围内寻找WARE卡片。如果有MIFARE卡片存在,这一指令将分别与MIFARE卡片进行通信,读取WARE卡片上的卡片类型号TAGTYPE,由MF-RC500传递给MCU,进行识别处理。Request指令分为Request stdRequest all两个指令。

Request all指令是非连续性的读卡指令,只读一次,它可以防止MF-RC500选择同一卡片好几次。当某一张卡片在MF-RC500天线的有效工作范围内,Request all指令在成功地读取这一张卡片之后,将一直等待卡片的使用者拿走这张卡片,直到有新一张的卡片进入M- RC500天线的有效工作范围内。

Request std指令的使用和Request all指令相反,Request std指令是连续性的读卡指令。当卡片在MF-RC500天线的有效工作范围内,Request std指令在成功地读取这一张卡片之后,对卡进行其他操作。如果其他操作完成之后,程序员又MF-RC500进入Request std指令操作,则Request std指令将连续性地再次进行读卡操作,而不管这张卡片是否被拿走。只要有一张卡片进入MF-RC500天线的有效的工作范围内,Request std指令将始终连续性地再次进行读卡操作。

(2)Select Tag(选择卡片操作)

4.2 选择卡片指令

指令 Select Tag(选择片)

指令代码(hex

93

相关的出错标志 TEBEPECE

接收卡片上数据

Size

21


在一个成功的AntiCollision指令之后,或在任何时候当程序员想与已知序列号的卡片进行通信时,必须使用Select指令,以建立与所选卡的通信Select令成功地完成后,MCU将得到MF-RC500DATA寄存器传送来的一个字节长的卡片容量信息Size

(3)Authentication(认证操作)

4.3 认证指令

指令 Authentication Auth_la Auth_lb

指令代码(hex

60 61

相关的出错标志



TEBEPECE

接收卡片上数据

/

MCU希望读取MIFARE卡上的数据之前,此操作必须是被允许的。这可以通过选择存储在MF-RC500RAM中的密码集中的一组密码来进行认证而实现。如果这一组密码与MIFARE卡片上的密码匹配,这一次操作被允许进行。卡片上的存储器的每一个块都分别地指定了该块的存取条件。这些存取条件是根据密码而定。用户必须在KEYSTACON寄存器中指定一套密码,即设置KSOKS1KEYADDR寄存器中的AB位用于选择KEYAKEYBKEYADDR寄存器中的AB设置必须匹配“Authentication”命令。

(4)Read(读指令)

4.4 读指令

指令 Read()

指令代码(hex

30

相关的出错标志 TEBEPECE

接收卡片上数据

Data

Read(读)指令允许MCU通过MF RC500来读取MIFARE卡片上完整的16Bytes的数据块(Data blocks)

(5)Write(写指令)

4.5 写指令

指令 Write ()

指令代码(hex

A0

相关的出错标志

TEBE

接收卡片上数据

/

“Write” 写指令允许用户写数据到MIFARE卡片上(完整的16Byte的数据)



22


4.3.2 /写卡程序流程图

/写卡过程主要由以下几步组成:

(1) 复位应答:当一张MIFARE卡片处在读写器的天线的工作范围之内时,程序员控制读写器向卡片发出REQUEST all 命令。卡片的ATR 将启动,将卡Block0中的卡片类型共2个字节传送给读写器, 建立卡片与读写器的第一步通信联络。如果不进行位选择操作,读卡器对卡片的其他操作将不会进行;

(2) 防重叠操作:有多张卡处在天线的工作范围之内时,RC500将取得每一张卡片的系列号,由于每一张MIFARE卡片都具有其唯一的序列号,决不会相同,因此MF-RC500根据卡片的序列号来保证一次只对一张卡操作。该操作MF-RC500得到MIFARE卡片的返回值和卡片的系列号;

(3) 选择卡片操作:选择被选中卡的系列号,并同时返回卡的容量代码; (4) 认证操作:经过上述3个步骤, 在确认已经选择了一张卡片时,MF-RC500 在对卡进行读写操作之前,必须对卡片上已经设置的密码进行认证如果匹配,才允许进一步的读写操作;

(5) 读写操作:在经过上述几个步骤之后就可以具体地对卡片进行相应的读、写、增值、减值、存储和传送等操作。读/写卡程序流程图如下图4.2所示。

初始化寄存器调用防冲突子程序

选择卡片认证操作认证通过?





错误处理









结束



4.2 /写卡程序流程图



23


4.4 读卡器外围基本电路程序的设计

4.4.1 显示程序设计

设计中的显示模块主要由系统时钟和LCD显示组成,系统时钟用来提供时间、日期等信息LCD用来向用户显示卡片、存储数据等信息LCD的读写操作、屏幕和光标的操作都是通过指令编程来实现的,通过寄存器的设置和指令编程就可完成,这部分的程序设计比较简单,其流程图如图4.3所示。



初始化

显示时钟

是否有中断?



中断处理程序



中断处理结果显示

返回



4.3 显示部分程序流程图

显示模块的部分程序如下: MAIN MOV SP#60H

MAIN1 LCALL START ;调用初始化

MOV A, #80H



;第一行显示第一个字符的位置

ACALL ENABLE ;调用写指令 MOV DPTR, #TABLE1 ;第一行表头位置 CALL WRITE1 ;调用第一行写子程序 MOV A, #0C0H



;第二行位置

CALL ENABLE ;调用写指令 MOV DPTR, #TABLE2 ;第二行表头位置 CALL WRITE



24


LCALL DELAY1 JMP MAIN1 ENABLE





;写命令时序

MOV SS, A CLR RS CLR RW CLR E ACALL DELAY SETB E RET WRITE1:





;写字符串

MOV R1, #00H

A1 MOV A, R1

MOVC A, @A+DRTR ;取将显示的数据 CALL WRITE2 ;调用写程序写入单个字节

INC R1

CJNE R1#10HAL RET

WRITE2 ;写单个字符

MOV SS A SETB RS CLR RW

CLR E CALL DELAY SETB E

RET

4.4.2 键盘程序设计

键盘程序包括按键识别及识别按键后系统的相应动作。按键识别分两步进行:第一步,识别键盘有无键被按下;第二步如果有键被按下,识别出具体的按

25


键。分述如下:第一步,识别键盘有无键被按下的方法是:让所有列均置为0电平,检查各行线电平是否有变化,如果有变化,则说明有键被按下。第二步,识别具体的按键的方法有扫描法和线反转法,这里采用扫描法:逐列置0电平,其余各列置为高电平,检查各行线电平的变化,如果某行电平由高电平变为0电平,则可确定此行此列交叉点处的按键被按下。本方案中用延时l0ms进行软件消抖,通过设置处理标志位来区分闭合键是否己处理过,用计算方法得到键码。键盘扫描子程序中完成如下几个功能:

(1) 断键盘上有无键按下。其方法为P1口低3位输出全0,读P1口状态,P1.3P1.4为全1则说明键盘无键按下;若不全为1则说明键盘有键按下;

(2) 除按键抖动的影响。其方法为,在判断有键按下后,软件延时的方法延时10ms,再判断键盘状态,如果仍为有键按下状态,则认为有一个确定的键按下,否则当作按键抖动处理;

(3) 按键位置。根据前面的扫描法,进行逐位置0扫描,最后定位按键位置; (4) 闭合一次仅进行一次按键的处理。方法是等待按键释放之后,再进行按键功能的处理操作。编程扫描程序流程图如图4.4所示。

开始

有键闭合吗?



软件廷时10ms





有键闭合吗?



确定按键位置



闭合键释放?



按键处理程序

返回



4.4 扫描程序流程图

26


4.4.3 E2PROM程序的编写

AT24C64存储器可以解决单片机片内E2PROM不足的问题,用以保存诸如用户设置参数、卡片信息资料。由于本系统中采用到的AT89S52单片机不具I2C总线接口,因此采用软件法加以解决。在软件编写时遵循I2C总线规则:初始状态时,SCLSDA两线都为高,当SCL为高电平时,如果SDA线跌落,认为是起始位;当SCL为高电平时,如果SDA线上升,认为是停止位;除此之外,在发送数据的过程中当SCL为高电平时,SDA应保持稳定。ACK应答位指在此时钟周期内由从器件(E2PROM)SDA拉低,表示回应。这时主器件(AT89S52)SDA口属性应该变为输入以便检测。E2PROM主要读写程序如下: void 12c_Send_Byte (unsigned char Send_Data) /*写一个字节到E2PROM*/ { unsigned char i; for(i=8;i!=0;i--) { SCL_DIR=0;

if(Send_Data&0x80){SDA_DIR=1;} //接收到数据 else{SDA_DIR=0;} delay_µs(2); SCL_DIR=1;

Send_Data = (Send_Data<<1); // 数据左移一位 }

do //接收应答信号,防止死循环 {

SCL_DIR=0; SDA_DIR=1; delay_µs(2); SCL_DIR=1; }

while(SDA!=0); //停止位 SCL_DIR=0; SDA_DIR=0; }



27


4.5 通信部分程序设计

(1)通信协议概述

RS232串口通信协议是我们熟悉和常用的通信协议通信协议设计思想是基于帧传输方式,即在向串口发送命令信号、应答信号及数据信号时是按照帧的格式发送的。为了使数据快速可靠地传输,将每一帧数据对应一个命令帧,输数据即执行命令,具体如下:

1) 在读数据时,遵循读命令--等数据--报告,即PC下达一个命令,等待接收数据,再据所接收数据正误向应用程序报告此命令的执行情况;

2) PC写数据时,遵循写命令--等回应--报告,即PC下达一写命令(时所要写的数据含于此命令中),等待MCU发来的己经正确接收的回应信号, 应用程序报告此命令执行完毕;

3) 如果在传输过程中PCMCU所接收的任何一帧信号出现错误时,均会向对方发送重发此帧信号的请求,如果连续只次传输失败,则退出通信并向应用程序报告

(2)MCU串口通信程序流程图

MCU串口通信程序流程图如图4.5所示。



接收到一帧数据



此帧正确否?



读命令信号?



写命令信号?

退出通信

报告

退出,等下一帧命令



分析此命令,取出数据信息

发正回应信号帧



分析此命令,开始执行

发数据帧



4.5 MCU串口通信程序流程图

28


5 系统调试

(1)调试过程

系统调试是在实验室进行的,它是从设计应用转化的关键一步,需要大量调试,才可能使系统运行正常,系统调试是在这样的环境下进行的:仿真器采用的是伟福公司的G6W软件采用与其配套的e2000w编译软件部分程序的编译也使用了KeilC51;编程器使用的是Top系列编程器Top2000-a型。

主要测试的内容有:

1) 读卡器的基本功能如:系统时钟显示、E2PROM的读写、非法卡报警等; 2) 系统软件的功能模块测试; 3) RC500/写卡功能模块测试。 (2)调试中发现的问题与解决方法

在测试上述三项内容过程中,曾经出现过一些问题:

1) 系统显示模块不能正常工作。显示模块由LCD和时钟芯片1302组成,时钟芯片与单片机的连接比较简单,并且程序部分也都通过了调试,但系统却不能正常工作所以应该是LCD硬件出了问题,经过查找,是由于调节LCD度的那个电位器值过大,造成虽然DS1302正常工作了,但信息并没有得到正常的显示,通过对电位器值的适当调整,LCD正常工作了,问题得到了解决。

2) 数据写不到AT24C64中去。AT24C64通过二根线与单片机相连,理论只要时序正确,对其进行数据的读写就应该能够成功,但是实际中每次调用该子程序都不成功,可能是时序上的问题,但经过调试发现程序的编写是正确的,以应该是硬件连接上的问题。根据I2C协议传输数据的规定,SDASCL都是要求加上拉电阻的,但参阅的资料上说由于P2口内部已带有上拉电阻,不用再AT24C64就能正常工作但经过调试发现事实并非如此,经过对电路的修正,SDASCL引脚上加了两个10K的电阻,最终解决了这个问题了。

3) 读卡器与卡片不能进行正常的通信。在调试过程中,当有卡进入天线范围内时,读写器却不能正常的与之进行数据交换,读不到卡片的信息这个问题产生的原因有很多,可能是RC500软件设计上的问题,也可能是天线设计的问题,最后在指导老师的帮助下,经过自己的努力找到了问题的所在,原来是天线匹配电路不合适,通过对匹配电路上电阻、电容的适当调整,使问题得到了解决。



29






本论文从整体的角度,对非接触式智能卡系统进行分析和研究同时做到重点的突出。论文从智能卡整体系统入手,着重介绍了基于Philips公司MIFARE技术的非接触式智能卡读卡器的设计开发。该读卡器能够读写距离在0-100mm范围内的符合IEC/IS014443 Type A标准的非接触式智能卡。读卡器采用外接电源供电,具有蜂鸣器报警、系统时钟、LCD显示、2小键盘输入和采用RS232接口同上位机通信的功能,能够很好地满足实际应用的需要。

作为一个系统在设计时可能要考虑到诸多因素,每一个细节上,都可能出现意想不到的事情,有时一个小小的问题,要花好多的时间和精力,需要耐心和恒心,经过努力,该系统设计已经完成,实际测试证明系统已能达到设计要求。

然而本论文论述的非接触式智能卡系统还有很多方面需要进一步提高,针对论文中所述,主要有以下几个方面:

(1) 本论文没有介绍上位机的软件设计问题。应用系统中,这也是非常重要的一部分,主要涉及数据库的操作、与下位机的通信以及友好的用户操作界面等问题。

(2) 读写装置与上位机之间的通信接口宜采用USB接口。采用USB接口的外设与计算机之间的传输速率远比RS232和标准并行接口高,而且支持热插拔。

(3) 本论文中给出的程序,还需进一步的优化,减少其大小,提高程序执行效率。

通过对系统的软硬件设计和调试过程,积累了不少实际经验开拓了了思维,为今后在这方面的工作打下了较为坚实的基础。本文还有很多不足之处,恳请各位专家和老师批评指正。





30






本文从课题的选定开始,系统方案的确定,以及对设计电路的调试指导,最后论文的编写和完成较稿,XXXXXX老师都给予了悉心的指导。对其中设计思路的引导,电路的可靠性,论文的严谨性等方面更倾注了她的精力和心血。具体的设计问题中,能够一针见血的指出问题所在,使我学到了新的知识,受益匪浅。她广博的知识面,丰富的实践经验以及严谨的治学作风,将激励我在今后工作学习中丰富自己、努力进取,在此,特别向郭广灵老师表示由衷的感谢和诚挚的敬意。

其次,要感谢学校给我们提供这么好的毕业设计环境在毕业设计完成的过程中得到了许多老师和学院领导的帮助,老师们严谨治学的教学使我受益匪浅。

在本论文的写作和相关研究工作中,我同一实验室和同班同学都给予了我很多热心的帮助和热情的鼓励,使我顺利走过近三个月的课题研究生活。我要向他们中的每一个人表示由衷的感谢,我会永远记住这段美好时光。

再次向所有帮助过我的人表示衷心的感谢!谢谢你们!





31






[1] 王爱英.智能卡技术[M].北京:清华大学出版社,2000

[2] 沈宇超.射频识别技术及其发展现状[J]电子技术应用2007(1)89 [3] 潘长东.IC卡电能表的现状与改进[J].电测与仪表2006(8)1519 [4] 朱义胜.低通型阻抗匹配网络设计[J]电子学报,20064(1)9194 [5] 张肃文,陆兆熊.高频电子线路[M].北京:高等教育出版社,1996

[6] 李淑琴,范蟠果.射频识别非接触式 IC卡读卡器的设计[J]. 计算机测量与控制,2007(3)378380

[7] 童诗白,华成英.模拟电子技术基础[M].北京:高等教育出版社,2001 [8] 张洪润,蓝清华.单片机应用技术教程[M].北京:清华大学出版社,1997 [9] 王卫东,傅佑麟.高频电子电路[M].北京:电子工业出版社,2004 [10] 罗海勇.IC卡读写器子系统设计[J]电子技术应用2006(12)1417 [11] 谭浩强.C程序设计[M].北京:清华大学出版社,2003

[12] 周晓中.IC卡预付费计算机管理系统[J]计算机应用2006(1)914 [13] 刘铮.非接触式IC卡射频识别技术[J]信息技术,20063(4)812 [14] 范久臣.实时时钟芯片在单片机系统中的应用[J].沈阳教育学院学报,

20057(4)132134 [15] 林昌禄,吴为公.近代天线设计[M].北京:人民邮电出版社,1990 [16] Klaus Finkenzeller著.射频识别技术[M].北京:电子工业出版社,2001 [17] 赵亮.液晶显示模块LCD1602应用[J]电子制作2007(3)5859 [18] 肖婧.液晶显示温度计的制作[J]经验交流,2005(2)8183 [19] 黄筱霞.IC卡门禁系统[J].北京工商大学学报,2006(4)6267 [20] 陈大才.射频识别(RFID)技术[M].北京:电子工业出版社,2003

[21] John YarbroughDigital Applications and Design[M].北京:机械工业出版

社,2003

[22] MF-RC500 Highly Integrated ISO 14443A Reader IC Semiconductors[J]2002 [23] Philips SemiconductorsContactless Chip Card Module Specification[J]1999 [24] Standard Card IC S50 Functional SpecificationPhilips Seniconductors[J]

2001

[25] Rosenthall EMProceedings of the fifth Canadian Mathematical Congress[J]

2006110~112





32


12345

VCCC121μF



U3MAX232

2V+

T2outT2inR2inR2out

1112

C151μF3

VCC

C2-V-C24

C1+GND

1μF

SPEAKERR2

1K

U1

R5

RC500_PDVMIDRXR6

VCCVCC

C4

10uF

+5VU6AT24C64

115

S1BELL

10TTL_TX9TTL_RXVCC

J316

J2

C2A_a80PT1outT1inR1inR1out

C2+C1-C2A_b80P

C1_A47P

1234

J2C1_B47P

DB9U7VCC

C2B_a80PC2B_b80P

RS232TX71RS232RX862RS232RX147133RS232TX8C1441μF49556

TX11TGND2TX23RX14

Y332.768KHz

DS1302

C1715pF

R710K×3

VCC

1234Vcc1Vcc2X1SCLKX2I/OGND~RST8765

AD0AD1AD2AD3AD4AD5AD6AD7

ALE

RS232TXRS232RXGNDTTL_RXTTL_TX

87651234VCCA0WPA1SCLA2SDAGND

R4

10k

1234567

+5VU4ACM1602AVDD

VCC

R1200Ω

R31K

C522μFk1VCC

ALE

AD7AD6AD5AD4VCC

32313029282726252423222120191817

123456789TTL_RX10TTL_TX11RC500_IRQ12RC500_PD13RC500_CS14SPEAKER15WR16RD17181920P1.0VCCP1.1P0.0P1.2P0.1P1.3P0.2P1.4P0.3P1.5P0.4P1.6P0.5P1.7P0.6RSTAT89S52P0.7P3.0EAP3.1ALEP3.2/INT0PSENP3.3/INT1P2.7P3.4P2.6P3.5P2.5P3.6/WRP2.4P3.7/RDP2.3XTAL2P2.2XTAL1P2.1GNDP2.040

39383736353433323130292827262524232221

+5V

TVDDC630PY112M

SCLKRCLKSEROH'SCLRVCCGGNDQ0Q1Q2Q3Q4Q5Q6Q7

U574HC595C214.7μF

TVSS

C221nFC230.1μFC730P

12345678910111213141516VSSVDDV0RSR/WED0D1D2D3D4D5D6D7BLABLK

Receiving Circuitry and EMC filter

VMID

R10

C9

820Ω

0.1μF(To AVSS)

RX

R9

C10

560Ω

TX1

L1

15pF

1μH

附录A 电路

C1168pF

(To TVSS)

TX2

L2

C1368pF

1μH

Q19013

Y2

C1615pF

13.56MHz

J1POWER

33

U2MFRC500

AVSS

AD0AD1AD2AD3

1RC500_IRQ234TX15TVDD6TX278RC500_CS9WR10RD111213141516

OSCINIRQMFINMFOUTTX1TVDDTX2TVSSNCSNWRNRDDVSSD0D1D2D3OSCOUTRSTPDVMIDRXAVSSAUXAVDDDVDDA2A1A0ALED7D6D5D4

VCC

VCC

LRF1

LRF2

AVDD10μH

10μH

C180.1μFC191nFC204.7μF




附录B /写卡源程序

#ifndef __rc500_h__ #define __rc500_h__

/********************常用操作定义************************************/ #define _BV(X) (1 << (X)) #define CHAE char

#define BYTE unsigned char #define WORD unsigned int #define DWORD unsigned long #define int8 signed char #define uint8 #define int16 #define uint16 #define int32

unsigned char signed int unsigned int signed long

#define uint32 unsigned long

/********************RC500引脚步宏定义****************/ #define DDR_RC500RST() DDRE |= (1<<7) #define SET_RC500RST() PORTE |= (1<<7) #define CLR_RC500RST() PORTE &= ~(1<<7) #define DDR_RC500IRQ() DDRE &= ~(1<<6)

#define PIN_RC500IRQ() PINE & (1<<6) #define DDR_RC500CS() DDRC |= (1<<1) #define SET_RC500CS() PORTC |= (1<<1) #define CLR_RC500CS() PORTC &= ~(1<<1)

/********************RC500命令宏定义*****************/ #define RegPage 0x00 #define RegCommand 0x01 #define RegFIFOData 0x02 #define RegPrimaryStatus 0x03 #define RegFIFOLength 0x04 #define RegSecondaryStatus 0x05 #define RegInterruptEn 0x06 #define RegInterruptRq 0x07 #define RegControl 0x09 #define RegErrorFlag 0x0A #define RegCollPos 0x0B #define RegTimerValue 0x0C #define RegCRCResultLSB 0x0D



34


#define RegCRCResultMSB 0x0E #define RegBitFraming 0x0F #define RegTxControl 0x11 #define RegCwConductance 0x12 #define RFU13 0x13 #define RegCoderControl 0x14 #define RegModWidth 0x15 #define RFU16 0x16 #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define

RFU17 0x17 RegRxControl1 0x19 RegDecoderControl 0x1A RegBitPhase 0x1B RegRxThreshold 0x1C RFU1D 0x1D RegRxControl2 0x1E RegClockQControl 0x1F RegRxWait 0x21 RegChannelRedundancy 0x22 RegCRCPresetLSB 0x23 RegCRCPresetMSB 0x24 RFU25 0x25 RegMfOutSelect 0x26 RFU3B 0x3B RFU3C 0x3C RegTestDigiSelect 0x3D RFU3E 0x3E RegTestDigiAccess 0x3F DEF_FIFO_LENGTH 0x 64 PCD_IDLE 0x00 PCD_READE2 0x03 PCD_LOADCONFIG 0x07 PCD_LOADKEYE2 0x0B PCD_AUTHENT1 0x0C PCD_CALCCRC 0x12 PCD_AUTHENT2 0x14 PCD_RECEIVE 0x16 PCD_LOADKEY 0x19 PCD_TRANSMIT 0x1A

35


#define PCD_TRANSCEIVE 0x1E

#define PCD_RESETPHASE 0x3F

#define PICC_REQIDL 0x26 #define PICC_REQALL 0x52 #define PICC_ANTICOLL1 0x93 #define PICC_ANTICOLL2 0x95 #define PICC_ANTICOLL3 0x97 #define PICC_AUTHENT1A 0x60 #define PICC_AUTHENT1B 0x61 #define PICC_READ 0x30 #define PICC_WRITE 0xA0 #define PICC_DECREMENT 0xC0 #define PICC_INCREMENT 0xC1 #define PICC_RESTORE 0xC2

#define PICC_TRANSFER 0xB0 #define PICC_HALT 0x50

/*********************数据传送结构体宏定义***************************/ #define MI_REQUESTERR 10 //寻卡错误 #define MI_ANTICOLLERR 11 //防冲突错误 #define MI_SELECTERR 12 //选卡错误 #define MI_REQUEST 20 //寻卡成功 #define MI_ANTICOLL 21 //防冲突成功 #define MI_SELECT 22 //选卡成功 typedef struct {

BYTE cmd; BYTE status; BYTE nBytesSent; BYTE nBytesToSend; BYTE nBytesReceived;

WORD nBitsReceived; BYTE CardNumber[5];

BYTE SerBuffer[20]; }MfCmdInfo; #define ResetInfo(Info)

Info.cmd = 0; Info.status = 0; Info.nBytesSent = 0;



36


Info.nBytesToSend = 0;

Info.nBytesReceived = 0; Info.nBitsReceived = 0;

/*********************函数声明***************************************/ void Delay_1us(void); void Delay_us(uint16 n); void Delay_1ms(void); void Delay_ms(uint16 n);

void WriteIO(BYTE Address,BYTE value); BYTE ReadIO(BYTE Address); void Device_Init(void);

BYTE M500PcdReset(void); BYTE M500PcdConfig(void);

BYTE SetBitMask(BYTE reg,BYTE mask); BYTE ClearBitMask(BYTE reg,BYTE mask); BYTE M500PcdRfReset(BYTE val); BYTE M500PiccCommonRequest(void); BYTE M500PcdCmd(void);

BYTE M500PiccCascAnticoll(void); BYTE M500PiccCascSelect(void);

BYTE M500PcdLoadKeyE2(WORD StartAddr); BYTE M500PiccHalt(void);

BYTE M500PiccAuthKey(BYTE *KEY,BYTE Sector,BYTE Block); void M500HostCodeKey(BYTE *uncoded,BYTE *coded); BYTE M500PiccAuthState(BYTE Block);

BYTE M500PiccRead(BYTE Sector,BYTE Block); BYTE M500PiccWrite(BYTE Sector,BYTE Block); #endif

/********************************************************************/ #include

#include #include "RC500.h" #include "uart.h"

/**********************变量定义*************************************/ MfCmdInfo Info;

/**********************硬件驱动程***********************************/ void WriteIO(BYTE Address,BYTE value) {



37


WORD addr;

addr = 0x2000 | Address;

(*(volatile unsigned char *)0x2000) = (Address>>3) | 0x80; //选择寄存器页 (*(volatile unsigned char *)addr) = value; //写入一个字节 }

BYTE ReadIO(BYTE Address) {

WORD addr;

addr = 0x2000 | Address;

(*(volatile unsigned char *)0x2000) = (Address>>3) | 0x80; //选择寄存器页 return (*(volatile unsigned char *)addr); //读取一个字节 }

/*************RC500功能程序************************/ BYTE M500PcdReset(void) {

uint16 timecnt; CLR_RC500RST(); Delay_ms(25); SET_RC500RST(); Delay_ms(20);

CLR_RC500RST(); Delay_ms(10); timecnt=1000;

while((ReadIO(RegCommand)&0x3F) & timecnt--); if(!timecnt)return 1;

if(ReadIO(RegCommand)!=0x00)return 1; return 0; }

//配置RC500内部寄存器函数 BYTE M500PcdConfig(void)

{

if (!M500PcdReset()) {

WriteIO(RegClockQControl,0x00); //Q时钟复位

WriteIO(RegClockQControl,0x40); //Q时钟写入0x40 Delay_us(150); //延时100us以上 WriteIO(RegClockQControl,0x00); //Q时钟清零 WriteIO(RegBitPhase,0xAD); //BitPhase寄存器



38


WriteIO(RegRxThreshold,0xFF); //RxThreshold寄存器写入0FFH WriteIO(RegRxControl2,0x01); //RxControl2寄存器写入01H WriteIO(RegFIFOLevel,0x1A); //设置FIFO上溢和下溢的界限 WriteIO(RegTimerControl,0x02); //设置数据发送完成后停止定时器 WriteIO(RegIRqPinConfig,0x03); //配置IRQ管脚的输出状态 M500PcdRfReset(1); //打开天线 WriteIO(RegMfOutSelect,0x02); return 0; } else

return 1;

}

BYTE M500PcdRfReset(BYTE val) {

if(val) {

ClearBitMask(RegTxControl,0x03); Delay_ms(2); SetBitMask(RegTxControl,0x03); }

else {

ClearBitMask(RegTxControl,0x03); }

return 0; }

//置一位

BYTE SetBitMask(BYTE reg,BYTE mask) {

BYTE tmp = 0x00;

tmp = ReadIO(reg);

WriteIO(reg,tmp | mask); // set bit mask return 0x00; }

//清一位

BYTE ClearBitMask(BYTE reg,BYTE mask) {

BYTE tmp = 0x00;



39


tmp = ReadIO(reg);

WriteIO(reg,tmp & ~mask); // clear bit mask return 0x00; }

//发送命令

BYTE M500PcdCmd(void) {

BYTE i,n; BYTE lastBits;

BYTE irqEn = 0x00; switch(Info.cmd)

{

case PCD_IDLE: irqEn = 0x00;

waitFor = 0x00; break;

case PCD_WRITEE2: irqEn = 0x11; waitFor = 0x10; break;

case PCD_READE2: irqEn = 0x07; waitFor = 0x04; break;

case PCD_LOADCONFIG: case PCD_LOADKEYE2: case PCD_AUTHENT1: irqEn = 0x05; waitFor = 0x04; break;

case PCD_CALCCRC: irqEn = 0x11; waitFor = 0x10; break;

case PCD_AUTHENT2: irqEn = 0x04; waitFor = 0x04; break;



40


case PCD_RECEIVE:

irqEn = 0x06; waitFor = 0x04; break;

case PCD_TRANSCEIVE: irqEn = 0x3D; waitFor = 0x04; break; default: return 1; }

WriteIO(RegInterruptEn,0x7F); //清除中断使能

WriteIO(RegInterruptRq,0x7F); //清除中断标志

WriteIO(RegCommand,PCD_IDLE); //清除Command寄存器 SetBitMask(RegControl,0x01); //清除FIFO指针

for(i=0; i

WriteIO(RegFIFOData,Info.SerBuffer[i]); //将数据写入FIFO irqEn |= 0x20; waitFor |= 0x20;

WriteIO(RegInterruptEn,irqEn | 0x80); //打开中断

WriteIO(RegCommand,Info.cmd); //将命令写入命令寄存器 timecnt=1000;

while(!(ReadIO(RegInterruptRq) & waitFor || !(timecnt--))); WriteIO(RegInterruptEn,0x7F); //清除中断使能

WriteIO(RegInterruptRq,0x7F); //清除中断标志寄存器 SetBitMask(RegControl,0x04); //停止定时器 WriteIO(RegCommand,PCD_IDLE); //清除命令寄存器 if(!timecnt)

{ USART_String("timeout!\n");return 1; } //超时退出,返回1 if(Info.cmd == PCD_TRANSCEIVE) {

n = ReadIO(RegFIFOLength); //读取FIFO中数据的总字节数 lastBits = ReadIO(RegSecondaryStatus) & 0x07; Info.nBytesReceived = n; if(lastBits)

Info.nBitsReceived = (n-1) * 8 + lastBits; else

Info.nBitsReceived = n * 8; if(n==0)n=1;



41


for(i=0; i

Info.SerBuffer[i]=ReadIO(RegFIFOData); /*USART_Hex(n); USART_Hex(lastBits); for(i=0; i USART_Hex(Info.SerBuffer[i]);*/ }

return 0; }

//寻卡

BYTE M500PiccCommonRequest(void)

{

WriteIO(RegTimerClock,0x09); //设置定时器分频 WriteIO(RegTimerReload,0xA0); //设置定时器初值

ClearBitMask(RegControl,0x08); //寄存器Control0

WriteIO(RegBitFraming,0x07); //寄存器BitFramming写入07H WriteIO(RegChannelRedundancy,0x03); //选择RF信道上数据完整性检测的类型和模式

SetBitMask(RegTxControl,0x03); //打开天线 //ResetInfo(Info); Info.cmd = PCD_TRANSCEIVE; //命令为发送命令 Info.nBytesToSend = 1; //发送字节长度为1 Info.nBytesReceived = 2; //接收字节长度为2 Info.SerBuffer[0] = PICC_REQIDL; //数据为寻卡命令

if(M500PcdCmd())return 1; //调用发送命令子函数

if(Info.nBitsReceived != 16) return 1;//判断接收到是不是16,否则是错误的 if(Info.SerBuffer[0]==0x04) return 0; //如果第一个字节是0x04,则是One卡,寻卡成功

else return 1; //否则返回错误状态 }

//防冲突

BYTE M500PiccCascAnticoll(void) {

BYTE i;

BYTE snr_check=0;

BYTE status=0;

WriteIO(RegTimerClock,0x07); //设置定时器分频 WriteIO(RegTimerReload,0X6A); //设置定时器初值



42


WriteIO(RegDecoderControl,0x28); //防冲突处理

ClearBitMask(RegControl,0x08); // WriteIO(RegChannelRedundancy,0x03); //

Info.cmd = PCD_TRANSCEIVE; //命令为发送命令 Info.nBytesToSend = 2; //发送字节长度为1 Info.nBytesReceived = 5; //接收字节长度为2 Info.SerBuffer[0] = PICC_ANTICOLL1; //数据0为防冲突命令 Info.SerBuffer[1] = 0x20; if(M500PcdCmd())status = 1; else {

for(i=0;i<4;i++)

snr_check^=Info.SerBuffer[i]; //生成校验数据

if(snr_check!=Info.SerBuffer[i]) //对比校验数据是否正确

status = 1; else {

for(i=0;i<5;i++)

Info.CardNumber[i] = Info.SerBuffer[i]; //将卡号和CRC装到卡号缓存

} }

ClearBitMask(RegDecoderControl,0x20); //结束防冲突处理 return status; }

//选卡

BYTE M500PiccCascSelect(void) {

BYTE i;

WriteIO(RegTimerClock,0x07); //设置定时器分频 WriteIO(RegTimerReload,0X6A); //设置定时器初值 WriteIO(RegChannelRedundancy,0x0F); // ClearBitMask(RegControl,0x08); //

Info.cmd = PCD_TRANSCEIVE; //命令为发送命令 Info.nBytesToSend = 7; //发送字节长度为1



Info.nBytesReceived = 1; //接收字节长度为2 Info.SerBuffer[0] = PICC_ANTICOLL1; //数据0为选卡命令 Info.SerBuffer[1] = 0x70;

43


for(i=0; i<5; i++)

Info.SerBuffer[i+2] = Info.CardNumber[i]; if(M500PcdCmd())return 1;

if(Info.SerBuffer[0] != 0x08)return 1; return 0; }

//直接验证密码

BYTE M500PiccAuthKey(BYTE *KEY,BYTE Sector,BYTE Block) {

Info.cmd = PCD_LOADKEY; //命令为发送命令 Info.nBytesToSend = 0x0C; //发送字节长度为1 Info.nBytesReceived = 0; //接收字节长度为2

M500HostCodeKey(KEY,Info.SerBuffer);//将密码转换成固定格式 if(M500PcdCmd())return 1; //调用发送命令子函数 if(M500PiccAuthState(Sector*4+Block)) return 1;//Crytol卡验证子程序 return 0; }

//Crystol卡验证

BYTE M500PiccAuthState(BYTE Block)

{

BYTE i;

Info.cmd = PCD_AUTHENT1; //命令为发送命令 Info.nBytesToSend = 0x06; //发送字节长度为1 Info.nBytesReceived = 0; //接收字节长度为2 Info.SerBuffer[0] = PICC_AUTHENT1A; //Authen1命令 Info.SerBuffer[1] = Block; //块号 for(i=0; i<4; i++) //卡号

Info.SerBuffer[i+2] = Info.CardNumber[i];

if(M500PcdCmd())return 1; //调用发送命令子函数 }



if(ReadIO(RegSecondaryStatus)&0x07)return 1;

Info.cmd = PCD_AUTHENT2; //Authen2命令 Info.nBytesToSend = 0; //发送数据为0字节 Info.nBytesReceived = 0; //接收数据为0字节

if(M500PcdCmd())return 1; //调用发送命令子函数 if(ReadIO(RegControl)==0x08)return 0;//值是否为0x08 else return 1;

44


//读数据

BYTE M500PiccRead(BYTE Sector,BYTE Block) {

BYTE tmp = 0;

WriteIO(RegTimerClock,0x09); //设置定时器分频 WriteIO(RegTimerReload,0xA0); //设置定时器初值 WriteIO(RegChannelRedundancy,0x0F); ResetInfo(Info);

Info.cmd = PCD_TRANSCEIVE; Info.SerBuffer[1] = Sector*4+Block; Info.nBytesToSend = 2;

Info.nBytesReceived = 0x10; //接收字节长度为 if(M500PcdCmd())return 1; //调用发送命令子函数 if(Info.nBytesReceived != 16) return 1; for(tmp=0;tmp<0x10;tmp++)

USART_Hex(Info.SerBuffer[tmp]); return 0; }

//写数据

BYTE M500PiccWrite(BYTE Sector,BYTE Block)

{

Info.cmd = PCD_TRANSCEIVE;

Info.SerBuffer[0] = PICC_WRITE; Info.SerBuffer[1] = Sector*4+Block; Info.nBytesToSend = 2;

Info.nBytesReceived = 0; //接收字节长度为

if(M500PcdCmd())return 1; //调用发送命令子函数 WriteIO(RegTimerClock,0x09); //设置定时器分频 WriteIO(RegTimerReload,0xA0); //设置定时器初值 WriteIO(RegChannelRedundancy,0x0F);

Info.cmd = PCD_TRANSCEIVE; Info.nBytesToSend = 0x10;

Info.nBytesReceived = 0; //接收字节长度为

if(M500PcdCmd())return 1; //调用发送命令子函数 if(Info.SerBuffer[0]==0x0A)return 0; return 1; }

……



45


本文来源:https://www.wddqxz.cn/9187fa3268d97f192279168884868762caaebbe9.html

相关推荐