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