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