📄 mfucfunc.lst
字号:
462 6 snr_in[nbytes - 1] = snr_in[nbytes - 1] | MRcvBuffer[0];
463 6 byteOffset = 1;
464 6 }
465 5 for ( i =0; i < (4 - nbytes); i++)
466 5 {
467 6 snr_in[nbytes + i] = MRcvBuffer[i + byteOffset];
468 6 }
469 5
470 5 if (status != MI_COLLERR ) // no error and no collision
471 5 {
472 6 // SerCh check
473 6 snr_crc = snr_in[0] ^ snr_in[1] ^ snr_in[2] ^ snr_in[3];
474 6 snr_check = MRcvBuffer[MInfo.nBytesReceived - 1];
475 6 if (snr_crc != snr_check)
476 6 {
477 7 status = MI_SERNRERR;
478 7 }
479 6 else
480 6 {
481 7 complete = 1;
482 7 }
483 6 }
484 5 else // collision occured
485 5 {
486 6 bcnt = bcnt + MInfo.collPos - nbits;
487 6 status = MI_OK;
488 6 }
489 5 }
490 4 }
491 3 }
492 2 }
493 1 if (status == MI_OK)
494 1 {
495 2 // transfer snr_in to snr
496 2 memcpy(snr,snr_in,4);
497 2 }
498 1 else
499 1 {
500 2 memcpy(snr,"0000",4);
501 2 }
502 1
503 1 //----------------------Einstellungen aus Initialisierung ruecksetzen
504 1 ClearBitMask(RegDecoderControl,0x20); // ZeroAfterColl disable
505 1
506 1 return status;
507 1 }
508
509 ///////////////////////////////////////////////////////////////////////
510 // M I F A R E S E L E C T
511 // for std. select
512 ///////////////////////////////////////////////////////////////////////
513 char Mf500PiccSelect(unsigned char *snr,
514 unsigned char *sak)
515 {
516 1 return Mf500PiccCascSelect(0x93,snr,sak); // first cascade level
517 1 }
518
519 ///////////////////////////////////////////////////////////////////////
520 // M I F A R E C A S C A D E D S E L E C T
521 // for extended serial number
C51 COMPILER V4.01, MFUCFUNC 19/08/04 14:33:23 PAGE 9
522 ///////////////////////////////////////////////////////////////////////
523 char Mf500PiccCascSelect(unsigned char select_code,
524 unsigned char *snr,
525 unsigned char *sak)
526 {
527 1 char status = MI_OK;
528 1
529 1 if ((status = Mf500PcdSetDefaultAttrib()) == MI_OK)
530 1 {
531 2 PcdSetTmo(106);
532 2
533 2 WriteRC(RegChannelRedundancy,0x0f); // RxCRC,TxCRC, Parity enable
534 2 ClearBitMask(RegControl,0x08); // disable crypto 1 unit
535 2
536 2 //************* Cmd Sequence **********************************
537 2 ResetInfo(MInfo);
538 2 MRcvBuffer[0] = select_code;
539 2 MRcvBuffer[1] = 0x70; // number of bytes send
540 2
541 2 memcpy(MRcvBuffer + 2,snr,4);
542 2 MRcvBuffer[6] = MRcvBuffer[2]
543 2 ^ MRcvBuffer[3]
544 2 ^ MRcvBuffer[4]
545 2 ^ MRcvBuffer[5];
546 2 MInfo.nBytesToSend = 7;
547 2 status = PcdSingleResponseCmd(PCD_TRANSCEIVE,
548 2 MRcvBuffer,
549 2 MRcvBuffer,
550 2 &MInfo);
551 2
552 2 *sak = 0;
553 2 if (status == MI_OK) // no timeout occured
554 2 {
555 3 if (MInfo.nBitsReceived != 8) // last byte is not complete
556 3 {
557 4 status = MI_BITCOUNTERR;
558 4 }
559 3 else
560 3 {
561 4 *sak = MRcvBuffer[0];
562 4 memcpy(MLastSelectedSnr,snr,4);
563 4 }
564 3 }
565 2 }
566 1 return status;
567 1 }
568
569 ///////////////////////////////////////////////////////////////////////
570 // M I F A R E P I C C A C T I V A T I O N S E Q E N C E
571 ///////////////////////////////////////////////////////////////////////
572 /*char Mf500PiccActivateIdle(unsigned char br,
573 unsigned char *atq,
574 unsigned char *sak,
575 unsigned char *uid,
576 unsigned char *uid_len)
577 {
578 unsigned char cascade_level;
579 unsigned char sel_code;
580 unsigned char uid_index;
581 signed char status;
582 unsigned char cmdASEL;
583
584 *uid_len = 0;
585
586 //call activation with def. divs
587 status = Mf500PcdSetDefaultAttrib();
C51 COMPILER V4.01, MFUCFUNC 19/08/04 14:33:23 PAGE 10
588 if (status == MI_OK)
589 {
590 status = Mf500PiccCommonRequest(PICC_REQIDL,atq);
591 }
592 if (status == MI_OK)
593 {
594 if((atq[0] & 0x1F) == 0x00) // check lower 5 bits, for tag-type
595 // all tags within this 5 bits have to
596 // provide a bitwise anticollision
597 {
598 status = MI_NOBITWISEANTICOLL;
599 }
600 }
601 if (status == MI_OK)
602 {
603 //Get UID in 1 - 3 levels (standard, [double], [triple] )
604 //-------
605 switch(br)
606 {
607 case 0: cmdASEL = PICC_ANTICOLL1; break;
608 default:
609 status = MI_BAUDRATE_NOT_SUPPORTED; break;
610 }
611 }
612 if (status == MI_OK)
613 {
614 cascade_level = 0;
615 uid_index = 0;
616 do
617 {
618 //Select code depends on cascade level
619 sel_code = cmdASEL + (2 * cascade_level);
620 cmdASEL = PICC_ANTICOLL1; // reset anticollistion level for calculation
621 //ANTICOLLISION
622 status = Mf500PiccCascAnticoll(sel_code, 0, &uid[uid_index]);
623 //SELECT
624 if (status == MI_OK)
625 {
626 status = Mf500PiccCascSelect(sel_code, &uid[uid_index], sak);
627 if (status == MI_OK)
628 {
629 cascade_level++;
630
631 //we differ cascaded and uncascaded UIDs
632 if (*sak & 0x04) // if cascaded, bit 2 is set in answer to select
633 {
634 //this UID is cascaded, remove the cascaded tag that is
635 //0x88 as first of the 4 byte received
636 memmove(&uid[uid_index], &uid[uid_index + 1], 3);
637 uid_index += 3;
638 *uid_len += 3;
639 }
640 else
641 {
642 //this UID is not cascaded -> the length is 4 bytes
643 uid_index += 4;
644 *uid_len += 4;
645 }
646 }
647 }
648 }
649 while((status == MI_OK) // error status
650 && (*sak & 0x04) // no further cascade level
651 && (cascade_level < 3)); // highest cascade level is reached
652 }
653 if (status == MI_OK)
C51 COMPILER V4.01, MFUCFUNC 19/08/04 14:33:23 PAGE 11
654 {
655 //Exit function, if cascade level is triple and sak indicates another
656 //cascase level.
657 if ((cascade_level == 3) && (*sak & 0x04))
658 {
659 *uid_len = 0;
660 status = MI_SERNRERR;
661 }
662 }
663 return (status);
664 }
665
666 ///////////////////////////////////////////////////////////////////////
667 // M I F A R E P I C C A C T I V A T I O N S E Q E N C E
668 ///////////////////////////////////////////////////////////////////////
669 char Mf500PiccActivateWakeup(unsigned char br,
670 unsigned char *atq,
671 unsigned char *sak,
672 unsigned char *uid,
673 unsigned char uid_len)
674 {
675 unsigned char cascade_level;
676 unsigned char uid_index;
677 unsigned char tmpuid[4];
678 unsigned char sel_code;
679 unsigned char cmdASEL;
680 signed char status;
681
682 //call activation with def. divs
683 status = Mf500PcdSetDefaultAttrib();
684 if (status == MI_OK)
685 {
686 status = Mf500PiccCommonRequest(PICC_REQIDL,atq);
687 }
688 if (status == MI_OK)
689 {
690 if ((atq[0] & 0x1F) == 0x00) // check lower 5 bits, for tag-type
691 // all tags within this 5 bits have to
692 // provide a bitwise anticollision
693 {
694 status = MI_NOBITWISEANTICOLL;
695 }
696 }
697 if (status == MI_OK)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -