news 2026/4/20 11:37:14

STM32F103驱动RC522读卡器:从SPI通信协议到M1卡数据读写全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32F103驱动RC522读卡器:从SPI通信协议到M1卡数据读写全解析

STM32F103驱动RC522读卡器:从SPI通信协议到M1卡数据读写全解析

在嵌入式系统开发中,RFID技术因其非接触式识别的特性被广泛应用于门禁系统、物流追踪和智能支付等领域。本文将深入探讨如何基于STM32F103微控制器通过SPI接口驱动RC522读卡器,实现对M1卡(Mifare Classic)的完整读写操作。不同于简单的库函数调用教程,我们将从底层通信协议出发,逐步构建完整的RFID读写系统。

1. 硬件架构与SPI通信基础

RC522是一款高度集成的13.56MHz射频读写芯片,支持ISO/IEC 14443 Type A协议。与STM32F103的通信主要通过SPI接口实现,以下是关键硬件连接方式:

RC522引脚STM32F103引脚功能描述
SDAPA4片选信号(SPI_NSS)
SCKPA5时钟信号(SPI_SCK)
MOSIPA7主出从入(SPI_MOSI)
MISOPA6主入从出(SPI_MISO)
RSTPB0复位信号
VCC3.3V电源
GNDGND地线

SPI初始化代码示例

void SPI1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; // 使能GPIO和SPI时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); // 配置SPI引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); // SPI参数配置 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_Init(SPI1, &SPI_InitStructure); SPI_Cmd(SPI1, ENABLE); }

注意:RC522的SPI通信时钟相位(CPHA)需设置为第二个边沿采样,这与多数SPI设备的配置不同。错误的相位设置会导致通信失败。

2. RC522寄存器配置与初始化流程

RC522内部包含多个功能寄存器,合理的初始化序列是确保正常工作的关键。以下是核心初始化步骤:

  1. 硬件复位:拉低RST引脚至少1μs后释放
  2. 软件复位:写入0x0F到Command寄存器
  3. 定时器配置
    • 设置TModeReg为0x8D(定时器自动重载)
    • TPrescalerReg设为0x3E(分频系数)
  4. RF参数配置
    • TxModeReg设置发射器调制方式
    • RxModeReg配置接收器参数
  5. 天线开启:设置TxControlReg的0x03位

关键寄存器配置函数

void M500PcdConfigISOType(u8 type) { if(type == 'A') { // ISO14443-A模式 ClearBitMask(Status2Reg, 0x08); WriteRawRC(ModeReg, 0x3D); WriteRawRC(RxSelReg, 0x86); WriteRawRC(RFCfgReg, 0x7F); WriteRawRC(TReloadRegL, 30); WriteRawRC(TReloadRegH, 0); WriteRawRC(TModeReg, 0x8D); WriteRawRC(TPrescalerReg, 0x3E); delay_us(2); PcdAntennaOn(); } }

3. M1卡操作全流程解析

Mifare Classic 1K(M1)卡的存储结构分为16个扇区,每个扇区包含4个块(共64块)。其中:

  • 块0为厂商信息,只读
  • 每个扇区的块3为控制块,存储密钥和访问权限
  • 其余块为数据块,可读写

典型操作序列

  1. 寻卡(PcdRequest):发送0x52或0x26命令唤醒射频场内的卡片
  2. 防冲撞(PcdAnticoll):获取卡片UID,解决多卡冲突
  3. 选卡(PcdSelect):通过UID选择特定卡片
  4. 认证(PcdAuthState):验证扇区密钥(A密钥或B密钥)
  5. 数据操作:读写已验证扇区的数据块
char PcdAuthState(u8 ucAuth_mode, u8 ucAddr, u8 *pKey, u8 *pSnr) { char cStatus; u8 ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] = ucAuth_mode; // 0x60验证A密钥,0x61验证B密钥 ucComMF522Buf[1] = ucAddr; // 块地址 memcpy(&ucComMF522Buf[2], pKey, 6); // 6字节密钥 memcpy(&ucComMF522Buf[8], pSnr, 4); // 4字节卡UID cStatus = PcdComMF522(PCD_AUTHENT, ucComMF522Buf, 12, ucComMF522Buf, &ulLen); if((cStatus != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08))) cStatus = MI_ERR; return cStatus; }

提示:每个扇区必须通过密钥验证后才能进行读写操作。默认密钥通常为6个0xFF,但实际应用中应及时修改。

4. 数据读写实战与调试技巧

数据块读写示例

// 读取块数据 char PcdRead(u8 ucAddr, u8 *pData) { char cStatus; u8 ucComMF522Buf[MAXRLEN]; u32 ulLen; ucComMF522Buf[0] = PICC_READ; ucComMF522Buf[1] = ucAddr; CalulateCRC(ucComMF522Buf, 2, &ucComMF522Buf[2]); cStatus = PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 4, ucComMF522Buf, &ulLen); if((cStatus == MI_OK) && (ulLen == 0x90)) { memcpy(pData, ucComMF522Buf, 16); } else { cStatus = MI_ERR; } return cStatus; }

常见问题排查表

现象可能原因解决方案
寻卡失败天线未正确连接检查天线线圈和匹配电路
能寻卡但无法读UIDSPI相位/极性设置错误确认CPHA=2Edge, CPOL=High
认证通过但读写失败块地址超出范围确保操作非厂商块和控制块
通信不稳定电源噪声干扰增加电源滤波电容,缩短连线

在实际项目中,建议使用逻辑分析仪捕捉SPI波形,重点检查:

  • 片选信号(CS)的时序
  • 时钟与数据线的对应关系
  • 命令响应时间是否符合RC522规格书要求

通过深入理解SPI通信协议和ISO14443-A标准,开发者可以灵活应对各种复杂的RFID应用场景。我曾在一个门禁系统项目中遇到多卡冲突问题,最终通过优化防冲撞算法和调整射频场参数解决了稳定性问题。记住,成功的嵌入式开发不仅在于代码实现,更在于对硬件特性的深刻把握。

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

CompressO:你的跨平台视频压缩专家,免费开源释放存储空间

CompressO:你的跨平台视频压缩专家,免费开源释放存储空间 【免费下载链接】compressO Convert any video/image into a tiny size. 100% free & open-source. Available for Mac, Windows & Linux. 项目地址: https://gitcode.com/gh_mirrors/…

作者头像 李华
网站建设 2026/4/20 11:34:21

Intv_AI_MK11应对Java面试题:自动生成答案解析与知识延伸

Intv_AI_MK11应对Java面试题:自动生成答案解析与知识延伸 1. 效果展示开场 最近在技术社区看到一个有趣的讨论:Java面试准备过程中,最耗时的部分是什么?超过70%的开发者选择了"整理答案解析和知识延伸"。传统方式下&a…

作者头像 李华
网站建设 2026/4/20 11:30:10

LightOnOCR-2-1B部署教程:WSL2环境下Windows主机部署LightOnOCR-2-1B

LightOnOCR-2-1B部署教程:WSL2环境下Windows主机部署LightOnOCR-2-1B 1. 环境准备与系统要求 在开始部署LightOnOCR-2-1B之前,请确保你的Windows系统满足以下要求: 硬件要求: Windows 10或Windows 11操作系统至少16GB系统内存…

作者头像 李华