STM32F103驱动MFRC522Word格式.docx
《STM32F103驱动MFRC522Word格式.docx》由会员分享,可在线阅读,更多相关《STM32F103驱动MFRC522Word格式.docx(27页珍藏版)》请在冰豆网上搜索。
#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_NOTAGERR1//(-1)
#defineMI_ERR2//(-2)
#defineSHAQU10X01
#defineKUAI40X04
#defineKUAI70X07
#defineREGCARD0xa1
#defineCONSUME0xa2
#defineREADCARD0xa3
#defineADDMONEY0xa4
#definespi_csPEout(4)
#definespi_ckPEout(3)
#definespi_mosiPEout
(2)
#definespi_misoPEin
(1)
#definespi_rstPEout(0)
#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
#defineSTU_SPI_MISOspi_miso
#defineSET_RC522RSTspi_rst=1
#defineCLR_RC522RSTspi_rst=0
externunsignedcharLastKeyA[6];
//NO.2卡
externunsignedcharNewKeyA[6];
externunsignedcharNewKey[16];
externunsignedcharRC522_Read_Data[16];
externunsignedcharRC522_Write_Data[16];
externunsignedcharMLastSelectedSnr[4];
externunsignedcharRevBuffer[30];
voidRC522_GPIO_Configuration(void);
unsignedcharSPIReadByte(void);
voidSPIWriteByte(unsignedcharSPIData);
charPcdRequest(unsignedcharreq_code,unsignedchar*pTagType);
charPcdAnticoll(unsignedchar*pSnr);
charPcdSelect(unsignedchar*pSnr);
charPcdAuthState(unsignedcharauth_mode,unsignedcharaddr,unsignedchar*pKey,unsignedchar*pSnr);
charPcdRead(unsignedcharaddr,unsignedchar*pData);
charPcdWrite(unsignedcharaddr,unsignedchar*pData);
charPcdHalt(void);
voidCalulateCRC(unsignedchar*pIndata,unsignedcharlen,unsignedchar*pOutData);
charPcdReset(void);
charM500PcdConfigISOType(unsignedchartype);
unsignedcharReadRawRC(unsignedcharAddress);
voidWriteRawRC(unsignedcharAddress,unsignedcharvalue);
voidSetBitMask(unsignedcharreg,unsignedcharmask);
voidClearBitMask(unsignedcharreg,unsignedcharmask);
charPcdComMF522(unsignedcharCommand,
unsignedchar*pInData,
unsignedcharInLenByte,
unsignedchar*pOutData,
unsignedint*pOutLenBit);
voidPcdAntennaOn(void);
voidPcdAntennaOff(void);
voidInitRc522(void);
#endif
rc522.h"
//////////////////////////////////////////////////////////////////////////////////
//深圳海德电子有限公司
//公司网站:
//修改日期:
2015/7/21
//版本:
V1.0
//版权所有,XX。
//程序员:
李俊
unsignedcharLastKeyA[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
unsignedcharNewKeyA[6]={0x80,0x80,0x80,0x80,0x80,0x80};
unsignedcharNewKey[16]={0x80,0x80,0x80,0x80,0x80,0x80,\
0xff,0x07,0x80,0x69,\
0x80,0x80,0x80,0x80,0x80,0x80};
unsignedcharRC522_Read_Data[16];
unsignedcharRC522_Write_Data[16];
unsignedcharMLastSelectedSnr[4];
unsignedcharRevBuffer[30];
voidRC522_GPIO_Configuration(void)
{
RCC->
APB2ENR|=1<
<
6;
//使能GPIOE的时钟
GPIOE->
CRL&
=0XFFF00000;
CRL|=0X00022282;
ODR|=1<
1;
}
//------------------------------------------
//SPI读取数据
unsignedcharSPIReadByte(void)
unsignedcharSPICount;
//Counterusedtoclockoutthedata
unsignedcharSPIData;
SPIData=0;
//CLR_SPI_CS;
for(SPICount=0;
SPICount<
8;
SPICount++)//Preparetoclockinthedatatoberead
{
SPIData<
=1;
//Rotatethedata
CLR_SPI_CK;
//RaisetheclocktoclockthedataoutoftheMAX7456
if(STU_SPI_MISO)
SPIData|=0x01;
}
//delay_us(10);
SET_SPI_CK;
//Droptheclockreadyforthenextbit
}
//SET_SPI_CS;
//andloopback
return(SPIData);
//Finallyreturnthereaddata
}
//SPI写入数据
voidSPIWriteByte(unsignedcharSPIData)
//CLR_SPI_CS;
SPICount++)
if(SPIData&
0x80)
SET_SPI_MOSI;
else
CLR_SPI_MOSI;
=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(unsignedcharreq_code,unsignedchar*pTagType)
charstatus;
unsignedintunLen;
unsignedcharucComMF522Buf[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];
status=MI_ERR;
returnstatus;
防冲撞
pSnr[OUT]:
卡片序列号,4字节
/////////////////////////////////////////////////////////////////////
charPcdAnticoll(unsignedchar*pSnr)
unsignedchari,snr_check=0;
WriteRawRC(BitFramingReg,0x00);
ClearBitMask(CollReg,0x80);
ucComMF522Buf[0]=PICC_ANTICOLL1;
ucComMF522Buf[1]=0x20;
status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&
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);
选定卡片
pSnr[IN]:
charPcdSelect(unsignedchar*pSnr)
unsignedchari;
ucComMF522Buf[1]=0x70;
ucComMF522Buf[6]=0;
for(i=0;
ucComMF522Buf[i+2]=*(pSnr+i);
ucComMF522Buf[6]^=*(pSnr+i);
CalulateCRC(ucComMF522Buf,7,&
ucComMF522Buf[7]);
status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&
(unLen==0x18))
{status=MI_OK;
////////////////////////////////