mfrc522程序注释-(1)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

#includeintrins.h#includereg52.h#includemain.h#includemfrc522.h#includestring.h#defineMAXRLEN18/*******RxModeReg默认为106kbit/s的通信速率******************//************************************************************************功能:寻卡*参数说明:req_code[IN]:寻卡方式*0x52=寻感应区内所有符合14443A标准的卡*0x26=寻未进入休眠状态的卡*pTagType[OUT]:卡片类型代码*0x4400=Mifare_UltraLight*0x0400=Mifare_One(S50)*0x0200=Mifare_One(S70)*0x0800=Mifare_Pro(X)*0x4403=Mifare_DESFire*返回:成功返回MI_OK***********************************************************************/charPcdRequest(unsignedcharreq_code,unsignedchar*pTagType){charstatus;unsignedintunLen;unsignedcharucComMF522Buf[MAXRLEN];//unsignedcharxTest;ClearBitMask(Status2Reg,0x08);//清MFCrypto1On,只能通过软件清零,该位用来指示Crypto1的接通情况,MFAuthent(验证密钥)命令成功执行后置1WriteRawRC(BitFramingReg,0x07);//TxLastBits([2-0])表示发送的最后一个字节7位发送//xTest=ReadRawRC(BitFramingReg);//if(xTest==0x07)//{LED_GREEN=0;}//else{LED_GREEN=1;while(1){}}SetBitMask(TxControlReg,0x03);//TxControlReg低2位(Tx2RFEn和Tx1RFEn)置1,Tx2和Tx1管脚输出信号调制在13.56MHz的载波上ucComMF522Buf[0]=req_code;status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);//PCD_TRANSCEIVE==0x0c发送并接收数据//if(status==MI_OK)//{LED_GREEN=0;}//else{LED_GREEN=1;}if((status==MI_OK)&&(unLen==0x10))//发送成功并且接收16位数据{*pTagType=ucComMF522Buf[0];*(pTagType+1)=ucComMF522Buf[1];//接收的卡片类型保存在pTagType中}else{status=MI_ERR;}returnstatus;}/***********************************************************************功能:防冲撞*参数说明:pSnr[OUT]:卡片序列号,4字节*返回:成功返回MI_OK**********************************************************************/charPcdAnticoll(unsignedchar*pSnr){charstatus;unsignedchari,snr_check=0;unsignedintunLen;unsignedcharucComMF522Buf[MAXRLEN];ClearBitMask(Status2Reg,0x08);//清MFCrypto1On,只能通过软件清零,该位用来指示Crypto1的接通情况,MFAuthent(验证密钥)命令成功执行后置1WriteRawRC(BitFramingReg,0x00);//TxLastBits([2-0])表示发送的最后一个字节的所有位都发送ClearBitMask(CollReg,0x80);//高位置0,所有接收的位在冲突后清除ucComMF522Buf[0]=PICC_ANTICOLL1;//防冲撞(0x93)ucComMF522Buf[1]=0x20;status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);if(status==MI_OK){for(i=0;i4;i++){*(pSnr+i)=ucComMF522Buf[i];//读取卡片序列号snr_check^=ucComMF522Buf[i];}if(snr_check!=ucComMF522Buf[i]){status=MI_ERR;}}SetBitMask(CollReg,0x80);//置1,回归正常returnstatus;}/***********************************************************************功能:选定卡片*参数说明:pSnr[IN]:卡片序列号,4字节*返回:成功返回MI_OK**********************************************************************/charPcdSelect(unsignedchar*pSnr){charstatus;unsignedchari;unsignedintunLen;unsignedcharucComMF522Buf[MAXRLEN];ucComMF522Buf[0]=PICC_ANTICOLL1;//防冲撞ucComMF522Buf[1]=0x70;ucComMF522Buf[6]=0;for(i=0;i4;i++){ucComMF522Buf[i+2]=*(pSnr+i);//将卡片序列号写进去ucComMF522Buf[6]^=*(pSnr+i);}CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]);//CRC校验卡片序列号ClearBitMask(Status2Reg,0x08);//清MFCrypto1On,只能通过软件清零,该位用来指示Crypto1的接通情况,MFAuthent(验证密钥)命令成功执行后置1status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);//发送卡片的序列号及其校验码if((status==MI_OK)&&(unLen==0x18))//接收24位{status=MI_OK;}else{status=MI_ERR;}returnstatus;}/***********************************************************************功能:验证卡片密码*参数说明:auth_mode[IN]:密码验证模式*0x60=验证A密钥*0x61=验证B密钥*addr[IN]:块地址*pKey[IN]:密码*pSnr[IN]:卡片序列号,4字节*返回:成功返回MI_OK**********************************************************************/charPcdAuthState(unsignedcharauth_mode,unsignedcharaddr,unsignedchar*pKey,unsignedchar*pSnr){charstatus;unsignedintunLen;unsignedchari,ucComMF522Buf[MAXRLEN];ucComMF522Buf[0]=auth_mode;//验证模式ucComMF522Buf[1]=addr;//块地址for(i=0;i6;i++){ucComMF522Buf[i+2]=*(pKey+i);}//密码for(i=0;i4;i++)/*源代码是6,不知道正不正确*/{ucComMF522Buf[i+8]=*(pSnr+i);}//防冲撞卡号//memcpy(&ucComMF522Buf[2],pKey,6);//memcpy(&ucComMF522Buf[8],pSnr,4);status=PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);if((status!=MI_OK)||(!(ReadRawRC(Status2Reg)&0x08))){status=MI_ERR;}returnstatus;}/***********************************************************************功能:读取M1卡一块数据*参数说明:addr[IN]:块地址*pData[OUT]:读出的数据,16字节*返回:成功返回MI_OK***********************************************************************/charPcdRead(unsignedcharaddr,unsignedchar*pData){charstatus;unsignedintunLen;unsignedchari,ucComMF522Buf[MAXRLEN];ucComMF522Buf[0]=PICC_READ;//0x30,读块ucComMF522Buf[1]=addr;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);//计算CRC,存放在ucComMF522Buf[2]和ucComMF522Buf[3]中status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);//将4个字节放松出去,并接收数据if((status==MI_OK)&&(unLen==0x90))//接收144位(18字节)//{memcpy(pData,ucComMF522Buf,16);}{for(i=0;i16;i++){*(pData+i)=ucComMF522Buf[i];}//将前16字节读出}else{status=MI_ERR;}returnstatus;}/*********************************************************************功能:写数据到M1卡一块*参数说明:addr[IN]:块地址*pData[IN]:写入的数据,16字节*返回:成功返回MI_OK********************************************************************/charPcdWrite(unsignedcharaddr,unsignedchar*pData){charstatus;unsignedintunLen;unsignedchari,ucComMF522Buf[MAXRLEN];ucComMF522Buf[0]=PICC_WRITE;//0xa0写块ucComMF522Buf[1]=addr;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);//计算CRCstatus=Pc

1 / 19
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功