📄 mfrc500.lst
字号:
854 2 SndBuffer[0] = 0x93;
855 2 SndBuffer[1] = 0x20 + ((bcnt/8) << 4) + nbits;
856 2
857 2 for (i = 0; i < nbytes; i++)
858 2 {
C51 COMPILER V8.00 MFRC500 04/23/2009 15:56:15 PAGE 15
859 3 SndBuffer[i + 2] = Snr[i];
860 3 }
861 2 MInfo.nBytesToSend = 2 + nbytes;
862 2
863 2 status = M500PcdCmd(PCD_TRANSCEIVE, SndBuffer, RcvBuffer, &MInfo);
864 2 if (nbits == 7)
865 2 {
866 3 dummyShift1 = 0x00;
867 3 for (i = 0; i < MInfo.nBytesReceived; i++)
868 3 {
869 4 dummyShift2 = RcvBuffer[i];
870 4 RcvBuffer[i] = (dummyShift1 >> (i+1)) | (RcvBuffer[i] << (7-i));
871 4 dummyShift1 = dummyShift2;
872 4 }
873 3 MInfo.nBitsReceived -= MInfo.nBytesReceived;
874 3 if ( MInfo.collPos )
875 3 MInfo.collPos += 7 - (MInfo.collPos + 6) / 9;
876 3 }
877 2
878 2 if ( status == MI_OK || status == MI_COLLERR) // no other occured
879 2 {
880 3
881 3 byteOffset = 0;
882 3 if( nbits != 0 )
883 3 {
884 4 Snr[nbytes - 1]|= RcvBuffer[0];
885 4 byteOffset = 1;
886 4 }
887 3 for ( i =0; i < (4 - nbytes); i++)
888 3 {
889 4 Snr[nbytes + i] = RcvBuffer[i + byteOffset];
890 4 }
891 3 if (status != MI_COLLERR )
892 3 {
893 4 snr_crc = Snr[0] ^Snr[1] ^Snr[2] ^Snr[3];
894 4 snr_check = RcvBuffer[MInfo.nBytesReceived - 1];
895 4 if (snr_crc != snr_check)
896 4 {
897 5 status = MI_SERNRERR;
898 5 }
899 4 else
900 4 {
901 5 complete = 1;
902 5 }
903 4 }
904 3 else
905 3 {
906 4 bcnt = bcnt + MInfo.collPos - nbits;
907 4 status = MI_OK;
908 4 }
909 3 }
910 2 }
911 1 ClearBitMask(RegDecoderControl,0x20);
912 1 return status;
913 1 }
914
915 uchar M500Select(uchar *Snr)
916 {
917 1
918 1 uchar idata status = MI_OK;
919 1 uchar idata size;
920 1
C51 COMPILER V8.00 MFRC500 04/23/2009 15:56:15 PAGE 16
921 1
922 1 M500PcdSetTmo(2); // 1 050418
923 1
924 1 WriteIO(RegChannelRedundancy,0x0F);
925 1 ClearBitMask(RegControl,0x08);
926 1
927 1 ResetInfo(&MInfo);
928 1 SndBuffer[0] = 0x93;
929 1 SndBuffer[1] = 0x70;
930 1 memcpy(SndBuffer + 2,Snr,4);
931 1
932 1 SndBuffer[6] = SndBuffer[2]^SndBuffer[3]^SndBuffer[4]^SndBuffer[5];
933 1 MInfo.nBytesToSend = 7;
934 1 status = M500PcdCmd(PCD_TRANSCEIVE, SndBuffer, RcvBuffer, &MInfo);
935 1 if (status == MI_OK)
936 1 {
937 2 if (MInfo.nBitsReceived != 8)
938 2 {
939 3 status = MI_BITCOUNTERR;
940 3 }
941 2 else
942 2 {
943 3 size = RcvBuffer[0];
944 3 }
945 2 }
946 1 return status;
947 1 }
948
949 // cook key
950 void M500HostCodeKey(uchar *uncoded,uchar *coded)
951 {
952 1 uchar idata cnt = 0;
953 1 uchar idata ln = 0;
954 1 uchar idata hn = 0;
955 1
956 1 for (cnt = 0; cnt < 6; cnt++)
957 1 {
958 2 ln = uncoded[cnt] & 0x0F;
959 2 hn = uncoded[cnt] >> 4;
960 2 coded[cnt * 2 + 1] = (~ln << 4) | ln;
961 2 coded[cnt * 2 ] = (~hn << 4) | hn;
962 2 }
963 1 }
964
965 ///////////////////////////////////////////////////////////////////////
966 // M I F A R E H A L T
967 ///////////////////////////////////////////////////////////////////////
968 /*
969 char M500Halt(void)
970 {
971 char status = MI_CODEERR;
972
973 M500PcdSetTmo(3);//106);
974 // ************* Cmd Sequence **********************************
975 ResetInfo(&MInfo);
976 SndBuffer[0] = PICC_HALT ; // Halt command code
977 SndBuffer[1] = 0x00; // dummy address
978 MInfo.nBytesToSend = 2;
979 status = M500PcdCmd(PCD_TRANSCEIVE,
980 SndBuffer,
981 RcvBuffer,
982 &MInfo);
C51 COMPILER V8.00 MFRC500 04/23/2009 15:56:15 PAGE 17
983 if (status)
984 {
985 // timeout error ==> no NAK received ==> OK
986 if (status == MI_NOTAGERR || status == MI_ACCESSTIMEOUT)
987 status = MI_OK;
988 }
989 //reset command register - no response from tag
990 WriteIO(RegCommand,PCD_IDLE);
991 return status;
992 }
993 */
994
995 uchar M500PiccAuthState(uchar AuthMode, uchar *snr, uchar Sector)
996 {
997 1 uchar idata status = MI_OK;
998 1
999 1 status = ReadIO(RegErrorFlag);
1000 1
1001 1 if (status != MI_OK)
1002 1 {
1003 2 if (status & 0x40)
1004 2 status = MI_KEYERR;
1005 2 else
1006 2 status = MI_AUTHERR;
1007 2 }
1008 1 else
1009 1 {
1010 2 SndBuffer[0] = AuthMode;
1011 2 SndBuffer[1] = Sector*4+3;
1012 2 memcpy(SndBuffer + 2, snr, 4);
1013 2 ResetInfo(&MInfo);
1014 2 MInfo.nBytesToSend = 6;
1015 2 M500PcdSetTmo(3); // 3
1016 2 if ((status = M500PcdCmd(PCD_AUTHENT1, SndBuffer, RcvBuffer, &MInfo)) == MI_OK)
1017 2 {
1018 3 if (ReadIO(RegSecondaryStatus) & 0x07)
1019 3 {
1020 4 status = MI_BITCOUNTERR;
1021 4 }
1022 3 else
1023 3 {
1024 4 ResetInfo(&MInfo);
1025 4 MInfo.nBytesToSend = 0;
1026 4 if ((status = M500PcdCmd(PCD_AUTHENT2, SndBuffer, RcvBuffer, &MInfo)) == MI_OK)
1027 4 {
1028 5 if ( ReadIO(RegControl) & 0x08 )
1029 5 {
1030 6 status = MI_OK;
1031 6 }
1032 5 else
1033 5 {
1034 6 status = MI_AUTHERR;
1035 6 }
1036 5 }
1037 4 }
1038 3 }
1039 2 }
1040 1 return status;
1041 1 }
1042
1043 uchar M500Auth(uchar Mode, uchar *snr, uchar *Keys, uchar Sector)
1044 {
C51 COMPILER V8.00 MFRC500 04/23/2009 15:56:15 PAGE 18
1045 1 uchar idata status = MI_OK;
1046 1 uchar idata keycoded[12];
1047 1 uchar idata offset;
1048 1
1049 1 offset = (Mode == PICC_AUTHENT1A) ? 0 : 6;
1050 1 M500HostCodeKey(Keys,keycoded);
1051 1 FlushFIFO();
1052 1 ResetInfo(&MInfo);
1053 1 memcpy(SndBuffer,keycoded,12);
1054 1 MInfo.nBytesToSend = 12;
1055 1 if ((status = M500PcdCmd(PCD_LOADKEY, SndBuffer, RcvBuffer, &MInfo)) == MI_OK)
1056 1 {
1057 2 status = M500PiccAuthState(Mode, snr, Sector);
1058 2 }
1059 1 return status;
1060 1 }
1061
1062 uchar M500Read(uchar Address,uchar *DataBuff)
1063 {
1064 1
1065 1 uchar idata status = MI_OK;
1066 1 uchar idata tmp = 0;
1067 1
1068 1 FlushFIFO();
1069 1 M500PcdSetTmo(4); //3
1070 1 WriteIO(RegChannelRedundancy,0x0F);
1071 1 ResetInfo(&MInfo);
1072 1 SndBuffer[0] = PICC_READ;
1073 1 SndBuffer[1] = Address;
1074 1 MInfo.nBytesToSend = 2;
1075 1 status = M500PcdCmd(PCD_TRANSCEIVE, SndBuffer, RcvBuffer, &MInfo);
1076 1 if (status != MI_OK)
1077 1 {
1078 2 if (status != MI_NOTAGERR )
1079 2 {
1080 3 if (MInfo.nBitsReceived == 4)
1081 3 {
1082 4 RcvBuffer[0] &= 0x0f;
1083 4 if ((RcvBuffer[0] & 0x0a) == 0)
1084 4 {
1085 5 status = MI_NOTAUTHERR;
1086 5 }
1087 4 else
1088 4 {
1089 5 status = MI_CODEERR;
1090 5 }
1091 4 }
1092 3 }
1093 2 }
1094 1 else
1095 1 {
1096 2 if (MInfo.nBytesReceived != 16)
1097 2 {
1098 3 status = MI_BYTECOUNTERR;
1099 3 }
1100 2 else
1101 2 {
1102 3 memcpy(DataBuff,RcvBuffer,16);
1103 3 }
1104 2 }
1105 1 return status;
1106 1 }
C51 COMPILER V8.00 MFRC500 04/23/2009 15:56:15 PAGE 19
1107
1108 uchar M500Write(uchar Address,uchar *DataBuff)
1109 {
1110 1
1111 1 uchar idata status = MI_OK;
1112 1
1113 1 ResetInfo(&MInfo);
1114 1 SndBuffer[0] = PICC_WRITE;
1115 1 SndBuffer[1] = Address;
1116 1 MInfo.nBytesToSend = 2;
1117 1 status = M500PcdCmd(PCD_TRANSCEIVE, SndBuffer, RcvBuffer, &MInfo);
1118 1
1119 1 if (status != MI_NOTAGERR)
1120 1 {
1121 2 if (MInfo.nBitsReceived != 4)
1122 2 {
1123 3 status = MI_BITCOUNTERR;
1124 3 }
1125 2 else
1126 2 {
1127 3 RcvBuffer[0] &= 0x0f;
1128 3 if ((RcvBuffer[0] & 0x0a) == 0)
1129 3 {
1130 4 status = MI_NOTAUTHERR;
1131 4 }
1132 3 else
1133 3 {
1134 4 if (RcvBuffer[0] == 0x0a)
1135 4 {
1136 5 status = MI_OK;
1137 5 }
1138 4 else
1139 4 {
1140 5 status = MI_CODEERR;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -