1. 项目背景与核心价值
去年接手一个社区门禁改造项目时,发现传统IC卡系统存在严重的复制风险。物业经理拿着几张从网上购买的复制卡找到我:"你看,用手机NFC功能就能轻松复制,这安全形同虚设啊!"这次经历促使我深入研究RFID技术,最终用STM32搭建了一套具备加密验证功能的刷卡系统。
这套系统的核心价值在于:
- 采用13.56MHz高频RFID技术,读取距离稳定在5-10cm
- 支持ISO14443A协议的MIFARE Classic 1K卡片
- 通过STM32硬件加密引擎实现三重认证
- 典型场景下刷卡响应时间<200ms
2. 硬件选型与电路设计
2.1 主控芯片选择
对比STM32F1和F4系列后,最终选用STM32F103C8T6最小系统板:
- 72MHz主频满足实时性要求
- 内置SPI接口可直接连接RFID模块
- 成本控制在25元以内
- 开发社区资源丰富(实测有bug时Stack Overflow解决率85%+)
注意:F1系列GPIO速度限制在50MHz,若需要更高速通信建议选用F4系列
2.2 RFID模块选型
RC522模块的性价比优势明显:
- 工作频率:13.56MHz
- 支持协议:ISO14443A/MIFARE
- 读写距离:0-6cm(实测加装天线可达10cm)
- 市场价格:12-15元
接线方案:
c复制RC522 STM32
SDA -> PA4(SPI1_NSS)
SCK -> PA5(SPI1_SCK)
MOSI -> PA7(SPI1_MOSI)
MISO -> PA6(SPI1_MISO)
IRQ -> 不接
GND -> GND
RST -> PA1
3.3V -> 3.3V
3. 软件架构设计
3.1 底层驱动开发
使用HAL库实现SPI通信时,需要特别注意时钟相位配置:
c复制hspi1.Init.CLKPhase = SPI_PHASE_2EDGE; // 必须与RC522时序匹配
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
卡片检测采用状态机设计:
c复制typedef enum {
CARD_IDLE,
CARD_DETECTING,
CARD_AUTHENTICATING,
CARD_PROCESSING
} CardState;
3.2 安全认证流程
三级认证机制设计:
- 卡片UID校验(防白卡)
- 扇区密钥认证(防复制)
- 动态数据校验(防重放攻击)
关键加密算法实现:
c复制void AES_Encrypt(uint8_t* plainText, uint8_t* key) {
// 使用STM32硬件加密引擎
CRYP_KeyInitStructure.Key = key;
CRYP_Init(CRYP_AlgoMode_AES_ECB, CRYP_DataType_8b);
CRYP_DataIn(plainText);
CRYP_Start();
while(CRYP_GetFlagStatus(CRYP_FLAG_BUSY));
CRYP_DataOut(cipherText);
}
4. 系统优化与实测
4.1 天线调优技巧
通过调整PCB天线匹配电路提升读取距离:
- 匹配电容C1:27pF(原装22pF)
- 匹配电容C2:10pF(原装12pF)
- 天线线圈:用0.5mm漆包线绕制5圈
实测效果:
| 配置方案 | 读取距离(cm) | 功耗(mA) |
|---|---|---|
| 原装天线 | 4.2 | 45 |
| 优化方案 | 7.8 | 52 |
4.2 低功耗设计
采用间歇唤醒模式:
c复制void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc) {
RFID_WakeUp();
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
}
功耗对比:
- 持续工作模式:58mA
- 间隔唤醒模式(1s周期):平均9mA
5. 常见问题排查
5.1 卡片无法识别
典型故障树:
- 检查SPI时钟相位(80%问题出在这里)
- 测量天线谐振频率(应为13.56MHz±5%)
- 验证3.3V电源纹波(应<50mV)
5.2 数据写入失败
解决方案:
- 先执行认证流程再写入
- 检查块地址是否为数据块(非厂商块)
- 确认密钥类型(A/B密钥权限不同)
6. 项目进阶方向
这套系统在实际部署后,我又做了这些优化:
- 增加NFC手机兼容模式(需修改APDU指令)
- 集成Wiegand26输出接口(兼容传统门禁控制器)
- 添加温度补偿电路(解决冬季读取距离缩短问题)
最近正在试验双频段方案(125kHz+13.56MHz),用来同时支持ID卡和IC卡。调试中发现两个频段天线需要间隔至少15cm,否则会产生互调干扰。
