如何用RC522+STM32F103C8T6读取MIFARE 1K卡数据并实现USB HID输出
问题解答
1. 读取MIFARE 1K卡上的特定数据
MIFARE 1K卡采用扇区-块结构存储数据,要读取你写入的;1234567?格式数据,需完成以下步骤:
- 确定数据存储位置:原厂商大概率将数据写入了非UID所在的块(UID固定在扇区0的块0),优先尝试扇区1的块4、扇区2的块8这类常用存储块,或遍历所有可读写块测试。
- 实现MIFARE密钥认证:MIFARE卡每个扇区都有A、B两组密钥,读写数据块前必须通过密钥认证。原厂商可能使用默认密钥
FFFFFFFFFFFF,可先以此测试。核心代码示例:// 认证扇区1的块4,使用A密钥 uint8_t keyA[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; MFRC522_Auth(MFRC522_AUTH_KEY_A, 4, keyA, &uid); // uid为已读取的卡UID - 读取数据块并解析:认证通过后读取对应块的16字节数据,将字节转换为ASCII字符串(因写入的是ASCII格式),过滤末尾填充0即可得到目标数据。示例:
uint8_t blockData[16]; MFRC522_Read(4, blockData); // 读取块4的数据 // 转换为ASCII字符串,遇到填充0停止 char targetData[17] = {0}; for(int i=0; i<16; i++){ if(blockData[i] == 0) break; targetData[i] = (char)blockData[i]; }
2. 实现USB HID键盘输出至记事本
STM32F103C8T6可通过USB HID设备类模拟键盘输入,步骤如下:
- CubeMX配置:开启USB外设,选择
HID设备类型,在HID配置中设置Descriptor Type为Keyboard,报告长度设为8(标准HID键盘报告格式:1字节修饰键 + 6字节按键码)。 - 实现HID键盘发送逻辑:将读取到的ASCII字符串转换为对应HID键盘扫描码,逐个发送按键按下+释放的报告。核心代码示例:
// ASCII转HID扫描码映射表(简化版) uint8_t ascii_to_hid[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x2B, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, // '1'-'7'对应0x1E-0x24 0x25, 0x26, 0x27, 0x28, 0x29, 0x2D, 0x2E, 0x2F, 0x33, // ';'对应0x33 0x38 // '?'对应0x38 }; // 发送单个字符 void HID_Send_Char(char c){ uint8_t report[8] = {0}; report[2] = ascii_to_hid[(uint8_t)c]; // 填充按键码 USBD_HID_SendReport(&hUsbDeviceFS, report, 8); HAL_Delay(10); // 发送按键释放报告 memset(report, 0, 8); USBD_HID_SendReport(&hUsbDeviceFS, report, 8); HAL_Delay(10); } // 发送完整字符串 void HID_Send_String(char* str){ while(*str){ HID_Send_Char(*str); str++; } } - 触发输入:成功读取到卡的目标数据后,调用
HID_Send_String(targetData)即可将数据输出到当前光标所在的记事本窗口。
3. 当前配置缺失的关键环节
- MIFARE数据块访问逻辑缺失:现有代码仅实现UID读取,未包含密钥认证、数据块读取及ASCII解析的完整逻辑。
- USB HID设备配置与实现不足:未在CubeMX中配置USB为HID键盘类型,也未编写HID报告发送的代码。
- 卡数据存储信息不明确:未确定原厂商写入数据的具体扇区/块、使用的密钥,导致无法正确定位和读取数据。
- RC522通信完整性验证:可能未确保RC522与STM32的SPI通信参数(时钟速度、引脚电平)完全匹配,导致数据读取失败。
内容的提问来源于stack exchange,提问作者user29444496
相关产品推荐
相关产品推荐

