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

📄 iso14443a.lst

📁 读ISO14443 CPU卡源代码
💻 LST
📖 第 1 页 / 共 3 页
字号:
 548   2              MfComData.MfData[2] = 0;
 549   2              MfComData.MfData[3] = 0;
 550   2              
 551   2              status = PcdComTransceive(pi);
C51 COMPILER V8.05a   ISO14443A                                                            07/05/2010 23:34:45 PAGE 10  

 552   2              if (status == MI_NOTAGERR)
 553   2              {   status = MI_OK;    }
 554   2           }
 555   1           return status;
 556   1      }
 557          
 558          /////////////////////////////////////////////////////////////////////
 559          //将卡缓冲区中数据保存到块
 560          //input:addr=绝对块号
 561          /////////////////////////////////////////////////////////////////////
 562          char PcdTransfer(unsigned char addr)
 563          {
 564   1          char status;
 565   1          struct TranSciveBuffer MfComData;
 566   1          struct TranSciveBuffer *pi;
 567   1          pi = &MfComData;
 568   1      
 569   1          PcdSetTmo(5);
 570   1          MfComData.MfCommand = PCD_TRANSCEIVE;
 571   1          MfComData.MfLength  = 2;
 572   1          MfComData.MfData[0] = PICC_TRANSFER;
 573   1          MfComData.MfData[1] = addr;
 574   1      
 575   1          status = PcdComTransceive(pi);
 576   1          if (status != MI_NOTAGERR)
 577   1          {
 578   2              if (MfComData.MfLength != 4)
 579   2              {  status = MI_BITCOUNTERR;    }
 580   2              else
 581   2              {
 582   3                 MfComData.MfData[0] &= 0x0F;
 583   3                 switch (MfComData.MfData[0])
 584   3                 {
 585   4                    case 0x00:
 586   4                       status = MI_NOTAUTHERR;
 587   4                       break;
 588   4                    case 0x0A:
 589   4                       status = MI_OK;
 590   4                       break;
 591   4                    case 0x01:
 592   4                       status = MI_VALERR;
 593   4                       break;
 594   4                    default:
 595   4                       status = MI_CODEERR;
 596   4                       break;
 597   4                 }
 598   3              }
 599   2           }
 600   1           return status;
 601   1      }
 602          
 603          /////////////////////////////////////////////////////////////////////
 604          //命令卡进入休眠状态
 605          /////////////////////////////////////////////////////////////////////
 606          char PcdHalt()
 607          {
 608   1          char status = MI_OK;
 609   1          struct TranSciveBuffer MfComData;
 610   1          struct TranSciveBuffer *pi;
 611   1          pi = &MfComData;
 612   1      
 613   1          MfComData.MfCommand = PCD_TRANSCEIVE;
C51 COMPILER V8.05a   ISO14443A                                                            07/05/2010 23:34:45 PAGE 11  

 614   1          MfComData.MfLength  = 2;
 615   1          MfComData.MfData[0] = PICC_HALT;
 616   1          MfComData.MfData[1] = 0;
 617   1      
 618   1          status = PcdComTransceive(pi);
 619   1          if (status)
 620   1          {
 621   2              if (status==MI_NOTAGERR || status==MI_ACCESSTIMEOUT)
 622   2              status = MI_OK;
 623   2          }
 624   1          WriteRawRC(RegCommand,PCD_IDLE);
 625   1          return status;
 626   1      }
 627          
 628          
 629          /////////////////////////////////////////////////////////////////////
 630          //Mifare_Pro复位
 631          //input: parameter = PCD BUFERR SIZE
 632          //output:pLen      = 复位信息长度
 633          //       pData     = 复位信息
 634          /////////////////////////////////////////////////////////////////////
 635          char MifareProRst(unsigned char parameter,unsigned char *pLen,unsigned char *pData)
 636          {
 637   1          char status;
 638   1          struct TranSciveBuffer MfComData;
 639   1          struct TranSciveBuffer *pi;
 640   1          pi = &MfComData;
 641   1          
 642   1          PcdSetTmo(15);
 643   1        
 644   1          MfComData.MfCommand = PCD_TRANSCEIVE;
 645   1          MfComData.MfLength  = 2;
 646   1          MfComData.MfData[0] = PICC_RESET;
 647   1          MfComData.MfData[1] = parameter;
 648   1          g_bIblock = 0;    
 649   1          status = PcdComTransceive(pi);
 650   1          if ((*pLen = MfComData.MfLength/8) <= FSD)
 651   1          {   memcpy(pData, &MfComData.MfData[0], *pLen);   }    
 652   1          else
 653   1          {   status = MI_COM_ERR;   }
 654   1          return status;
 655   1      }
 656          
 657          
 658          /////////////////////////////////////////////////////////////////////
 659          //向ISO14443-4卡发送COS命令
 660          //input:CID_NAD  = 是否包含CID或NAD             CID卡片标识符 NAD节点
 661          //      timeout  = FWI                                  桢等待时间的整数
 662          //      pLen     = 命令长度
 663          //      pCommand = COS命令
 664          //ouput:pLen     = 返回数据长度
 665          //      pCommand = 返回数据
 666          /////////////////////////////////////////////////////////////////////
 667          char MifareProCom(unsigned char CID_NAD,unsigned char timeout,unsigned char *pLen,unsigned char *pCommand)
 668          {
 669   1          char status;
 670   1          struct TranSciveBuffer MfComData;
 671   1          struct TranSciveBuffer *pi;
 672   1          unsigned char i,CidNadLg,PCB_I,PCB_R;
 673   1          unsigned char idata sendlgok,sendlgnow,sendlgsum,recelgnow,recelgsum;
 674   1          
 675   1          recelgnow = 0x00;
C51 COMPILER V8.05a   ISO14443A                                                            07/05/2010 23:34:45 PAGE 12  

 676   1          recelgsum = 0x00;
 677   1          sendlgnow = 0x00;
 678   1          sendlgok  = 0x00;
 679   1          sendlgsum = *pLen;
 680   1          PCB_R     = 0xA2;
 681   1          
 682   1          PcdSetTmo(timeout);
 683   1          
 684   1      
 685   1          if (CID_NAD & 0xF0)
 686   1          {   CidNadLg = 1;    }
 687   1          else
 688   1          {   CidNadLg = 0;    }    
 689   1          if (sendlgsum > FSD-1-CidNadLg)
 690   1          {
 691   2              sendlgnow  = FSD-1-CidNadLg;
 692   2              sendlgsum -= sendlgnow;
 693   2              PCB_I = 0x12 ^ g_bIblock;
 694   2          }    
 695   1          else
 696   1          {   
 697   2              sendlgnow  = sendlgsum;
 698   2              PCB_I = 0x02 ^ g_bIblock;
 699   2          }
 700   1          g_bIblock = !g_bIblock;    
 701   1          MfComData.MfCommand = PCD_TRANSCEIVE;
 702   1          MfComData.MfLength  = sendlgnow + CidNadLg + 1;
 703   1          MfComData.MfData[0] =( CidNadLg<<3) | PCB_I;
 704   1          for (i=0; i<CidNadLg; i++)
 705   1          {  MfComData.MfData[i+1] = 1;  } 
 706   1          memcpy(&MfComData.MfData[CidNadLg+1], pCommand, sendlgnow);   
 707   1          sendlgok += sendlgnow;
 708   1          pi = &MfComData;
 709   1          
 710   1          status = PcdComTransceive(pi);
 711   1         
 712   1      //////////////////////////////////////////////
 713   1          while (status == MI_OK)
 714   1          {
 715   2              if (MfComData.MfLength/8-1-CidNadLg > FSD)
 716   2              {   
 717   3                  status = MI_COM_ERR;
 718   3                  break;
 719   3              }
 720   2              if ((MfComData.MfData[0] & 0xF0) == 0x00) 
 721   2              //命令通讯结束
 722   2              {
 723   3                  recelgnow = MfComData.MfLength/8 - 1 - CidNadLg;
 724   3                  memcpy(pCommand+recelgsum, &MfComData.MfData[CidNadLg+1], recelgnow);    
 725   3                  recelgsum += recelgnow;
 726   3                  *pLen = recelgsum;
 727   3                  break;
 728   3              }  
 729   2              if ((MfComData.MfData[0] & 0xF0) == 0xA0)
 730   2              //发送后续数据
 731   2              {
 732   3                  MfComData.MfCommand = PCD_TRANSCEIVE;
 733   3                  for(i=0; i<CidNadLg; i++)
 734   3                  {   MfComData.MfData[i+1] = 0;  }               
 735   3                  PCB_I ^= 1;
 736   3                  if(sendlgsum > FSD-1-CidNadLg)
 737   3                  {  
C51 COMPILER V8.05a   ISO14443A                                                            07/05/2010 23:34:45 PAGE 13  

 738   4                      sendlgnow  = FSD-1-CidNadLg; 
 739   4                      sendlgsum -= sendlgnow; 
 740   4                      PCB_I |= 0x10^ g_bIblock;
 741   4                      g_bIblock = !g_bIblock;
 742   4                  }    
 743   3                  else
 744   3                  {
 745   4                      sendlgnow = sendlgsum;
 746   4                      PCB_I &= 0xEF;
 747   4                      PCB_I |= g_bIblock;
 748   4                      g_bIblock = !g_bIblock;
 749   4                  }
 750   3                  MfComData.MfLength  = sendlgnow + CidNadLg + 1;
 751   3                  MfComData.MfData[0] = 0x02 | (CID_NAD<<3) | PCB_I;
 752   3          
 753   3                  memcpy(&MfComData.MfData[CidNadLg+1], pCommand+sendlgok, sendlgnow); 
 754   3                  sendlgok += sendlgnow;
 755   3                  pi = &MfComData;
 756   3                  status = PcdComTransceive(pi);
 757   3                  continue;
 758   3              }
 759   2              if ((MfComData.MfData[0] & 0xF0) == 0x10)
 760   2              //接收后续数据
 761   2              {
 762   3                  recelgnow = MfComData.MfLength/8 - 1 - CidNadLg;
 763   3                  memcpy(pCommand+recelgsum, &MfComData.MfData[CidNadLg+1], recelgnow);  
 764   3                  recelgsum += recelgnow;
 765   3                  
 766   3                  MfComData.MfCommand = PCD_TRANSCEIVE;
 767   3                  for(i=0; i<CidNadLg; i++)
 768   3                  {  MfComData.MfData[i+1]=0;  }               
 769   3                  MfComData.MfLength = CidNadLg + 1;
 770   3                  if(MfComData.MfData[0] & 0x01) 
 771   3                  {  PCB_R &= 0xFE;  }
 772   3                  else 
 773   3                  {  PCB_R |= 0x01;  }
 774   3                  MfComData.MfData[0] = PCB_R | (CID_NAD<<3) & 0xFB;
 775   3                  pi = &MfComData;
 776   3                  
 777   3                  status = PcdComTransceive(pi);
 778   3                  continue;    
 779   3              }
 780   2              status = MI_COM_ERR;
 781   2              break;
 782   2          }     
 783   1          return status;
 784   1      }
 785          
 786          //////////////////////////////////////////////////////////////////////
 787          //ISO14443-4 DESELECT
 788          //////////////////////////////////////////////////////////////////////
 789          char CL_Deselect(unsigned char CID)
 790          {
 791   1          char status;
 792   1          struct TranSciveBuffer MfComData;
 793   1          struct TranSciveBuffer *pi;
 794   1          
 795   1          PcdSetTmo(4);
 796   1          
 797   1          MfComData.MfCommand = PCD_TRANSCEIVE;
 798   1          MfComData.MfLength  = 0x2   ;
 799   1          MfComData.MfData[0] =0xCA;
C51 COMPILER V8.05a   ISO14443A                                                            07/05/2010 23:34:45 PAGE 14  

 800   1          MfComData.MfData[1] =CID;
 801   1          pi = &MfComData;
 802   1          
 803   1          status = PcdComTransceive(pi);
 804   1          return status;
 805   1      }
 806          
 807          
 808          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   2459    ----
   CONSTANT SIZE    =      5    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    1049
   IDATA SIZE       =   ----      10
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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