简介:本资源是一套面向嵌入式开发者与电子设计初学者的RC522 RFID读写模块完整开发套件,聚焦于STM32F103平台下的硬件集成与驱动实现,解决非接触式射频识别系统从原理图设计到固件调试的一站式落地难题。压缩包共225个文件,涵盖34个头文件(.h)、33个C源码(.c)、38个编译中间文件(.o/.d)、8个备份文件(.bak)及PCB工程(.pcbdoc、.prjpcb)、原理图(.schdoc)、MDK5工程配置(.uvprojx、.uvoptx)等核心内容,总大小19.6MB。已有2504人学习下载,表明其在实际项目与课程实践中具备较高参考价值。用户可直接复用保护AD优化的原理图与PCB布局,快速部署抗干扰RF前端;导入MDK5工程后,结合已适配STM32F103的完整RC522驱动(含初始化、防碰撞、MIFARE卡读写等函数),无需重写底层通信逻辑;同时通过工程中大量调试符号文件(如.axf、.map、.lst)和预编译头(.__i)可深入理解编译流程与内存映射,显著提升嵌入式RFID系统开发效率。 从下载那套RC522资料开始,到把它变成一块能稳定读卡的板子,中间其实有一段容易被忽略的“空档期”:代码是别人写的,图是别人画的,你拿到手能用,但真要做修改、排错、改板,就发现哪里都对不上号。网上搜“RC522 STM32F103”这类关键词,九成结果是模块接线图加一段C语言,丢给你一个不知道哪个工程改出来的MDK5代码,原理图、PCB、固件完全是三张皮。我整理这套资料时,特意把Altium Designer原理图、PCB、MDK5工程和STM32F103驱动全部按同一个项目配套好,硬件上动了哪里、代码里做什么配合,一一对得上。这篇文章就把包里有什么、为什么这么设计、拿到手后怎么改、实测中会踩哪些坑,一次性讲清楚。
无论你是第一次碰13.56MHz射频读卡,还是准备把RC522做成门禁、储物柜、签到台这类小产品,这套资料能帮你跳过自己从零拼图的过程。下文按“拆包到改板、编译到量产”的顺序走,我尽量用做硬件人说话的方式讲,不整虚的。
1. 先拆包:这套资料里到底有什么,能用在哪
1.1 解压后的目录结构
解压出来整体分四个部分:AD原理图、PCB、MDK5工程、STM32F103驱动工程。完整目录长这样:
RC522_Project/ ├── Doc/ │ ├── MFRC522_DataSheet.pdf │ ├── 天线设计参考.pdf │ └── 常见卡型说明.pdf ├── Hardware/ │ ├── RC522_V1.SchDoc │ ├── RC522_V1.PcbDoc │ ├── RC522_Lib.SchLib │ └── RC522_Lib.PcbLib ├── Firmware/ │ ├── MDK-ARM/ │ │ ├── RC522.uvprojx │ │ └── 其他散文件 │ ├── USER/ │ │ ├── main.c │ │ └── stm32f10x_it.c │ ├── HARDWARE/ │ │ ├── rc522.c / rc522.h │ │ ├── spi.c / spi.h │ │ ├── uart.c / uart.h │ │ └── delay.c / delay.h │ └── SYSTEM/ │ ├── sys.c │ └── usart.c └── README.mdDoc目录放的是芯片手册、天线设计参考、常用卡说明,这部分我建议先读,别跳过。MFRC522的数据手册有几十页,但真正决定你板子能不能读出卡的就那么几块:电源引脚、SPI时序、天线匹配、寄存器配置。
Hardware目录里的SchLib和PcbLib是自建的元件库,不是AD自带的那种通用库,这保证你打开别人看到的是同一套东西。很多共享工程翻车就是翻在库上——原理图里调了一个库元件,PCB里封装却对不上,最后绿油油一片错误。这套工程我自己编译、出过Gerber、打过样,所以库和板子是对得上的。
Firmware目录是MDK5工程,后面第四章细说。
1.2 “软硬件对上号”是这套资料最值钱的地方
很多新手拿到资料后第一反应是“代码能编译就好”,然后照着接线图搞了两天,读不到卡,开始怀疑人生。问题往往不在代码,而在硬件和代码的假设不一致。比如某份代码把RC522的CS脚接在GPIOA.4,你的板子却画到GPIOB.12,你盲改代码,坑就来了。
这套资料的对应关系在README里列了表,核心几行我抄在下面:
| 信号 | MCU引脚 | RC522模块/电路脚 | 说明 |
|---|---|---|---|
| SPI1_NSS | PA4 | SDA/CS | 软件控制 |
| SPI1_SCK | PA5 | SCK | 硬件SPI1 |
| SPI1_MISO | PA6 | MISO | 硬件SPI1 |
| SPI1_MOSI | PA7 | MOSI | 硬件SPI1 |
| RESET | PB0 | RST | 复位控制 |
| USART1_TX | PA9 | 调试串口发送 | 可接USB转TTL |
| USART1_RX | PA10 | 调试串口接收 | 可接USB转TTL |
用硬件SPI1纯属自然选择,STM32F103的SPI1就挂在APB2上,速度比SPI2更快,代码也最成熟。RC522数据手册推荐SPI时钟不大于10MHz,实测我用2MHz到4MHz最稳,第六章会讲为什么。
1.3 每个文件在什么时候用得上
原理图和PCB主要是三个场景用:一是你自己要改板、加功能,二是板子做回来焊完发现哪不对,要顺着电路查问题,三是给板厂出生产文件。MDK5工程则是你调试代码的主战场,不管你是改读卡逻辑、加PWM控制、接CAN通信,最终都要回到这个工程里动。
如果你只想快速验证硬件能不能用,那可以不用打开AD,直接把固件编译烧进去,看串口有没有卡号打印。但如果你想做自己的产品,建议把AD部分也过一遍,因为这是唯一能让你真正理解“为什么这块板子能读卡”的途径。
2. 为什么RC522配STM32F103是这个项目的最优解
2.1 RC522这个芯片解决了什么问题
RC522内部实际是指MFRC522,NXP出的13.56MHz非接触式读卡芯片,支持ISO/IEC 14443A协议,也就是市面上最普遍的MIFARE Classic 1K、S50卡等。它可以做到三件事:寻卡、读卡、写卡。读卡距离通常在2到5厘米,取决于天线设计。这个物理特性决定了它的场景:门禁刷卡、储物柜锁、签到机、会员刷卡,这些不需要远距离感应的场合,RC522是性价比很高的选择。
同类方案里,比它便宜的读卡芯片多数不带SPI接口或者寄存器操作复杂,开发周期长;比它功能强的比如PN532,支持NFC、卡模拟、点对点通信,但成本贵一倍,而且驱动复杂度也上去了。所以RC522是“够用、便宜、资料多、上手快”这几个标签最平衡的一个。
2.2 天线匹配电路才是RC522的命门
原理图里最容易被忽略的是天线部分。RC522要想以13.56MHz频率辐射能量,天线线圈需要和匹配电容组成一个谐振回路。通常匹配电容取值从几十皮法到一百多皮法,具体根据线圈的等效电感来算,公式就是常用的谐振频率公式:
[ f = \frac{1}{2\pi\sqrt{LC}} ]
但实际设计时靠纯计算很难一步到位,因为线圈匝数、线宽、走线寄生参数都会影响等效电感。所以常见做法是先照参考设计画一版,板子回来后用网络分析仪或示波器微调电容。我这里画的天线是一圈半的矩形线圈,外框约50mm×35mm,匹配电容初始值用的是数据手册推荐值,打样回来读卡距离稳定在3cm左右,够用。
2.3 为什么用STM32F103而不是更低成本的芯片
F103在今天看来不算年轻,但做这类项目它有一个优势:资源极度充裕。RC522用不了多少性能,但你在产品里往往还要接继电器、数码管、LCD、RS485、CAN、上位机通信,F103的USART、SPI、I2C、CAN外设数量和开发资料覆盖度都是这个价位MCU里最强的。更关键的是,STM32F103的库函数和HAL库生态太成熟了,随便搜一个引脚功能都有例程,团队协作或者后面接手维护的人都容易上手。
3. 用AD打开工程后的实操修改,含我踩过的坑
3.1 工程编译与电气规则检查
拿到AD工程,不要急着改,先Project→Compile PCB Project,把编译错误清零。常见的错误有两类:一类是原理图里元件的引脚悬空或者网络标号不匹配,另一类是封装缺失导致PCB转不过去。这些错误在Message面板里会列出来,双击可以直接跳到对应位置。
编译通过后,再跑一遍原理图的电气规则检查(ERC)。我习惯把“Unconnected Pin”和“Net has multiple names”两个检查项设为致命错误,这样能把原理图上隐藏的断线问题提前暴露出来,不至于等画完PCB才发现。
3.2 位号批量修改和封装检查
PCB上丝印位号乱是很多工程的通病,位置重叠、方向不统一、字号过大盖住焊盘。处理方法是:在PCB里框选所有位号字符,用Properties面板统一改字体高度、宽度和线宽,通常高度1.0mm到1.2mm、线宽0.15mm左右就能兼顾辨识度和不挡焊盘。然后Tools→Re-Annotate,按顺序重排位号。注意Re-Annotate之后一定要回原理图,用Tools→Back Annotate把改动反向同步过去,否则就会出现PCB位号和原理图不一致的“两张皮”问题。
封装检查这块,我建议在原理图里按Shift+P逐个看关键元件封装,重点看三个:RC522芯片本体焊盘尺寸、天线线圈到底画在什么层、插座和按钮的实际占位。很多封装问题在原理图里看不出来,必须切到PCB的3D预览模式(快捷键3)转一圈。
3.3 DRC检查:怎么看线是不是真的全部连完
AD里检查线是否连完,最可靠的是Design→Rules Check。在Electrical规则里把Un-Routed Net、Un-Connected Pin两项打开,执行DRC后会告诉你哪些网络还有鼠线(飞线)没布通。如果DRC报错,按T+M可以把错误标记全部“清零”,再按Shift+S切到单层显示,逐个区域检查剩下的鼠线。
这个操作看起来基础,但很多人画完板子后只看“有没有绿”,忽略了DRC里未布通网络的报错。绿油油的板子未必是连完的,有些是违规但被隐藏了规则提示,有些则是网络没排干净。
3.4 网格、铺铜和定位孔的调整要领
AD里按G可以快速切换捕获网格,默认1.0mm可能会让画线跳来跳去,我一般用0.254mm(10mil)作为布线网格,结构件限位用0.5mm。如果你打开工程发现格点不见了,基本就是误按了G把网格关了,按Ctrl+G打开网格设置,把Snap Grid和Visible Grid勾上即可。
地网络铺铜用Place→Polygon Pour,连接方式选Solid,这样能降低地阻抗。要注意RC522天线线圈正下方尽量不要铺实心铜,铜皮感应出的涡流会吃掉一部分磁场能量,导致读卡距离明显缩短。如果双层板要走完整地平面,建议天线区域挖空或改成网格铺铜,效果会好很多。
定位孔的画法我推荐在机械1层画圆心和孔径圆,再在禁布层(Keepout)画一个同样大小的禁止布线圆,这样板厂在出CAM时能准确识别,同时电气布线会被自动避开。
3.5 从布线规则到块板子的参考参数
这款双面板我用的规则供大家参考:
| 项目 | 设置值 | 说明 |
|---|---|---|
| 最小线宽 | 0.2mm | 信号线,普通密度 |
| 重点电源线宽 | 0.5mm | 3.3V主线 |
| GND铺铜连接方式 | Solid | 减少地阻抗 |
| 最小间距 | 0.2mm | 常规间距 |
| 过孔内径/外径 | 0.3mm/0.6mm | 直插电容还是贴片都好焊 |
| 天线走线宽度 | 0.5mm | 保证线圈Q值和电流承载 |
如果你手头是6层或者4层板,叠层设计是另一套逻辑,但RC522这块板用双面板能省不少成本,天线区域也更干净。
4. MDK5工程从打开到跑起来:F103驱动详解
4.1 MDK5安装与包兼容性
MDK5和MDK4在工程管理上差别不小。如果你本机装的MDK5打开这个工程提示找不到设备,先别怀疑工程坏了,八成是Device Family Pack没装。打开Pack Installer,搜索“STM32F1”,安装Keil.STM32F1xx_DFP组件。装好后重新打开工程,在Device选项卡里能看到STM32F103RC。如果你的电脑上装的是MDK4,那建议直接换成MDK5,ST官方和第三方库现在都默认MDK5环境,兼容性更好。
工程打开后,先编译一次,把宏定义、头文件路径检查一遍。我习惯在C/C++选项卡里确认Include Paths里是否包含了USER、HARDWARE、SYSTEM等目录,缺了头文件路径编译会直接报红,新手很容易卡在这一步。
4.2 驱动代码的分层结构
这个工程的驱动不是一堆文件堆在一起,而是分了三层,维护起来很舒服:
- 应用层:main.c,负责初始化外设、循环读卡、把卡号打印到串口,也留了PWM/CAN的调用接口。
- 板级支持:sys.c、usart.c,封装系统时钟初始化、延时函数和串口打印,硬件改动时主要改这里。
- 驱动层:spi.c、rc522.c,SPI底层和RC522芯片寄存器的读写封装,这部分最稳定,不需要频繁动。
rc522.c里核心API整理如下:
| 函数 | 作用 |
|---|---|
| RC522_Init() | 初始化SPI、复位芯片、配置RC522寄存器 |
| RC522_Request() | 寻卡,检测范围内是否有卡 |
| RC522_Anticoll() | 防冲突,取回卡的4字节序列号 |
| RC522_SelectTag() | 选定某一张卡,进入认证前状态 |
| RC522_Auth() | 验证扇区密钥,得到读写权限 |
| RC522_Read() / RC522_Write() | 读写卡上指定块的数据 |
写卡流程要记住一个顺序:寻卡→防冲突→选卡→认证→读写。网络上有些人只发寻卡和读块代码,没有认证那步,看似读到了卡号,其实没进扇区,所以写卡总是失败,这是很多“写不进卡”问题的来源。
4.3 SPI时序、复位和卡轮询的细节
RC522通过SPI接口跟F103通信,时序要求不算苛刻,但有两个细节容易出问题。第一个是SPI极性相位:MFRC522的SPI模式通常配置为CPOL=0、CPHA=0,也就是空闲时为低电平、第二个边沿采样。配置错了,寄存器读出来全是0xFF或0x00,芯片看起来像没上电。第二个是时钟频率:我实测SPI1时钟设到4MHz以下最稳,再高偶尔会误码,尤其是杜邦线连接的时候。
复位时序也要注意:RC522的RST引脚要先拉低至少几毫秒,再拉高,之后延时等待芯片就绪,再开始写寄存器初始化序列。直接上电就操作寄存器,偶尔能跑通,但温度、电源波动后就容易随机失败。追求稳定的项目,不要在复位时序上省这几毫秒。
卡轮询这部分,工程里用的是一秒内循环寻卡的方式,每次寻卡之间加10ms左右延时,避免连续高频查询把天线驱动电路拖累。如果你做低功耗设备,可以把寻卡做成定时唤醒,平时让RC522进入掉电模式(SoftPowerDown寄存器),读卡前再唤醒,效果明显。
4.4 串口、PWM、CAN等扩展需求的接入思路
既然主控是STM32F103,做产品基本不可能只读卡。最常见的是串口打印和PWM输出。串口部分,注意PA9是USART1_TX、PA10是USART1_RX,接USB转TTL模块时要交叉连接并共地,否则看数据跟看天书一样。PWM输出可以拿TIM2到TIM4任意一个通用定时器做,比如用TIM3_CH1输出一个频率可调、占空比可调的信号控制门锁或蜂鸣器,在main.c的初始化里加一段MX_TIM3_Init和修改占空比的接口就行。F103的PWM配置不算复杂,关键是算好预分频和自动重装值,以72MHz主频为例,输出20kHz PWM,预分频给71、重装值给50,一查公式就清楚了。
CAN通讯例程在资料里也留了一个简版,F103原生支持CAN2.0,只需要一颗CAN收发器芯片(比如TJA1050)就能上总线。用CAN把卡号发给上位机,比串口抗干扰能力强,适合车间、电梯这类环境。我第一次做的时候卡在CAN初始化失败,最后发现是波特率配置和外部上拉电阻一致性的问题,调好之后非常稳。
5. 实测记录:读卡性能和故障排查的完整链路
5.1 正常板子的表现
我手上的这套板子,用MIFARE 1K卡实测,读卡距离稳定在2.5到3.5cm,偶发能到4cm。卡片贴近时响应很快,串口在115200波特率下打印卡号基本无延迟。天线区域如果用手靠近,读卡距离会下降,这是正常现象,人的手会改变天线周围介电环境,不用过度担心。
5.2 一次“读卡距离只有1cm”的完整排查过程
刚打样回来第一版,读卡距离只有1cm,隔着外壳甚至读不到卡。我按这个顺序排查,最后找到根因,过程供参考:
先量RC522供电,3.3V纹波偏大,峰峰值接近200mV。在电源处补了一颗10μF陶瓷电容和一颗100nF高频电容后,纹波降到70mV左右,读卡距离好了一点,但仍然只有1.5cm。
接着怀疑天线匹配,用示波器看天线两端信号,发现谐振明显偏了。然后把天线匹配电容从原来的15pF交替调整到22pF,读卡距离从1.5cm跳到了3cm出头,说明问题是匹配电容和线圈参数不匹配。最后确认根因:第一版PCB的天线走线比参考设计宽了0.3mm,线宽变化改变了线圈电感,原来参考设计里的电容值就不适用了。
| 现象 | 可能原因 | 处理办法 |
|---|---|---|
| 完全读不到卡 | SPI接线错、RC522未复位、SPI模式错误 | 查PA4-PA7接线,查RST时序,核对CPOL/CPHA |
| 读卡距离短 | 天线匹配偏、天线下方铺铜 | 微调匹配电容,天线区镂空铺铜 |
| 时好时坏 | 电源纹波大、接触不良 | 电源加去耦电容,杜邦线换短引线或焊接 |
| 能读卡但写扇区失败 | 认证未通过、扇区不可写 | 检查Auth密钥,查扇区访问位 |
| 多个卡同时出现读卡混乱 | 防冲突处理不当 | 确认Anticoll返回和SelectTag是否正确 |
5.3 天线匹配电容怎么调:没有网分的土办法
不是所有人都有网络分析仪。我用的土办法是用一个5到50pF的可调电容,先焊在匹配电容的位置上,慢慢旋转,同时让卡片以固定距离贴近,看哪个位置读卡成功率最高,再用等容值的固定电容换上去,多试几种值,选读卡距离最远的。这个办法不精密,但工程上非常实用,尤其对RC522这种工作距离本身就在几厘米内的应用,能调出1cm以上的改善就说明谐振准了。
6. 从这套资料到自己产品:打样、Gerber和量产前的落地建议
6.1 发板前的检查清单
每次送板厂之前,我习惯按这个清单过一遍,能省不少冤枉钱:
- DRC是否0错误0警告,重点看Un-Routed Net。
- 板框是否封闭,原点是否在板框左下角。
- 定位孔孔径是否大于最终要求的成品孔径,孔边离板边保持至少0.3mm。
- 丝印位号是否压到焊盘,天线区域丝印是否影响读卡。
- 是否需要拼板,V-cut还是邮票孔,拼板后有没有加工艺边。
- Gerber是否完整输出,钻孔文件是否包含非金属化孔和金属化孔两类。
6.2 Gerber导出与“Gerber转PCB”反查
从AD导出Gerber,路径是File→Fabrication Outputs→Gerber Files。格式选RS-274-X,单位毫米,精度按2:5,层面对应好顶层、底层、丝印、阻焊、助焊,最后再导一个钻孔文件。导出后用CAM工具(比如CAMtastic或者第三方看图软件)打开看一遍,确认没有缺层、线没断,再发给板厂。
你可能听过“Gerber文件转PCB文件”这个操作,这主要是反向工程或者检查别人板子用的。AD里可以用Import→Gerber把Gerber导入,重建PCB图形,但要注意导入后没有网络连接信息,只有铜皮图形,不能当普通PCB直接改。遇到“the imported file was not wholly contained in the valid pcb region”这类报错,通常是你导入的Gerber范围超出了PCB板框边界,把板框文件一起导入或者手动设置范围为最大即可。
6.3 位号规范和跨工具转换的坑
位号处理是量产前最容易忽略的一环。嘉立创这类打样厂对丝印高度有建议值,位号太小看不清贴片,位号太大盖住焊盘又不方便焊接。我现在的做法是在AD里统一把位号字高设为1.2mm,字宽0.15mm,再配合Re-Annotate连续重排。这样导出的PDF和Gerber都很干净,工厂贴片时也不用专门要求“人工识别位号”。
如果你需要把这套AD工程转成PADS或Allegro,提前说一句:转换工具能搬图形,但库、规则、网络名可能丢一部分,尤其是一些异形焊盘和铜皮会被转换成默认形状。转换完必须重新做DRC和封装核对,不要抱有“一键转换直接投产”的幻想。Allegro和AD的软件理念差异很大,一个更强调约束管理器,一个更偏向图形化编辑,个人开发者用AD效率高,但到了大型团队配合,还是跟着整条设计链走为好。
6.4 资料归档的软件工程习惯
最后说一个容易被忽视的点:哪怕资料是分享用的,也要按软件工程的思路管理。每个版本改了什么,在README的更新日志里写一行;原理图、PCB、固件三者的版本号在同一个版本目录里;打样回来的实测结果记到release note里。我这套RC522资料的V1.0版就是这么维护的,后面自己回看、或者别人接手,都不需要重新考古一样翻历史文件。
一点个人体会
RC522这个方案这么多年还没有过时,原因很简单:它把“非接触读卡”这个需求做到了好用、便宜、开发量小。但如果你只拿一个别人的示例工程烧进去,不打开原理图看看天线匹配,不自己动手改改PCB,那学到的东西始终是碎片。我之前有几次打包资料被网友问“你这工程到底哪几个文件是有用的”,我越来越觉得,分享的意义不只是给文件,而是顺带把设计逻辑也讲清楚。这套RC522资料最让我满意的一点不是布线和代码多漂亮,而是你按着我上面的路径走一遍,能自己把读不了卡、写不进数这种问题定位到具体环节,然后真正改好它。
本文还有配套的精品资源,点击获取