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

📄 m500auc.lst

📁 射频卡读卡头的程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
 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 + -