📄 iso14443a.lst
字号:
548 2 MfComData.MfData[2] = 0;
549 2 MfComData.MfData[3] = 0;
550 2
551 2 status = PcdComTransceive(pi);
C51 COMPILER V8.05a ISO14443A 07/05/2010 23:34:45 PAGE 10
552 2 if (status == MI_NOTAGERR)
553 2 { status = MI_OK; }
554 2 }
555 1 return status;
556 1 }
557
558 /////////////////////////////////////////////////////////////////////
559 //将卡缓冲区中数据保存到块
560 //input:addr=绝对块号
561 /////////////////////////////////////////////////////////////////////
562 char PcdTransfer(unsigned char addr)
563 {
564 1 char status;
565 1 struct TranSciveBuffer MfComData;
566 1 struct TranSciveBuffer *pi;
567 1 pi = &MfComData;
568 1
569 1 PcdSetTmo(5);
570 1 MfComData.MfCommand = PCD_TRANSCEIVE;
571 1 MfComData.MfLength = 2;
572 1 MfComData.MfData[0] = PICC_TRANSFER;
573 1 MfComData.MfData[1] = addr;
574 1
575 1 status = PcdComTransceive(pi);
576 1 if (status != MI_NOTAGERR)
577 1 {
578 2 if (MfComData.MfLength != 4)
579 2 { status = MI_BITCOUNTERR; }
580 2 else
581 2 {
582 3 MfComData.MfData[0] &= 0x0F;
583 3 switch (MfComData.MfData[0])
584 3 {
585 4 case 0x00:
586 4 status = MI_NOTAUTHERR;
587 4 break;
588 4 case 0x0A:
589 4 status = MI_OK;
590 4 break;
591 4 case 0x01:
592 4 status = MI_VALERR;
593 4 break;
594 4 default:
595 4 status = MI_CODEERR;
596 4 break;
597 4 }
598 3 }
599 2 }
600 1 return status;
601 1 }
602
603 /////////////////////////////////////////////////////////////////////
604 //命令卡进入休眠状态
605 /////////////////////////////////////////////////////////////////////
606 char PcdHalt()
607 {
608 1 char status = MI_OK;
609 1 struct TranSciveBuffer MfComData;
610 1 struct TranSciveBuffer *pi;
611 1 pi = &MfComData;
612 1
613 1 MfComData.MfCommand = PCD_TRANSCEIVE;
C51 COMPILER V8.05a ISO14443A 07/05/2010 23:34:45 PAGE 11
614 1 MfComData.MfLength = 2;
615 1 MfComData.MfData[0] = PICC_HALT;
616 1 MfComData.MfData[1] = 0;
617 1
618 1 status = PcdComTransceive(pi);
619 1 if (status)
620 1 {
621 2 if (status==MI_NOTAGERR || status==MI_ACCESSTIMEOUT)
622 2 status = MI_OK;
623 2 }
624 1 WriteRawRC(RegCommand,PCD_IDLE);
625 1 return status;
626 1 }
627
628
629 /////////////////////////////////////////////////////////////////////
630 //Mifare_Pro复位
631 //input: parameter = PCD BUFERR SIZE
632 //output:pLen = 复位信息长度
633 // pData = 复位信息
634 /////////////////////////////////////////////////////////////////////
635 char MifareProRst(unsigned char parameter,unsigned char *pLen,unsigned char *pData)
636 {
637 1 char status;
638 1 struct TranSciveBuffer MfComData;
639 1 struct TranSciveBuffer *pi;
640 1 pi = &MfComData;
641 1
642 1 PcdSetTmo(15);
643 1
644 1 MfComData.MfCommand = PCD_TRANSCEIVE;
645 1 MfComData.MfLength = 2;
646 1 MfComData.MfData[0] = PICC_RESET;
647 1 MfComData.MfData[1] = parameter;
648 1 g_bIblock = 0;
649 1 status = PcdComTransceive(pi);
650 1 if ((*pLen = MfComData.MfLength/8) <= FSD)
651 1 { memcpy(pData, &MfComData.MfData[0], *pLen); }
652 1 else
653 1 { status = MI_COM_ERR; }
654 1 return status;
655 1 }
656
657
658 /////////////////////////////////////////////////////////////////////
659 //向ISO14443-4卡发送COS命令
660 //input:CID_NAD = 是否包含CID或NAD CID卡片标识符 NAD节点
661 // timeout = FWI 桢等待时间的整数
662 // pLen = 命令长度
663 // pCommand = COS命令
664 //ouput:pLen = 返回数据长度
665 // pCommand = 返回数据
666 /////////////////////////////////////////////////////////////////////
667 char MifareProCom(unsigned char CID_NAD,unsigned char timeout,unsigned char *pLen,unsigned char *pCommand)
668 {
669 1 char status;
670 1 struct TranSciveBuffer MfComData;
671 1 struct TranSciveBuffer *pi;
672 1 unsigned char i,CidNadLg,PCB_I,PCB_R;
673 1 unsigned char idata sendlgok,sendlgnow,sendlgsum,recelgnow,recelgsum;
674 1
675 1 recelgnow = 0x00;
C51 COMPILER V8.05a ISO14443A 07/05/2010 23:34:45 PAGE 12
676 1 recelgsum = 0x00;
677 1 sendlgnow = 0x00;
678 1 sendlgok = 0x00;
679 1 sendlgsum = *pLen;
680 1 PCB_R = 0xA2;
681 1
682 1 PcdSetTmo(timeout);
683 1
684 1
685 1 if (CID_NAD & 0xF0)
686 1 { CidNadLg = 1; }
687 1 else
688 1 { CidNadLg = 0; }
689 1 if (sendlgsum > FSD-1-CidNadLg)
690 1 {
691 2 sendlgnow = FSD-1-CidNadLg;
692 2 sendlgsum -= sendlgnow;
693 2 PCB_I = 0x12 ^ g_bIblock;
694 2 }
695 1 else
696 1 {
697 2 sendlgnow = sendlgsum;
698 2 PCB_I = 0x02 ^ g_bIblock;
699 2 }
700 1 g_bIblock = !g_bIblock;
701 1 MfComData.MfCommand = PCD_TRANSCEIVE;
702 1 MfComData.MfLength = sendlgnow + CidNadLg + 1;
703 1 MfComData.MfData[0] =( CidNadLg<<3) | PCB_I;
704 1 for (i=0; i<CidNadLg; i++)
705 1 { MfComData.MfData[i+1] = 1; }
706 1 memcpy(&MfComData.MfData[CidNadLg+1], pCommand, sendlgnow);
707 1 sendlgok += sendlgnow;
708 1 pi = &MfComData;
709 1
710 1 status = PcdComTransceive(pi);
711 1
712 1 //////////////////////////////////////////////
713 1 while (status == MI_OK)
714 1 {
715 2 if (MfComData.MfLength/8-1-CidNadLg > FSD)
716 2 {
717 3 status = MI_COM_ERR;
718 3 break;
719 3 }
720 2 if ((MfComData.MfData[0] & 0xF0) == 0x00)
721 2 //命令通讯结束
722 2 {
723 3 recelgnow = MfComData.MfLength/8 - 1 - CidNadLg;
724 3 memcpy(pCommand+recelgsum, &MfComData.MfData[CidNadLg+1], recelgnow);
725 3 recelgsum += recelgnow;
726 3 *pLen = recelgsum;
727 3 break;
728 3 }
729 2 if ((MfComData.MfData[0] & 0xF0) == 0xA0)
730 2 //发送后续数据
731 2 {
732 3 MfComData.MfCommand = PCD_TRANSCEIVE;
733 3 for(i=0; i<CidNadLg; i++)
734 3 { MfComData.MfData[i+1] = 0; }
735 3 PCB_I ^= 1;
736 3 if(sendlgsum > FSD-1-CidNadLg)
737 3 {
C51 COMPILER V8.05a ISO14443A 07/05/2010 23:34:45 PAGE 13
738 4 sendlgnow = FSD-1-CidNadLg;
739 4 sendlgsum -= sendlgnow;
740 4 PCB_I |= 0x10^ g_bIblock;
741 4 g_bIblock = !g_bIblock;
742 4 }
743 3 else
744 3 {
745 4 sendlgnow = sendlgsum;
746 4 PCB_I &= 0xEF;
747 4 PCB_I |= g_bIblock;
748 4 g_bIblock = !g_bIblock;
749 4 }
750 3 MfComData.MfLength = sendlgnow + CidNadLg + 1;
751 3 MfComData.MfData[0] = 0x02 | (CID_NAD<<3) | PCB_I;
752 3
753 3 memcpy(&MfComData.MfData[CidNadLg+1], pCommand+sendlgok, sendlgnow);
754 3 sendlgok += sendlgnow;
755 3 pi = &MfComData;
756 3 status = PcdComTransceive(pi);
757 3 continue;
758 3 }
759 2 if ((MfComData.MfData[0] & 0xF0) == 0x10)
760 2 //接收后续数据
761 2 {
762 3 recelgnow = MfComData.MfLength/8 - 1 - CidNadLg;
763 3 memcpy(pCommand+recelgsum, &MfComData.MfData[CidNadLg+1], recelgnow);
764 3 recelgsum += recelgnow;
765 3
766 3 MfComData.MfCommand = PCD_TRANSCEIVE;
767 3 for(i=0; i<CidNadLg; i++)
768 3 { MfComData.MfData[i+1]=0; }
769 3 MfComData.MfLength = CidNadLg + 1;
770 3 if(MfComData.MfData[0] & 0x01)
771 3 { PCB_R &= 0xFE; }
772 3 else
773 3 { PCB_R |= 0x01; }
774 3 MfComData.MfData[0] = PCB_R | (CID_NAD<<3) & 0xFB;
775 3 pi = &MfComData;
776 3
777 3 status = PcdComTransceive(pi);
778 3 continue;
779 3 }
780 2 status = MI_COM_ERR;
781 2 break;
782 2 }
783 1 return status;
784 1 }
785
786 //////////////////////////////////////////////////////////////////////
787 //ISO14443-4 DESELECT
788 //////////////////////////////////////////////////////////////////////
789 char CL_Deselect(unsigned char CID)
790 {
791 1 char status;
792 1 struct TranSciveBuffer MfComData;
793 1 struct TranSciveBuffer *pi;
794 1
795 1 PcdSetTmo(4);
796 1
797 1 MfComData.MfCommand = PCD_TRANSCEIVE;
798 1 MfComData.MfLength = 0x2 ;
799 1 MfComData.MfData[0] =0xCA;
C51 COMPILER V8.05a ISO14443A 07/05/2010 23:34:45 PAGE 14
800 1 MfComData.MfData[1] =CID;
801 1 pi = &MfComData;
802 1
803 1 status = PcdComTransceive(pi);
804 1 return status;
805 1 }
806
807
808
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 2459 ----
CONSTANT SIZE = 5 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 1049
IDATA SIZE = ---- 10
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -