公司动态
RC522+STM32F103读卡方案:原理图、PCB、MDK工程全套解析
简介本资源是一套面向嵌入式开发者与电子设计初学者的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_NSSPA4SDA/CS软件控制SPI1_SCKPA5SCK硬件SPI1SPI1_MISOPA6MISO硬件SPI1SPI1_MOSIPA7MOSI硬件SPI1RESETPB0RST复位控制USART1_TXPA9调试串口发送可接USB转TTLUSART1_RXPA10调试串口接收可接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内部实际是指MFRC522NXP出的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位号和原理图不一致的“两张皮”问题。封装检查这块我建议在原理图里按ShiftP逐个看关键元件封装重点看三个RC522芯片本体焊盘尺寸、天线线圈到底画在什么层、插座和按钮的实际占位。很多封装问题在原理图里看不出来必须切到PCB的3D预览模式快捷键3转一圈。3.3 DRC检查怎么看线是不是真的全部连完AD里检查线是否连完最可靠的是Design→Rules Check。在Electrical规则里把Un-Routed Net、Un-Connected Pin两项打开执行DRC后会告诉你哪些网络还有鼠线飞线没布通。如果DRC报错按TM可以把错误标记全部“清零”再按ShiftS切到单层显示逐个区域检查剩下的鼠线。这个操作看起来基础但很多人画完板子后只看“有没有绿”忽略了DRC里未布通网络的报错。绿油油的板子未必是连完的有些是违规但被隐藏了规则提示有些则是网络没排干净。3.4 网格、铺铜和定位孔的调整要领AD里按G可以快速切换捕获网格默认1.0mm可能会让画线跳来跳去我一般用0.254mm10mil作为布线网格结构件限位用0.5mm。如果你打开工程发现格点不见了基本就是误按了G把网格关了按CtrlG打开网格设置把Snap Grid和Visible Grid勾上即可。地网络铺铜用Place→Polygon Pour连接方式选Solid这样能降低地阻抗。要注意RC522天线线圈正下方尽量不要铺实心铜铜皮感应出的涡流会吃掉一部分磁场能量导致读卡距离明显缩短。如果双层板要走完整地平面建议天线区域挖空或改成网格铺铜效果会好很多。定位孔的画法我推荐在机械1层画圆心和孔径圆再在禁布层Keepout画一个同样大小的禁止布线圆这样板厂在出CAM时能准确识别同时电气布线会被自动避开。3.5 从布线规则到块板子的参考参数这款双面板我用的规则供大家参考项目设置值说明最小线宽0.2mm信号线普通密度重点电源线宽0.5mm3.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那建议直接换成MDK5ST官方和第三方库现在都默认MDK5环境兼容性更好。工程打开后先编译一次把宏定义、头文件路径检查一遍。我习惯在C/C选项卡里确认Include Paths里是否包含了USER、HARDWARE、SYSTEM等目录缺了头文件路径编译会直接报红新手很容易卡在这一步。4.2 驱动代码的分层结构这个工程的驱动不是一堆文件堆在一起而是分了三层维护起来很舒服应用层main.c负责初始化外设、循环读卡、把卡号打印到串口也留了PWM/CAN的调用接口。板级支持sys.c、usart.c封装系统时钟初始化、延时函数和串口打印硬件改动时主要改这里。驱动层spi.c、rc522.cSPI底层和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模式通常配置为CPOL0、CPHA0也就是空闲时为低电平、第二个边沿采样。配置错了寄存器读出来全是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资料最让我满意的一点不是布线和代码多漂亮而是你按着我上面的路径走一遍能自己把读不了卡、写不进数这种问题定位到具体环节然后真正改好它。本文还有配套的精品资源点击获取