#include
#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_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];
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;
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); // 置1,回归正常 return status; }
/********************************************************************** * 功 能:选定卡片
* 参数说明: 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校验卡片序列号
ClearBitMask(Status2Reg,0x08); // 清MFCrypto1On,只能通过软件清零,该位用来指示Crypto1的接通情况,MFAuthent(验证密钥)命令成功执行后置1
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen); // 发送卡片的序列号及其校验码
if ((status == MI_OK) && (unLen == 0x18)) // 接收24位 { 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);
status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen); if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08))) { status = MI_ERR; }
return status; }
/********************************************************************** * 功 能:读取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]); // 计算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; i<16; i++)
{ *(pData+i) = ucComMF522Buf[i]; } // 将前16字节读出 } else
{ status = MI_ERR; }
return status; }
/******************************************************************** * 功 能:写数据到M1卡一块 * 参数说明: addr[IN]:块地址
* pData[IN]:写入的数据,16字节 * 返 回: 成功返回MI_OK
********************************************************************/ char PcdWrite(unsigned char addr,unsigned char *pData) {
char status;
unsigned int unLen;
unsigned char i,ucComMF522Buf[MAXRLEN];
ucComMF522Buf[0] = PICC_WRITE; // 0xa0 写块 ucComMF522Buf[1] = addr;
CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]); // 计算CRC
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen); // 发送写命令和地址
if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)) // 接收低四位为1010
{ status = MI_ERR; }
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库mfrc522程序注释在线全文阅读。
相关推荐: