博主福利:100G+电子设计学习资源包!
http://mp.weixin.qq.com/mp/homepage?__biz=MzU3OTczMzk5Mg==&hid=7&sn=ad5d5d0f15df84f4a92ebf72f88d4ee8&scene=18#wechat_redirect --------------------------------------------------------------------------------------------------------------------------
Radio Frequency Identification技术,即RFID技术又称为射频识别技术和无线射频识别技术,是一项应用非常广泛的、发展中的技术,发展至今,其历史已临近百年。随着其发展,人们对与系统的安全性,以及标签体积样式和存储容量等方面都有了更高的要求。本文以STM32F103RCT6微处理器为核心,配合CR95HF射频芯片构成符合ISO/IEC 14443标准的便携读卡器。
系统终端硬件包含两部分:基于STM32103RCT6处理器的控制单元和基于RC522的射频单元。控制单元是整个终端的控制枢纽;控制板集成了USB了接口、RS232接口LCD触摸屏接口,方便了系统调试和二次开发。射频单元以RC522为核心,配置了低通滤波器电路和功率放大器电路,能够满足ISO/IEC14443A协议的标签。
01
RFID系统的构成
RFID系统是由读写器、电子标签两大部分组成的。在本论文中,读写器是很重要的一部分。系统中电子标签的作用是存储设备的信息等,是整个RFID系统的信息载体组成,电子标签内的数据由用户用读写器自行写入。读写器是RFID系统的核心,能够由它来完成对电子标签信息的读写,读写器与电子标签的通信必须要按照统一的协议标准,否则无法实现对标签信息的读写。
阅读器由于使用的不一样的结构和技术能够分成读或者读/写装置,它是操控和处理RFID系统消息的重要部分。阅读器一般是由耦合模块、收发模块、控制模块和接口单元组合而来。阅读器和应答器之间通常使用半双工通信模式进行消息的互换,在这基础上阅读器利用耦合给无源应答器提供能量和时序。在正常使用过程中,能够更有效的利用Ethernet或WLAN等完成对物体识别信息的采集、处理及远程传送等管理功能。应答器承载着RFID系统的内部消息,应答器一般都是由耦合原件(线圈、微带天线等)和微芯片组成无源单元。
而电子标签分为两部分即电子芯片部分和天线部分,电子芯片主要用于存储数据,而天线主要作用为收发在标签和读取器之间的射频信号。RFID系统组成结构图如下图所示。
02
RFID读写器工作原理
RFID读写器的命令收发链路由发射机和接收机两部分组成,发射机部分主要功能是产生射频信号,让系统的前端天线发射出去。此部分主要由调制器、振荡器、上变频、带通滤波器和高频功率放大等组成。其结构图如图所示。
接收机部分的功能与发射机恰好相反。接收机主要是接收射频信号。天线接收标签向空间的反向散射信号,经过带通滤波器滤除高频信号后,然后低噪声放大器将接收到的信号进行放大,接着调制解调器对放大的信号进行解调,最后将射频信号变为数字基带信号。接收机的方框图如下图所示。
本设计采用ARM处理器和RFID射频处理单元相结合的方案。这种方案开发难度相对较低,开发周期较短,釆用ARM处理器能获得较高的性能和丰富的接口,很好满足功能需求。设计中将控制单元和射频单元分开,做成两个电路板。巡检终端结构如下图所示。
03
控制单元总体结构
控制单元电路包括STM32F103RCT6处理器及其外部接口设计。重点包括GPRS接口电路设计,GPS电路接口设计,RFID接口电路设计。
STM32F103RCT6外部配置电路主要包括FLASH存储电路、SDRAM电路、RS232接口电路、触摸屏接口电路、USB接口电路,电源模块电路和JTAG调试接口电路等。控制单元硬件电路图如下图所示。
主处理器STM32F103RCT6:整个电路的控制中心,实现与RFID模块命令交和信息处理;串口、JTAG接口主要实现软件调试,为未来功能拓展预留调试接口;USB接口提供多种方式的信息传输;电源管理模块、FLASH存储模块是STM32F103RCT6正常工作的必要电路;LCD触摸屏和按键接口为整个终端提供了良好的人机接口,方便操作使用。
04
编程的总体思路
本RFID系统的目的是通过终端扫描设备标签的RFID编号,将设备的编号、记录时间及设备的状态信息传送到处理器中,总体的变成思路如图所示,所以本系统的编程需要两个部分,一个是阅读器判断标签是否注册的介绍,另一个是Key0判断卡片是否上锁的介绍。使用的是MDK5.10对STM32103RCT6进行编程,上位机用的是C#进行编程。
Stm32与M1卡通信的流程图如图所示:
(1)寻卡
M1射频卡的通讯协议和通讯波特率是定义好的,当有卡片进入读写器的操作范围时,读写器以特定的协议与它通讯,从而确定该卡是否为M1射频卡,即验证卡片的卡型。调用的函数及参数解释如下所示:
参数说明: 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(u8 req_code,u8 *pTagType)
向 FIFO 中写入 PICC_REQIDL 命令,通过 PCD_TRANSCEIVE 命令将 FIFO 中数据通过天线发送出去,此时若有卡在天线作用范围内,将识别命令,并返回卡类型;由于本次采用的是M1卡,所以返回的值是0x0400,具体程序请参考附录。
(2)防冲突机制
当有多张卡进入读写器操作范围时,防冲突机制会从其中选择一张进行操作,未选中的则处于空闲模式等待下一次选卡,该过程会返回被选卡的序列号。调用的函数及参数解释如下所示:
参数说明: pSnr[OUT]:卡片序列号,4字节
返回: 成功返回MI_OK
char PcdAnticoll(u8 *pSnr)
向 FIFO 中写入 PICC_ANTICOLL + 0x20 ,通过 PCD_TRANSCEIVE 命令将 FIFO 中数据通过天线发送出去,卡返回卡序列号由于是非接触式的,同一时间天线作用范围内可能不只一张卡时,即有多于一张的MIFARE 1 卡发回了卡序列号应答,则发生了冲突。此时,由于每张卡的卡序列号各不相同, MCM 接收到的信息 ( 即卡序列号 ) 至少有 1 位既是 0 又是 1( 即该位的前、后半部都有副载波调制 ) , MCM 找到第 1 个冲突位将其置 1( 排除该位为 0 的卡 ) ,然后查第 2 个,依次排除,最后不再有冲突的 SN 即为被选中的卡,具体程序请参考附录。
(3)选择卡片
选择被选中的卡的序列号,并同时返回卡的容量代码。调用的函数及参数解释如下所示:
参数说明: pSnr[IN]:卡片序列号,4字节
返回: 成功返回MI_OK
char PcdSelect(u8 *pSnr)
向 FIFO 中写入 PICC_SElECTTAG+0x70+卡序列号,通过 PCD_TRANSCEIVE 命令将 FIFO中数据通过天线发送出去,卡返回卡容量(对于 MIFARE 1 卡来说,可能为 88H 或08H ),具体程序请参考附录。
(4)三次互相确认(验证卡片密码)
选定要处理的卡片之后,读写器就确定要访问的扇区号,并对该扇区密码进行密码校验,在三次相互认证之后就可以通过加密流进行通讯。(在选择另一扇区时,则必须进行另一扇区密码校验),具体程序请参考附录。调用的函数及参数解释如下所示:
功能:验证卡片密码
参数说明: auth_mode[IN]: 密码验证模式
0x60 = 验证A密钥
0x61 = 验证B密钥
addr[IN]:块地址
pKey[IN]:密码
pSnr[IN]:卡片序列号,4字节
返回: 成功返回MI_OK
char PcdAuthState(u8 auth_mode,
u8 addr,u8 *pKey,u8 *pSnr)
(5)对数据块的操作
由于本程序只涉及到对M1卡的读数据应用,所以只介绍有关读数据函数的操作。调用的函数及参数解释如下所示:
功能:读取M1卡一块数据
参数说明: addr[IN]:块地址
p [OUT]:读出的数据,16字节
返回: 成功返回MI_OK
char PcdRead(u8 addr,u8 *p )
向 FIFO 中写入 PICC_READ+块地址,通过 PCD_TRANSCEIVE 命令将 FIFO 中数据通过天线发送出去,具体程序参考附录。