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

📄 mfrc500c.lst

📁 矿工定位系统单端
💻 LST
📖 第 1 页 / 共 2 页
字号:
 217          ****************************************************************************/
 218          char Mf500PiccAnticoll (unsigned char bcnt,
 219                               unsigned char *snr)
 220          {
 221   1         return Mf500PiccCascAnticoll(0x93,bcnt,snr); // first cascade level
 222   1      }
 223          
 224          char Mf500PiccCascAnticoll (unsigned char select_code,
 225                                   unsigned char bcnt,       
 226                                   unsigned char *snr)       
 227          {
 228   1         char  status = MI_OK;
 229   1         char  snr_in[4];         // copy of the input parameter snr
 230   1         char  nbytes = 0;        // how many bytes received
 231   1         char  nbits = 0;         // how many bits received
 232   1         char  complete = 0;      // complete snr recived
 233   1         char  i        = 0;
 234   1         char  byteOffset = 0;
 235   1         unsigned char snr_crc;   // check byte calculation
 236   1         unsigned char snr_check;
 237   1         unsigned char dummyShift1;       // dummy byte for snr shift
 238   1         unsigned char dummyShift2;       // dummy byte for snr shift   
 239   1       
C51 COMPILER V7.05   MFRC500C                                                              10/09/2004 16:22:30 PAGE 5   

 240   1        
 241   1         
 242   1            PcdSetTmo(2);
 243   1            
 244   1            memcpy(snr_in,snr,4);   
 245   1            
 246   1            WriteRC(RegDecoderControl,0x28); // ZeroAfterColl aktivieren   
 247   1            ClearBitMask(RegControl,0x08);    // disable crypto 1 unit
 248   1               
 249   1            complete=0;
 250   1            while (!complete && (status == MI_OK) )
 251   1            {
 252   2               ResetInfo();
 253   2               WriteRC(RegChannelRedundancy,0x03); // RxCRC and TxCRC disable, parity enable
 254   2               nbits = bcnt % 8;
 255   2               if (nbits)
 256   2               {
 257   3                  WriteRC(RegBitFraming,nbits << 4 | nbits); // TxLastBits/RxAlign auf nb_bi
 258   3                  nbytes = bcnt / 8 + 1;   
 259   3                  if (nbits == 7 )
 260   3                  {
 261   4                     MInfo.cmd = PICC_ANTICOLL1;   // pass command flag to ISR        
 262   4                     WriteRC(RegBitFraming,nbits); // reset RxAlign to zero
 263   4                  }
 264   3               } 
 265   2               else
 266   2               {
 267   3                  nbytes = bcnt / 8;
 268   3               }
 269   2               
 270   2               MSndBuffer[0] = select_code;
 271   2               MSndBuffer[1] = 0x20 + ((bcnt/8) << 4) + nbits; //number of bytes send
 272   2                        
 273   2               for (i = 0; i < nbytes; i++)  // Sende Buffer beschreiben
 274   2               {
 275   3                  MSndBuffer[i + 2] = snr_in[i];
 276   3               }
 277   2               MInfo.nBytesToSend   = 2 + nbytes;    
 278   2               status = PcdSingleResponseCmd(PCD_TRANSCEIVE);
 279   2      
 280   2                // in order to solve an inconsistancy in the anticollision sequence
 281   2                // (will be solved soon), the case of 7 bits has to be treated in a
 282   2                // separate way 
 283   2               if (nbits == 7)
 284   2               {
 285   3                  // reorder received bits
 286   3                  dummyShift1 = 0x00;
 287   3                  for (i = 0; i < MInfo.nBytesReceived; i++)
 288   3                  {
 289   4                      dummyShift2 = MRcvBuffer[i];
 290   4                      MRcvBuffer[i] = (dummyShift1 >> (i+1)) | (MRcvBuffer[i] << (7-i));
 291   4                      dummyShift1 = dummyShift2;
 292   4                  }
 293   3                  MInfo.nBitsReceived -= MInfo.nBytesReceived; // subtract received parity bits
 294   3                  // recalculation of collision position
 295   3                  if ( MInfo.collPos ) MInfo.collPos += 7 - (MInfo.collPos + 6) / 9;
 296   3               }
 297   2               if ( status == MI_OK || status == MI_COLLERR)    // no other occured
 298   2               {
 299   3                  // R e s p o n s e   P r o c e s s i n g   
 300   3                  if ( MInfo.nBitsReceived != 40) // not 5 bytes answered
 301   3                  {
C51 COMPILER V7.05   MFRC500C                                                              10/09/2004 16:22:30 PAGE 6   

 302   4                     status = MI_BITCOUNTERR;
 303   4                  } 
 304   3                  else 
 305   3                  {
 306   4                     byteOffset = 0;
 307   4                     if ( nbits != 0 )           // last byte was not complete
 308   4                     {
 309   5                        snr_in[nbytes - 1] = snr_in[nbytes - 1] | MRcvBuffer[0];
 310   5                        byteOffset = 1;
 311   5                     }
 312   4                     for ( i =0; i < (4 - nbytes); i++)     
 313   4                     {
 314   5                        snr_in[nbytes + i] = MRcvBuffer[i + byteOffset];
 315   5                     }
 316   4           
 317   4                     if (status != MI_COLLERR ) // no error and no collision
 318   4                     {
 319   5                        // SerCh check
 320   5                        snr_crc = snr_in[0] ^ snr_in[1] ^ snr_in[2] ^ snr_in[3];
 321   5                        
 322   5                        snr_check = MRcvBuffer[4];
 323   5                        if (snr_crc != snr_check)
 324   5                        {
 325   6                           status = MI_SERNRERR;
 326   6                        } 
 327   5                        else   
 328   5                        {
 329   6                           complete = 1;
 330   6                        }
 331   5                     }
 332   4                     else                   // collision occured
 333   4                     {
 334   5                        bcnt = bcnt + MInfo.collPos - nbits;
 335   5                        status = MI_OK;
 336   5                     }
 337   4                  }
 338   3              
 339   3            }
 340   2         }
 341   1         if (status == MI_OK)
 342   1         {
 343   2            for(i=0;i<4;i++)    
 344   2            {
 345   3      //               csn[i]=MRcvBuffer[i];
 346   3               snr[i]=MRcvBuffer[i];
 347   3            }
 348   2               
 349   2         }
 350   1         else
 351   1         {
 352   2            _nop_();
 353   2         }
 354   1      
 355   1         ClearBitMask(RegDecoderControl,0x20); // ZeroAfterColl disable
 356   1         
 357   1         return status;  
 358   1      }
 359          
 360          
 361          
 362          /*
 363          ///////////////////////////////////////////////////////////////////////
C51 COMPILER V7.05   MFRC500C                                                              10/09/2004 16:22:30 PAGE 7   

 364          //          M I F A R E      A U T H E N T I C A T I O N
 365          //   calling compatible version    
 366          ///////////////////////////////////////////////////////////////////////
 367          char Mf500PiccAuth(unsigned char key_type,    // PICC_AUTHENT1A or PICC_AUTHENT1B
 368                             unsigned char key_addr,    // key address in reader storage
 369                             unsigned char block)       // block number which should be 
 370                                                        // authenticated
 371          {
 372             char            status = MI_OK;
 373          
 374             status = Mf500PiccAuthE2(  key_type,
 375                                        MLastSelectedSnr,
 376                                        key_addr,
 377                                        block);
 378             return status;
 379          }
 380          
 381          ///////////////////////////////////////////////////////////////////////
 382          //                  A U T H E N T I C A T I O N   
 383          //             W I T H   K E Y S   F R O M   E 2 P R O M
 384          ///////////////////////////////////////////////////////////////////////
 385          char Mf500PiccAuthE2(   unsigned char auth_mode,   // PICC_AUTHENT1A or PICC_AUTHENT1B
 386                               unsigned char *snr,        // 4 bytes card serial number
 387                               unsigned char key_sector,  // 0 <= key_sector <= 15                     
 388                               unsigned char block)      //  0 <= block <= 256
 389          {
 390             char status = MI_OK;
 391             char i;
 392             // eeprom address calculation
 393             // 0x80 ... offset
 394             // key_sector ... sector
 395             // 0x18 ... 2 * 12 = 24 = 0x18
 396             unsigned short e2addr = 0x80 + key_sector * 0x18;
 397             unsigned char *e2addrbuf = (unsigned char*)&e2addr;
 398             
 399             PcdSetTmo(2);
 400             if (auth_mode == PICC_AUTHENT1B)
 401                e2addr += 12; // key B offset   
 402             FlushFIFO();    // empty FIFO
 403             ResetInfo();
 404          
 405             //memcpy(MSndBuffer,e2addrbuf,2); // write low and high byte of address
 406             for(i=0;i<2;i++)   MSndBuffer[i]=e2addrbuf[i];
 407             MInfo.nBytesToSend   = 2;
 408              // write load command
 409             if ((status=PcdSingleResponseCmd(PCD_LOADKEYE2)) == MI_OK)
 410             {      
 411                // execute authentication
 412                status = Mf500PiccAuthState(auth_mode,snr,block);  
 413             }
 414             return status;
 415          }                        
 416          */
 417          ///////////////////////////////////////////////////////////////////////
 418          //                      C O D E   K E Y S  将密钥转换成RC500格式
 419          ///////////////////////////////////////////////////////////////////////
 420          char Mf500HostCodeKey(  unsigned char *uncoded, // 6 bytes key value uncoded
 421                               unsigned char *coded)   // 12 bytes key value coded
 422          {
 423   1         char status = MI_OK;
 424   1         unsigned char cnt = 0;
 425   1         unsigned char ln  = 0;     // low nibble
C51 COMPILER V7.05   MFRC500C                                                              10/09/2004 16:22:30 PAGE 8   

 426   1         unsigned char hn  = 0;     // high nibble
 427   1         
 428   1         for (cnt = 0; cnt < 6; cnt++)
 429   1         {
 430   2            ln = uncoded[cnt] & 0x0F;
 431   2            hn = uncoded[cnt] >> 4;
 432   2            coded[cnt * 2 + 1]     =  (~ln << 4) | ln;
 433   2            coded[cnt * 2 ] =  (~hn << 4) | hn;
 434   2      
 435   2         }
 436   1         return MI_OK;
 437   1      }
 438          
 439          ///////////////////////////////////////////////////////////////////////
 440          //认证操作函数
 441          //MCU将运算获得的数据,急复娲⒌娇ㄆ

⌨️ 快捷键说明

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