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