📄 m500aucend.lst
字号:
723 //WriteIO(RegPage,0x80);
724 if (ReadIO(RegCommand) != 0x00)
725 {
726 status = MI_INTERFACEERR;
727 }
728 }
729 return status;
730 }
731
732 ///////////////////////////////////////////////////////////////////////
733 // Configures the MF RC500
734 ///////////////////////////////////////////////////////////////////////
735 char M500PcdConfig(void)
736 {
737 char idata status;
738
739 if ((status = M500PcdReset()) == MI_OK)
740 {
741 WriteIO(RegClockQControl,0x00);
742 WriteIO(RegClockQControl,0x40);
743 delay_50us(2);
744 ClearBitMask(RegClockQControl,0x40);
745 WriteIO(RegBitPhase,0xAD);
746 WriteIO(RegRxThreshold,0xFF);
747 WriteIO(RegRxControl2,0x01);
748 WriteIO(RegFIFOLevel,0x1A);
C51 COMPILER V7.03 M500AUCEND 05/07/2004 12:23:37 PAGE 15
749 WriteIO(RegTimerControl,0x02);
750 WriteIO(RegIRqPinConfig,0x03);
751 M500PcdRfReset(1);
752 }
753 return status;
754 }
755
756 ///////////////////////////////////////////////////////////////
757 // Key loading into the MF RC500's EEPROM
758 ///////////////////////////////////////////////////////////////
759 char M500PcdLoadKeyE2(unsigned char key_type,
760 unsigned char sector,
761 unsigned char *uncoded_keys)
762 {
763 signed char status = MI_OK;
764 unsigned int e2addr = 0x80 + sector * 0x18;
765 unsigned char coded_keys[12];
766
767 if (key_type == PICC_AUTHENT1B)
768 {
769 e2addr += 12; // key B offset
770 }
771 if ((status = M500HostCodeKey(uncoded_keys,coded_keys)) == MI_OK)
772 {
773 status = PcdWriteE2(e2addr,12,coded_keys);
774 }
775 return status;
776 }
777
778 ///////////////////////////////////////////////////////////////////////
779 // Write the MF RC500's EEPROM
780 ///////////////////////////////////////////////////////////////////////
781 char PcdWriteE2(unsigned int startaddr,
782 unsigned char length,
783 unsigned char* _data)
784 {
785 char status = MI_OK;
786 ResetInfo(MInfo);
787 SerBuffer[0] = startaddr & 0xFF;
788 SerBuffer[1] = (startaddr >> 8) & 0xFF;
789 memcpy(SerBuffer + 2,_data,length);
790
791 MInfo.nBytesToSend = length + 2;
792
793 status = M500PcdCmd(PCD_WRITEE2,
794 SerBuffer,
795 &MInfo);
796 return status;
797 }
798
799 ///////////////////////////////////////////////////////////////////////
800 // Select Command defined in ISO14443(MIFARE)
801 ///////////////////////////////////////////////////////////////////////
802 char M500PcdMfOutSelect(unsigned char type)
803 {
804 WriteIO(RegMfOutSelect,type&0x7);
805 return MI_OK;
806 }
807
808 ///////////////////////////////////////////////////////////////////////
809 // Request Command defined in ISO14443(MIFARE)
810 // Request,Anticoll,Select,return CardType(2 bytes)+CardSerialNo(4 bytes)
C51 COMPILER V7.03 M500AUCEND 05/07/2004 12:23:37 PAGE 16
811 // 寻卡,防冲突,选择卡 返回卡类型(2 bytes)+ 卡系列号(4 bytes)
812 ///////////////////////////////////////////////////////////////////////
813 char M500PiccCommonRequest(unsigned char req_code,unsigned char *atq)
814 {
815 char idata status = MI_OK;
816
817 M500PcdSetTmo(3);
818 WriteIO(RegChannelRedundancy,0x03);
819 ClearBitMask(RegControl,0x08);
820 WriteIO(RegBitFraming,0x07);
821 SetBitMask(RegTxControl,0x03);
822 ResetInfo(MInfo);
823 SerBuffer[0] = req_code;
824 MInfo.nBytesToSend = 1;
825
826 status = M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo);
827 if (status)
828 {
829 *atq = 0;
830 }
831 else
832 {
833 if (MInfo.nBitsReceived != 16)
834 {
835 *atq = 0;
836 status = MI_BITCOUNTERR;
837 }
838 else
839 {
840 status = MI_OK;
841 memcpy(atq,SerBuffer,2);
842 }
843 }
844 return status;
845 }
846
847 ///////////////////////////////////////////////////////////////////
848 // Cascaded Anti-Collision Command defined in ISO14443(MIFARE)
849 // 防冲突 读卡的系列号 MLastSelectedSnr
850 ///////////////////////////////////////////////////////////////////
851 char M500PiccCascAnticoll (unsigned char bcnt,unsigned char *snr)
852 {
853 char idata status = MI_OK;
854 char idata snr_in[4];
855 char idata nbytes = 0;
856 char idata nbits = 0;
857 char idata complete = 0;
858 char idata i = 0;
859 char idata byteOffset = 0;
860 unsigned char dummyShift1;
861 unsigned char dummyShift2;
862
863 M500PcdSetTmo(106);
864 memcpy(snr_in,snr,4);
865
866 WriteIO(RegDecoderControl,0x28);
867 ClearBitMask(RegControl,0x08);
868 complete = 0;
869 while (!complete && (status == MI_OK) )
870 {
871 ResetInfo(MInfo);
872 WriteIO(RegChannelRedundancy,0x03);
C51 COMPILER V7.03 M500AUCEND 05/07/2004 12:23:37 PAGE 17
873 nbits = bcnt % 8;
874 if(nbits)
875 {
876 WriteIO(RegBitFraming,nbits << 4 | nbits);
877 nbytes = bcnt / 8 + 1;
878 if (nbits == 7)
879 {
880 MInfo.cmd = PICC_ANTICOLL1;
881 WriteIO(RegBitFraming,nbits);
882 }
883 }
884 else
885 {
886 nbytes = bcnt / 8;
887 }
888 SerBuffer[0] = 0x93;
889 SerBuffer[1] = 0x20 + ((bcnt/8) << 4) + nbits;
890
891 for (i = 0; i < nbytes; i++)
892 {
893 SerBuffer[i + 2] = snr_in[i];
894 }
895 MInfo.nBytesToSend = 2 + nbytes;
896
897 status = M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo);
898 if (nbits == 7)
899 {
900 dummyShift1 = 0x00;
901 for (i = 0; i < MInfo.nBytesReceived; i++)
902 {
903 dummyShift2 = SerBuffer[i];
904 SerBuffer[i] = (dummyShift1 >> (i+1)) | (SerBuffer[i] << (7-i));
905 dummyShift1 = dummyShift2;
906 }
907 MInfo.nBitsReceived -= MInfo.nBytesReceived;
908 if ( MInfo.collPos ) MInfo.collPos += 7 - (MInfo.collPos + 6) / 9;
909 }
910 if ( status == MI_OK || status == MI_COLLERR)
911 {
912 if ( MInfo.nBitsReceived != (40 - bcnt) )
913 {
914 status = MI_BITCOUNTERR;
915 }
916 else
917 {
918 byteOffset = 0;
919 if( nbits != 0 )
920 {
921 snr_in[nbytes - 1] = snr_in[nbytes - 1] | SerBuffer[0];
922 byteOffset = 1;
923 }
924
925 for ( i =0; i < (4 - nbytes); i++)
926 {
927 snr_in[nbytes + i] = SerBuffer[i + byteOffset];
928 }
929
930 if (status != MI_COLLERR )
931 {
932 dummyShift2 = snr_in[0] ^ snr_in[1] ^ snr_in[2] ^ snr_in[3];
933 dummyShift1 = SerBuffer[MInfo.nBytesReceived - 1];
934 if (dummyShift2 != dummyShift1)
C51 COMPILER V7.03 M500AUCEND 05/07/2004 12:23:37 PAGE 18
935 {
936 status = MI_SERNRERR;
937 }
938 else
939 {
940 complete = 1;
941 }
942 }
943 else
944 {
945 bcnt = bcnt + MInfo.collPos - nbits;
946 status = MI_OK;
947 }
948 }
949 }
950 }
951 if (status == MI_OK)
952 {
953 memcpy(snr,snr_in,4);
954 }
955 else
956 {
957 memcpy(snr,"0000",4);
958 }
959 ClearBitMask(RegDecoderControl,0x20);
960
961 return status;
962 }
963
964 //////////////////////////////////////////////////////////////////
965 // Cascaded Select command defined in ISO14443(MIFARE)
966 // 选择卡 Select Card
967 //////////////////////////////////////////////////////////////////
968 char M500PiccCascSelect(unsigned char *snr,unsigned char *sak)
969 {
970 char idata status = MI_OK;
971
972 M500PcdSetTmo(106);
973
974 WriteIO(RegChannelRedundancy,0x0F);
975 ClearBitMask(RegControl,0x08);
976 ResetInfo(MInfo);
977 SerBuffer[0] = 0x93;
978 SerBuffer[1] = 0x70;
979
980 memcpy(SerBuffer + 2,snr,4);
981 SerBuffer[6] = SerBuffer[2] ^ SerBuffer[3] ^ SerBuffer[4] ^ SerBuffer[5];
982 MInfo.nBytesToSend = 7;
983 status = M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo);
984
985 *sak = 0;
986 if (status == MI_OK)
987 {
988 if (MInfo.nBitsReceived != 8)
989 {
990 status = MI_BITCOUNTERR;
991 }
992 else
993 {
994 *sak = SerBuffer[0];
995 }
996 }
C51 COMPILER V7.03 M500AUCEND 05/07/2004 12:23:37 PAGE 19
997 return status;
998 }
999
1000 ///////////////////////////////////////////////////////////////////////
1001 // Key loading into the MF RC500's EEPROM
1002 // 校验卡密码(E2)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -