MFRC522射频识别参考程序注释new.docx
- 文档编号:30369831
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:22
- 大小:106.25KB
MFRC522射频识别参考程序注释new.docx
《MFRC522射频识别参考程序注释new.docx》由会员分享,可在线阅读,更多相关《MFRC522射频识别参考程序注释new.docx(22页珍藏版)》请在冰豆网上搜索。
MFRC522射频识别参考程序注释new
MFRC522射频识别参考程序注释
串口读取的数据
//------------------------------------------
ucAddr=((Address<<1)&0x7E)|0x80;//变化成有效的地址形式,最低位为0,最高位为1时候时,从MFRC522读出数据,最低位为0,最高位为0时候时,往MFRC522写数据,参考39页
//读SPI数据
//------------------------------------------
unsignedcharSPIReadByte(void)
{
unsignedchardataSPICount;//Counterusedtoclockoutthedata
unsignedchardataSPIData;
SPIData=0;
for(SPICount=0;SPICount<8;SPICount++)//Preparetoclockinthedatatoberead
{
SPIData<<=1;//Rotatethedata
CLR_SPI_CK;nop();nop();//RaisetheclocktoclockthedataoutoftheMAX7456
if(STU_SPI_MISO)
{
SPIData|=0x01;
}
SET_SPI_CK;nop();nop();//Droptheclockreadyforthenextbit
}//andloopback
return(SPIData);//Finallyreturnthereaddata
}
//------------------------------------------
//写SPI数据
//------------------------------------------
voidSPIWriteByte(unsignedchardataSPIData)
{
unsignedchardataSPICount;//Counterusedtoclockoutthedata
for(SPICount=0;SPICount<8;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;
}
}
/////////////////////////////////////////////////////////////////////
//功能:
寻卡
//参数说明:
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(unsignedchardatareq_code,unsignedchar*pTagType)
{
chardatastatus;
unsignedintdataunLen;
unsignedchardataucComMF522Buf[MAXRLEN];
ClearBitMask(Status2Reg,0x08);//清除MRCrypto1on,要用软件清零
WriteRawRC(BitFramingReg,0x07);//startsend=0,rxalign=0,在FIFO中存放的位置,TXlastbit=7
SetBitMask(TxControlReg,0x03);//TX2rfen=1,TX1RFen=1,传递调制的13.56MHZ的载波信号
ucComMF522Buf[0]=req_code;
status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);//******************8
if((status==MI_OK)&&(unLen==0x10))
{
*pTagType=ucComMF522Buf[0];
*(pTagType+1)=ucComMF522Buf[1];
}
else
{status=MI_ERR;}
returnstatus;
}
/////////////////////////////////////////////////////////////////////
//功能:
防冲撞
//参数说明:
pSnr[OUT]:
卡片序列号,4字节
//返回:
成功返回MI_OK
/////////////////////////////////////////////////////////////////////
charPcdAnticoll(unsignedchar*pSnr)
{
chardatastatus;
unsignedchardatai,snr_check=0;
unsignedintdataunLen;
unsignedchardataucComMF522Buf[MAXRLEN];
ClearBitMask(Status2Reg,0x08);//清除MRCrypto1on,要用软件清零
WriteRawRC(BitFramingReg,0x00);//表示最后一个字节所有位都发送
ClearBitMask(CollReg,0x80);//CollRegCollReg0冲突结束后冲突位被置零
ucComMF522Buf[0]=PICC_ANTICOLL1;
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);//CollRegCollReg在106kbps良好的防冲突情况下该位置1
returnstatus;
}
/////////////////////////////////////////////////////////////////////
//功能:
选定卡片
//参数说明:
pSnr[IN]:
卡片序列号,4字节
//返回:
成功返回MI_OK
/////////////////////////////////////////////////////////////////////
charPcdSelect(unsignedchar*pSnr)
{
chardatastatus;
unsignedchardatai;
unsignedintdataunLen;
unsignedchardataucComMF522Buf[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]);//########
ClearBitMask(Status2Reg,0x08);//清零MFcryon
status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);
if((status==MI_OK)&&(unLen==0x18))
{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(unsignedchardataauth_mode,unsignedchardataaddr,unsignedchar*pKey,unsignedchar*pSnr)
{
chardatastatus;
unsignedintdataunLen;
unsignedchardatai,ucComMF522Buf[MAXRLEN];
ucComMF522Buf[0]=auth_mode;//验证A密钥
ucComMF522Buf[1]=addr;//addr[IN]:
块地址
for(i=0;i<6;i++)
{ucComMF522Buf[i+2]=*(pKey+i);}
for(i=0;i<6;i++)
{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(unsignedchardataaddr,unsignedchar*pData)
{
chardatastatus;
unsignedintdataunLen;
unsignedchardatai,ucComMF522Buf[MAXRLEN];
ucComMF522Buf[0]=PICC_READ;
ucComMF522Buf[1]=addr;
CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
if((status==MI_OK)&&(unLen==0x90))
//{memcpy(pData,ucComMF522Buf,16);}
{
for(i=0;i<16;i++)
{*(pData+i)=ucComMF522Buf[i];}
}
else
{status=MI_ERR;}
returnstatus;
}
/////////////////////////////////////////////////////////////////////
//功能:
写数据到M1卡一块
//参数说明:
addr[IN]:
块地址
//pData[IN]:
写入的数据,16字节
//返回:
成功返回MI_OK
/////////////////////////////////////////////////////////////////////
charPcdWrite(unsignedchardataaddr,unsignedchar*pData)
{
chardatastatus;
unsignedintdataunLen;
unsignedchardatai,ucComMF522Buf[MAXRLEN];
ucComMF522Buf[0]=PICC_WRITE;
ucComMF522Buf[1]=addr;
CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
if((status!
=MI_OK)||(unLen!
=4)||((ucComMF522Buf[0]&0x0F)!
=0x0A))
{status=MI_ERR;}
if(status==MI_OK)
{
//memcpy(ucComMF522Buf,pData,16);
for(i=0;i<16;i++)
{
ucComMF522Buf[i]=*(pData+i);
}
CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);
status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);
if((status!
=MI_OK)||(unLen!
=4)||((ucComMF522Buf[0]&0x0F)!
=0x0A))
{status=MI_ERR;}
}
returnstatus;
}
/////////////////////////////////////////////////////////////////////
//功能:
命令卡片进入休眠状态
//返回:
成功返回MI_OK
/////////////////////////////////////////////////////////////////////
charPcdHalt(void)
{
chardatastatus;
unsignedintdataunLen;
unsignedchardataucComMF522Buf[MAXRLEN];
ucComMF522Buf[0]=PICC_HALT;
ucComMF522Buf[1]=0;
CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);
returnMI_OK;
}
/////////////////////////////////////////////////////////////////////
//用MF522计算CRC16函数
/////////////////////////////////////////////////////////////////////
voidCalulateCRC(unsignedchar*pIndata,unsignedchardatalen,unsignedchar*pOutData)
{
unsignedchardatai,n;
ClearBitMask(DivIrqReg,0x04);
WriteRawRC(CommandReg,PCD_IDLE);//取消当前命令
SetBitMask(FIFOLevelReg,0x80);//FlushBuffer清除ErrReg的标志位
for(i=0;i {WriteRawRC(FIFODataReg,*(pIndata+i));} WriteRawRC(CommandReg,PCD_CALCCRC); i=0xFF; do { n=ReadRawRC(DivIrqReg); i--; } while((i! =0)&&! (n&0x04));//当CRCIRq所有数据被处理完毕该位置位 pOutData[0]=ReadRawRC(CRCResultRegL);//显示计算出来的CRC值 pOutData[1]=ReadRawRC(CRCResultRegM); } ///////////////////////////////////////////////////////////////////// //功能: 复位RC522 //返回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// charPcdReset(void) { //PORTD|=(1< SET_RC522RST; delay_ns(10); //PORTD&=~(1< CLR_RC522RST; delay_ns(10); //PORTD|=(1< SET_RC522RST; delay_ns(10); WriteRawRC(CommandReg,PCD_RESETPHASE);//#definePCD_RESETPHASE0x0F//复位 delay_ns(10); WriteRawRC(ModeReg,0x3D);//和Mifare卡通讯,CRC初始值0x6363 WriteRawRC(TReloadRegL,30);//定时器的低8位数据, WriteRawRC(TReloadRegH,0);//定时器的高8位数据, WriteRawRC(TModeReg,0x8D);//定时器模式寄存器,定时器减值计数 WriteRawRC(TPrescalerReg,0x3E);//实际值是OXD3E这部分主要是设置定时器寄存器,############## WriteRawRC(TxAutoReg,0x40);//必须要,设置逻辑1,强制100%ASK调制 returnMI_OK; } ////////////////////////////////////////////////////////////////////// //设置RC522的工作方式 ////////////////////////////////////////////////////////////////////// charM500PcdConfigISOType(unsignedchardatatype) { if(type=='A')//ISO14443_A { ClearBitMask(Status2Reg,0x08);//状态2寄存器 WriteRawRC(ModeReg,0x3D);//3F//和Mifare卡通讯,CRC初始值0x6363 WriteRawRC(RxSelReg,0x86);//84选择内部接收器设置,内部模拟部分调制信号,发送数据后,延迟6个位时钟,接收 WriteRawRC(RFCfgReg,0x7F);//4F配置接收器48dB最大增益 WriteRawRC(TReloadRegL,30);//tmoLength);//TReloadVal='h6a=tmoLength(dec) WriteRawRC(TReloadRegH,0);//实际值是OXD3E这部分主要是设置定时器寄存器,############## WriteRawRC(TModeReg,0x8D); WriteRawRC(TPrescalerReg,0x3E); delay_ns(1000); PcdAntennaOn(); } else{return-1;} returnMI_OK; } ///////////////////////////////////////////////////////////////////// //功能: 读RC522寄存器 //参数说明: Address[IN]: 寄存器地址 //返回: 读出的值 /////////////
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MFRC522 射频 识别 参考 程序 注释 new