⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 m500auc.lst

📁 学校水POS读卡程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
 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 V6.23a  M500AUC                                                               08/03/2004 08:47:24 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 V6.23a  M500AUC                                                               08/03/2004 08:47:24 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            Pt = &MInfo ;
1106   2            status = M500PcdCmd(PCD_TRANSCEIVE,
1107   2                               MSndBuffer,
1108   2                               MRcvBuffer,
C51 COMPILER V6.23a  M500AUC                                                               08/03/2004 08:47:24 PAGE 19  

1109   2                               &MInfo);
1110   2      
1111   2      
1112   2            // in order to solve an inconsistancy in the anticollision sequence
1113   2            // (will be solved soon), the case of 7 bits has to be treated in a
1114   2            // separate way
1115   2            if (nbits == 7)
1116   2            {
1117   3               // reorder received bits
1118   3               dummyShift1 = 0x00;
1119   3               for (i = 0; i < MInfo.nBytesReceived; i++)
1120   3               {
1121   4                  dummyShift2 = MRcvBuffer[i];
1122   4                  MRcvBuffer[i] = (dummyShift1 >> (i+1)) | (MRcvBuffer[i] << (7-i));
1123   4                  dummyShift1 = dummyShift2;
1124   4               }
1125   3               MInfo.nBitsReceived -= MInfo.nBytesReceived; // subtract received parity bits
1126   3               // recalculation of collision position
1127   3               if ( MInfo.collPos ) MInfo.collPos += 7 - (MInfo.collPos + 6) / 9;
1128   3            }
1129   2      
1130   2            if ( status == MI_OK || status == MI_COLLERR)    // no other occured
1131   2            {
1132   3               // R e s p o n s e   P r o c e s s i n g
1133   3               if ( MInfo.nBitsReceived != (40 - bcnt) ) // not 5 bytes answered
1134   3               {
1135   4                  status = MI_BITCOUNTERR; // Exit with error
1136   4               }
1137   3               else
1138   3               {
1139   4                  byteOffset = 0;
1140   4                  if( nbits != 0 ) // last byte was not complete
1141   4                  {
1142   5                      snr_in[nbytes - 1] = snr_in[nbytes - 1] | MRcvBuffer[0];
1143   5                      byteOffset = 1;
1144   5                  }
1145   4      
1146   4                  for ( i =0; i < (4 - nbytes); i++)
1147   4                  {
1148   5                     snr_in[nbytes + i] = MRcvBuffer[i + byteOffset];
1149   5                  }
1150   4      
1151   4                  if (status != MI_COLLERR ) // no error and no collision
1152   4                  {
1153   5                     // SerCh check
1154   5                     snr_crc = snr_in[0] ^ snr_in[1] ^ snr_in[2] ^ snr_in[3];
1155   5                     snr_check = MRcvBuffer[MInfo.nBytesReceived - 1];
1156   5                     if (snr_crc != snr_check)
1157   5                     {
1158   6                        status = MI_SERNRERR;
1159   6                     }
1160   5                     else
1161   5                     {
1162   6                        complete = 1;
1163   6                     }
1164   5                  }
1165   4                  else                   // collision occured
1166   4                  {
1167   5                     bcnt = bcnt + MInfo.collPos - nbits;
1168   5                     status = MI_OK;
1169   5                  }
1170   4               }
C51 COMPILER V6.23a  M500AUC                                                               08/03/2004 08:47:24 PAGE 20  

1171   3            }
1172   2         }
1173   1         if (status == MI_OK)
1174   1         {
1175   2            // transfer snr_in to snr
1176   2            memcpy(snr,snr_in,4);
1177   2         }
1178   1         else
1179   1         {
1180   2            memcpy(snr,"0000",4);
1181   2         }
1182   1      
1183   1         //----------------------Einstellungen aus Initialisierung ruecksetzen
1184   1         ClearBitMask(RegDecoderControl,0x20); // ZeroAfterColl disable
1185   1      
1186   1         return status;
1187   1      }
1188          
1189          ////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -