51单片机RC522射频卡驱动.docx
《51单片机RC522射频卡驱动.docx》由会员分享,可在线阅读,更多相关《51单片机RC522射频卡驱动.docx(27页珍藏版)》请在冰豆网上搜索。
51单片机RC522射频卡驱动
/*-----------------------------------------------.H文件-----------------------------------------*/
#ifndef__RC522_H_
#define__RC522_H_
/////////////////////////////////////////////////////////////////////
//MF522命令字
/////////////////////////////////////////////////////////////////////
#definePCD_IDLE0x00//取消当前命令
#definePCD_AUTHENT0x0E//验证密钥
#definePCD_RECEIVE0x08//接收数据
#definePCD_TRANSMIT0x04//发送数据
#definePCD_TRANSCEIVE0x0C//发送并接收数据
#definePCD_RESETPHASE0x0F//复位
#definePCD_CALCCRC0x03//CRC计算
/////////////////////////////////////////////////////////////////////
//Mifare_One卡片命令字
/////////////////////////////////////////////////////////////////////
#definePICC_REQIDL0x26//寻天线区内未进入休眠状态
#definePICC_REQALL0x52//寻天线区内全部卡
#definePICC_ANTICOLL10x93//防冲撞
#definePICC_ANTICOLL20x95//防冲撞
#definePICC_AUTHENT1A0x60//验证A密钥
#definePICC_AUTHENT1B0x61//验证B密钥
#definePICC_READ0x30//读块
#definePICC_WRITE0xA0//写块
#definePICC_DECREMENT0xC0//扣款
#definePICC_INCREMENT0xC1//充值
#definePICC_RESTORE0xC2//调块数据到缓冲区
#definePICC_TRANSFER0xB0//保存缓冲区中数据
#definePICC_HALT0x50//休眠
/////////////////////////////////////////////////////////////////////
//MF522FIFO长度定义
/////////////////////////////////////////////////////////////////////
#defineDEF_FIFO_LENGTH64//FIFOsize=64byte
#defineMAXRLEN18
/////////////////////////////////////////////////////////////////////
//MF522寄存器定义
/////////////////////////////////////////////////////////////////////
//PAGE0
#defineRFU000x00
#defineCommandReg0x01
#defineComIEnReg0x02
#defineDivlEnReg0x03
#defineComIrqReg0x04
#defineDivIrqReg0x05
#defineErrorReg0x06
#defineStatus1Reg0x07
#defineStatus2Reg0x08
#defineFIFODataReg0x09
#defineFIFOLevelReg0x0A
#defineWaterLevelReg0x0B
#defineControlReg0x0C
#defineBitFramingReg0x0D
#defineCollReg0x0E
#defineRFU0F0x0F
//PAGE1
#defineRFU100x10
#defineModeReg0x11
#defineTxModeReg0x12
#defineRxModeReg0x13
#defineTxControlReg0x14
#defineTxAutoReg0x15
#defineTxSelReg0x16
#defineRxSelReg0x17
#defineRxThresholdReg0x18
#defineDemodReg0x19
#defineRFU1A0x1A
#defineRFU1B0x1B
#defineMifareReg0x1C
#defineRFU1D0x1D
#defineRFU1E0x1E
#defineSerialSpeedReg0x1F
//PAGE2
#defineRFU200x20
#defineCRCResultRegM0x21
#defineCRCResultRegL0x22
#defineRFU230x23
#defineModWidthReg0x24
#defineRFU250x25
#defineRFCfgReg0x26
#defineGsNReg0x27
#defineCWGsCfgReg0x28
#defineModGsCfgReg0x29
#defineTModeReg0x2A
#defineTPrescalerReg0x2B
#defineTReloadRegH0x2C
#defineTReloadRegL0x2D
#defineTCounterValueRegH0x2E
#defineTCounterValueRegL0x2F
//PAGE3
#defineRFU300x30
#defineTestSel1Reg0x31
#defineTestSel2Reg0x32
#defineTestPinEnReg0x33
#defineTestPinValueReg0x34
#defineTestBusReg0x35
#defineAutoTestReg0x36
#defineVersionReg0x37
#defineAnalogTestReg0x38
#defineTestDAC1Reg0x39
#defineTestDAC2Reg0x3A
#defineTestADCReg0x3B
#defineRFU3C0x3C
#defineRFU3D0x3D
#defineRFU3E0x3E
#defineRFU3F0x3F
/////////////////////////////////////////////////////////////////////
//和MF522通讯时返回的错误代码
/////////////////////////////////////////////////////////////////////
#defineMI_OK0
#defineMI_NOTAGERR(-1)
#defineMI_ERR(-2)
#defineSHAQU10X01
#defineKUAI40X04
#defineKUAI70X07
#defineREGCARD0xa1
#defineCONSUME0xa2
#defineREADCARD0xa3
#defineADDMONEY0xa4
//voiddelay_ns(uint16ns);
voiddelay10us(void);
voiddelay1ms(void);
uint8SPIReadByte(void);
voidSPIWriteByte(uint8SPIData);
charPcdRequest(uint8req_code,uint8*pTagType);
charPcdAnticoll(uint8*pSnr);
charPcdSelect(unsignedchar*pSnr);
charPcdAuthState(uint8auth_mode,uint8addr,uint8*pKey,uint8*pSnr);
charPcdRead(uint8addr,uint8*pData);
charPcdWrite(uint8addr,uint8*pData);
charPcdHalt(void);
voidCalulateCRC(uint8*pIndata,uint8len,uint8*pOutData);
charPcdReset(void);
charM500PcdConfigISOType(uint8type);
uint8ReadRawRC(uint8Address);
voidWriteRawRC(uint8Address,uint8value);
voidSetBitMask(uint8reg,uint8mask);
voidClearBitMask(uint8reg,uint8mask);
charPcdComMF522(uint8Command,uint8*pInData,uint8InLenByte,uint8*pOutData,uint16*pOutLenBit);
voidPcdAntennaOn(void);
voidPcdAntennaOff(void);
voidInitRc522(void);
voiddelay1ms500us(void);
sbitSPI_CS=P1^3;
sbitSPI_CK=P1^4;
sbitSPI_MOSI=P1^5;
sbitSPI_MISO=P1^6;
sbitSPI_RST=P1^7;
#defineSET_SPI_CSSPI_CS=1
#defineCLR_SPI_CSSPI_CS=0
#defineSET_SPI_CKSPI_CK=1
#defineCLR_SPI_CKSPI_CK=0
#defineSET_SPI_MOSISPI_MOSI=1
#defineCLR_SPI_MOSISPI_MOSI=0
#defineSET_SPI_MISOSPI_MISO
#defineSET_RC522RSTSPI_RST=1
#defineCLR_RC522RSTSPI_RST=0
#endif
/*-----------------------------------------------.c文件-----------------------------------------*/
#include"rc522.h"
/*voiddelay_ns(uint16ns)
{
uint16xdatai;
for(i=0;i{
nop();
nop();
nop();
}
}*/
voiddelay10us(void)//误差0us
{
unsignedchara,b;
for(b=1;b>0;b--)
for(a=2;a>0;a--);
}
voiddelay1ms(void)//误差0us
{
unsignedchara,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
voiddelay1ms500us(void)//误差0us
{
uint8xdataa,b;
for(b=115;b>0;b--)
for(a=5;a>0;a--);
}
uint8SPIReadByte(void)
{
uint8xdataSPICount;//Counterusedtoclockoutthedata
uint8xdataSPIData;
SPIData=0;
for(SPICount=0;SPICount<8;SPICount++)//Preparetoclockinthedatatoberead
{
SPIData<<=1;//Rotatethedata
CLR_SPI_CK;nop();nop();//RaisetheclocktoclockthedataoutoftheMAX7456
if(SET_SPI_MISO)
{
SPIData|=0x01;
}
SET_SPI_CK;nop();nop();//Droptheclockreadyforthenextbit
}//andloopback
return(SPIData);//Finallyreturnthereaddata
}
voidSPIWriteByte(uint8SPIData)
{
uint8xdataSPICount;//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(uint8req_code,uint8*pTagType)
{
charxdatastatus;
uint16xdataunLen;
uint8xdataucComMF522Buf[MAXRLEN];
ClearBitMask(Status2Reg,0x08);
WriteRawRC(BitFramingReg,0x07);
SetBitMask(TxControlReg,0x03);
ucComMF522Buf[0]=req_code;
status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);
if((status==MI_OK)&&(unLen==0x10))
{
*pTagType=ucComMF522Buf[0];
*(pTagType+1)=ucComMF522Buf[1];
}
else
{status=MI_ERR;}
returnstatus;
}
/////////////////////////////////////////////////////////////////////
//功能:
防冲撞
//参数说明:
pSnr[OUT]:
卡片序列号,4字节
//返回:
成功返回MI_OK
/////////////////////////////////////////////////////////////////////
charPcdAnticoll(uint8*pSnr)
{
charxdatastatus;
uint8xdatai,snr_check=0;
uint16xdataunLen;
uint8xdataucComMF522Buf[MAXRLEN];
ClearBitMask(Status2Reg,0x08);
WriteRawRC(BitFramingReg,0x00);
ClearBitMask(CollReg,0x80);
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);
returnstatus;
}
/////////////////////////////////////////////////////////////////////
//功能:
选定卡片
//参数说明:
pSnr[IN]:
卡片序列号,4字节
//返回:
成功返回MI_OK
/////////////////////////////////////////////////////////////////////
charPcdSelect(uint8*pSnr)
{
charxdatastatus;
uint8xdatai;
uint16xdataunLen;
uint8xdataucComMF522Buf[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);
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(uint8auth_mode,uint8addr,uint8*pKey,uint8*pSnr)
{
charxdatastatus;
uint16xdataunLen;
uint8xdatai,ucComMF522Buf[MAXRLEN];
ucComMF522Buf[0]=auth_mode;
ucComMF522Buf[1]=addr;
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(uint8addr,uint8*pData)
{