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

📄 m500auc.lst

📁 奥尔斯公司pxa270试验箱射频卡读写器相关资料
💻 LST
📖 第 1 页 / 共 5 页
字号:
 562          
 563          ///////////////////////////////////////////////////////////////////////
 564          // Request Command defined in ISO14443(MIFARE)
 565          // Request,Anticoll,Select,return CardType(2 bytes)+CardSerialNo(4 bytes)
 566          // 寻卡,防冲突,选择卡    返回卡类型(2 bytes)+ 卡系列号(4 bytes)
 567          // req_code: Requset All or Request Std( PICC_REQALL,PICC_REQSTD )
 568          // atq: 16 bit answer to request( ATO)
 569          ///////////////////////////////////////////////////////////////////////
 570          char M500PiccCommonRequest(unsigned char req_code,unsigned char *atq)
 571          {
 572   1          char idata status = MI_OK;
 573   1      
 574   1          M500PcdSetTmo(3);
 575   1          WriteIO(RegChannelRedundancy,0x03);
 576   1          ClearBitMask(RegControl,0x08);
 577   1          WriteIO(RegBitFraming,0x07);
 578   1          SetBitMask(RegTxControl,0x03);
 579   1          ResetInfo(MInfo);
 580   1          SerBuffer[0] = req_code;
 581   1          MInfo.nBytesToSend = 1;
 582   1      
 583   1          status = M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo);
 584   1          if (status)
 585   1          {
 586   2              *atq = 0;
 587   2          }
 588   1          else
 589   1          {
 590   2              if (MInfo.nBitsReceived != 16)
 591   2              {
 592   3                  *atq = 0;
 593   3                  status = MI_BITCOUNTERR;
 594   3              }
 595   2              else
 596   2              {
 597   3                  status = MI_OK;
 598   3                  memcpy(atq,SerBuffer,2);
 599   3              }
 600   2          }
 601   1          return status;
 602   1      }
 603          
 604          ///////////////////////////////////////////////////////////////////
 605          // Cascaded Anti-Collision Command defined in ISO14443(MIFARE)
 606          // 防冲突 读卡的系列号 MLastSelectedSnr
 607          // bcnt: SNR-bits number( 0~32)
 608          // snr: 4 Bytes serial number
 609          ///////////////////////////////////////////////////////////////////
 610          char M500PiccCascAnticoll (unsigned char bcnt,unsigned char *snr)
 611          {
 612   1          char idata status = MI_OK;
 613   1          char idata snr_in[4];
C51 COMPILER V6.02  M500AUC                                                                02/09/2006 13:25:02 PAGE 11  

 614   1          char idata nbytes = 0;
 615   1          char idata nbits = 0;
 616   1          char idata complete = 0;
 617   1          char idata i        = 0;
 618   1          char idata byteOffset = 0;
 619   1          unsigned char dummyShift1;
 620   1          unsigned char dummyShift2;
 621   1      
 622   1          M500PcdSetTmo(106);
 623   1          memcpy(snr_in,snr,4);
 624   1      
 625   1          WriteIO(RegDecoderControl,0x28);
 626   1          ClearBitMask(RegControl,0x08);
 627   1          complete = 0;
 628   1          while (!complete && (status == MI_OK) )
 629   1          {
 630   2              ResetInfo(MInfo);
 631   2              WriteIO(RegChannelRedundancy,0x03);
 632   2              nbits = bcnt % 8;
 633   2              if(nbits)
 634   2              {
 635   3                  WriteIO(RegBitFraming,nbits << 4 | nbits);
 636   3                  nbytes = bcnt / 8 + 1;
 637   3                  if (nbits == 7)
 638   3                  {
 639   4                      MInfo.cmd = PICC_ANTICOLL1;
 640   4                      WriteIO(RegBitFraming,nbits);
 641   4                  }
 642   3              }
 643   2              else
 644   2              {
 645   3                  nbytes = bcnt / 8;
 646   3              }
 647   2              SerBuffer[0] = 0x93;
 648   2              SerBuffer[1] = 0x20 + ((bcnt/8) << 4) + nbits;
 649   2      
 650   2              for (i = 0; i < nbytes; i++)
 651   2              {
 652   3                  SerBuffer[i + 2] = snr_in[i];
 653   3              }
 654   2              MInfo.nBytesToSend   = 2 + nbytes;
 655   2      
 656   2              status = M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo);
 657   2              if (nbits == 7)
 658   2              {
 659   3                  dummyShift1 = 0x00;
 660   3                  for (i = 0; i < MInfo.nBytesReceived; i++)
 661   3                  {
 662   4                      dummyShift2 = SerBuffer[i];
 663   4                      SerBuffer[i] = (dummyShift1 >> (i+1)) | (SerBuffer[i] << (7-i));
 664   4                      dummyShift1 = dummyShift2;
 665   4                  }
 666   3                  MInfo.nBitsReceived -= MInfo.nBytesReceived;
 667   3                  if ( MInfo.collPos ) MInfo.collPos += 7 - (MInfo.collPos + 6) / 9;
 668   3              }
 669   2              if ( status == MI_OK || status == MI_COLLERR)
 670   2              {
 671   3                  if ( MInfo.nBitsReceived != (40 - bcnt) )
 672   3                  {
 673   4                      status = MI_BITCOUNTERR;
 674   4                  }
 675   3                  else
C51 COMPILER V6.02  M500AUC                                                                02/09/2006 13:25:02 PAGE 12  

 676   3                  {
 677   4                      byteOffset = 0;
 678   4                      if( nbits != 0 )
 679   4                      {
 680   5                          snr_in[nbytes - 1] = snr_in[nbytes - 1] | SerBuffer[0];
 681   5                          byteOffset = 1;
 682   5                      }
 683   4      
 684   4                      for ( i =0; i < (4 - nbytes); i++)
 685   4                      {
 686   5                          snr_in[nbytes + i] = SerBuffer[i + byteOffset];
 687   5                      }
 688   4      
 689   4                      if (status != MI_COLLERR )
 690   4                      {
 691   5                          dummyShift2 = snr_in[0] ^ snr_in[1] ^ snr_in[2] ^ snr_in[3];
 692   5                          dummyShift1 = SerBuffer[MInfo.nBytesReceived - 1];
 693   5                          if (dummyShift2 != dummyShift1)
 694   5                          {
 695   6                              status = MI_SERNRERR;
 696   6                          }
 697   5                          else
 698   5                          {
 699   6                              complete = 1;
 700   6                          }
 701   5                      }
 702   4                      else
 703   4                      {
 704   5                          bcnt = bcnt + MInfo.collPos - nbits;
 705   5                          status = MI_OK;
 706   5                      }
 707   4                  }
 708   3              }
 709   2          }
 710   1          if (status == MI_OK)
 711   1          {
 712   2              memcpy(snr,snr_in,4);
 713   2          }
 714   1          else
 715   1          {
 716   2              memcpy(snr,"0000",4);
 717   2          }
 718   1          ClearBitMask(RegDecoderControl,0x20);
 719   1      
 720   1          return status;
 721   1      }
 722          
 723          //////////////////////////////////////////////////////////////////
 724          // Cascaded Select command defined in ISO14443(MIFARE)
 725          // 选择卡 Select Card
 726          // snr: PICC's 4 Bytes serial number
 727          // sak: 1 Byte select acknowledge
 728          //////////////////////////////////////////////////////////////////
 729          char M500PiccCascSelect(unsigned char *snr,unsigned char *sak)
 730          {
 731   1          char idata status = MI_OK;
 732   1      
 733   1          M500PcdSetTmo(106);
 734   1      
 735   1          WriteIO(RegChannelRedundancy,0x0F);
 736   1          ClearBitMask(RegControl,0x08);
 737   1          ResetInfo(MInfo);
C51 COMPILER V6.02  M500AUC                                                                02/09/2006 13:25:02 PAGE 13  

 738   1          SerBuffer[0] = 0x93;
 739   1          SerBuffer[1] = 0x70;
 740   1      
 741   1          memcpy(SerBuffer + 2,snr,4);
 742   1          SerBuffer[6] = SerBuffer[2] ^ SerBuffer[3] ^ SerBuffer[4] ^ SerBuffer[5];
 743   1          MInfo.nBytesToSend   = 7;
 744   1          status = M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo);
 745   1      
 746   1          *sak = 0;
 747   1          if (status == MI_OK)
 748   1          {
 749   2              if (MInfo.nBitsReceived != 8)
 750   2              {
 751   3                  status = MI_BITCOUNTERR;
 752   3              }
 753   2              else
 754   2              {
 755   3      	        *sak = SerBuffer[0];
 756   3              }
 757   2          }
 758   1          return status;
 759   1      }
 760          
 761          ///////////////////////////////////////////////////////////////////////
 762          // Key loading into the MF RC500's EEPROM
 763          // 校验卡密码(E2)
 764          // auth_mode:选择keyA 还是keyB
 765          // snr: 4 Bytes,代表卡的序列号(Serial Number)
 766          // key: 12 Bytes,认证的密码
 767          // block: 所需要认证的块的地址
 768          ///////////////////////////////////////////////////////////////////////
 769          /*
 770          char M500PiccAuthE2( unsigned char auth_mode,unsigned char *snr,
 771                               unsigned char keynr,unsigned char block)
 772          
 773          {
 774              char idata status = MI_OK;
 775              unsigned int e2addr = 0x80 + keynr * 0x18;
 776              //unsigned char *e2addrbuf = (unsigned char*)&e2addr;
 777              unsigned char *e2addrbuf;
 778          
 779              e2addrbuf = (unsigned char *)&e2addr;
 780              if (auth_mode == PICC_AUTHENT1B)
 781              {
 782                  e2addr += 12;
 783              }
 784              FlushFIFO();
 785              ResetInfo(MInfo);
 786          
 787              memcpy(SerBuffer,e2addrbuf,2);
 788              SerBuffer[2] = SerBuffer[0];
 789              SerBuffer[0] = SerBuffer[1];
 790              SerBuffer[1] = SerBuffer[2];
 791              MInfo.nBytesToSend   = 2;
 792              if ((status=M500PcdCmd(PCD_LOADKEYE2,SerBuffer,&MInfo)) == MI_OK)
 793              {
 794                  status = M500PiccAuthState(auth_mode,snr,block);  //11.9
 795              }
 796              return status;
 797          }
 798          */
 799          ///////////////////////////////////////////////////////////////////////
C51 COMPILER V6.02  M500AUC                                                                02/09/2006 13:25:02 PAGE 14  

 800          // Authentication key coding
 801          // uncoded: 6 Bytes uncoded authentication key
 802          // coded: 12 Bytes coded authentication key
 803          ///////////////////////////////////////////////////////////////////////
 804          /*
 805          char M500HostCodeKey(  unsigned char *uncoded, unsigned char *coded)
 806          {
 807              char idata status = MI_OK;
 808              unsigned char idata cnt = 0;
 809              unsigned char idata ln  = 0;
 810              unsigned char idata hn  = 0;
 811              for (cnt = 0; cnt < 6; cnt++)
 812              {
 813                  ln = uncoded[cnt] & 0x0F;
 814                  hn = uncoded[cnt] >> 4;
 815                  coded[cnt * 2 + 1] = (~ln << 4) | ln;
 816                  coded[cnt * 2 ] = (~hn << 4) | hn;
 817              }
 818              return MI_OK;
 819          }
 820          */
 821          ///////////////////////////////////////////////////////////////////
 822          // Authentication with direct key loading from the uC
 823          // 直接校验密码
 824          // auth_mode:选择keyA 还是keyB
 825          // snr: 4 Bytes,代表卡的序列号(Serial Number)
 826          // key: 12 Bytes,认证的密码
 827          // block: 所需要认证的块的地址
 828          //////////////////////////////////////////////////////////////////
 829          /*
 830          char M500PiccAuthKey(  unsigned char auth_mode,
 831                                 unsigned char *snr,
 832                                 unsigned char *keys,
 833                                 unsigned char block)
 834          {
 835              char idata status = MI_OK;
 836              //PcdSetTmo(2);
 837              FlushFIFO();
 838              ResetInfo(MInfo);
 839              memcpy(SerBuffer,keys,12);
 840              MInfo.nBytesToSend = 12;
 841              if ((status=M500PcdCmd(PCD_LOADKEY,SerBuffer,&MInfo)) == MI_OK)
 842              {
 843                  status = M500PiccAuthState(auth_mode,snr,block);
 844              }
 845              return status;
 846          }
 847          

⌨️ 快捷键说明

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