ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

【STM32 物联网实训】RFID 三连:读卡、写卡、刷卡

【STM32 物联网实训】RFID 三连:读卡、写卡、刷卡 这一篇记录物联网方向的RFID 系列读取、写入、刷卡消费充值同样是学校的智联场景实训箱STM32L431 Keil MDK5 HAL 库。RFID是物联网感知层里 身份识别 的代表技术门禁、校园卡、食堂刷卡、公交卡全是它。这篇不贴大段代码重点讲核心逻辑和真正踩过的坑。一、实验环境与硬件项目配置主控芯片STM32L431VCTxCortex-M4主频 80MHzRFID 芯片RC522NXP MFRC52213.56MHzISO14443A卡类型Mifare 1S50默认密码 FF FF FF FF FF FFRC522 接口硬件 SPI3分频 64 复位 PD0 片选 PA15人机交互TFT LCD 4 个按键 蜂鸣器 串口 2115200知识铺垫M1 卡内部结构 16 个扇区 × 每扇区 4 块每块 16 字节。每扇区的块 0/1/2 是数据块块 3 是控制块存密码和访问控制位——块 3 千万别乱写这是后面重点坑之一。二、实验一RFID 读取功能功能把卡放到感应区读出卡类型和 4 字节 UID 卡号LCD 串口显示蜂鸣器提示。核心代码读卡四步流程static void RC522_Read_ID(void) { uint8_t card_id_arr[4] {0}; // 卡ID缓存 uint8_t card_type_arr[2] {0}; // 卡类型缓存 status RC522_Search_Cards(PICC_REQALL, card_type_arr); // ① 寻卡 if(status MI_OK) { status MI_ERR; status RC522_Anticoll(card_id_arr); } // ② 防冲撞 if(status MI_OK) { status MI_ERR; status RC522_Select_Cards(card_id_arr); } // ③ 选卡 if(status MI_OK) // ④ 合成卡ID和类型 { Card_Id (card_id_arr[0] 24) | (card_id_arr[1] 16) | (card_id_arr[2] 8) | card_id_arr[3]; Card_Type (card_type_arr[0] 8) | card_type_arr[1]; RC522_Sleep(); // 让卡进入睡眠防止一直重复触发 } }实验现象刷卡 → 蜂鸣器响 400ms → 串口打印Card type S50(0x0400) Card ID 1268881799LCD 同步显示 Card Type Mifare_One(S50) 和 Card ID ...。卡类型判断表0x0400M1(S50)、0x0200S70、0x4400UltraLight、0x4403DESFire。⚠️重点坑必看寻卡 → 防冲撞 → 选卡这三步一步都不能省。防冲撞Anticoll是解决 两张卡同时放在感应区 时的冲突问题 —— 没有它两张卡一起放会读不出任何一张。新手最容易把三步简化成一步 寻卡就读然后发现读卡偶尔失败还找不到原因。另外读完后要调 RC522_Sleep() 让卡睡眠不然卡一直贴在感应区会每秒重复触发串口刷屏。三、实验二RFID 写入功能功能向卡扇区 1 的块 0/1/2写入数据key1→块 0 写 tangrenjiekey2→块 1 写 dongfangxueyuankey3→块 2 写 0x30313233key4→清空三块写完读回验证。核心代码验证密码 写数据 读回// ① 验证扇区密码默认 FFFFFFFFFFFF不通过则无法读写 status RC522_Verification_Password(PICC_AUTHENT1A, Sector_Addr_Date[1], Pass_Word, card_id); // ② 向扇区1的块0写入16字节数据 status RC522_Write_Date(Sector_Addr_Date[1], Test_date1); // tangrenjie if(status ! MI_OK) { printf(数据写入失败\r\n); return; } // ③ 读回块0/1/2确认写入成功 for(i 0; i 3; i) { status RC522_Read_Date(Sector_Addr_Date[1] i, card_date); memcpy(BlockData[i][0], card_date, 16); }实验现象按 key1 → 刷卡 → 数据写入成功读回显示 块0:tangrenjie 块1:dongfangxueyuan 块2:0123按 key4 刷卡后三块全部清零。⚠️重点坑必看每个扇区的块 3 是密码控制块写数据永远只能写块 0/1/2。块 3绝对地址 3,7,11,15,...,63存的是密码 A/B 和访问控制位有固定的数据格式一旦乱写进去整个扇区直接废掉—— 密码对不上、读写全部失败这张卡的这个扇区就再也用不了了。原厂代码注释里特意用大写警告了这一点是真的会发生的。另外写数据前必须先 RC522_Verification_Password 验证密码默认全 F密码错会导致写入静默失败现象就是 写数据失败 刷屏。四、实验三RFID 应用设计・刷卡消费充值这个实验最 物联网把卡当成一张电子钱包。key1 扣 2 元、key2 扣 12 元、key3 充值 200 元、key4 初始化新卡余额存在卡的数值块里刷卡即读写不联网也能用 —— 这就是 M1 卡在食堂 / 超市的玩法。背景知识M1 卡数据块有两种模式 ——数据保存模式普通读写实验二用的和数值模式专门存金额支持初始化 / 加值 / 减值指令。数值块格式固定4字节数值(小端) 4字节反码 4字节数值 1字节地址 3字节地址反码。核心代码充值 扣费// ① 新卡先初始化生成数值块格式写入初始金额 10 元 Wallet_Data_Init(); // ② 十进制金额转成 4 字节小端 Value_Change(Deduction_Value1, HEXvalue[0]); // 扣费 2 元 // ③ 执行减值/加值指令 status RC522_Deduction_Recharge(PICC_DECREMENT, // 扣费 Sector_Addr_Date[1] 0, HEXvalue); status RC522_Deduction_Recharge(PICC_INCREMENT, // 充值 Sector_Addr_Date[1] 0, HEXvalue); // ④ 读余额小端合成 Card_Money card_money[0] | (card_money[1] 8) | (card_money[2] 16) | (card_money[3] 24);实验现象key4 初始化新卡余额 10 元→ key3 刷卡充值 200 → 余额 210 → key1 刷卡扣 2 → 208 → key2 刷卡扣 12 → 196串口全程打印 RFID卡当前余额:xxx元LCD 同步显示蜂鸣器提示。⚠️重点坑必看余额判断的数值是模板没改干净的雷。看代码if(RCC522_Work_Mode 1) // 扣费2元if(Card_Money 0) // ← 应该是 2if(RCC522_Work_Mode 2) // 扣费12元if(Card_Money 5) // ← 应该是 12扣 2 元判断的是 0、扣 12 元判断的是 5—— 余额 5 元时扣 12 元照样成功余额直接变负数。这是因为工程模板默认金额是 1 元和 5 元改金额时判断条件没跟着改。演示到 余额不足 环节时会翻车记得改成 Card_Money 2 / Card_Money 12。另外两个提醒①新卡必须先 key4 初始化否则刷卡会提示 此卡未初始化② 初始化 / 扣费 / 充值之后要重新读一次余额再显示别用旧值。五、三个实验对比含总结实验核心功能关键 API存储位置总结B01 读取读卡类型 UID 卡号RC522_Search_Cards → Anticoll → Select_Cards只读不动卡内数据入门第一步四步流程要背熟注意防冲撞和多卡冲突B02 写入向扇区 1 块 0/1/2 写数据Verification_Password Write_Date Read_DateM1 数据块16 字节 / 块密码验证是读写前提块 3 控制块千万别碰写坏扇区直接废B03 刷卡消费充值 / 扣费 / 余额 / 初始化Deduction_RechargePICC_INCREMENT/DECREMENTM1 数值块固定格式数值块有专用格式和加值 / 减值指令余额判断要按真实金额改模板坑总结三个实验是层层递进的 —— 读卡是基础写卡是 能存数据消费是 把数据用起来正好对应物联网 感知 → 存储 → 应用 的链路。六、重点坑速查余额 5 元扣 12 元竟然成功余额判断是模板默认值没改Card_Money 5 应为 12金额和判断条件要同步修改。某扇区读写全部失败卡 废了把数据写进了块 3密码控制块。只写块 0/1/2块 3 绝对不动。提示 此卡未初始化新卡没有数值块格式先按 key4 初始化再使用。读卡偶尔失败、两张卡都读不出少了防冲撞或流程被简化寻卡→防冲撞→选卡三步要齐全。卡贴着感应区串口刷屏处理完没让卡睡眠记得调 RC522_Sleep()。七、总结RFID 三个实验做下来最深的感受RFID 的 身份 是硬件的每张 M1 卡的 4 字节 UID 出厂就烧死了读卡就是 认卡不认人这是它跟二维码最大的区别 —— 所以门禁、公交卡至今离不开它。卡内存储要分清 数据块 和 数值块普通读写用数据块存金额要用数值块指令加值 / 减值混用会出各种莫名其妙的问题。细节决定成败块 3 不能写、新卡先初始化、余额判断改金额要同步改 —— 这三个坑全是 照抄模板没细看 造成的。物联网的套路传感器篇是 采集数据RFID 篇是 识别身份 存数据后面再接上 WiFi 上云就是完整的物联网应用了。如果帮到了你欢迎点赞收藏评论区交流本文基于学校智联场景实训箱STM32L431 Keil MDK5 HAL 库真实工程代码整理代码已实测跑通。
返回列表