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

📄 rc522.lst

📁 这是一个单片机与MFRC522通信的程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
 434   1         return MI_OK;
 435   1      }
 436          /////////////////////////////////////////////////////////////////////
 437          //功    能:读RC632寄存器
 438          //参数说明:Address[IN]:寄存器地址
 439          //返    回:读出的值
 440          /////////////////////////////////////////////////////////////////////
 441          unsigned char ReadRawRC(unsigned char Address)
 442          {
 443   1           unsigned char i, ucAddr;
 444   1           unsigned char ucResult=0;
 445   1      
 446   1           MF522_SCK = 0;
 447   1           MF522_NSS = 0;
 448   1           ucAddr = ((Address<<1)&0x7E)|0x80;
 449   1      
 450   1           for(i=8;i>0;i--)
 451   1           {
 452   2               MF522_SI = ((ucAddr&0x80)==0x80);
 453   2               MF522_SCK = 1;
 454   2               ucAddr <<= 1;
 455   2               MF522_SCK = 0;
 456   2           }
 457   1      
 458   1           for(i=8;i>0;i--)
 459   1           {
 460   2               MF522_SCK = 1;
 461   2               ucResult <<= 1;
 462   2               ucResult|=(bit)MF522_SO;
 463   2               MF522_SCK = 0;
 464   2           }
 465   1      
 466   1           MF522_NSS = 1;
 467   1           MF522_SCK = 1;
 468   1           return ucResult;
 469   1      }
 470          
 471          /////////////////////////////////////////////////////////////////////
 472          //功    能:写RC632寄存器
 473          //参数说明:Address[IN]:寄存器地址
 474          //          value[IN]:写入的值
 475          /////////////////////////////////////////////////////////////////////
 476          void WriteRawRC(unsigned char Address, unsigned char value)
 477          {  
 478   1          unsigned char i, ucAddr;
 479   1      
 480   1          MF522_SCK = 0;
 481   1          MF522_NSS = 0;
 482   1          ucAddr = ((Address<<1)&0x7E);
 483   1      
 484   1          for(i=8;i>0;i--)
 485   1          {
 486   2              MF522_SI = ((ucAddr&0x80)==0x80);
 487   2              MF522_SCK = 1;
 488   2              ucAddr <<= 1;
 489   2              MF522_SCK = 0;
C51 COMPILER V7.07   RC522                                                                 02/12/2007 09:56:17 PAGE 9   

 490   2          }
 491   1      
 492   1          for(i=8;i>0;i--)
 493   1          {
 494   2              MF522_SI = ((value&0x80)==0x80);
 495   2              MF522_SCK = 1;
 496   2              value <<= 1;
 497   2              MF522_SCK = 0;
 498   2          }
 499   1          MF522_NSS = 1;
 500   1          MF522_SCK = 1;
 501   1      }
 502          
 503          /////////////////////////////////////////////////////////////////////
 504          //功    能:置RC522寄存器位
 505          //参数说明:reg[IN]:寄存器地址
 506          //          mask[IN]:置位值
 507          /////////////////////////////////////////////////////////////////////
 508          void SetBitMask(unsigned char reg,unsigned char mask)  
 509          {
 510   1          char tmp = 0x0;
 511   1          tmp = ReadRawRC(reg);
 512   1          WriteRawRC(reg,tmp | mask);  // set bit mask
 513   1      }
 514          
 515          /////////////////////////////////////////////////////////////////////
 516          //功    能:清RC522寄存器位
 517          //参数说明:reg[IN]:寄存器地址
 518          //          mask[IN]:清位值
 519          /////////////////////////////////////////////////////////////////////
 520          void ClearBitMask(unsigned char reg,unsigned char mask)  
 521          {
 522   1          char tmp = 0x0;
 523   1          tmp = ReadRawRC(reg);
 524   1          WriteRawRC(reg, tmp & ~mask);  // clear bit mask
 525   1      } 
 526          
 527          /////////////////////////////////////////////////////////////////////
 528          //功    能:通过RC522和ISO14443卡通讯
 529          //参数说明:Command[IN]:RC522命令字
 530          //          pInData[IN]:通过RC522发送到卡片的数据
 531          //          InLenByte[IN]:发送数据的字节长度
 532          //          pOutData[OUT]:接收到的卡片返回数据
 533          //          *pOutLenBit[OUT]:返回数据的位长度
 534          /////////////////////////////////////////////////////////////////////
 535          char PcdComMF522(unsigned char Command, 
 536                           unsigned char *pInData, 
 537                           unsigned char InLenByte,
 538                           unsigned char *pOutData, 
 539                           unsigned int  *pOutLenBit)
 540          {
 541   1          char status = MI_ERR;
 542   1          unsigned char irqEn   = 0x00;
 543   1          unsigned char waitFor = 0x00;
 544   1          unsigned char lastBits;
 545   1          unsigned char n;
 546   1          unsigned int i;
 547   1          switch (Command)
 548   1          {
 549   2             case PCD_AUTHENT:
 550   2                irqEn   = 0x12;
 551   2                waitFor = 0x10;
C51 COMPILER V7.07   RC522                                                                 02/12/2007 09:56:17 PAGE 10  

 552   2                break;
 553   2             case PCD_TRANSCEIVE:
 554   2                irqEn   = 0x77;
 555   2                waitFor = 0x30;
 556   2                break;
 557   2             default:
 558   2               break;
 559   2          }
 560   1         
 561   1          WriteRawRC(ComIEnReg,irqEn|0x80);
 562   1          ClearBitMask(ComIrqReg,0x80);
 563   1          WriteRawRC(CommandReg,PCD_IDLE);
 564   1          SetBitMask(FIFOLevelReg,0x80);
 565   1          
 566   1          for (i=0; i<InLenByte; i++)
 567   1          {   WriteRawRC(FIFODataReg, pInData[i]);    }
 568   1          WriteRawRC(CommandReg, Command);
 569   1         
 570   1          
 571   1          if (Command == PCD_TRANSCEIVE)
 572   1          {    SetBitMask(BitFramingReg,0x80);  }
 573   1          
 574   1      //    i = 600;//根据时钟频率调整,操作M1卡最大等待时间25ms
 575   1       i = 2000;
 576   1          do 
 577   1          {
 578   2               n = ReadRawRC(ComIrqReg);
 579   2               i--;
 580   2          }
 581   1          while ((i!=0) && !(n&0x01) && !(n&waitFor));
 582   1          ClearBitMask(BitFramingReg,0x80);
 583   1                    
 584   1          if (i!=0)
 585   1          {    
 586   2               if(!(ReadRawRC(ErrorReg)&0x1B))
 587   2               {
 588   3                   status = MI_OK;
 589   3                   if (n & irqEn & 0x01)
 590   3                   {   status = MI_NOTAGERR;   }
 591   3                   if (Command == PCD_TRANSCEIVE)
 592   3                   {
 593   4                      n = ReadRawRC(FIFOLevelReg);
 594   4                      lastBits = ReadRawRC(ControlReg) & 0x07;
 595   4                      if (lastBits)
 596   4                      {   *pOutLenBit = (n-1)*8 + lastBits;   }
 597   4                      else
 598   4                      {   *pOutLenBit = n*8;   }
 599   4                      if (n == 0)
 600   4                      {   n = 1;    }
 601   4                      if (n > MAXRLEN)
 602   4                      {   n = MAXRLEN;   }
 603   4                      for (i=0; i<n; i++)
 604   4                      {   pOutData[i] = ReadRawRC(FIFODataReg);    }
 605   4                  }
 606   3               }
 607   2               else
 608   2               {   status = MI_ERR;   }
 609   2              
 610   2         }
 611   1         
 612   1      
 613   1         SetBitMask(ControlReg,0x80);           // stop timer now
C51 COMPILER V7.07   RC522                                                                 02/12/2007 09:56:17 PAGE 11  

 614   1         WriteRawRC(CommandReg,PCD_IDLE); 
 615   1         return status;
 616   1      }
 617          
 618          
 619          /////////////////////////////////////////////////////////////////////
 620          //开启天线  
 621          //每次启动或关闭天险发射之间应至少有1ms的间隔
 622          /////////////////////////////////////////////////////////////////////
 623          void PcdAntennaOn()
 624          {
 625   1          unsigned char i;
 626   1          i = ReadRawRC(TxControlReg);
 627   1          if (!(i & 0x03))
 628   1          {
 629   2              SetBitMask(TxControlReg, 0x03);
 630   2          }
 631   1      }
 632          
 633          
 634          /////////////////////////////////////////////////////////////////////
 635          //关闭天线
 636          /////////////////////////////////////////////////////////////////////
 637          void PcdAntennaOff()
 638          {
 639   1          ClearBitMask(TxControlReg, 0x03);
 640   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   2037    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----     238
   IDATA SIZE       =   ----    ----
   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 + -