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