引言
Mifare类型的非接触式智能IC卡作为符合14443A标准的IC卡,广泛应用在电子钱包、各类场所的门禁系统中。MFRC522作为支持该标准的射频读写卡芯片,拥有多种通讯接口(例如UART、SPI、I2C),可以通过单片机方便地读写MFRC522射频芯片内部的寄存器,配合天线对Mifare IC卡片进行读写。
本文设计的读写卡器以STM32F103C8T6为主控芯片,通过SPI通讯方式,选用支持14443A协议的频率为13.56MHz的读卡芯片MFRC522与Mifare卡通讯,并利用双线并绕的方式设计PCB天线,可大幅提高读写卡器的天线信号强度和生产成品率。配合上位机软件可以便捷地对Mifare IC卡片进行读写以作为储值卡、会员卡和物品管理卡片使用。
1 硬件系统设计
本读写卡器的硬件设计框图如图1所示。
本设计以STM32F103C8T6为主控芯片,采用USB供电方式,可以通过虚拟串口进行开发调试并且与上位机进行通信。主控芯片通过SPI接口方式与RC522进行通讯,RC522则利用电磁感应的原理与无源Mifare IC卡进行数据交换,上位机软件用于对卡片进行配置与读写操作,同时STM32驱动蜂鸣器和贴片LED发光二极管以告知用户系统运行状态。
1.1 相关芯片及Mifare IC卡片介绍
STM32F103C8T6为 ST (意法半导体)公司生产的一款入门级低功耗32位ARM芯片,拥有64Kb片内Flash,以及包括UART、USB、CAN、SPI、I2C等在内的丰富的硬件接口,结合keil或者IAR开发环境及其标准固件库可方便的进行产品开发。
MFRC522为NXP公司生产的一款支持ISO/IEC 14443A标准的读写芯片,根据天线尺寸和调校效果读写距离可达50mm,其多样化的硬件接口可方便的与单片机或PLC进行通讯,其QFN32的小型封装,有利于集成到紧凑型产品之中。
Mifare S50非接触式智能IC卡片拥有1Kb存储空间,存储于16个扇区内,每个扇区分为0-3块,共64块,每个数据块包含16个字节。其操作频率为13.56MHz,根据天线设计最高读写距离为100mm,数据可存储10年,写次数可达10万次。
1.2 原理图设计
考虑到各芯片电源电压与使用场景,设置系统的输入电压为5V直流,经过L1117-3.3稳压芯片输出3.3V直流电压供电,为保证直流电源波形噪声小,可在5V输入端和3.3V输出端并联2个100uf钽电容进行滤波。同样的,可在每个电源管脚附近布一颗100nf电容用作退耦电容稳定输入电源。主芯片JTAG接口加10k上拉电阻进行连接,方便使用Ulink等调试器进行在线调试及仿真。采用SI2301的MOS管芯片驱动发光二极管与蜂鸣器。将主控芯片与MFRC522芯片按照SPI接口连接,并按要求,将MFRC522芯片1脚I2C引脚接地,将32脚EA引脚拉高以使其硬件运行于SPI模式下。
SPI串行外设接口作为单片机与外设进行通信的一种高速、全双工的总线模式,因其仅需SPI_SCK(SPI时钟)、SPI_MISO(主输入从输出)的SPI_MOSI(主输出从输入)以及一根SPI_NSS(SPI片选)信号线即可完成主芯片与MFRC522的通讯接口。利于PCB布局布线,由于MFRC522与STM32均有SPI接口,并且SPI时序较为简洁易于调试,故在本设计中可以直接通过STM32F103的SPI总线读写MFRC522芯片的寄存器来进行芯片的设置与配置。SPI硬件接口如图2所示。
1.3天线设计
由于MFRC522与Mifare卡通信是利用电磁感应,在卡片与天线匹配时产生电荷进行数据交换,故天线的设计显得尤为重要,天线部分原理图如图3所示。
根据官方天线设计指导手册可得:
分析可知优化前的天线中点接地,其整体也为GND的一部分,故在天线绕制时相邻的两根线在生产的时候极易发生短路的情况,导致天线强度大大减小。为保证PCB在制板生产中的合格率,本设计采用双线并绕的方式直接在板上绘制RC522的天线部分。PCB如图5所示。
具体设计方法是在天线的匹配网络中串入2个欧姆的电阻(R4与R10),在PCB绘制时将天线两端同时开始走线,使得天线的相邻两根线在物理上隔离,这样制板时机器可以检测出相邻的天线部分是否有短路情况。通过这种设计,可将产品的天线合格率由优化之前的95%提高到近100%,大大降级了天线短路所带来的卡片感应距离低,合格率低的问题。
通过对MFRC522读卡芯片天线部分的改进与优化,使得天线短路情况发生情况大大减少,产品良品率有较大提高,读卡距离可达70mm,配合嵌入式软件与上位机软件,读写Mifare IC卡片效率较高。
2 软件设计与实现
通过STM32的SPI对MFRC522的内部寄存器进行读写,配置所需寄存器以达到设置芯片的目的来驱动电线部分,通过芯片的RX、TX引脚发送和接收信号对Mifare卡片进行数据传输,接收到的数据则存储在RC522芯片内部FIFO中,stm32 读取FIFO即可取出相应的数据。
STM32软件内采用串口中断方式查看是否有数据接收,主程序的while(1)死循环内轮询查询从串口接收的数据是否为上位机下发来的符合通讯协议的指令,并对数据进行CRC校验查看是否有数据遗失和错误。若收到上位机指令并数据完整正确,则执行相应的通讯协议中的Command,并返回执行状态。具体软件设计框图如图6所示。
2.1 系统初始化函数
利用STM32的标准库函数可以快速对芯片的SPI进行初始化,其中需要注意的是根据MFRC522的数据手册中芯片的SPI时序图,其CPOL极性为低电平,即时钟空闲时候的电平是低电平,所以当SCLK有效的时候,就是高电平;相位CPHA为第一个边沿,即在CPOL为0时,时钟空闲时是低电平,第一个边沿从低变到高,为上升沿。
在STM32的main函数中上电后主要完成相应的时钟、GPIO以及SPI之后,通过读写寄存器配置MFRC522芯片,完成设置芯片工作模式、天线增益、使能天线收发信号等操作,之后使能USB时钟、配置USB相关GPIO管脚、USB接收中断、初始化波特率等。
2.2 硬件与上位机通讯
当程序运行至while(1)循环时,循环检查是串口是否收到数据,若收到则继续检查数据是否为上位机命令并进行CRC校验,解析出具体的命令号,即m_nProtocol,根据该值执行相关命令并返回执行结果,以检查串口连接为例:
if(Received() != 0)
{
if(GetUsbReceived((u8 *)&m_NetComm,sizeof(m_NetComm)))
{
if(!VerifyCRC(&m_NetComm)) continue;
}
}
其中Received(void)函数判断串口中断是否有数据接收,GetUsbReceived(u8 *pdata, u32 num)函数用于接收数据到pdata指针中,实际中将这些数据放置于m_NetComm结构体中,通过比对结构体的m_Header成员中的m_nProtocol来启动相应的处理程序。
switch(m_NetComm.m_Header.m_nProtocol)
{
case CMD_FindDevice:
if(m_NetComm.m_Header.m_nOperation == 0) //请求
{
strcpy((char *)m_NetComm.myunion.m_FindDeviceAck.DeviceIdentify,"Greenpow Usb IC card reader");
m_NetComm.m_Header.m_nOperation = 1;
m_NetComm.m_Header.m_Err = ERR_OK;
SendPacket(&m_NetComm);
}
break;
}
当串口收到数据包时,通过判断是FindDevice指令,执行if内部语句,通过USB虚拟串口SendPacket(NetComm_Struct *p_net)函数发送特定字符,通过上位机验证即可连接成功。
软件使用MFC底层CSerialCom类中的OpenPort函数打开指定串口,ConfigurePort函数配置串口,使用ClosePort函数关闭串口。与下位机的程序恰恰相反,上位机通过发送请求命令,接收应答信息来执行相关指令。通过发送NetComm_Struct结构体,根据串口收到的数据执行相应函数。按照协议,如果USB有回应则确认连接成功,可以进行使用。在遵循操作Mifare卡的时序的基础上,依次进行防冲突、选卡、验证和读写的顺序进行卡片的操作。每次不同操作之后都在软件的右下角EditBox控件内有提示信息,结合蜂鸣器以及LED灯可以方便的了解操作结果。
3 结论
论文以STM32F103C8T6为主控芯片,以 MFRC522为读写卡芯片,采用SPI通讯方式与Mifare IC卡的通讯;通过对MFRC522读卡芯片天线部分的改进与优化,使得天线短路情况大大减少,读卡距离可达70mm,配合嵌入式软件和上位机软件,方便地实现了对Mifare IC卡的读写,读写效率较高。为非接触式IC卡读写器的设计提供了一种有效方案。
参考文献:
[1] 刘火良.STM32库开发实战指南[M].北京:机械工业出版社,2013
[2] 王爱英. 智能卡技术:IC卡、RFID标签与物联网[M].北京:清华大学出版社,2015
[3] 李志明. STM32嵌入式系统开发实战指南[M].北京:机械工业出版社,2015
[4] 李令伟. 嵌入式C语言实战教程[M].北京:电子工业出版社,2014
[5] 张淑清. 嵌入式单片机STM32设计及应用技术 [M].北京:国防工业出版社,2015
设计资源 培训 开发板 精华推荐
- ADL5304-EVALZ,用于 ADL5304 高速、200 DB 范围、对数转换器的评估板
- 使用 ROHM Semiconductor 的 BD45421 的参考设计
- EV-AD74413RSDZ,用于评估 AD74413R 四通道、软件可配置输入和输出的评估套件
- 路由器双flash切换
- 基于ADI公司ADuC7061的智能压力变送器
- 用于手机的 0.158W、2 通道、AB 类音频功率放大器
- 使用 Analog Devices 的 LTC1985ES5-1.8 的参考设计
- FlyingRC-F4Wing-MK2-TopLayer
- 【训练营】机械狗学习项目
- 用于线性相位控制调光器的 10W、8-LED 调光 LED 驱动器