1、 RST_RC500=1; / reset RC500 Delay_10us(200); / wait RST_RC500=0; / clear reset pin st_data=ReadRC(RegPage); if (st_data=0x80) break; while(-ii); ii=5000; do WriteRC(RegPage,0x00); / Dummy access in order to determine the bus st_data= ReadRC(RegCommand); if (!st_data) break; / configuration / necessa
2、ry read access / after first write access, the returned value / should be zero = interface recognized if (st_data) status = MI_INTERFACEERR; else status = 0; if(!status) XBYTERegClockQControl=0x0; XBYTERegClockQControl=0x40; Delay_10us(5); ClearBitMask(RegClockQControl,0x40); / clear bit ClkQCalib f
3、or XBYTERegBitPhase=0xAd; XBYTERegRxThreshold=0xFF; XBYTERegRxControl2=01; XBYTERegFIFOLevel=0x1A; / initialize to 26d XBYTERegTimerControl=0x02; / TStopRxEnd=0,TStopRxBeg=0, XBYTERegIRqPinConfig=0x3; / interrupt active low enable status=PcdRfReset(1); / Rf - reset and enable output driver return st
4、atus;unsigned char Mf500PiccRequest(unsigned char req_code, unsigned char *atq) unsigned char D_data status = MI_OK; PcdSetTmo(2); WriteRC(RegChannelRedundancy,0x03); / RxCRC and TxCRC disable, parity enable ClearBitMask(RegControl,0x08); / disable crypto 1 unit WriteRC(RegBitFraming,0x07); / set Tx
5、LastBits to 7 ResetInfo(); MSndBuffer0 = req_code; MInfo.nBytesToSend = 1; status = PcdSingleResponseCmd(PCD_TRANSCEIVE); if (status) / error occured atq0 = 0; if (MInfo.nBitsReceived != 16) / 2 bytes expected atq0 = 0; status = MI_BITCOUNTERR; else status = MI_OK; memcpy(atq,MRcvBuffer,2); return s
6、tatus;unsigned char Mf500PiccCascSelect(unsigned char select_code,unsigned char *snr, unsigned char *sak)/ if (CardSortChar=102)/1102卡不需要/ return 0; WriteRC(RegChannelRedundancy,0x0F); / RxCRC,TxCRC, Parity enable MSndBuffer0 = select_code; MSndBuffer1 = 0x70; / number of bytes send memcpy(MSndBuffe
7、r+2,snr,4); MSndBuffer6 = MSndBuffer2 MSndBuffer3 MSndBuffer4 MSndBuffer5; MInfo.nBytesToSend = 7; sak0 = 0; if (status = MI_OK) / no timeout occured= 8) / last byte is not complete sak0 = MRcvBuffer0;/ memcpy(MLastSelectedSnr,snr,4);unsigned char Mf500PiccAnticoll (unsigned char bcnt, unsigned char
8、 *snr) return Mf500PiccCascAnticoll(0x93,bcnt,snr); / first cascade levelunsigned char Mf500PiccCascAnticoll (unsigned char select_code,unsigned char bcnt,unsigned char *snr) unsigned char D_data snr_in4; / copy of the input parameter snr unsigned char D_data nbytes = 0; / how many bytes received un
9、signed char D_data nbits = 0; / how many bits received unsigned char D_data complete = 0; / complete snr recived unsigned char D_data i = 0; unsigned char D_data byteOffset = 0; unsigned char D_data snr_crc; / check byte calculation unsigned char D_data snr_check; unsigned char D_data dummyShift1; /
10、 dummy byte for snr shift unsigned char D_data dummyShift2; memcpy(snr_in,snr,4); WriteRC(RegDecoderControl,0x28); / ZeroAfterColl aktivieren complete=0; while (!complete & (status = MI_OK) ) nbits = bcnt % 8; if (nbits) WriteRC(RegBitFraming,nbits 4 | nbits); / TxLastBits/RxAlign auf nb_bi nbytes =
11、 bcnt / 8 + 1; if (nbits = 7 ) MInfo.cmd = PICC_ANTICOLL1; / pass command flag to ISR WriteRC(RegBitFraming,nbits); / reset RxAlign to zero nbytes = bcnt / 8; MSndBuffer1 = 0x20 + (bcnt/8) 4) + nbits; /number of bytes send memcpy (MSndBuffer+2,snr_in,nbytes); MInfo.nBytesToSend = 2 + nbytes; / in or
12、der to solve an inconsistancy in the anticollision sequence / (will be solved soon), the case of 7 bits has to be treated in a / separate way if (nbits = 7) / reorder received bits dummyShift1 = 0x00; for (i = 0; i (i+1) | (MRcvBufferi 0) nms=1000*nms; Delay_10us(nms); SetBitMask(RegTxControl,0x03);
13、void PcdSetTmo(unsigned char tmoLength) switch(tmoLength) / timer clock frequency 13,56 MHz case 1: / short timeout (1,0 ms) WriteRC(RegTimerClock,0x07); / TAutoRestart=0,TPrescale=128 WriteRC(RegTimerReload,0x6a);/ TReloadVal = h6a =106(dec) break; case 2: / medium timeout (1,5 ms) WriteRC(RegTimer
14、Reload,0xa0);ha0 =160(dec) case 3: / long timeout (6 ms) WriteRC(RegTimerClock,0x09); / TAutoRestart=0,TPrescale=4*128 case 4: / long timeout (19.2 ms) WriteRC(RegTimerClock,0x0a); WriteRC(RegTimerReload,0xff);ff =255(dec) case 5: / long timeout (38.4 ms) WriteRC(RegTimerClock,0x0b); / TAutoRestart=
15、0,TPrescale=4*4*128 WriteRC(RegTimerReload,0xff); break; case 6: / long timeout (76.8 ms) WriteRC(RegTimerClock,0x0c); / TAutoRestart=0,TPrescale=2*4*4*128 case 7: / long timeout (153.6 ms) WriteRC(RegTimerClock,0x0d); / TAutoRestart=0,TPrescale=2*2*4*4*128 default: WriteRC(RegTimerClock,0x07); Writ
16、eRC(RegTimerReload,tmoLength);/ TReloadVal = tmoLengthvoid ResetInfo(void) MInfo.cmd = 0; MInfo.status = MI_OK; MInfo.irqSource = 0; MInfo.nBytesSent = 0; MInfo.nBytesToSend = 0; MInfo.nBytesReceived = 0; MInfo.nBitsReceived = 0; MInfo.collPos = 0; unsigned char PcdSingleResponseCmd(unsigned char cm
17、d) unsigned char D_data tmpStatus ; unsigned char D_data lastBits; unsigned char D_data irqEn = 0x00; unsigned char D_data waitFor = 0x00; unsigned char D_data timerCtl = 0x00; unsigned int D_data ii=50000; WriteRC(RegInterruptEn,0x7F); / disable all interrupts WriteRC(RegInterruptRq,0x7F); / reset
18、interrupt requests WriteRC(RegCommand,PCD_IDLE); / terminate probably running command FlushFIFO(); / flush FIFO buffer haveset=1; / initialising the ISR-Function pointer for mifare / protocol - do this after initialising the MpXXXX variables MInfo.irqSource = 0x0; / reset interrupt flags / depending on the command code, appropria
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1