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

📄 mf_rc500.lst

📁 RC500 Mifare Chip for 8051 code
💻 LST
📖 第 1 页 / 共 4 页
字号:
 331                                     unsigned char *snr)       
 332          {
 333   1         char idata status = MI_OK;
 334   1         char idata snr_in[4];    
 335   1         char idata nbytes = 0;
 336   1         char idata nbits = 0;
 337   1         char idata complete = 0;
 338   1         char idata i        = 0;
 339   1         char idata byteOffset = 0;
 340   1         unsigned char dummyShift1;       
 341   1         unsigned char dummyShift2;      
 342   1         RC_SetTmod(tmod_1ms);
 343   1         memcpy(snr_in,snr,4);   
 344   1         
 345   1         RC_WriteRC(RegDecoderControl,0x28); 
 346   1         RC_ClearBit(RegControl,0x08);   
 347   1         complete = 0;
 348   1         while (!complete && (status == MI_OK) )
 349   1         {
 350   2            ResetInfo(MInfo);           
 351   2            RC_WriteRC(RegChannelRedundancy,0x03);
 352   2            nbits = bcnt % 8;  
 353   2            if (nbits)
 354   2            {
 355   3               RC_WriteRC(RegBitFraming,nbits << 4 | nbits); 
 356   3               nbytes = bcnt / 8 + 1;   
 357   3               if (nbits == 7)
 358   3               {
 359   4                  MInfo.cmd = PICC_ANTICOLL1;  
 360   4                  RC_WriteRC(RegBitFraming,nbits); 
 361   4               }
 362   3            } 
 363   2            else
 364   2            {
 365   3               nbytes = bcnt / 8;
C51 COMPILER V7.08   MF_RC500                                                              01/18/2004 17:34:11 PAGE 7   

 366   3            }
 367   2      
 368   2            SerBuffer[0] = 0x93;
 369   2            SerBuffer[1] = 0x20 + ((bcnt/8) << 4) + nbits;
 370   2                     
 371   2            for (i = 0; i < nbytes; i++)  
 372   2            {
 373   3               SerBuffer[i + 2] = snr_in[i];
 374   3            }
 375   2            MInfo.nBytesToSend   = 2 + nbytes;   
 376   2       
 377   2            status = RC_Command(PCD_TRANSCEIVE,
 378   2                               SerBuffer,
 379   2                               &MInfo);
 380   2            if (nbits == 7)
 381   2            {
 382   3               dummyShift1 = 0x00;
 383   3               for (i = 0; i < MInfo.nBytesReceived; i++)
 384   3               {
 385   4                  dummyShift2 = SerBuffer[i];
 386   4                  SerBuffer[i] = (dummyShift1 >> (i+1)) | (SerBuffer[i] << (7-i));
 387   4                  dummyShift1 = dummyShift2;
 388   4               }
 389   3               MInfo.nBitsReceived -= MInfo.nBytesReceived;       
 390   3               if ( MInfo.collPos ) MInfo.collPos += 7 - (MInfo.collPos + 6) / 9;
 391   3            }
 392   2               
 393   2            if ( status == MI_OK || status == MI_COLLERR)    
 394   2            {
 395   3               if ( MInfo.nBitsReceived != (40 - bcnt) )
 396   3               {
 397   4                  status = MI_BITCOUNTERR; 
 398   4               } 
 399   3               else 
 400   3               {
 401   4                  byteOffset = 0;
 402   4                  if( nbits != 0 ) 
 403   4                  {
 404   5                      snr_in[nbytes - 1] = snr_in[nbytes - 1] | SerBuffer[0];
 405   5                      byteOffset = 1;
 406   5                  }
 407   4      
 408   4                  for ( i =0; i < (4 - nbytes); i++)     
 409   4                  {
 410   5                     snr_in[nbytes + i] = SerBuffer[i + byteOffset];
 411   5                  }
 412   4        
 413   4                  if (status != MI_COLLERR ) 
 414   4                  {
 415   5                     dummyShift2 = snr_in[0] ^ snr_in[1] ^ snr_in[2] ^ snr_in[3];
 416   5                     dummyShift1 = SerBuffer[MInfo.nBytesReceived - 1];
 417   5                     if (dummyShift2 != dummyShift1)
 418   5                     {
 419   6                        status = MI_SERNRERR;
 420   6                     } 
 421   5                     else   
 422   5                     {
 423   6                        complete = 1;
 424   6                     }
 425   5                  }
 426   4                  else                 
 427   4                  {
C51 COMPILER V7.08   MF_RC500                                                              01/18/2004 17:34:11 PAGE 8   

 428   5                     bcnt = bcnt + MInfo.collPos - nbits;
 429   5                     status = MI_OK;
 430   5                  }
 431   4               }
 432   3            }
 433   2         }
 434   1         if (status == MI_OK)
 435   1         {
 436   2            memcpy(snr,snr_in,4);
 437   2         }
 438   1         else
 439   1         {
 440   2            memcpy(snr,"0000",4);
 441   2         }
 442   1         RC_ClearBit(RegDecoderControl,0x20); 
 443   1         
 444   1         return status;  
 445   1      }
 446          
 447          char MF_Select(unsigned char *snr,
 448                                  unsigned char *sak)
 449          {
 450   1         char idata status = MI_OK; 
 451   1       
 452   1         RC_SetTmod(tmod_1ms);
 453   1              
 454   1         RC_WriteRC(RegChannelRedundancy,0x0F); 
 455   1         RC_ClearBit(RegControl,0x08);    
 456   1         ResetInfo(MInfo);   
 457   1         SerBuffer[0] = 0x93;
 458   1         SerBuffer[1] = 0x70;        
 459   1         
 460   1         memcpy(SerBuffer + 2,snr,4);
 461   1         SerBuffer[6] = SerBuffer[2] ^ SerBuffer[3] ^ SerBuffer[4] ^ SerBuffer[5];
 462   1         MInfo.nBytesToSend   = 7;
 463   1         status = RC_Command(PCD_TRANSCEIVE,
 464   1                             SerBuffer,
 465   1                             &MInfo);
 466   1      
 467   1         *sak = 0;   
 468   1         if (status == MI_OK)  
 469   1         {
 470   2            if (MInfo.nBitsReceived != 8)   
 471   2            {
 472   3               status = MI_BITCOUNTERR;
 473   3            }
 474   2            else
 475   2            {
 476   3               *sak = SerBuffer[0];
 477   3            } 
 478   2         }
 479   1        
 480   1         return status;
 481   1      }
 482          #if(0)
              
              char MF_LoadKeyE2(unsigned char key_type,
                                     unsigned char sector,
                                     unsigned char *uncoded_keys)
              {
                 signed char status = MI_OK;
                 unsigned int e2addr = 0x80 + sector * 0x18;
C51 COMPILER V7.08   MF_RC500                                                              01/18/2004 17:34:11 PAGE 9   

                 unsigned char coded_keys[12];
              
                 if (key_type == PICC_AUTHENT1B)
                    e2addr += 12; // key B offset
                 if ((status = MF_ChgAvailableKey(uncoded_keys,coded_keys)) == MI_OK)
                    status = RC_WriteE2(  e2addr,12,coded_keys);
                 return status;
              }
              
              char RC_WriteE2(unsigned int startaddr,
                              unsigned char length,
                              unsigned char* _data)
              {
                 char status = MI_OK;
                 ResetInfo(MInfo);   
                 SerBuffer[0] = startaddr & 0xFF;
                 SerBuffer[1] = (startaddr >> 8) & 0xFF;
                 memcpy(SerBuffer + 2,_data,length);
              
                 MInfo.nBytesToSend   = length + 2;
                       
                 status = RC_Command(PCD_WRITEE2,
                                     SerBuffer,
                                     &MInfo); 
                 return status;
              }   
              
              char MF_AuthE2( unsigned char auth_mode, 
                                   unsigned char *snr,      
                                   unsigned char keynr,
                                   unsigned char block)     
                                                            
              {
                 char idata status = MI_OK;
                 unsigned int e2addr = 0x80 + keynr * 0x18;
                 unsigned char *e2addrbuf = (unsigned char*)&e2addr;
                 
              
                 if (auth_mode == PICC_AUTHENT1B)
                    e2addr += 12; 
                 RC_FlushFIFO();    
                 ResetInfo(MInfo);
              
                 memcpy(SerBuffer,e2addrbuf,2); 
                 SerBuffer[2] = SerBuffer[0];      
                 SerBuffer[0] = SerBuffer[1]; 
                 SerBuffer[1] = SerBuffer[2];
                 MInfo.nBytesToSend   = 2;
                 if ((status=RC_Command(PCD_LOADKEYE2,SerBuffer,&MInfo)) == MI_OK)
                 {  
                    status = MF_AuthState(auth_mode,snr,block);  //11.9
                 }
                 return status;
              }                        
              char load_key(void)
              {
                        uchar code Nkey_a1[6]={0xc5,0xc4,0xc3,0xc2,0xc1,0xc0};
                        uchar code Nkey_b1[6]={0xd5,0xd4,0xd3,0xd2,0xd1,0xd0};
                        uchar code Nkey_a2[6]={0xff,0xff,0xff,0xff,0xff,0xff};
                        uchar code Nkey_b2[6]={0xff,0xff,0xff,0xff,0xff,0xff};
                        uchar code Nkey_a[6]={0xff,0xff,0xff,0xff,0xff,0xff};
                        uchar code Nkey_b[6]={0xff,0xff,0xff,0xff,0xff,0xff};
C51 COMPILER V7.08   MF_RC500                                                              01/18/2004 17:34:11 PAGE 10  

                        uchar i,key_mode;//s;            
                            
                              if (MF_LoadKeyE2(KEYA,0,Nkey_a1))
                              return LOAD_KEYA_ERR;
                        
                             if(MF_LoadKeyE2(KEYB,0,Nkey_b1))
                             return LOAD_KEYB_ERR;
              
                              if (MF_LoadKeyE2(KEYA,1,Nkey_a))
                              return LOAD_KEYA_ERR;
                
                             if(MF_LoadKeyE2(KEYB,1,Nkey_b))
                             return LOAD_KEYB_ERR;
                             
                       
                              key_mode=KEYA;//0x00   /*prepare key A (SET 0)loading*/
                              for (i=2;i<16;i++)
                                      {
                                      watch_dog();
                                     if(MF_LoadKeyE2(key_mode,i,Nkey_a2))
                                     return LOAD_KEYA_ERR;
                                      }
                              key_mode=KEYB;//0x04   /*prepare key B (SET 0)loading*/
                              for (i=2;i<16;i++)
                                      {
                                        watch_dog( );
                                        if(MF_LoadKeyE2(key_mode,i,Nkey_b2))
                                        return LOAD_KEYB_ERR;
                                      //load key ok
                                       }  
                              return 0;                     
              }
              
              char MF_Value(unsigned char dd_mode, 
                                  unsigned char addr, 
                                  unsigned char *value,
                                  unsigned char trans_addr)
              {
                 char status = MI_OK;
              
                 RC_SetTmod(tmod_1ms); 
                 ResetInfo(MInfo);   
                 SerBuffer[0] = dd_mode;      
                 SerBuffer[1] = addr;
                 MInfo.nBytesToSend   = 2;
                 status = RC_Command(PCD_TRANSCEIVE,
                                     SerBuffer,
                                     &MInfo);
              
                 if (status != MI_NOTAGERR)   
                 {
                      if (MInfo.nBitsReceived != 4)  
                      {
                         status = MI_BITCOUNTERR;
                      }
                      else                    
                      {
                         SerBuffer[0] &= 0x0f; 
                         switch(SerBuffer[0])
                         {
                            case 0x00: 
                               status = MI_NOTAUTHERR;
C51 COMPILER V7.08   MF_RC500                                                              01/18/2004 17:34:11 PAGE 11  

                               break;
                            case 0x0a:
                               status = MI_OK;
                               break;
                            case 0x01:
                               status = MI_VALERR;
                               break;
                            default:
                               status = MI_CODEERR;
                               break;
                         }
                      }
                   }
              
                   if ( status == MI_OK)
                   {
                      RC_SetTmod(tmod_6ms);    
                      ResetInfo(MInfo);   
                      memcpy(SerBuffer,value,4);
                      MInfo.nBytesToSend   = 4;
                      status = RC_Command(PCD_TRANSCEIVE,
                                          SerBuffer,
                                          &MInfo);
                      
                      if (status == MI_OK)    
                      {
                          if (MInfo.nBitsReceived != 4)   
                          {
                             status = MI_BITCOUNTERR;
                          }
                          else                    
                          {
                             SerBuffer[0] &= 0x0f; 
                             switch(SerBuffer[0])
                             {
                                case 0x00: 
                                   status = MI_NOTAUTHERR;
                                   break;
                                case 0x01:
                                   status = MI_VALERR;
                                   break;
                                default:
                                   status = MI_CODEERR;
                                   break;
                             }
                          }
                       }        
                       else
                       if (status == MI_NOTAGERR )
                          status = MI_OK;  
                   }
                   if ( status == MI_OK)
                   {
                      ResetInfo(MInfo);   
                      SerBuffer[0] = PICC_TRANSFER;      
                      SerBuffer[1] = trans_addr;

⌨️ 快捷键说明

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