RC522处理函数.docx

上传人:牧羊曲112 文档编号:3165021 上传时间:2023-03-11 格式:DOCX 页数:22 大小:39.82KB
返回 下载 相关 举报
RC522处理函数.docx_第1页
第1页 / 共22页
RC522处理函数.docx_第2页
第2页 / 共22页
RC522处理函数.docx_第3页
第3页 / 共22页
RC522处理函数.docx_第4页
第4页 / 共22页
RC522处理函数.docx_第5页
第5页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《RC522处理函数.docx》由会员分享,可在线阅读,更多相关《RC522处理函数.docx(22页珍藏版)》请在三一办公上搜索。

1、RC522处理函数/*MFRC522处理函数*/void MFRC522_execution( void) unsigned char m;status = PcdRequest(PICC_REQALL, &g_ucTempbuf0); /运行寻卡子程序,返回2字节卡片类型代码(寻卡返回代码)if (status != MI_OK) / continue;return ;status = PcdAnticoll(&g_ucTempbuf2); /运行防冲撞子程序,返回4字节卡片序列号if (status != MI_OK) / continue; return ;LED1 = 0;/memcp

2、y(MlastSelectedSnr,&g_ucTempbuf2,4)for(m=0;m<4;m+)*(MlastSelectedSnr+m)=g_ucTempbufm+2;RxBuf0=(MlastSelectedSnr0&0xf0)>>4);RxBuf1=MlastSelectedSnr0&0x0f;RxBuf2=(MlastSelectedSnr1&0xf0)>>4);RxBuf3=MlastSelectedSnr1&0x0f;RxBuf4=(MlastSelectedSnr2&0xf0)>>4);RxBuf5=MlastSelectedSnr2&0x0f;R

3、xBuf6=(MlastSelectedSnr3&0xf0)>>4);RxBuf7=MlastSelectedSnr3&0x0f;status = PcdSelect(MlastSelectedSnr); /运行选定卡片子程序,if (status != MI_OK) /continue; return ; PcdHalt; /运行卡片进入休眠状态子程序,命令卡片进入休眠状态/功 能:寻卡/参数说明: req_codeIN:寻卡方式/ 0x52 = 寻感应区内所有符合14443A标准的卡/ 0x26 = 寻未进入休眠状态的卡/ pTagTypeOUT:卡片类型代码/ 0x4400 =

4、Mifare_UltraLight/ 0x0400 = Mifare_One(S50)/ 0x0200 = Mifare_One(S70)/ 0x0800 = Mifare_Pro(X)/ 0x4403 = Mifare_DESFire/返 回: 成功返回MI_OK/char PcdRequest(unsigned char req_code,unsigned char *pTagType)char status; unsigned int unLen;unsigned char ucComMF522BufMAXRLEN; ClearBitMask(Status2Reg,0x08);Write

5、RawRC(BitFramingReg,0x07);SetBitMask(TxControlReg,0x03);ucComMF522Buf0 = req_code;status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);if (status = MI_OK) & (unLen = 0x10) *pTagType = ucComMF522Buf0;*(pTagType+1) = ucComMF522Buf1;else status = MI_ERR; return status;/功 能:防冲撞/参数说明

6、: pSnrOUT:卡片序列号,4字节/返 回: 成功返回MI_OK/ char PcdAnticoll(unsigned char *pSnr)char status;unsigned char i,snr_check=0;unsigned int unLen;unsigned char ucComMF522BufMAXRLEN; ClearBitMask(Status2Reg,0x08);WriteRawRC(BitFramingReg,0x00);ClearBitMask(CollReg,0x80);ucComMF522Buf0 = PICC_ANTICOLL1;ucComMF522Bu

7、f1 = 0x20;status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);if (status = MI_OK)for (i=0; i<4; i+) *(pSnr+i) = ucComMF522Bufi;snr_check = ucComMF522Bufi;if (snr_check != ucComMF522Bufi) status = MI_ERR; SetBitMask(CollReg,0x80);return status;/功 能:选定卡片/参数说明: pSnrIN:卡片序列号,4字节/

8、返 回: 成功返回MI_OK/char PcdSelect(unsigned char *pSnr)char status;unsigned char i;unsigned int unLen;unsigned char ucComMF522BufMAXRLEN; ucComMF522Buf0 = PICC_ANTICOLL1; /防冲撞ucComMF522Buf1 = 0x70;ucComMF522Buf6 = 0;for (i=0; i<4; i+)ucComMF522Bufi+2 = *(pSnr+i);ucComMF522Buf6 = *(pSnr+i);CalulateCRC(u

9、cComMF522Buf,7,&ucComMF522Buf7);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;/功 能:命令卡片进入休眠状态/返 回: 成功返回MI_OK/char PcdHalt(void)char status;unsigned int u

10、nLen;unsigned char ucComMF522BufMAXRLEN; ucComMF522Buf0 = PICC_HALT;ucComMF522Buf1 = 0;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf2);status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);return MI_OK;/设置RC632的工作方式 /char M500PcdConfigISOType(unsigned char data type)if (type = A) /I

11、SO14443_A ClearBitMask(Status2Reg,0x08);WriteRawRC(ModeReg,0x3D);/3FWriteRawRC(RxSelReg,0x86);/84WriteRawRC(RFCfgReg,0x7F); /4FWriteRawRC(TReloadRegL,30);/tmoLength);/ TReloadVal = h6a =tmoLength(dec) WriteRawRC(TReloadRegH,0);WriteRawRC(TModeReg,0x8D);WriteRawRC(TPrescalerReg,0x3E);delay_ns(1000);P

12、cdAntennaOn;else return -1; return MI_OK;/用MF522计算CRC16函数/void CalulateCRC(unsigned char *pIndata,unsigned char len,unsigned char *pOutData)unsigned char i,n;ClearBitMask(DivIrqReg,0x04);WriteRawRC(CommandReg,PCD_IDLE);SetBitMask(FIFOLevelReg,0x80);for (i=0; i<len; i+) WriteRawRC(FIFODataReg, *(pI

13、ndata+i); WriteRawRC(CommandReg, PCD_CALCCRC);i = 0xFF;do n = ReadRawRC(DivIrqReg);i-;while (i!=0) & !(n&0x04);pOutData0 = ReadRawRC(CRCResultRegL);pOutData1 = ReadRawRC(CRCResultRegM);/功 能:复位RC522/返 回: 成功返回MI_OK/char PcdReset(void)MF522_RST=1;/ _nop_;delay_ns(10);MF522_RST=0;/_nop_;delay_ns(10);MF5

14、22_RST=1;/ _nop_;delay_ns(10);WriteRawRC(CommandReg,PCD_RESETPHASE);/ _nop_;delay_ns(10);WriteRawRC(ModeReg,0x3D); /和Mifare卡通讯,CRC初始值0x6363WriteRawRC(TReloadRegL,30); WriteRawRC(TReloadRegH,0);WriteRawRC(TModeReg,0x8D);WriteRawRC(TPrescalerReg,0x3E);WriteRawRC(TxAutoReg,0x40);/必须要return MI_OK;/功 能:读

15、RC632寄存器/参数说明:AddressIN:寄存器地址/返 回:读出的值/unsigned char ReadRawRC(unsigned char Address)unsigned char i, ucAddr;unsigned char ucResult=0;MF522_SCK = 0;MF522_NSS = 0;ucAddr = (Address<<1)&0x7E)|0x80;for(i=8;i>0;i-)MF522_SI = (ucAddr&0x80)=0x80);MF522_SCK = 1;ucAddr <<= 1;MF522_SCK = 0;for(i=8;

16、i>0;i-)MF522_SCK = 1;ucResult <<= 1;ucResult|=(bit)MF522_SO;MF522_SCK = 0;MF522_NSS = 1;MF522_SCK = 1;return ucResult;/功 能:写RC632寄存器/参数说明:AddressIN:寄存器地址/ valueIN:写入的值/void WriteRawRC(unsigned char Address, unsigned char value) unsigned char i, ucAddr;MF522_SCK = 0;MF522_NSS = 0;ucAddr = (Addr

17、ess<<1)&0x7E);for(i=8;i>0;i-)MF522_SI = (ucAddr&0x80)=0x80);MF522_SCK = 1;ucAddr <<= 1;MF522_SCK = 0;for(i=8;i>0;i-)MF522_SI = (value&0x80)=0x80);MF522_SCK = 1;value <<= 1;MF522_SCK = 0;MF522_NSS = 1;MF522_SCK = 1;/功 能:置RC522寄存器位/参数说明:regIN:寄存器地址/ maskIN:置位值/void SetBitMask(unsigned

18、char reg,unsigned char mask) char tmp = 0x0;tmp = ReadRawRC(reg);WriteRawRC(reg,tmp | mask); / set bit mask/功 能:清RC522寄存器位/参数说明:regIN:寄存器地址/ maskIN:清位值/void ClearBitMask(unsigned char reg,unsigned char mask) char tmp = 0x0;tmp = ReadRawRC(reg);WriteRawRC(reg, tmp & mask); / clear bit mask /功 能:通过RC5

19、22和ISO14443卡通讯/参数说明:CommandIN:RC522命令字/ pInDataIN:通过RC522发送到卡片的数据/ InLenByteIN:发送数据的字节长度/ pOutDataOUT:接收到的卡片返回数据/ *pOutLenBitOUT:返回数据的位长度/char PcdComMF522(unsigned char Command, unsigned char *pInData, unsigned char InLenByte,unsigned char *pOutData, unsigned int *pOutLenBit)char status = MI_ERR;uns

20、igned char irqEn = 0x00;unsigned char waitFor = 0x00;unsigned char lastBits;unsigned char n;unsigned int i;switch (Command)case PCD_AUTHENT:irqEn = 0x12;waitFor = 0x10;break;case PCD_TRANSCEIVE:irqEn = 0x77;waitFor = 0x30;break;default:break;WriteRawRC(ComIEnReg,irqEn|0x80);ClearBitMask(ComIrqReg,0x

21、80);WriteRawRC(CommandReg,PCD_IDLE);SetBitMask(FIFOLevelReg,0x80);for (i=0; i<InLenByte; i+) WriteRawRC(FIFODataReg, pInDatai); WriteRawRC(CommandReg, Command);if (Command = PCD_TRANSCEIVE) SetBitMask(BitFramingReg,0x80); i = 600;/根据时钟频率调整,操作M1卡最大等待时间25msdo n = ReadRawRC(ComIrqReg);i-;while (i!=0)

22、 & !(n&0x01) & !(n&waitFor);ClearBitMask(BitFramingReg,0x80);if (i!=0) if(!(ReadRawRC(ErrorReg)&0x1B)status = MI_OK;if (n & irqEn & 0x01) status = MI_NOTAGERR; if (Command = PCD_TRANSCEIVE)n = ReadRawRC(FIFOLevelReg);lastBits = ReadRawRC(ControlReg) & 0x07;if (lastBits) *pOutLenBit = (n-1)*8 + lastB

23、its; else *pOutLenBit = n*8; if (n = 0) n = 1; if (n > MAXRLEN) n = MAXRLEN; for (i=0; i<n; i+) pOutDatai = ReadRawRC(FIFODataReg); else status = MI_ERR; SetBitMask(ControlReg,0x80); / stop timer nowWriteRawRC(CommandReg,PCD_IDLE); return status;/开启天线 /每次启动或关闭天险发射之间应至少有1ms的间隔/void PcdAntennaOnunsigned char i;i = ReadRawRC(TxControlReg);if (!(i & 0x03)SetBitMask(TxControlReg, 0x03);/关闭天线/void PcdAntennaOffClearBitMask(TxControlReg, 0x03);

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号