51单片机RC522射频卡驱动.docx
- 文档编号:9899637
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:27
- 大小:19.68KB
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) {
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 RC522 射频卡 驱动
![提示](https://static.bdocx.com/images/bang_tan.gif)