/******************************************************************************************************** * @file READER.h * @brief RFID 读卡器底层驱动及协议头文件 * @details * 本文件定义了与RFID芯片交互所需的常量、数据结构和函数原型。 * * @author Kilo Code * @date 2025-11-24 * @version 1.0 ********************************************************************************************************/ #ifndef _READER_H #define _READER_H /******************************************************************************************************** * 常量定义 ********************************************************************************************************/ // ISO14443A 命令码 static const unsigned char RF_CMD_REQA = 0x26; /**< 请求命令 */ static const unsigned char RF_CMD_WUPA = 0x52; /**< 唤醒命令 */ static const unsigned char RF_CMD_ANTICOLL[3] = {0x93, 0x95, 0x97}; /**< 防冲突命令,根据级联级别选择 */ static const unsigned char RF_CMD_SELECT[3] = {0x93, 0x95, 0x97}; /**< 选择命令,根据级联级别选择 */ // MIFARE Classic 命令码 static const unsigned char RF_CMD_KEYA = 0x60; /**< 密钥A认证 */ static const unsigned char RF_CMD_KEYB = 0x61; /**< 密钥B认证 */ /******************************************************************************************************** * 卡片信息结构体 ********************************************************************************************************/ /** * @brief 存储ISO/IEC 14443 Type B卡片信息的结构体 */ struct picc_b_struct { unsigned char ATQB[12]; /**< REQB/WUPB的响应 (Answer to Request B) */ unsigned char PUPI[4]; /**< Pseudo-Unique PICC Identifier */ unsigned char APPLICATION_DATA[4]; /**< 应用数据 */ unsigned char PROTOCOL_INF[3]; /**< 协议信息 */ unsigned char CID; /**< 卡片ID (Card Identifier) */ unsigned char Answer_to_HALT[1]; /**< HALT命令的响应 */ unsigned char SN[8]; /**< 序列号 (自定义命令获取) */ }; extern struct picc_b_struct PICC_B; /** * @brief 存储ISO/IEC 14443 Type A卡片信息的结构体 */ struct picc_a_struct { unsigned char ATQA[2]; /**< REQA/WUPA的响应 (Answer to Request A) */ unsigned char CASCADE_LEVEL; /**< 当前级联级别 (用于处理多级UID) */ unsigned char UID_Length; /**< UID的长度 (4, 7, or 10 bytes) */ unsigned char UID[15]; /**< 卡片唯一ID (Unique Identifier) */ unsigned char BCC[3]; /**< 块校验字符 (Block Check Character) */ unsigned char SAK[3]; /**< 选择确认 (Select Acknowledge) */ }; extern struct picc_a_struct PICC_A; /** * @brief 存储ISO/IEC 15693 (Type V) 卡片信息的结构体 */ struct picc_v_struct { unsigned char UID[8]; /**< 卡片唯一ID (Unique Identifier) */ unsigned char RESPONSE; /**< 命令响应标志 */ unsigned char BLOCK_DATA[4]; /**< 读取或写入的块数据 */ }; extern struct picc_v_struct PICC_V; /** * @brief 存储FeliCa (Type F) 卡片信息的结构体 */ struct picc_f_struct { unsigned char UID[8]; /**< 卡片唯一ID (Unique Identifier) */ }; extern struct picc_f_struct PICC_F; /******************************************************************************************************** * 芯片参数配置 ********************************************************************************************************/ // --- Type A 参数 --- #define GAIN_A 7 // 接收增益 (范围 0~7) #define HPCF_A 3 // 高通滤波器截止频率 (范围 0~7) #define AMPLITUDE_A 255 // RF场幅度 (范围 0~255) // --- Type B 参数 --- #define GAIN_B 7 // 接收增益 #define HPCF_B 3 // 高通滤波器截止频率 #define AMPLITUDE_B 255 // RF场幅度 #define MODULATION_B 100 // 调制深度 (范围 0~255, 值越小调制越深) // --- Type V (ISO15693) 参数 --- #define GAIN_V 7 // 接收增益 #define HPCF_V 4 // 高通滤波器截止频率 #define AMPLITUDE_V 255 // RF场幅度 #define MODULATION_V 10 // 调制深度 // --- Type F (FeliCa) 参数 --- #define GAIN_F 7 // 接收增益 #define HPCF_F 4 // 高通滤波器截止频率 #define AMPLITUDE_F 255 // RF场幅度 #define MODULATION_F 100 // 调制深度 /******************************************************************************************************** * 函数原型声明 ********************************************************************************************************/ // --- 通用函数 --- extern void ModifyReg(unsigned char reg_address, unsigned char mask, unsigned char set); extern void Clear_FIFO(void); extern unsigned char SetCommand(unsigned char command); extern void SetParity(unsigned char state); extern void SetTimer(unsigned int timeout); extern unsigned char SetCW(unsigned char mode); // --- 协议初始化函数 --- extern unsigned char ReaderA_Initial(void); extern unsigned char ReaderB_Initial(void); extern unsigned char ReaderV_Initial(void); extern unsigned char ReaderF_Initial(void); // --- Type A 命令 --- extern unsigned char ReaderA_Wakeeup(struct picc_a_struct *picc_a); extern unsigned char ReaderA_Request(struct picc_a_struct *picc_a); extern unsigned char ReaderA_Anticoll(struct picc_a_struct *picc_a); extern unsigned char ReaderA_Select(struct picc_a_struct *picc_a); extern unsigned char ReaderA_CardActivate(struct picc_a_struct *picc_a); // --- Type B 命令 --- extern unsigned char ReaderB_Wakeup(struct picc_b_struct *picc_b); extern unsigned char ReaderB_Request(struct picc_b_struct *picc_b); extern unsigned char ReaderB_Attrib(struct picc_b_struct *picc_b); extern unsigned char ReaderB_Halt(struct picc_b_struct *picc_b); extern unsigned char ReaderB_Get_SN(struct picc_b_struct *picc_b); // --- Type V (ISO15693) 命令 --- extern unsigned char ReaderV_Inventory(struct picc_v_struct *picc_v); extern unsigned char ReaderV_Select(struct picc_v_struct *picc_v); extern unsigned char ReaderV_ReadSingleBlock(unsigned char block_num, struct picc_v_struct *picc_v); extern unsigned char ReaderV_WriteSingleBlock(unsigned char block_num, struct picc_v_struct *picc_v); // --- Type F (FeliCa) 命令 --- extern unsigned char ReaderF_Inventory(struct picc_f_struct *picc_f); #endif // _READER_H