13.56M读卡器开发详解二(RC522驱动程序).doc

上传人:scccc 文档编号:12421608 上传时间:2021-12-03 格式:DOC 页数:17 大小:335KB
返回 下载 相关 举报
13.56M读卡器开发详解二(RC522驱动程序).doc_第1页
第1页 / 共17页
13.56M读卡器开发详解二(RC522驱动程序).doc_第2页
第2页 / 共17页
13.56M读卡器开发详解二(RC522驱动程序).doc_第3页
第3页 / 共17页
13.56M读卡器开发详解二(RC522驱动程序).doc_第4页
第4页 / 共17页
13.56M读卡器开发详解二(RC522驱动程序).doc_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《13.56M读卡器开发详解二(RC522驱动程序).doc》由会员分享,可在线阅读,更多相关《13.56M读卡器开发详解二(RC522驱动程序).doc(17页珍藏版)》请在三一文库上搜索。

1、13.56M读卡器开发详解二1. 硬件接口介绍根据上一篇的介绍,小编使用了 RC522的SPI I I通信方式和51单片机进行通信。硬件接I 1 设计此处不再附图。只是将接口配置列写如下:sbit spi_cs=PlA6;sbit spi_ck=PlA5;sbit spi_mosi=PlA4;sbit spi_miso=PlA3;sbit spi_rst=PlA2;#define SET_SPI_CS spi_cs=l #define CLR_SPI_CS spi_cs=O #define SET_SPI_CK spi_ck=l #define CLR_SPI_CK spi_ck=O #def

2、ine SET_SPI_MOSI spi_mosi=l #define CLR_SPI_MOSI spi_mosi=0 #defineSTU_SPI_MISO spi_miso #defineSET_RC522RST spi_rst=l #define CLR_RC522RST spi_rst=O2. 51单片机模拟SPI通信函数 void delay_ns(unsigned int data ns)unsigned int xdata i;for(i=0;inop();nop();nop();unsigned char SPIReadByte(void)unsigned char idata

3、 SPICount;/ Counter used to clock out the dataunsigned char idata SPIData;SPIData = 0;for (SPICount = 0; SPICount < 8; SPICount+) / Prepare to clock in the data to be readSPIData «=1;/ Rotate the dataCLR_SPI_CK; nop();nop();/ Raise the clock to clock the data out of the MAX7456if(STU_SPI_MIS

4、O)SPIData|=0x01;SET_SPI_CK; nop();nop();/ Drop the clock ready for the next bit /and loop backreturn (SPIData);/ Fin ally retur n the read datavoid SPIWriteByte(unsigned char data SPIData)unsigned char idata SPICount;/ Counter used to clock out the datafor (SPICount = 0; SPICount < & SPICount

5、+)if (SPIData &0x80)SET_SPI_MOSI;elseCLR_SPI_MOSI;nop();nop();CLR_SPI_CK;nop();nop();SET_SPI_CK;nop();nop();SPIData «= 1;3. RC522芯片的寄存器、命令字等定义3.1命令字等定义这些宏定义都是根据RC522数据手册编写的代码。Z/Z/Z/7/ /MF522A 令字/definePCDJDLE0x00/取消当盼命今#dcf mePCDAUTHENTOxOE/验证屯锲#def mePCDRECEIVE0x08/接收数摊Itfdef mePCDTRANSMIT

6、0x04/发送数据(definePCDTRANSCEIVEOxOC/发送井接收数据"definePCDPESETPHASEOxOF复位definePCDCJLLCCRC0x03/CRC计算/ Z/Hlfare One卡片命今字/#def meP】CC.REOIDL0x26/寻天线区内来进入休眠状态MdefinePICCRECALL0x52"寻天线区内全祁卡"def inePICCJLNTICCH-Ll0x93盼冲播MdefinePICCANTIC0LL20x95/紡冲捡*definePICCAUTHENT U0x60/验证A密钥UderinePICCAUTHENT

7、 IB0x61/簽证B祀钳»definePICCP£AP0x30/樓块|definePICCWRITEOxAO写块"definePICCDECREMENTOxCO/杓款Mdef incPICCINCREMENTOxCl充值definePICCRESTOREOxC2"週块数拯到銀冲区definePICCTRANSFEROxBO/似存缓冲区中数亮*definePICCHALT0x50/KFS22 FIFO长度定义 /如r g DEF PIFOLENGTH64RAXPLEN/FIFO aize-i-lbyteblog-sifja-3.2. RC522寄存器地址

8、定义/ PAGE 0tfdetlneRFUOO0x00#defineContnandReg0x01#defineComlEnReg0x02#defineDivlEnReg0x03#defineCorolrqReg0x04ffdetmeDivIrqReg0x05#defineErrorReg0x06defineStatuslReg0x07defineStatus2Rea0x06#defineFIFODataReg0x09#def meFIFOLevelRegOxOAdefineVaterLevelRegOxOB#derineControlRegOxOC#deflneBitFrMoingRegOx

9、OD#define #detineCollReg RFUOFOxOEOxOF-cn/zhiiiizk/JIF522寄存器定义/(/ PAGE1#defineRFU100x10#defineModeReg0x11#defineTxKod皂Rg0x12#deflneRxKodeReg0x13#defineTxControlReg0x14#defineTxAutoReg0x15#defineTxSelReg0x16#defineRxSelReg0x17#defineRxThr皂shoIdReg0x18#defineDeroodReg0x19#defineRFU1AOxlA#defineRFU1BOx

10、lB#defineHitareRegOxlC#defineRFU1DOxlD#defineRFU1EOxlE#defineSerlalSpeedRegOxlF/ PAGE2#defineRFU200x20#defineCRCResultRegM0x21#defineCRCResulcRegL0x22#defineRFU230x23#defineModWidthReg0x24#defineRFU250x25#defineRFCfgReg0x2 6#defineGsNReg0x27#defineCWGsCfgReg0x28#def meModGsCfgReg0x29#defineTModeReg0

11、x2A"defineTPrescalerRegOx2B#defineTReloadRegH0x2C#defineTReloadRegL0x2D#defineTCounterValueRegHOx2E#defineTCounterValueRegL0x2F / PAGE 3defineRFU300x30#der meTestSellReg0x31#def meTestSelZRegOx3ZAdelineTestPinEnReg0x33defineTestPinValueReg0x34defineTestBusReg0x35#defineAutoTestReg0x36#defineVer

12、sionKeg0x37#defineAnalogTestReg0x38defineTestDACIReg0x39defineTestDAC2Peg0x3A*defineTestADCReg0x3BdefineRFU3C0x3C#def meRFU3D0x3DdefineRFU3E0x3EdefineRFU3F0x3F/和nrs22ifiiR时返回的借误代码/define define ftdetine1U_OKKINOTAGERR KIERR4. Rc522的14443协议代码驱动程序4.1寻卡程序I/. 琐 Mt.缪卡卷数说明:req_code( IN):寻卡方式-0X52 «謬險

13、应区内所有符合标准的卡 0X26 寻未进入休腕状态的卡pTaaType(OUTi卡片类型代网UltroLightOne (S50)0x400 nifare0x0400 KxfaceiS(3:0x0200 » Hifare0x0800 - Hifare0x4403 Hllare 成功返回NI_OK<e(S70» Pro(X) DISFlrechat PcdPequesc(unsigned char data req codeunsigned char pTaType)char PcdRequest(unsigned char data req_code,unsigned

14、 char *pTagType) char idata status;unsigned int idata unLen;unsigned char xdata ucComMF522BufMAXRLEN;ClearBitMask(Status2Reg,0x08);WriteRawRC(BitFramingReg,0x07);SetBitMask(TxControlReg,0x03);ucComMF522Buf0 = req_code;status = PcdComMF522(PCD_TRANSCEIVE/ucComMF522Buf/l/ucComMF522Buf/&unLen);if (

15、status = MI_0K) && (unLen = 0x10) *pTagType = ucComMF522Buf0; *(pTagType+l) = ucComMF522Bufl;else status = MI_ERR; return status;4.2防冲撞函数/ /功能,防冲撞/参数说明:pSnrfOUT:卡片序列号,4字节/返回:成功返回KI OK/ char PcdAnticoll(unsigned char 求pSnr)char PcdAnticoll(unsigned char *pSnr)char xdata status;unsigned char x

16、data i,snr_check=O;unsigned int xdata unLen;unsigned char xdata ucComMF522BufMAXRLEN;ClearBitMask(Status2Reg/0x08);WriteRawRC(BitFramingReg,OxOO);ClearBitMask(CollReg,0x80);ucComMF522Buf0 = PICC.ANTIC0LL1;ucComMF522Bufl =0x20;status = PcdComMF522(PCD_TRANSCEIVEzucComMF522Buf,2,ucComMF522Buf/&unL

17、en);if (status = MI_0K)for (i=0; i<4; i+)*(pSnr+i) = ucComMF522Bufi;snr_check A= ucComMF522Bufi;if (snr_check != ucComMF522Bufi) status = MI_ERR; SetBitMask(CollReg,0x80);return status;4.3选定卡片/功能,选定卡片/參数说明:pSnrIN:卡片停列号,4字节/返回:成功返Hhiok/char PcdSelecc(unsigned char fp3nr)char PcdSelect(unsigned cha

18、r *pSnr)char xdata status;unsigned char xdata i;unsigned int xdata unLen;unsigned char xdata ucComMF522BufMAXRLEN;ucComMF522Buf0 = PICC.ANTICOLL1;ucComMF522Bufl =0x70;ucComMF522Buf6 =0;for (i=0; i<4; i+)ucComMF522Bufi+2 = *(pSnr+i);ucComMF522Buf6 A= *(pSnr+i);CalulateCRC(ucComMF522Buf,7,&ucCo

19、mMF522Buf7);ClearBitMask(Status2Reg/0x08);status = PcdComMF522(PCD_TRANSCEIVE/ucComMF522Buf,9/ucComMF522Buf,&unLen);if (status = MI_OK) && (unLen = 0x18) status = MI_OK; else status = MI_ERR; return status;4.4验证卡片密码“ox<o “0x41 acMr t W) s癸绝址/Me,【ncj SA( XN) X *片厚刊§4字书 16 Sr冋iu.o&

20、lt;Cher PcdAnt hSrte | unnrh*r “ngnod ch at de心charrtr ap3nr Ichar PcdAuthState(unsigned char data auth_mode,unsigned char data addr,unsigned char *pKey, unsigned char *pSnr)char xdata status;unsigned int xdata unLen;unsigned char xdata i/ucComMF522BufMAXRLEN;ucComMF522Buf0 = auth_mode;ucComMF522Buf

21、l = addr;for (i=0; i<6; i+) ucComMF522Bufi+2 = *(pKey+i); for (i=0; i<6; i+) ucComMF522Bufi+8 = *(pSnr+i); / memcpy(&ucComMF522Buf2, pKey, 6);/ memcpy(&ucComMF522Buf8, pSnr, 4);status = PcdComMF522(PCD_AUTHENTucComMF522Buf,12/ucComMF522Buf/&unLen);if (status != MI_0K) 11 (!(ReadRaw

22、RC(Status2Reg) & 0x08) status = MI_ERR; return status;4.5读取Ml卡一块数据/功 能:读取Hl卡一块数推/塗数说明:addrIN«块地址/pDataOUT 1读出的数据,16字节/返回:成功返回m OK/ZZ/7/Z/ char PcdRead (unaigned char data aiddr,unsigned char pData)char PcdRead(unsigned char data addr,unsigned char *pData)char idata status;unsigned int idata

23、 unLen;unsigned char idata i,ucComMF522BufMAXRLEN;ucComMF522Buf0 = PICC_READ;ucComMF522Bufl = addr;CalulateCRC(ucComMF522Buf/2,&ucComMF522Buf2);status = PcdComMF522(PCD_TRANSCEIVE/ucComMF522BufAucComMF522Buf/&unLen); if (status = MI_OK) && (unLen = 0x90)/ memcpy(pDataz ucComMF522Buf,

24、 16); for (i=0; i<16; i+) *(pData+i) = ucComMF522Bufi; else status = MI_ERR; return status;4.6写数据到Ml卡一块/ 功 能:写数据到IU卡一块參数说明:addr IN:块地址/pDataIN:写入的数据,16字节返 回:成功返回!U_0K/ char PcdWrite(unsigned char data addr#unsigned char TpData)char PcdWrite(unsigned char data addr;unsigned char *pData) char idata

25、 status;unsigned int idata unLen;unsigned char idata ucComMF522BufMAXRLEN;ucComMF522Buf0 = PICC.WRITE;ucComMF522Bufl = addr;CalulateCRC(ucComMF522Bufz2,&ucComMF522Buf2);status = PcdComMF522(PCD_TRANSCEIVE/ucComMF522BufAucComMF522Buf/&unLen);if (status != MI_OK) 11 (unLen !=4) 11 (ucComMF522B

26、uf0 & OxOF) != OxOA) status = MI_ERR; if (status = MI_OK)memcpy(ucComMF522Buf/ pData, 16);/ for (i=0; i<16; i+)/ ucComMF522Bufi = *(pData+i);/CalulateCRC(ucComMF522Buf/16/&ucComMF522Buf16);status = PcdComMF522(PCD_TRANSCEIVE/ucComMF522Buf/l&ucComMF522Buf,&unLen); if (status != MI_

27、OK) 11 (unLen !=4) 11 (ucComMF522Buf0 & OxOF) != OxOA) status = MI_ERR; return status;4.7命令卡进入休眠状态/"功命今卡片进入休昵状态/返回:成功返回/ char PcdHalt(void)char PcdHalt(void)char idata status;unsigned int idata unLen;unsigned char idata ucComMF522BufMAXRLEN;ucComMF522Buf0 = PICC.HALT;ucComMF522Bufl =0;Calul

28、ateCRC(ucComMF522Buf/2,&ucComMF522Buf2);status = PcdComMF522(PCD_TRANSCEIVE/ucComMF522BufAucComMF522Buf/&unLen);return MI_OK;4.8 RC522 计算 CRC16void CalulateCRC(unsigned char *plndata,unsigned char data len,unsigned char *pOutData) unsigned char idata i,n;ClearBitMask(DivlrqReg/0x04);WriteRaw

29、RC(CommandReg,PCDDLE);SetBitMask(FIFOLevelReg,0x80);for (i=0; i WriteRawRC(FIFOData Reg, *(plndata+i); WriteRawRC(CommandReg, PCD_CALCCRC);i = OxFF;don = ReadRawRC(DivlrqReg);i-;while (i!=0) && !(n&0x04);pOutData0 = ReadRawRC(CRCResultRegL);pOutDatal = ReadRawRC(CRCResultRegM);4.9 复位 RC5

30、22 char PcdReset(void)功返 / / / / / / / /能x复位RC522 回:成功返回HI OK/PORTD|=(1«RC522RST);SET_RC522RST;delay_ns(10);/PORTD&=(1«RC522RST);CLR_RC522RST;delay_ns(10);/PORTD|=(1«RC522RST);SET_RC522RST;delay_ns(10);WriteRawRC(CommandReg,PCD_RESETPHASE);delay ns(10);WriteRawRC(ModeReg,0x3D); /&

31、#176; IMifarec I " W£-CRC3 6E%OnOx6363 WriteRawRC (TReloadRegLz30);WriteRawRC (TReloadRegHQ);WriteRawRC (TModeReg,0x8D);WriteRawRC (TPrescalerRegf0x3E);WriteRawRC(TxAutoReg,Ox4O);/±0Dedareturn MI_OK;4.10设置RC522工作方式/设SRC522的工作方式/ char MSOOPcdConflglSOType(unsigned char data type)char M

32、500PcdConfiglSOType(unsigned char data type)if (type = A)ISO14443_AClearBitMask(Status2Reg,0x08);WriteRawRC(ModeReg,0x3D);/FWriteRawRC(RxSelReg,0x86);/84WriteRawRC(RFCfgReg,0x7F); /AFWriteRawRC(TReloadRegL,30);/tmoLength);/TReloadVal = 'h6a =tmoLength(dec)WriteRawRC 仃 Reload RegH.O);WriteRawRC(T

33、ModeReg,0x8D);WriteRawRC(TPrescalerReg,0x3E);delay_ ns(1000);PcdAntennaOn();else return -1;return MI_OK;4.11读RC522寄存器/功能,褒RC632寄存器矗数说阴,Addres3IN:«存器地址返回,读出的值/ unsigned char ReadRavRC(unsigned char data Address)unsigned char ReadRawRC(unsigned char data Address)unsigned char xdata ucAddr;unsigne

34、d char xdata ucResult=O;CLR SPI CS;ucAddr = (Address«l)&0x7E) 10x80;SPIWriteByte(ucAddr);ucResult=SPIReadByte();SET_SPI_CS;return ucResult;4.12写RC522寄存器/ 功 能,写RC632寄存器君数说明】Address IN :器地址/value (IN):写入的值/ void UriteRavRC(unsigned char data Address/ unsigned char data value)void WriteRawRC(u

35、nsigned char data Address, unsigned char data value)unsigned char xdata ucAddr;CLR_SPI_CS;ucAddr = (Address«l)&0x7E);SPIWriteByte(ucAddr);SPIWriteByte(value);SET_SPI_CS;4.13置和清RC522寄存器位777777777777777777777777777777777777777777777777777777777777777777777/功 能SRC522S存器位/泰数说明,regIN):«存器地址

36、/mask (IN):宜位值/ void SetBitMask(unsigned char data reg#unsigned char data mask)char xdata tmp 0x0;t»p ReadRavRC(reg>UriceRavRC(reg trap | mask);/ sec bit mask/功 能,«RC522«存霸位说明 regIN:ff存器地址/naask( IN:槽位值/ void ClearBitMask(unsigned char data regfunsign皀d char data mask) 3<char xd

37、ata tmp 0x0;tmp ReadRavRC(reg);VriteRavRC(reg, twp £ -mask) ;/ clear bit mask.>blog.sina.corfi.cri/zhuifzk4.14 RC522 与 ISO14443 卡通讯/功 能:通过RCS22和ISO14443卡通讯/参数说明s CoMDand(IN :RC522侖令字/plnDacat IN:通过RC522发送到卡片的数据/InLenByteIN):发送数据的字节长度/pOutDataOUT:桂收到的卡*返回数据/»pOucLenBltOUT:返回数据的位长度/char PcdComRF522(unsigned char unsigned charunsigned char unsigned chardata Contxtand, plnDataj data InLenByter wpOutDacazunsigned intTpOutLenBit)char PcdComMF522(uns

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

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1