📄 m500auc.lst
字号:
949 1 MRcvBuffer,
950 1 &MInfo);
951 1
952 1 if (status) // error occured
953 1 {
954 2 *atq = 0;
955 2 }
956 1 else
957 1 {
958 2 if (MInfo.nBitsReceived != 16) // 2 bytes expected
959 2 {
960 3 *atq = 0;
961 3 status = MI_BITCOUNTERR;
962 3 }
963 2 else
964 2 {
965 3 status = MI_OK;
966 3 memcpy(atq,MRcvBuffer,2);
967 3 }
968 2 }
969 1 return status;
970 1 }
971
972 ///////////////////////////////////////////////////////////////////////
973 // M I F A R E A N T I C O L L I S I O N
974 // for standard select
975 ///////////////////////////////////////////////////////////////////////
976 char M500PiccAnticoll (unsigned char bcnt,
977 unsigned char *snr)
978 {
979 1 return M500PiccCascAnticoll(0x93,bcnt,snr); // first cascade level
980 1 }
981
982 ///////////////////////////////////////////////////////////////////////
983 // M I F A R E A N T I C O L L I S I O N
984 // for extended serial numbers
C51 COMPILER V7.07 M500AUC 06/01/2008 12:44:07 PAGE 17
985 ///////////////////////////////////////////////////////////////////////
986 char M500PiccCascAnticoll (unsigned char select_code,
987 unsigned char bcnt,
988 unsigned char *snr)
989 {
990 1 char idata status = MI_OK;
991 1 char idata snr_in[4]; // copy of the input parameter snr
992 1 char idata nbytes = 0;
993 1 char idata nbits = 0;
994 1 char idata complete = 0;
995 1 char idata i = 0;
996 1 char idata byteOffset = 0;
997 1 unsigned char idata snr_crc;
998 1 unsigned char idata snr_check;
999 1 unsigned char dummyShift1; // dummy byte for snr shift
1000 1 unsigned char dummyShift2; // dummy byte for snr shift
1001 1
1002 1 //************* Initialisation ******************************
1003 1 M500PcdSetTmo(106);
1004 1 memcpy(snr_in,snr,4);
1005 1
1006 1 WriteIO(RegDecoderControl,0x28); // ZeroAfterColl aktivieren
1007 1 ClearBitMask(RegControl,0x08); // disable crypto 1 unit
1008 1
1009 1 //************** Anticollision Loop ***************************
1010 1 complete = 0;
1011 1 // bcnt = 0; // no part of the snr is known
1012 1 while (!complete && (status == MI_OK) )
1013 1 {
1014 2 ResetInfo(MInfo);
1015 2 WriteIO(RegChannelRedundancy,0x03); // RxCRC and TxCRC disable, parity enable
1016 2 nbits = bcnt % 8; // remaining number of bits
1017 2 if (nbits)
1018 2 {
1019 3 WriteIO(RegBitFraming,nbits << 4 | nbits); // TxLastBits/RxAlign auf nb_bi
1020 3 nbytes = bcnt / 8 + 1;
1021 3 // number of bytes known
1022 3
1023 3 // in order to solve an inconsistancy in the anticollision sequence
1024 3 // (will be solved soon), the case of 7 bits has to be treated in a
1025 3 // separate way - please note the errata sheet
1026 3 if (nbits == 7)
1027 3 {
1028 4 MInfo.cmd = PICC_ANTICOLL1; // pass command flag to ISR
1029 4 WriteIO(RegBitFraming,nbits); // reset RxAlign to zero
1030 4 }
1031 3 }
1032 2 else
1033 2 {
1034 3 nbytes = bcnt / 8;
1035 3 }
1036 2
1037 2 MSndBuffer[0] = select_code;
1038 2 MSndBuffer[1] = 0x20 + ((bcnt/8) << 4) + nbits; //number of bytes send
1039 2
1040 2 for (i = 0; i < nbytes; i++) // Sende Buffer beschreiben
1041 2 {
1042 3 MSndBuffer[i + 2] = snr_in[i];
1043 3 }
1044 2 MInfo.nBytesToSend = 2 + nbytes;
1045 2
1046 2 status = M500PcdCmd(PCD_TRANSCEIVE,
C51 COMPILER V7.07 M500AUC 06/01/2008 12:44:07 PAGE 18
1047 2 MSndBuffer,
1048 2 MRcvBuffer,
1049 2 &MInfo);
1050 2
1051 2
1052 2 // in order to solve an inconsistancy in the anticollision sequence
1053 2 // (will be solved soon), the case of 7 bits has to be treated in a
1054 2 // separate way
1055 2 if (nbits == 7)
1056 2 {
1057 3 // reorder received bits
1058 3 dummyShift1 = 0x00;
1059 3 for (i = 0; i < MInfo.nBytesReceived; i++)
1060 3 {
1061 4 dummyShift2 = MRcvBuffer[i];
1062 4 MRcvBuffer[i] = (dummyShift1 >> (i+1)) | (MRcvBuffer[i] << (7-i));
1063 4 dummyShift1 = dummyShift2;
1064 4 }
1065 3 MInfo.nBitsReceived -= MInfo.nBytesReceived; // subtract received parity bits
1066 3 // recalculation of collision position
1067 3 if ( MInfo.collPos ) MInfo.collPos += 7 - (MInfo.collPos + 6) / 9;
1068 3 }
1069 2
1070 2 if ( status == MI_OK || status == MI_COLLERR) // no other occured
1071 2 {
1072 3 // R e s p o n s e P r o c e s s i n g
1073 3 if ( MInfo.nBitsReceived != (40 - bcnt) ) // not 5 bytes answered
1074 3 {
1075 4 status = MI_BITCOUNTERR; // Exit with error
1076 4 }
1077 3 else
1078 3 {
1079 4 byteOffset = 0;
1080 4 if( nbits != 0 ) // last byte was not complete
1081 4 {
1082 5 snr_in[nbytes - 1] = snr_in[nbytes - 1] | MRcvBuffer[0];
1083 5 byteOffset = 1;
1084 5 }
1085 4
1086 4 for ( i =0; i < (4 - nbytes); i++)
1087 4 {
1088 5 snr_in[nbytes + i] = MRcvBuffer[i + byteOffset];
1089 5 }
1090 4
1091 4 if (status != MI_COLLERR ) // no error and no collision
1092 4 {
1093 5 // SerCh check
1094 5 snr_crc = snr_in[0] ^ snr_in[1] ^ snr_in[2] ^ snr_in[3];
1095 5 snr_check = MRcvBuffer[MInfo.nBytesReceived - 1];
1096 5 if (snr_crc != snr_check)
1097 5 {
1098 6 status = MI_SERNRERR;
1099 6 }
1100 5 else
1101 5 {
1102 6 complete = 1;
1103 6 }
1104 5 }
1105 4 else // collision occured
1106 4 {
1107 5 bcnt = bcnt + MInfo.collPos - nbits;
1108 5 status = MI_OK;
C51 COMPILER V7.07 M500AUC 06/01/2008 12:44:07 PAGE 19
1109 5 }
1110 4 }
1111 3 }
1112 2 }
1113 1 if (status == MI_OK)
1114 1 {
1115 2 // transfer snr_in to snr
1116 2 memcpy(snr,snr_in,4);
1117 2 }
1118 1 else
1119 1 {
1120 2 memcpy(snr,"0000",4);
1121 2 }
1122 1
1123 1 //----------------------Einstellungen aus Initialisierung ruecksetzen
1124 1 ClearBitMask(RegDecoderControl,0x20); // ZeroAfterColl disable
1125 1
1126 1 return status;
1127 1 }
1128
1129 ///////////////////////////////////////////////////////////////////////
1130 // M I F A R E S E L E C T
1131 // for std. select
1132 ///////////////////////////////////////////////////////////////////////
1133 char M500PiccSelect(unsigned char *snr,
1134 unsigned char *sak)
1135 {
1136 1 return M500PiccCascSelect(0x93,snr,sak); // first cascade level
1137 1 }
1138
1139 ///////////////////////////////////////////////////////////////////////
1140 // M I F A R E C A S C A D E D S E L E C T
1141 // for extended serial number
1142 ///////////////////////////////////////////////////////////////////////
1143 char M500PiccCascSelect(unsigned char select_code,
1144 unsigned char *snr,
1145 unsigned char *sak)
1146 {
1147 1 char idata status = MI_OK;
1148 1
1149 1 M500PcdSetTmo(106);
1150 1
1151 1 WriteIO(RegChannelRedundancy,0x0F); // RxCRC,TxCRC, Parity enable
1152 1 ClearBitMask(RegControl,0x08); // disable crypto 1 unit
1153 1
1154 1 //************* Cmd Sequence **********************************
1155 1 ResetInfo(MInfo);
1156 1 MSndBuffer[0] = select_code;
1157 1 MSndBuffer[1] = 0x70; // number of bytes send
1158 1
1159 1 memcpy(MSndBuffer + 2,snr,4);
1160 1 MSndBuffer[6] = MSndBuffer[2]
1161 1 ^ MSndBuffer[3]
1162 1 ^ MSndBuffer[4]
1163 1 ^ MSndBuffer[5];
1164 1 MInfo.nBytesToSend = 7;
1165 1 status = M500PcdCmd(PCD_TRANSCEIVE,
1166 1 MSndBuffer,
1167 1 MRcvBuffer,
1168 1 &MInfo);
1169 1
1170 1 *sak = 0;
C51 COMPILER V7.07 M500AUC 06/01/2008 12:44:07 PAGE 20
1171 1 if (status == MI_OK) // no timeout occured
1172 1 {
1173 2 if (MInfo.nBitsReceived != 8) // last byte is not complete
1174 2 {
1175 3 status = MI_BITCOUNTERR;
1176 3 }
1177 2 else
1178 2 {
1179 3 *sak = MRcvBuffer[0];
1180 3 memcpy(MLastSelectedSnr,snr,4);
1181 3 }
1182 2 }
1183 1
1184 1 re
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -