news 2026/6/17 22:12:28

用STM32F103和RC522模块DIY一个门禁卡复制器?手把手教你读写M1卡(附完整代码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用STM32F103和RC522模块DIY一个门禁卡复制器?手把手教你读写M1卡(附完整代码)

STM32与RC522模块实战:深入理解M1卡读写机制与安全实践

1. RFID技术基础与M1卡结构解析

在物联网和嵌入式系统领域,RFID(射频识别)技术已经成为不可或缺的重要组成部分。Mifare Classic 1K卡片(简称M1卡)作为13.56MHz高频RFID的典型代表,广泛应用于门禁系统、公交卡和小额支付等场景。

M1卡的核心特性

  • 1KB EEPROM存储空间,分为16个扇区
  • 每个扇区包含4个块(Block),每块16字节
  • 每个扇区的块3为控制块,存储两个密钥(Key A和Key B)及访问控制位
  • 采用ISO/IEC 14443 Type A通信协议
  • 典型读写距离2-10cm(取决于天线设计)

M1卡的存储结构可以用以下表格清晰表示:

扇区号块0块1块2块3(控制块)
0厂商信息(只读)数据块数据块密钥A+控制位+密钥B
1-15数据块数据块数据块密钥A+控制位+密钥B

重要提示:扇区0的块0存储厂商信息,出厂时已固化不可修改,这保证了每张卡片的唯一性标识。

2. 硬件搭建与开发环境配置

2.1 所需硬件组件

实现M1卡读写功能需要以下硬件组件:

  • STM32F103开发板(如正点原子精英版)
  • RFID-RC522读写模块
  • M1卡片(钥匙扣卡或标准卡片)
  • 杜邦线若干
  • USB转TTL串口模块(用于调试输出)

RC522模块引脚定义

  1. SDA - 片选信号
  2. SCK - SPI时钟
  3. MOSI - 主机输出从机输入
  4. MISO - 主机输入从机输出
  5. IRQ - 中断信号(本项目中未使用)
  6. GND - 地线
  7. RST - 复位信号
  8. VCC - 3.3V电源

2.2 硬件连接指南

将RC522模块与STM32F103连接时,需按照以下对应关系接线:

RC522引脚STM32引脚功能说明
SDAPA4SPI片选
SCKPA5SPI时钟
MOSIPA7主出从入
MISOPA6主入从出
RSTPB0复位信号
GNDGND共地
VCC3.3V电源输入

注意:RC522模块工作电压为3.3V,切勿接入5V电源,否则可能损坏模块。

2.3 开发环境准备

  1. 软件工具链

    • Keil MDK-ARM开发环境(建议V5.25+)
    • STM32CubeMX(用于外设初始化)
    • 串口调试工具(如Putty或SecureCRT)
  2. 工程配置关键步骤

// SPI初始化配置示例(STM32CubeMX生成) void MX_SPI1_Init(void) { 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_HIGH; // RC522要求 hspi1.Init.CLKPhase = SPI_PHASE_2EDGE; // 数据在第二个边沿采样 hspi1.Init.NSS = SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; // ~140kHz hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi1.Init.TIMode = SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; if (HAL_SPI_Init(&hspi1) != HAL_OK) { Error_Handler(); } }
  1. 库函数准备
    • 标准外设库或HAL库
    • RC522驱动程序(需实现SPI底层读写函数)

3. M1卡读写操作深度解析

3.1 卡片操作基本流程

对M1卡进行读写操作需要遵循严格的通信协议流程:

  1. 寻卡(Request):探测射频场内的卡片
  2. 防冲撞(Anticollision):获取卡片唯一标识UID
  3. 选卡(Select):选定特定UID的卡片
  4. 密钥验证(Authentication):验证扇区访问权限
  5. 数据操作(Read/Write):执行实际的读写操作
  6. 休眠(Halt):结束通信(可选)
// 典型操作流程代码示例 void M1Card_Operate(uint8_t sector, uint8_t block, uint8_t* key, uint8_t* data) { uint8_t uid[4]; uint8_t status; // 1. 寻卡 status = PcdRequest(PICC_REQALL, NULL); if(status != MI_OK) return; // 2. 防冲撞获取UID status = PcdAnticoll(uid); if(status != MI_OK) return; // 3. 选卡 status = PcdSelect(uid); if(status != MI_OK) return; // 4. 密钥验证(以Key A为例) uint8_t blockAddr = sector * 4 + 3; // 计算控制块地址 status = PcdAuthState(PICC_AUTHENT1A, blockAddr, key, uid); if(status != MI_OK) return; // 5. 数据读写 uint8_t dataBlockAddr = sector * 4 + block; status = PcdRead(dataBlockAddr, data); // 或PcdWrite // 6. 休眠(可选) PcdHalt(); }

3.2 密钥验证机制详解

M1卡的安全性建立在密钥验证基础上,每个扇区都有独立的两个密钥(Key A和Key B)和访问控制位。验证过程采用三重认证机制:

  1. 验证类型:0x60表示验证Key A,0x61表示验证Key B
  2. 块地址:只需指定目标扇区的任意块地址(通常是控制块)
  3. 密钥:6字节密钥(默认通常为0xFF 0xFF 0xFF 0xFF 0xFF 0xFF)
  4. 卡片UID:4字节唯一标识

验证成功后,才能对该扇区进行读写操作。访问控制位决定了密钥的具体权限,典型配置如下:

控制位值Key A权限Key B权限
0xFF078069不可读,全权限可读,无权限
0xAABBCCDD自定义权限自定义权限

安全建议:实际应用中应修改默认密钥,并合理设置访问控制位以提高安全性。

4. 完整项目实现与代码分析

4.1 系统初始化

完整的RC522初始化包括硬件复位、SPI接口配置和工作模式设置:

void RC522_Init(void) { // 1. 硬件复位 RC522_Reset_Disable(); delay_us(1); RC522_Reset_Enable(); delay_us(1); RC522_Reset_Disable(); delay_us(1); // 2. 配置寄存器 WriteRawRC(CommandReg, PCD_RESETPHASE); WriteRawRC(ModeReg, 0x3D); // 定义发送和接收常用模式 WriteRawRC(TReloadRegL, 30); // 定时器低位 WriteRawRC(TReloadRegH, 0); // 定时器高位 WriteRawRC(TModeReg, 0x8D); // 定时器模式 WriteRawRC(TPrescalerReg, 0x3E); // 定时器分频 // 3. 设置ISO14443 Type A模式 M500PcdConfigISOType('A'); // 4. 开启天线 PcdAntennaOn(); }

4.2 核心功能实现

数据读取功能

uint8_t M1_ReadBlock(uint8_t sector, uint8_t block, uint8_t* data) { uint8_t status, uid[4]; uint8_t blockAddr = sector * 4 + block; // 1. 寻卡 status = PcdRequest(PICC_REQALL, NULL); if(status != MI_OK) return status; // 2. 获取UID status = PcdAnticoll(uid); if(status != MI_OK) return status; // 3. 选卡 status = PcdSelect(uid); if(status != MI_OK) return status; // 4. 密钥验证(假设使用Key A) uint8_t authBlock = sector * 4 + 3; // 控制块地址 status = PcdAuthState(PICC_AUTHENT1A, authBlock, DefaultKey, uid); if(status != MI_OK) return status; // 5. 读取数据 status = PcdRead(blockAddr, data); // 6. 休眠卡片 PcdHalt(); return status; }

数据写入功能

uint8_t M1_WriteBlock(uint8_t sector, uint8_t block, uint8_t* data) { uint8_t status, uid[4]; uint8_t blockAddr = sector * 4 + block; // 验证流程与读取相同... // 写入数据 status = PcdWrite(blockAddr, data); // 验证写入结果 uint8_t readBack[16]; status = PcdRead(blockAddr, readBack); if(memcmp(data, readBack, 16) != 0) { return MI_ERR; } return MI_OK; }

4.3 串口调试与数据可视化

为了方便调试,可以通过串口输出操作过程和结果:

void ShowCardInfo(uint8_t* uid, uint8_t* data) { printf("Card UID: "); for(int i=0; i<4; i++) { printf("%02X ", uid[i]); } printf("\r\n"); printf("Data: "); for(int i=0; i<16; i++) { printf("%02X ", data[i]); if(i==7) printf(" "); // 8字节分隔 } printf("\r\n"); }

5. 安全实践与项目扩展

5.1 合法使用与安全边界

在开发RFID相关项目时,必须注意以下法律和道德规范:

  • 仅对自有卡片进行操作,未经授权不得访问他人卡片
  • 不得复制具有版权保护或安全认证的卡片
  • 商业应用需获得相应资质和授权
  • 尊重隐私权,不得非法收集或使用个人信息

技术防护措施

  • 定期更换密钥,不使用默认密钥
  • 合理设置访问控制位
  • 对敏感操作增加二次确认
  • 记录操作日志以备审计

5.2 项目扩展方向

基于本项目的核心功能,可以进一步开发以下实用应用:

  1. 门禁系统原型

    • 实现UID白名单验证
    • 增加继电器控制电路
    • 添加管理界面
  2. 电子钱包模拟

    • 实现余额存储和扣款
    • 加入简单加密算法
    • 设计充值功能
  3. 智能储物柜

    • 卡片与储物柜绑定
    • 超时提醒功能
    • 远程管理接口
  4. 考勤系统

    • 记录刷卡时间和UID
    • 数据统计分析
    • 报表生成功能
// 简单门禁验证示例 uint8_t CheckAccess(uint8_t* uid) { // 定义合法UID列表 uint8_t validUIDs[][4] = { {0x12, 0x34, 0x56, 0x78}, {0x9A, 0xBC, 0xDE, 0xF0} }; // 检查UID是否在合法列表中 for(int i=0; i<sizeof(validUIDs)/4; i++) { if(memcmp(uid, validUIDs[i], 4) == 0) { return 1; // 验证通过 } } return 0; // 验证失败 }

5.3 性能优化技巧

在实际应用中,可以考虑以下优化措施:

  1. 天线调谐

    • 调整匹配电路中的电容值
    • 优化天线形状和尺寸
    • 测试不同工作频率下的性能
  2. 通信优化

    • 合理设置SPI时钟频率
    • 采用DMA传输减少CPU占用
    • 优化协议处理流程
  3. 功耗管理

    • 动态调整发射功率
    • 实现轮询间隔可调
    • 低功耗模式设计
  4. 错误处理

    • 增加重试机制
    • 完善状态检测
    • 异常情况恢复

通过本项目的实践,不仅可以掌握STM32与RC522的硬件接口开发,更能深入理解RFID技术的工作原理和安全机制。这种基础技术的掌握,为后续开发更复杂的物联网应用奠定了坚实基础。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/6 7:30:58

GBase 8s数据库高可用能力之-ER企业级数据复制详解

《GBase 8s 高可用四部曲》前三部介绍了南大通用GBase 8s数据库&#xff08;gbase database&#xff09;的HAC 同城守护、RHAC 异地延伸、SSC 全员作战——它们构建的是"集群内"的高可用护城河。但现实世界里&#xff0c;数据往往散落在全国各地的不同数据库实例中&a…

作者头像 李华
网站建设 2026/6/6 7:29:44

效率提升:告别反复安装mathtype,用快马AI打造个人云端公式库

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 请生成一个提升效率的在线公式编辑工具。核心功能&#xff1a;1、一个持久的公式库面板&#xff0c;允许用户将常用或编辑好的公式保存并命名。2、主编辑区支持LaTeX输入和快捷图标…

作者头像 李华