MF RC522 射频识别参考程序注释new.docx

上传人:b****6 文档编号:8157765 上传时间:2023-01-29 格式:DOCX 页数:19 大小:106.25KB
下载 相关 举报
MF RC522 射频识别参考程序注释new.docx_第1页
第1页 / 共19页
MF RC522 射频识别参考程序注释new.docx_第2页
第2页 / 共19页
MF RC522 射频识别参考程序注释new.docx_第3页
第3页 / 共19页
MF RC522 射频识别参考程序注释new.docx_第4页
第4页 / 共19页
MF RC522 射频识别参考程序注释new.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

MF RC522 射频识别参考程序注释new.docx

《MF RC522 射频识别参考程序注释new.docx》由会员分享,可在线阅读,更多相关《MF RC522 射频识别参考程序注释new.docx(19页珍藏版)》请在冰豆网上搜索。

MF RC522 射频识别参考程序注释new.docx

MFRC522射频识别参考程序注释new

MFRC522射频识别参考程序注释

串口读取的数据

//------------------------------------------

ucAddr=((Address<<1)&0x7E)|0x80;//变化成有效的地址形式,最低位为0,最高位为1时候是,从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]:

寄存器地址

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 工学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1