1、1356M读卡器开发详解二RC522驱动程序13.56M读卡器开发详解二1.硬件接口介绍根据上一篇的介绍,小编使用了RC522的SPI口通信方式和51单片机进行通信。硬件接口设计此处不再附图。只是将接口配置列写如下:sbitspi_cs=P16;sbitspi_ck=P15;sbitspi_mosi=P14;sbitspi_miso=P13;sbitspi_rst=P12;#defineSET_SPI_CSspi_cs=1#defineCLR_SPI_CSspi_cs=0#defineSET_SPI_CKspi_ck=1#defineCLR_SPI_CKspi_ck=0#defineSET_S
2、PI_MOSIspi_mosi=1#defineCLR_SPI_MOSIspi_mosi=0#defineSTU_SPI_MISOspi_miso#defineSET_RC522RSTspi_rst=1#defineCLR_RC522RSTspi_rst=02.51单片机模拟SPI通信函数voiddelay_ns(unsignedintdatans)unsignedintxdatai;for(i=0;inop();nop();nop();unsignedcharSPIReadByte(void)unsignedcharidataSPICount;/Counterusedtoclockoutth
3、edataunsignedcharidataSPIData;SPIData=0;for(SPICount=0;SPICount8;SPICount+)/PreparetoclockinthedatatobereadSPIData=1;/RotatethedataCLR_SPI_CK;nop();nop();/RaisetheclocktoclockthedataoutoftheMAX7456if(STU_SPI_MISO)SPIData|=0x01;SET_SPI_CK;nop();nop();/Droptheclockreadyforthenextbit/andloopbackreturn(
4、SPIData);/FinallyreturnthereaddatavoidSPIWriteByte(unsignedchardataSPIData)unsignedcharidataSPICount;/Counterusedtoclockoutthedatafor(SPICount=0;SPICount8;SPICount+)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
5、.1命令字等定义这些宏定义都是根据RC522数据手册编写的代码。3.2.RC522寄存器地址定义4.Rc522的14443协议代码驱动程序4.1寻卡程序charPcdRequest(unsignedchardatareq_code,unsignedchar*pTagType)charidatastatus;unsignedintidataunLen;unsignedcharxdataucComMF522BufMAXRLEN;ClearBitMask(Status2Reg,0x08);WriteRawRC(BitFramingReg,0x07);SetBitMask(TxControlReg,0
6、x03);ucComMF522Buf0=req_code;status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);if(status=MI_OK)&(unLen=0x10)*pTagType=ucComMF522Buf0;*(pTagType+1)=ucComMF522Buf1;elsestatus=MI_ERR;returnstatus;4.2防冲撞函数charPcdAnticoll(unsignedchar*pSnr)charxdatastatus;unsignedcharxdatai,snr_chec
7、k=0;unsignedintxdataunLen;unsignedcharxdataucComMF522BufMAXRLEN;ClearBitMask(Status2Reg,0x08);WriteRawRC(BitFramingReg,0x00);ClearBitMask(CollReg,0x80);ucComMF522Buf0=PICC_ANTICOLL1;ucComMF522Buf1=0x20;status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);if(status=MI_OK)for(i=0;i4
8、;i+)*(pSnr+i)=ucComMF522Bufi;snr_check=ucComMF522Bufi;if(snr_check!=ucComMF522Bufi)status=MI_ERR;SetBitMask(CollReg,0x80);returnstatus;4.3选定卡片charPcdSelect(unsignedchar*pSnr)charxdatastatus;unsignedcharxdatai;unsignedintxdataunLen;unsignedcharxdataucComMF522BufMAXRLEN;ucComMF522Buf0=PICC_ANTICOLL1;u
9、cComMF522Buf1=0x70;ucComMF522Buf6=0;for(i=0;i4;i+)ucComMF522Bufi+2=*(pSnr+i);ucComMF522Buf6=*(pSnr+i);CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf7);ClearBitMask(Status2Reg,0x08);status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);if(status=MI_OK)&(unLen=0x18)status=MI_OK;elsestatu
10、s=MI_ERR;returnstatus;4.4验证卡片密码charPcdAuthState(unsignedchardataauth_mode,unsignedchardataaddr,unsignedchar*pKey,unsignedchar*pSnr)charxdatastatus;unsignedintxdataunLen;unsignedcharxdatai,ucComMF522BufMAXRLEN;ucComMF522Buf0=auth_mode;ucComMF522Buf1=addr;for(i=0;i6;i+)ucComMF522Bufi+2=*(pKey+i);for(i
11、=0;i6;i+)ucComMF522Bufi+8=*(pSnr+i);/memcpy(&ucComMF522Buf2,pKey,6);/memcpy(&ucComMF522Buf8,pSnr,4);status=PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);if(status!=MI_OK)|(!(ReadRawRC(Status2Reg)&0x08)status=MI_ERR;returnstatus;4.5读取M1卡一块数据charPcdRead(unsignedchardataaddr,unsignedch
12、ar*pData)charidatastatus;unsignedintidataunLen;unsignedcharidatai,ucComMF522BufMAXRLEN;ucComMF522Buf0=PICC_READ;ucComMF522Buf1=addr;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf2);status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);if(status=MI_OK)&(unLen=0x90)/memcpy(pData,ucComMF5
13、22Buf,16);for(i=0;i16;i+)*(pData+i)=ucComMF522Bufi;elsestatus=MI_ERR;returnstatus;4.6写数据到M1卡一块charPcdWrite(unsignedchardataaddr,unsignedchar*pData)charidatastatus;unsignedintidataunLen;unsignedcharidataucComMF522BufMAXRLEN;ucComMF522Buf0=PICC_WRITE;ucComMF522Buf1=addr;CalulateCRC(ucComMF522Buf,2,&uc
14、ComMF522Buf2);status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);if(status!=MI_OK)|(unLen!=4)|(ucComMF522Buf0&0x0F)!=0x0A)status=MI_ERR;if(status=MI_OK)memcpy(ucComMF522Buf,pData,16);/for(i=0;i16;i+)/ucComMF522Bufi=*(pData+i);/CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf16);statu
15、s=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);if(status!=MI_OK)|(unLen!=4)|(ucComMF522Buf0&0x0F)!=0x0A)status=MI_ERR;returnstatus;4.7命令卡进入休眠状态charPcdHalt(void)charidatastatus;unsignedintidataunLen;unsignedcharidataucComMF522BufMAXRLEN;ucComMF522Buf0=PICC_HALT;ucComMF522Buf1=0;C
16、alulateCRC(ucComMF522Buf,2,&ucComMF522Buf2);status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);returnMI_OK;4.8RC522计算CRC16voidCalulateCRC(unsignedchar*pIndata,unsignedchardatalen,unsignedchar*pOutData)unsignedcharidatai,n;ClearBitMask(DivIrqReg,0x04);WriteRawRC(CommandReg,PCD_ID
17、LE);SetBitMask(FIFOLevelReg,0x80);for(i=0;iWriteRawRC(FIFODataReg,*(pIndata+i);WriteRawRC(CommandReg,PCD_CALCCRC);i=0xFF;don=ReadRawRC(DivIrqReg);i-;while(i!=0)&!(n&0x04);pOutData0=ReadRawRC(CRCResultRegL);pOutData1=ReadRawRC(CRCResultRegM);4.9复位RC522charPcdReset(void)/PORTD|=(1RC522RST);SET_RC522RS
18、T;delay_ns(10);/PORTD&=(1RC522RST);CLR_RC522RST;delay_ns(10);/PORTD|=(1RC522RST);SET_RC522RST;delay_ns(10);WriteRawRC(CommandReg,PCD_RESETPHASE);delay_ns(10);WriteRawRC(ModeReg,0x3D);/MifareCRC0x6363WriteRawRC(TReloadRegL,30);WriteRawRC(TReloadRegH,0);WriteRawRC(TModeReg,0x8D);WriteRawRC(TPrescalerR
19、eg,0x3E);WriteRawRC(TxAutoReg,0x40);/returnMI_OK;4.10设置RC522工作方式charM500PcdConfigISOType(unsignedchardatatype)if(type=A)/ISO14443_AClearBitMask(Status2Reg,0x08);WriteRawRC(ModeReg,0x3D);/3FWriteRawRC(RxSelReg,0x86);/84WriteRawRC(RFCfgReg,0x7F);/4FWriteRawRC(TReloadRegL,30);/tmoLength);/TReloadVal=h6
20、a=tmoLength(dec)WriteRawRC(TReloadRegH,0);WriteRawRC(TModeReg,0x8D);WriteRawRC(TPrescalerReg,0x3E);delay_ns(1000);PcdAntennaOn();elsereturn-1;returnMI_OK;4.11读RC522寄存器unsignedcharReadRawRC(unsignedchardataAddress)unsignedcharxdataucAddr;unsignedcharxdataucResult=0;CLR_SPI_CS;ucAddr=(Address1)&0x7E)|
21、0x80;SPIWriteByte(ucAddr);ucResult=SPIReadByte();SET_SPI_CS;returnucResult;4.12写RC522寄存器voidWriteRawRC(unsignedchardataAddress,unsignedchardatavalue)unsignedcharxdataucAddr;CLR_SPI_CS;ucAddr=(Address1)&0x7E);SPIWriteByte(ucAddr);SPIWriteByte(value);SET_SPI_CS;4.13置和清RC522寄存器位4.14RC522与ISO14443卡通讯cha
22、rPcdComMF522(unsignedchardataCommand,unsignedchar*pInData,unsignedchardataInLenByte,unsignedchar*pOutData,unsignedint*pOutLenBit)chardatastatus=MI_ERR;unsignedchardatairqEn=0x00;unsignedchardatawaitFor=0x00;unsignedchardatalastBits;unsignedchardatan;unsignedintdatai;switch(Command)casePCD_AUTHENT:irqEn=0x12;waitFor=0x10;break;casePCD_TRANSCEIVE:irqEn=0x77;waitFor=0x30;break;default:break;WriteRawRC(ComIEnReg,irqEn|0x80);ClearBitMask(ComIrqReg,0x80);WriteRawRC(CommandReg,PCD_IDLE);SetBitMask(FIFOLevelReg,0x80);for(i=0;iW
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1