51单片机RC522射频卡驱动.docx

上传人:b****8 文档编号:9899637 上传时间:2023-02-07 格式:DOCX 页数:27 大小:19.68KB
下载 相关 举报
51单片机RC522射频卡驱动.docx_第1页
第1页 / 共27页
51单片机RC522射频卡驱动.docx_第2页
第2页 / 共27页
51单片机RC522射频卡驱动.docx_第3页
第3页 / 共27页
51单片机RC522射频卡驱动.docx_第4页
第4页 / 共27页
51单片机RC522射频卡驱动.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

51单片机RC522射频卡驱动.docx

《51单片机RC522射频卡驱动.docx》由会员分享,可在线阅读,更多相关《51单片机RC522射频卡驱动.docx(27页珍藏版)》请在冰豆网上搜索。

51单片机RC522射频卡驱动.docx

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)

{

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

当前位置:首页 > 成人教育 > 电大

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

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