您好,欢迎访问三七文档
RFID基础实验1.1RFID模块测试实验1.1.1实验目的1、熟悉单片机和RC522RFID模块;2、学习射频卡的工作原理;3、学习RC522的工作原理。1.1.2实验设备1、单片机模块一个2、标准串口线一根3、S50卡一张1.1.3准备知识阅读MFRC522PDF资料,重点学习RC522的主要寄存器和命令集,并了解兼容的SPI接口和定时器等其他部分的使用。有单片机基础。1.1.4实验原理通过串口助手发送命令,控制RFID模块执行相应的读写修改操作,基本框架如图如下:PC串口助手单片机MFRC522S50卡MFRC522是高度集成的非接触是(13.56MHz)读写卡芯片,支持ISO14443A/MIFARE,支持SPI接口、串行UART和I2C,本模块使用的是SPI接口,简化MFRC522框图如下:寄存器的详细配置请参照MFRC522PDF资料,这里就不详细列出ISO14443A/MIFARE读写器功能的通信图:MFRC522的操作有可执行一系列命令的内部状态机来决定,通过寄存器写入相应的命令代码来启动命令。执行一个命令所需要的参数和数据通过FIFO缓冲区来交换。命令概述如下:S50卡总共对应有16个扇区,03,07,11,15,19,23,27,31,35,39,43,57,51,55,59,63各自对应1-16扇区的密钥存储块,密钥存放格式如下:密钥块访问:数据块访问(i=0,1,2):1.1.5实验步骤1、标准串口线一根将单片机模块与PC串口模块连接,单片机和MFRC522模块连接,PC通过USB方口线给单片机供电;2、打开串口助手CommAssistant.exe;3、操作如图所示:读S50卡序列号;首先确认串口已经连接好,打开串口,设置十六进制显示,发送间隔设置为一毫秒;在发送框输入:02A0;其中02表示发送数据长度为2个字节,A0(A零)表示读序列号功能。读S50卡块数据,每块数据长度为16字节;在发送框输入:09A1FFFFFFFFFFFF02其中09表示发送数据长度9个字节,A1表示读数据块功能,FFFFFFFFFFFF表示六字节密钥(初始默认密钥为FFFFFFFFFFFF),如果密钥被修改,请将FFFFFFFFFFFF替换为新密钥,02表示读第三(从00开始计,02表示第三块)块数据(共64块,0-63)。写S50卡块数据,每块数据长度为16字节;在发送框输入:19A2FFFFFFFFFFFF0201020304050607080910111213141516;其中19(16进制)表示25字节,A2表示写数据块,FFFFFFFFFFFF表示六字节密钥(初始默认密钥为FFFFFFFFFFFF),如果密钥被修改,请将FFFFFFFFFFFF替换为新密钥,02表示读第三(从00开始计,02表示第三块)块数据,请不要随意写(04*n-01,即03,07,11,15,19,23,27,31,35,39,43,57,51,55,59,63因为这些块存放的是密钥,如果误操作,如19A2FFFFFFFFFFFF0301020304050607080910111213141516将会导致第一个扇区(00-03块)不可使用(亲测),S50卡一共有16个扇区,其余15个扇区仍然可用。后续还会进行二次开发,通过判断来避免误操作,此处只是初始演示学习。修改S50密钥第一个扇区密钥:在发送框输入:0FA3FFFFFFFFFFFF03000000000000其中0F表示发送数据长度15个字节,A3表示修改密钥,FFFFFFFFFFFF表示六字节密钥(初始默认密钥为FFFFFFFFFFFF),如果密钥被修改,请将FFFFFFFFFFFF替换为新密钥,03块存放的是第一块扇区的密钥,000000000000表示修改后的新密钥。请务必记住新密钥,如果密钥忘记,那对应的扇区将被锁死。1.1.6注意事项请勿随意修改密钥,如果修改密钥,请务必记住,如果密钥忘记,那么该密钥对应的扇区将被锁死。S50卡总共对应有16个扇区,03,07,11,15,19,23,27,31,35,39,43,57,51,55,59,63各自对应1-16扇区的密钥存储块。1.1.7程序框图main初始化串口、定时器和MFRC522模块等有按键?设置对应按键的功能有警告?报警执行成功?提示有串口命令?设置对应的串口命令功能执行命令处理系统任务调度?获取按键NNNNNYYYYYY1.1.8:模块附带代码解析单片机通过SPI读写MFRC522模块:/*SPI读*/unsignedcharSPIReadByte(void){unsignedchardataSPICount;unsignedchardataSPIData;SPIData=0;for(SPICount=0;SPICount8;SPICount++){SPIData=1;CLR_SPI_CK;nop();nop();if(STU_SPI_MISO){SPIData|=0x01;}SET_SPI_CK;nop();nop();}return(SPIData);}/*SPI写*/voidSPIWriteByte(unsignedchardataSPIData){unsignedchardataSPICount;for(SPICount=0;SPICount8;SPICount++){if(SPIData&0x80){SET_SPI_MOSI;}else{CLR_SPI_MOSI;}nop();nop();CLR_SPI_CK;nop();nop();SET_SPI_CK;nop();nop();SPIData=1;}}通过RC522和ISO14443卡通讯///////////////////////////////////////////////////////////////////////功能:通过RC522和ISO14443卡通讯//参数说明:Command[IN]:RC522命令字//pInData[IN]:通过RC522发送到卡片的数据//InLenByte[IN]:发送数据的字节长度//pOutData[OUT]:接收到的卡片返回数据//*pOutLenBit[OUT]:返回数据的位长度/////////////////////////////////////////////////////////////////////charPcdComMF522(unsignedchardataCommand,unsignedchar*pInData,unsignedchardataInLenByte,unsignedchar*pOutData,unsignedint*pOutLenBit){chardatastatus=MI_ERR;unsignedchardatairqEn=0x00;unsignedchardatawaitFor=0x00;unsignedchardatalastBits;unsignedchardatan;unsignedintdatai;switch(Command){casePCD_AUTHENT:irqEn=0x12;/*允许空闲中断请求,允许错误中断请求*/waitFor=0x10;/*等待命令自行结束*/break;casePCD_TRANSCEIVE:irqEn=0x77;/*允许发送器、接收器、空闲、报警、错误和定时器中断请求*/waitFor=0x30;/*等待接收一个有效数据流或命令自行结束*/break;default:break;}WriteRawRC(ComIEnReg,irqEn|0x80);/*开启中断,IRQ上的信号与Status1Reg的IRq位的值相反*/ClearBitMask(ComIrqReg,0x80);/*开启IRQ中断*/WriteRawRC(CommandReg,PCD_IDLE);/*使MFRC522处于空闲模式,终止正在执行的命令*/SetBitMask(FIFOLevelReg,0x80);/*清空FIFO缓存*/for(i=0;iInLenByte;i++){WriteRawRC(FIFODataReg,pInData[i]);}/*将发送数据写入FIFO*/WriteRawRC(CommandReg,Command);/*启动命令*/if(Command==PCD_TRANSCEIVE){SetBitMask(BitFramingReg,0x80);}/*启动数据的发送*///i=600;//根据时钟频率调整,操作M1卡最大等待时间25msi=2000;do{n=ReadRawRC(ComIrqReg);i--;}while((i!=0)&&!(n&0x01)&&!(n&waitFor));ClearBitMask(BitFramingReg,0x80);if(i!=0){if(!(ReadRawRC(ErrorReg)&0x1B))/*检测是否FIFO溢出,是否冲突,是否奇偶校验错误,是否协议错误*/{status=MI_OK;if(n&irqEn&0x01)/*检测定时器是否超时*/{status=MI_NOTAGERR;}if(Command==PCD_TRANSCEIVE){n=ReadRawRC(FIFOLevelReg);lastBits=ReadRawRC(ControlReg)&0x07;if(lastBits){*pOutLenBit=(n-1)*8+lastBits;}else{*pOutLenBit=n*8;}if(n==0){n=1;}if(nMAXRLEN){n=MAXRLEN;}for(i=0;in;i++){pOutData[i]=ReadRawRC(FIFODataReg);}}}else{status=MI_ERR;}}SetBitMask(ControlReg,0x80);//stoptimernowWriteRawRC(CommandReg,PCD_IDLE);/*使MFRC522处于空闲模式,终止正在执行的命令*/returnstatus;}MFRC522操作函数charPcdReset(void);/*复位RC522*/charPcdRequest(unsignedcharreq_code,unsignedchar*pTagType);/*寻卡函数*/voidPcdAntennaOn(void);/*开启天线*/voidPcdAntennaOff(void);/*关闭天线*/charM500PcdConfigISOType(unsignedchartype);/*设置工作方式*/charPcdAnticoll(unsignedchar*pSnr);/*防冲撞*/charPcdSelect(unsignedchar*pSnr);/*选定卡片*/charPcdAuthState(unsignedcharauth_mode,unsignedcharaddr,unsignedchar*pKey,unsignedchar*pSnr);/*验证卡片密码*/charPcdWrite(unsignedcharaddr,unsignedchar*pData);/*写数据数据到M1卡*/charPcdRead(unsignedcharaddr,unsignedchar*pData);/*读M1卡数据*/charPcdHalt(void);/*命令卡片进入休眠*/串口接收数据并转换为相应的命令:串口接收数据voiduart_interrupt_receive(void)interrupt4{uchardataR_Char;if(RI==1);{RI=0;WaitTimes=0;R_Char=SBUF;RevBuffer[uart_count]=R_Char;uart_count++;if(uart_count==RevBuffer[0]){uart_comp=1;}}}将串口接收的数
本文标题:RFID实验指南
链接地址:https://www.777doc.com/doc-5922157 .html