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]:
寄存器地址
//返回:
读出的值
/////////////