SeanLib系列函数库-TX522
查看其它库函数说明请点击此处跳转到SeanLib主页1. 本篇内容本篇介绍RFID模块的操作函数库适用于深圳同欣智能的TX522系列读写模块本库提供了读卡ID、设置密钥、读块、写块的操作方法。本库包含 TX522.h 和 TX522.lib 两个文件同时依赖 SeanLib.c 中的一些函数/* 外部函数声明根据需要在SeanLib.c中实现 *************************************///获取系统滴答计数器单位ms裸机程序中用HAL_GetTick, 其它系统中可自定义externunsignedintSean_GetTick(void);//数据发送函数externvoidSean_Send(void*Dev,unsignedchar*Data,unsignedshortLen);//数据接收函数unsignedshortSean_Recv(void*Dev,unsignedchar*Data,unsignedshortMaxLen);2. 头文件介绍头文件中提供了一个TX522模块的设备结构体//定义一个RFID的设备类型typedefstruct{unsignedintTag;//提供一个变量可存储一些额外的信息如设备类型unsignedcharKeyMode;//私有模块的密钥验证模式unsignedcharSeqnr;//私有通讯中使用的包号用于通讯包校验void*ComDev;//提供一个万能指针可存放与该器件通讯的设备指针void(*Dispose)(void);//函数指针释放设备RFID_Status_t(*SetKey)(unsignedchar*KeyA,unsignedchar*KeyB);//函数指针设置模块的6字节密钥仅可设置一个密钥另一个为NULL即可RFID_Status_t(*GetID)(unsignedchar*ID);//函数指针激活卡并读IDID最长为11字节RFID_Status_t(*Sleep)(void);//函数指针关闭载波模块休眠RFID_Status_t(*ReadBlock)(unsignedcharBlkNum,unsignedchar*Data);//函数指针读一个块RFID_Status_t(*WriteBlock)(unsignedcharBlkNum,unsignedchar*Data);//函数指针写一个块}TX522_t;下面是创建设备的函数/******************************************************************************* * 功 能: 创建一个RFID设备 * 参 数: 无 * 返回值: 设备指针若创建失败返回空指针NULL *******************************************************************************/externTX522_t*NewTX522(void);这个库使用起来很方便没有繁琐的配置创建设备指针后即可直接进行读写卡操作。3. 示例代码3.1 创建设备voidRFID_Init(void){RFIDNewTX522();if(RFIDNULL){Error_Handle(1,Creat TX522 failed!);}}MSH_INIT_EXPORT(2,RFID_Init,Creat RFID modul);3.2 获取卡IDRFID的序列号有两种规格4字节长、7字节长使用Get_ID方法获取ID返回的数据长度比序列号多4字节规则如下Byte[0] Byte[1]Byte[2]Byte[3]Byte[4…n]TagTypeSakLenSN前两个字节是TagType常见的值有TagType卡类型0x0002Mifare1 S700x0004Mifare1 S50、SHC1101、11RF320x0010Mifare Light0x0044Mifare UltraLight0x3300SHC1102第三个字节Sak值Sak卡类型0x01Mifare1 Light0x04Mifare0 UltraLight0x08Mifare1 S50、11RF320x18Mifare1 S700x22SHC1101第4个字节表示后面有几个字节的序列号。使用下面代码读取ID必须用不少于11字节的数组来存放返回数据voidGet_RFID(char*Payload){unsignedcharID[11];RFID_Status_t Ret;RetRFID-GetID(ID);if(RetRFID_Status_OK){Printf_To_PC(OK,%s,%02X %02X %02X %02X\r\n_,__func__,ID[4],ID[5],ID[6],ID[7]);}elseif(RetRFID_Status_Error){Printf_To_PC(NG,%s,RFID_Status_Error\r\n_,__func__);}elseif(RetRFID_Status_OffLine){Printf_To_PC(NG,%s,RFID_Status_OffLine\r\n_,__func__);}elseif(RetRFID_Status_NoTag){Printf_To_PC(NG,%s,RFID_Status_NoTag\r\n_,__func__);}}MSH_CMD_EXPORT(Get_RFID,Get ID of RFID);3.3 读块常用的Mifare1 S50卡每个扇区有4个块每个块16个字节使用 ReadBlock 方法可以任意扇区的任意块包括扇区0中的块0厂商信息块。如果要读加密的卡需要提前在模块中设置密钥设置完后掉电保存下次不需要再次设置。使用下面代码读块voidGet_Model(char*Payload){charName[16];RFID_Status_t Ret;RetRFID-ReadBlock(4,(unsignedchar*)Name);Name[15]\0;if(RetRFID_Status_OK){Printf_To_PC(OK,%s,%s\r\n_,__func__,Name);}elseif(RetRFID_Status_Error){Printf_To_PC(NG,%s,RFID_Status_Error\r\n_,__func__);}elseif(RetRFID_Status_OffLine){Printf_To_PC(NG,%s,RFID_Status_OffLine\r\n_,__func__);}elseif(RetRFID_Status_NoTag){Printf_To_PC(NG,%s,RFID_Status_NoTag\r\n_,__func__);}}MSH_CMD_EXPORT(Get_Model,Get model name from RFID);这段代码从扇区1的块0中读16个字节写块的方面与读操作类似不再展出。3.4 设置密钥无论要读或写卡都需要设置密钥不过这个模块默认的密钥为FF FF FF FF FF FF可以读写任意不加密的卡。RFID支持两套密钥KeyA、KeyB允许有不同的权限配置建议设置密钥不要在项目代码中进行而是单独进行提前设置进模块之中之后再也不用操作。设置密钥的代码//设置模块的密钥将密钥写入模块后续所有的块操作都用该密钥验证unsignedcharKey[6]{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};//要用KeyA验证时RFID-SetKey(Key,NULL);//要用KeyB验证时RFID-SetKey(NULL,Key);