当前位置: 首页 > article >正文

FM17550读写器实战:从零开始玩转S50卡(附完整代码)

FM17550读写器实战从零开始玩转S50卡附完整代码第一次接触RFID技术时我被那个隔空取物般的神奇体验震撼到了——不需要任何物理接触卡片靠近读写器就能完成数据交换。作为物联网领域最基础的感知技术之一RFID在门禁、物流、支付等场景中无处不在。本文将带你深入FM17550读写器与S50卡的实战开发从硬件连接到完整代码实现解决初学者最头疼的芯片手册看不懂、防冲突机制不会用等实际问题。1. 硬件准备与环境搭建1.1 硬件选型与连接FM17550是复旦微电子推出的13.56MHz RFID读写芯片兼容MFRC522但性价比更高。典型硬件连接如下表所示FM17550引脚连接目标备注VCC3.3V严禁接5VGND地线与MCU共地RSTGPIO硬件复位引脚IRQ悬空中断输出(本教程未使用)MISOMCU_MISOSPI从机输出MOSIMCU_MOSISPI从机输入SCKMCU_SCKSPI时钟SDA(SS)GPIO片选信号注意FM17550工作电压为2.5V-3.3V直接接5V会烧毁芯片建议使用电平转换模块与5V单片机通信。1.2 开发环境配置以STM32 HAL库为例需要配置SPI接口// SPI初始化代码示例 hspi1.Instance SPI1; hspi1.Init.Mode SPI_MODE_MASTER; hspi1.Init.Direction SPI_DIRECTION_2LINES; hspi1.Init.DataSize SPI_DATASIZE_8BIT; hspi1.Init.CLKPolarity SPI_POLARITY_LOW; hspi1.Init.CLKPhase SPI_PHASE_1EDGE; hspi1.Init.NSS SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler SPI_BAUDRATEPRESCALER_32; hspi1.Init.FirstBit SPI_FIRSTBIT_MSB; hspi1.Init.TIMode SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation SPI_CRCCALCULATION_DISABLE; hspi1.Init.CRCPolynomial 10; if (HAL_SPI_Init(hspi1) ! HAL_OK) { Error_Handler(); }关键参数说明BaudRatePrescalerSPI时钟分频建议初始设为32约1MHzNSS必须设为软件控制SPI_NSS_SOFTCLKPolarity/CLKPhase模式0POL0,PHA0或模式3POL1,PHA12. FM17550寄存器配置详解2.1 关键寄存器映射FM17550采用分页寄存器架构主要寄存器页如下寄存器页功能描述Page 0命令与状态控制Page 1通信控制Page 2发送配置Page 3接收配置常用寄存器操作函数// 写入寄存器 void FM17550_WriteReg(uint8_t addr, uint8_t val) { HAL_GPIO_WritePin(FM17550_SS_GPIO_Port, FM17550_SS_Pin, GPIO_PIN_RESET); HAL_SPI_Transmit(hspi1, addr, 1, 100); HAL_SPI_Transmit(hspi1, val, 1, 100); HAL_GPIO_WritePin(FM17550_SS_GPIO_Port, FM17550_SS_Pin, GPIO_PIN_SET); } // 读取寄存器 uint8_t FM17550_ReadReg(uint8_t addr) { uint8_t val; addr | 0x80; // 设置读标志位 HAL_GPIO_WritePin(FM17550_SS_GPIO_Port, FM17550_SS_Pin, GPIO_PIN_RESET); HAL_SPI_Transmit(hspi1, addr, 1, 100); HAL_SPI_Receive(hspi1, val, 1, 100); HAL_GPIO_WritePin(FM17550_SS_GPIO_Port, FM17550_SS_Pin, GPIO_PIN_SET); return val; }2.2 初始化流程完整的芯片初始化应包括以下步骤硬件复位拉低RST引脚至少50ms软件复位写入CommandReg的SoftReset命令定时器配置FM17550_WriteReg(TModeReg, 0x80); // 定时器自动重启 FM17550_WriteReg(TPrescalerReg, 0xA9);// 定时器预分频 FM17550_WriteReg(TReloadRegH, 0x03); // 重载值高位 FM17550_WriteReg(TReloadRegL, 0xE8); // 重载值低位RF配置FM17550_WriteReg(TxASKReg, 0x40); // 100% ASK调制 FM17550_WriteReg(ModeReg, 0x3D); // 定义发送器行为天线开启FM17550_WriteReg(TxControlReg, FM17550_ReadReg(TxControlReg) | 0x03); // 开启TX1/TX23. S50卡操作全流程3.1 卡片通信状态机S50卡遵循严格的状态转换机制POWER OFF → IDLE → READY → ACTIVE → HALT完整操作流程对应的状态转换复位POWER OFF → IDLE寻卡IDLE → READY防冲突获取完整UID选卡READY → ACTIVE数据操作读写/验证密码等挂起ACTIVE → HALT3.2 核心操作代码实现寻卡与防冲突uint8_t FM17550_Request(uint8_t req_mode, uint16_t *tag_type) { uint8_t status; FM17550_WriteReg(BitFramingReg, 0x07); // 最后一个字节的位数 FM17550_WriteReg(CommandReg, PCD_IDLE); // 停止当前命令 if (req_mode PICC_REQIDL) { FM17550_WriteReg(FIFOLevelReg, 0x26); // 写入REQA命令 } else { FM17550_WriteReg(FIFOLevelReg, 0x52); // 写入WUPA命令 } FM17550_WriteReg(CommandReg, PCD_TRANSCEIVE); FM17550_WriteReg(BitFramingReg, 0x80); // 启动发送 // 等待命令完成 uint16_t i 2000; while (1) { uint8_t n FM17550_ReadReg(ComIrqReg); if (n 0x30) break; // 收到数据或超时 if (--i 0) return STATUS_TIMEOUT; } // 检查错误标志 if (FM17550_ReadReg(ErrorReg) 0x13) { return STATUS_ERROR; } // 获取返回数据 uint8_t len FM17550_ReadReg(FIFOLevelReg); if (len ! 2) return STATUS_ERROR; *tag_type FM17550_ReadReg(FIFODataReg); *tag_type 8; *tag_type | FM17550_ReadReg(FIFODataReg); return STATUS_OK; }密码验证与数据读取uint8_t FM17550_Auth(uint8_t auth_mode, uint8_t block_addr, uint8_t *sector_key, uint8_t *ser_num) { uint8_t buff[12]; // 构造认证指令 buff[0] auth_mode; buff[1] block_addr; memcpy(buff[2], sector_key, 6); memcpy(buff[8], ser_num, 4); // 执行认证 return FM17550_ToCard(PCD_AUTHENT, buff, 12, NULL, NULL); } uint8_t FM17550_ReadBlock(uint8_t block_addr, uint8_t *recv_data) { uint8_t buff[2] {PICC_READ, block_addr}; uint8_t status FM17550_ToCard(PCD_TRANSCEIVE, buff, 2, recv_data, NULL); if (status ! STATUS_OK || recv_data[0] ! 0x0A) { return STATUS_ERROR; } return STATUS_OK; }4. 实战案例门禁系统设计4.1 系统架构设计[FM17550读写器] ←SPI→ [STM32 MCU] ←UART→ [上位机] ↑ [继电器控制] ↓ [电磁锁装置]4.2 核心业务逻辑实现void DoorLock_Control(uint8_t* uid) { // 1. 检查白名单 if (!Check_WhiteList(uid)) { Buzzer_Beep(3); // 非法卡提示音 return; } // 2. 验证扇区1密码 uint8_t default_key[6] {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; if (FM17550_Auth(PICC_AUTHENT1A, 4, default_key, uid) ! STATUS_OK) { Buzzer_Beep(2); // 认证失败提示音 return; } // 3. 读取用户权限 uint8_t block_data[16]; if (FM17550_ReadBlock(4, block_data) STATUS_OK) { if (block_data[0] 0x01) { // 检查权限位 Relay_On(); // 开锁 Delay_ms(3000); Relay_Off(); // 闭锁 Log_Access(uid, 1); // 记录成功日志 } else { Buzzer_Beep(1); // 权限不足提示音 } } }4.3 常见问题排查问题1寻卡失败返回STATUS_TIMEOUT检查天线连接是否正常确认晶振起振测量OSCIN引脚应有13.56MHz信号调整RxGain寄存器值0x27地址建议初始值0x70问题2密码验证失败确认使用的密钥与卡片匹配检查防冲突过程是否获取了正确的UID验证前确保卡片处于ACTIVE状态问题3数据写入后读取异常S50卡每个扇区最后一块存储密钥禁止普通写入写入前必须通过密码验证注意块地址范围是0-6316扇区×4块在完成第一个RFID项目后我强烈建议将常用操作封装成库函数。比如把寻卡、验证、读写等流程做成API这样后续开发可以直接调用效率能提升数倍。实际项目中还要考虑多卡同时出现的防冲突处理以及针对不同扇区设置不同权限等高级功能。

相关文章:

FM17550读写器实战:从零开始玩转S50卡(附完整代码)

FM17550读写器实战:从零开始玩转S50卡(附完整代码) 第一次接触RFID技术时,我被那个"隔空取物"般的神奇体验震撼到了——不需要任何物理接触,卡片靠近读写器就能完成数据交换。作为物联网领域最基础的感知技术…...

VSCode配置clangd踩坑指南:从安装到跳转全流程(附常见问题解决)

VSCode配置clangd实战指南:从零搭建高效C/C开发环境 作为一名长期与C/C打交道的开发者,我深知代码导航和智能提示对开发效率的影响。传统C/C插件在大型项目中的表现往往不尽如人意,而clangd作为LLVM项目的一部分,凭借其精准的代码…...

LangChain安装报错排查指南:从环境配置到依赖冲突解决

1. 为什么你的LangChain安装总是报错? 最近在技术社区看到不少朋友抱怨LangChain安装报错的问题,我自己第一次安装时也踩了不少坑。记得那天晚上折腾到凌晨两点,各种错误提示看得我头皮发麻。后来才发现,LangChain对Python版本和依…...

RuoYi-Vue3后台隐藏顶部栏和侧边栏的另一种思路:基于路由meta的动态布局方案

RuoYi-Vue3动态布局方案:基于路由meta的架构级实践 在开发企业级后台系统时,我们常常会遇到需要根据不同页面动态调整整体布局的需求。传统方案往往通过在组件内部维护状态或调用全局方法来控制布局元素的显隐,这种方式虽然能快速实现功能&am…...

STM32智能时钟系统设计与实现

基于STM32的便携式智能时钟系统设计1. 项目概述1.1 系统架构本设计采用STM32F103C8T6作为核心控制器,构建了一个多功能便携式时钟系统。系统集成了实时时钟(RTC)、环境温度检测和姿态自适应显示三大核心功能模块,通过0.96寸OLED显示屏提供直观的人机交互…...

RK3568 Android12红外遥控唤醒失效?手把手教你排查DTS配置问题

RK3568 Android12红外遥控唤醒失效?深度解析DTS配置与硬件唤醒机制 红外遥控唤醒功能在智能家居、机顶盒等嵌入式设备中属于基础需求,但实际开发中常遇到待机后无法唤醒的问题。本文将基于RK3568平台和Android12系统,从硬件原理到DTS配置&…...

RWKV7-1.5B-g1a显存优化部署教程:3.8GB实测占用下稳定运行的完整配置

RWKV7-1.5B-g1a显存优化部署教程:3.8GB实测占用下稳定运行的完整配置 1. 模型简介 rwkv7-1.5B-g1a是基于新一代RWKV-7架构的多语言文本生成模型,特别适合中文场景下的轻量级应用。这个1.5B参数的版本在保持良好生成质量的同时,通过架构优化…...

5个秘诀让你彻底掌握WinUtil:打造高效安全的Windows系统

5个秘诀让你彻底掌握WinUtil:打造高效安全的Windows系统 【免费下载链接】winutil Chris Titus Techs Windows Utility - Install Programs, Tweaks, Fixes, and Updates 项目地址: https://gitcode.com/GitHub_Trending/wi/winutil WinUtil是一款功能全面的…...

手把手教你用智慧农场小程序源码搭建自己的农业管理系统(含完整配置流程)

从零构建智慧农场小程序:源码解析与实战部署指南 引言:智慧农业的技术赋能 清晨六点,当大多数城市居民还在睡梦中时,山东寿光的菜农老张已经通过手机查看了大棚内作物的实时生长数据。温度22.3℃、湿度65%、土壤EC值1.2mS/cm——这…...

程序员面试别再死磕算法了!面试官真正想看的是这几点

文章目录开篇:刷题300道,面试5分钟挂,你中招了吗?算法是门票,但门票不能当饭吃面试官真正在偷看的五个隐藏考点1. 代码的"卫生习惯"比你想象的更重要2. 系统设计:别只会砌砖,要会盖楼…...

5大核心功能全面解析:无名杀网页版三国杀完整解决方案

5大核心功能全面解析:无名杀网页版三国杀完整解决方案 【免费下载链接】noname 项目地址: https://gitcode.com/GitHub_Trending/no/noname 无名杀是一款功能完整、完全免费的开源网页版三国杀游戏,为玩家提供随时随地的三国杀对战体验。这款专业…...

面试官不会告诉你:简历上这3句话,直接让你挂掉初面

文章目录前言第一句:"熟练掌握Office办公软件"正确姿势:第二句:"具有良好的团队合作精神"正确姿势:第三句:"抗压能力强,能适应高强度工作"正确姿势:藏在背后的底…...

学生党必看:Intel 7260AC网卡Ubuntu/Win双系统使用全攻略

Intel 7260AC网卡双系统终极优化指南:从安装到性能调优 作为一名长期折腾老旧笔记本的技术爱好者,我深刻理解学生党对性价比硬件的执着。Intel 7260AC这款发布于2013年的mini PCI-E网卡,至今仍是二手市场的热门选择——它支持802.11ac、双频5…...

别再复制模型占空间了!Ollama 1.5版本下,如何正确挂载外部GGUF文件(附详细路径配置)

高效管理模型存储:Ollama 1.5外部GGUF文件挂载全指南 每次下载新模型都要占用双倍空间?这可能是许多开发者使用Ollama时最头疼的问题之一。随着模型体积越来越大,动辄几十GB的文件复制操作不仅浪费宝贵存储资源,还会拖慢工作流程。…...

【ResNet深度解析】Bottleneck结构如何实现高效深层网络训练

1. 从梯度消失到残差连接:为什么需要Bottleneck? 十年前,当研究者们试图训练更深的神经网络时,遇到了一个令人头疼的问题:随着网络层数增加,模型性能不升反降。这不是过拟合导致的,而是因为梯度…...

联想服务器RAID5阵列配置与Windows Server系统安装全攻略

1. 联想服务器RAID5阵列配置详解 第一次接触服务器硬件配置的朋友可能会觉得RAID阵列很神秘,其实用大白话来说,RAID就是把多块硬盘组合成一个"超级硬盘"的技术。我经手过几十台联想SR650服务器的部署,RAID5是最常用的方案&#xff…...

NFC标签技术演进与主流厂商产品选型指南

1. NFC标签技术演进:从Type 1到Type 5的进化之路 NFC标签技术的发展就像智能手机的迭代升级,每一代都在解决前代的痛点。最早的Type 1标签诞生时,就像功能机时代的诺基亚,只能存储96字节数据,读写速度仅有106kbps。我曾…...

Langflow全场景部署实战指南:从本地开发到云端服务

Langflow全场景部署实战指南:从本地开发到云端服务 【免费下载链接】langflow ⛓️ Langflow 是 LangChain 的用户界面,使用 react-flow 设计,旨在提供一种轻松实验和原型设计流程的方式。 项目地址: https://gitcode.com/GitHub_Trending/…...

SAR成像新手避坑指南:从点目标到面目标,你的Matlab仿真为什么跑不出来?

SAR成像仿真实战:从点目标到面目标的Matlab避坑手册 当你第一次成功运行点目标SAR成像仿真时,那种成就感就像解开了宇宙的密码。但当你信心满满地转向面目标仿真,准备复现教科书上的精美图像时,Matlab却用各种报错和异常结果给你泼…...

避坑指南:Triton配置文件config.pbtxt里那些容易踩的坑(input/output参数详解)

Triton配置实战:input/output参数避坑手册 当你在深夜调试Triton推理服务时,突然看到"INVALID_ARGUMENT: unexpected inference input size"错误提示,而config.pbtxt文件已经反复检查了十几次——这种经历恐怕很多开发者都不陌生。…...

FPGA复位策略全流程验证:从RTL到实现后的仿真与电路解析

1. FPGA复位策略的重要性与验证流程 在FPGA设计中,复位策略就像建筑的地基,看起来不起眼却决定了整个系统的稳定性。我遇到过不少项目,功能仿真一切正常,但上板后随机出现异常,最后排查发现都是复位信号处理不当导致的…...

WuliArt Qwen-Image Turbo惊艳效果:低光照场景中暗部层次保留与高光不过曝控制

WuliArt Qwen-Image Turbo惊艳效果:低光照场景中暗部层次保留与高光不过曝控制 1. 引言:当AI绘画遇见光影挑战 你有没有遇到过这种情况?想让AI帮你画一张夜晚街头的照片,结果要么整个画面黑乎乎一片,什么细节都看不清…...

你的USB摄像头在Linux下真的‘能用’吗?从V4L2接口到ROS话题发布的完整诊断手册

你的USB摄像头在Linux下真的‘能用’吗?从V4L2接口到ROS话题发布的完整诊断手册 当你在Linux系统下插上USB摄像头,看到/dev/video0设备节点时,是否曾天真地以为一切就绪?直到ROS节点启动后,rqt_image_view里那片漆黑的…...

用OpenCV和C++实现无人机影像自动匹配:从Moravec特征点到NCC相关系数的完整流程

无人机影像智能匹配实战:基于OpenCV的Moravec与NCC全流程解析 当无人机掠过一片待测区域时,它每秒能捕获数十张高分辨率影像。这些影像蕴含着丰富的地理信息,但如何让这些二维图片"对话",构建出三维世界的数字孪生&…...

AMD ROCm深度学习实战:从零构建高性能AI推理架构

AMD ROCm深度学习实战:从零构建高性能AI推理架构 【免费下载链接】ROCm AMD ROCm™ Software - GitHub Home 项目地址: https://gitcode.com/GitHub_Trending/ro/ROCm 面对AI推理场景中模型部署复杂、性能瓶颈突出和硬件兼容性挑战,AMD ROCm开源软…...

AI写专著的秘密武器!实用软件推荐,开启专著创作新篇章

学术专著写作困境与AI工具解决方案 对于许多学者来说,撰写学术专著时所面临的最大挑战,就是“有限时间”与“无限期望”之间的矛盾。写好一本专著通常需要耗费三到五年,甚至更长时间,而研究人员还需要应对教学、科研项目和各种学…...

SiameseAOE模型C盘清理日志分析:自动识别大文件类型与可清理建议

SiameseAOE模型C盘清理日志分析:自动识别大文件类型与可清理建议 你是不是也经常被电脑C盘飘红的存储空间警告搞得心烦意乱?点开磁盘清理工具,面对一长串看不懂的日志文件和陌生的文件夹路径,根本无从下手——哪些能删&#xff1…...

Blender手绘贴图实战:从入门到精通

1. 初识Blender手绘贴图:从零开始的艺术创作 第一次打开Blender的纹理绘制功能时,我完全被这个数字画布迷住了。与传统平面绘图软件不同,Blender的手绘贴图是直接在3D模型表面作画,就像给雕塑上色一样直观。对于游戏美术、影视特效…...

如何高效完成从SVN到Git的完整迁移:svn2git实战指南

如何高效完成从SVN到Git的完整迁移:svn2git实战指南 【免费下载链接】svn2git 项目地址: https://gitcode.com/gh_mirrors/sv/svn2git 在软件开发生命周期中,版本控制系统迁移是一个关键但充满挑战的任务。随着Git在分布式版本控制领域的统治地位…...

Klipper高级诊断与性能优化终极指南:从日志分析到系统调优的完整方案

Klipper高级诊断与性能优化终极指南:从日志分析到系统调优的完整方案 【免费下载链接】klipper Klipper is a 3d-printer firmware 项目地址: https://gitcode.com/GitHub_Trending/kl/klipper 你是否曾因3D打印过程中的层偏移、温度波动或通信中断而烦恼&am…...