mfrc522程序注释 (1)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ClearBitMask(Status2Reg,0x08); // 清 MFCrypto1On,只能通过软件清 零,该位用来指示 Crypto1 的接通情况,MFAuthent(验证密钥)命令成功执行后 置1 WriteRawRC(BitFramingReg,0x00); // TxLastBits([2-0])表示发送的最 后一个字节的所有位都发送 ClearBitMask(CollReg,0x80); // 高位置 0,所有接收的位在冲突后 清除 ucComMF522Buf[0] = PICC_ANTICOLL1; // 防冲撞(0x93) ucComMF522Buf[1] = 0x20;
=
/********************************************************************* * * 功 能:读取 M1 卡一块数据 * 参数说明: addr[IN]:块地址 * pData[OUT]:读出的数据,16 字节 * 返 回: 成功返回 MI_OK ********************************************************************** */ char PcdRead(unsigned char addr,unsigned char *pData) { char status; unsigned int unLen; unsigned char i,ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] = PICC_READ; // 0x30,读块 ucComMF522Buf[1] = addr; CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]); 在 ucComMF522Buf[2]和 ucComMF522Buf[3]中
ClearBitMask(Status2Reg,0x08); // 清 MFCrypto1On, 只能通过软件清零, 该位用来指示 Crypto1 的接通情况,MFAuthent(验证密钥)命令成功执行后置 1 status PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen); 发送卡片的序列号及其校验码 if ((status == MI_OK) && (unLen == 0x18)) { status = MI_OK; } else { status = MI_ERR; } return status; } /********************************************************************* * * 功 能:验证卡片密码 * 参数说明: auth_mode[IN]: 密码验证模式 * 0x60 = 验证 A 密钥 * 0x61 = 验证 B 密钥 * addr[IN]:块地址 * pKey[IN]:密码 * pSnr[IN]:卡片序列号,4 字节 * 返 回: 成功返回 MI_OK ********************************************************************** / char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr) { char status; unsigned int unLen; unsigned char i,ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] = auth_mode; // 验证模式 ucComMF522Buf[1] = addr; // 块地址 for (i=0; i<6; i++) { ucComMF522Buf[i+2] = *(pKey+i); } // 密码 for (i=0; i<4; i++) 代码是 6,不知道正不正确*/ { ucComMF522Buf[i+8] = *(pSnr+i); } // 防冲撞卡号 // memcpy(&ucComMF522Buf[2], pKey, 6); // memcpy(&ucComMF522Buf[8], pSnr, 4); // 接收 24 位 = //
#include <intrins.h> #include "reg52.h" #include "main.h" #include "mfrc522.h" #include <string.h> #define MAXRLEN 18 /******* 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 ********************************************************************** */ char PcdRequest(unsigned char req_code,unsigned char *pTagType) { char status; unsigned int unLen; unsigned char ucComMF522Buf[MAXRLEN]; // unsigned char xTest ; ClearBitMask(Status2Reg,0x08); // 清 MFCrypto1On, 只能通过软件清零, 该位用来指示 Crypto1 的接通情况,MFAuthent(验证密钥)命令成功执行后置 1 WriteRawRC(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_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen); if ((status != MI_OK) || (!(ReadRawRCห้องสมุดไป่ตู้Status2Reg) & 0x08))) { status = MI_ERR; } return status; }
// 计算 CRC,存放
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen); // 将 4 个字节放松出去,并接收数据 if ((status == MI_OK) && (unLen == 0x90)) // 接收 144 位(18 字节) // { memcpy(pData, ucComMF522Buf, 16); } { for (i=0; i<16; i++) { *(pData+i) = ucComMF522Buf[i]; } // 将前 16 字节读出 } else { status = MI_ERR; } return status; } /******************************************************************** * 功 能:写数据到 M1 卡一块
status PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen); if (status == MI_OK) { for (i=0; i<4; i++) { *(pSnr+i) = ucComMF522Buf[i]; // 读取卡片序列号 snr_check ^= ucComMF522Buf[i]; } if (snr_check != ucComMF522Buf[i]) { status = MI_ERR; } } SetBitMask(CollReg,0x80); return status; } // 置 1,回归正常
=
/********************************************************************* * * 功 能:选定卡片 * 参数说明: pSnr[IN]:卡片序列号,4 字节 * 返 回: 成功返回 MI_OK ********************************************************************** / char PcdSelect(unsigned char *pSnr) { char status; unsigned char i; unsigned int unLen; unsigned char ucComMF522Buf[MAXRLEN]; ucComMF522Buf[0] = PICC_ANTICOLL1; // 防冲撞 ucComMF522Buf[1] = 0x70; ucComMF522Buf[6] = 0; for (i=0; i<4; i++) { ucComMF522Buf[i+2] = *(pSnr+i); // 将卡片序列号写进去 ucComMF522Buf[6] ^= *(pSnr+i); } CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]); // CRC 校验卡片序 列号
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; } return status; } /********************************************************************* * * 功 能:防冲撞 * 参数说明: pSnr[OUT]:卡片序列号,4 字节 * 返 回: 成功返回 MI_OK ********************************************************************** / char PcdAnticoll(unsigned char *pSnr) { char status; unsigned char i,snr_check=0; unsigned int unLen; unsigned char ucComMF522Buf[MAXRLEN];