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

📄 slrc500.lst

📁 RC500可用的程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 250   2               WriteRawRC(RegTimerReload,0x81);// TReloadVal = 'h81 =129(dec) 
 251   2               break;
 252   2            case 15:                        // (4.9485 s) FWI=14
 253   2               WriteRawRC(RegTimerClock,0x9); // TAutoRestart=0,TPrescale=4096*128
 254   2               WriteRawRC(RegTimerReload,0x0ff);// TReloadVal = 'h81 =129(dec) 
 255   2               break;
 256   2            default:                       // 
 257   2               WriteRawRC(RegTimerClock,0x19); // TAutoRestart=0,TPrescale=128
 258   2               WriteRawRC(RegTimerReload,tmoLength);// TReloadVal = 'h6a =tmoLength(dec) 
 259   2               break;
 260   2         }     
 261   1         WriteRawRC(RegTimerControl,0X06);
 262   1      }
 263          
 264          /////////////////////////////////////////////////////////////////////
 265          //通过RC500和ISO14443卡通讯
 266          //input: pi->MfCommand = RC500命令字
 267          //       pi->MfLength  = 发送的数据长度
 268          //       pi->MfData[]  = 发送数据
 269          //output:status        = 错误字
 270          //       pi->MfLength  = 接收的数据BIT长度
 271          //       pi->MfData[]  = 接收数据
 272          /////////////////////////////////////////////////////////////////////
 273          char PcdComTransceive(struct TranSciveBuffer *pi)
 274          {
 275   1         bit recebyte = 0;
 276   1         char status;
 277   1         unsigned char irqEn   = 0x00;
 278   1         unsigned char waitFor = 0x00;
 279   1         unsigned char lastBits;
 280   1         unsigned char n;
 281   1         unsigned int i;
 282   1         switch (pi->MfCommand)
 283   1         {
 284   2            case PCD_IDLE:
 285   2               irqEn   = 0x00;
 286   2               waitFor = 0x00;
 287   2               break;
 288   2            case PCD_WRITEE2:
 289   2               irqEn   = 0x11;
 290   2               waitFor = 0x10;
 291   2               break;
 292   2            case PCD_READE2:
 293   2               irqEn   = 0x07;
 294   2               waitFor = 0x04;
 295   2               recebyte=1;
 296   2               break;
 297   2            case PCD_LOADCONFIG:
 298   2            case PCD_LOADKEYE2:
 299   2            case PCD_AUTHENT1:
 300   2               irqEn   = 0x05;
 301   2               waitFor = 0x04;
C51 COMPILER V7.06   SLRC500                                                               05/01/2009 01:52:10 PAGE 6   

 302   2               break;
 303   2            case PCD_CALCCRC:
 304   2               irqEn   = 0x11;
 305   2               waitFor = 0x10;
 306   2               break;
 307   2            case PCD_AUTHENT2:
 308   2               irqEn   = 0x04;
 309   2               waitFor = 0x04;
 310   2               break;
 311   2            case PCD_RECEIVE:
 312   2               irqEn   = 0x06;
 313   2               waitFor = 0x04;
 314   2               recebyte=1;
 315   2               break;
 316   2            case PCD_LOADKEY:
 317   2               irqEn   = 0x05;
 318   2               waitFor = 0x04;
 319   2               break;
 320   2            case PCD_TRANSMIT:
 321   2               irqEn   = 0x05;
 322   2               waitFor = 0x04;
 323   2               break;
 324   2            case PCD_TRANSCEIVE:
 325   2               irqEn   = 0x3D;
 326   2               waitFor = 0x04;
 327   2               recebyte=1;
 328   2               break;
 329   2            default:
 330   2               pi->MfCommand = MI_UNKNOWN_COMMAND;
 331   2               break;
 332   2         }
 333   1         
 334   1         if (pi->MfCommand != MI_UNKNOWN_COMMAND)
 335   1         {
 336   2            WriteRawRC(RegPage,0x00);
 337   2            WriteRawRC(RegInterruptEn,0x7F);          //清除中断使能
 338   2            WriteRawRC(RegInterruptRq,0x7F);          //清除中断标志
 339   2            WriteRawRC(RegCommand,PCD_IDLE);          //清除Command寄存器
 340   2            SetBitMask(RegControl,0x01);                      //清除FIFO指针
 341   2            WriteRawRC(RegInterruptEn,irqEn|0x80);
 342   2            for (i=0; i<pi->MfLength; i++)
 343   2            {
 344   3               WriteRawRC(RegFIFOData, pi->MfData[i]);//将数据写入FIFO
 345   3            }
 346   2            WriteRawRC(RegCommand, pi->MfCommand);//将指令写入Command寄存器
 347   2            i = 0x3500;
 348   2            do
 349   2            {
 350   3               n = ReadRawRC(RegInterruptRq);//当定时器TimerValue 寄存器值减为0 时置位
 351   3               i--;
 352   3            }
 353   2            while ((i!=0) && !(n&irqEn&0x20) && !(n&waitFor));
 354   2            status = MI_COM_ERR;
 355   2            if ((i!=0) && !(n&irqEn&0x20))
 356   2            {
 357   3               if (!(ReadRawRC(RegErrorFlag)&0x17))
 358   3               {
 359   4                  status = MI_OK;
 360   4                  if (recebyte) //从PICC读数据
 361   4                  {
 362   5                      n = ReadRawRC(RegFIFOLength);//指示保存在FIFO 缓冲区的字节数 
 363   5                                      //写入FIFOData寄存器增加,读减少FIFOLength
C51 COMPILER V7.06   SLRC500                                                               05/01/2009 01:52:10 PAGE 7   

 364   5                      lastBits = ReadRawRC(RegSecondaryStatus) & 0x07;
 365   5                      if (lastBits)//显示最后接收字节的有效位个数如果为0 整个字节有效
 366   5                      {
 367   6                         pi->MfLength = (n-1)*8 + lastBits;
 368   6                      }
 369   5                      else
 370   5                      {
 371   6                         pi->MfLength = n*8;//计算比特数长度
 372   6                      }
 373   5                      if (n == 0)
 374   5                      {
 375   6                         n = 1;
 376   6                      }
 377   5                      for (i=0; i<n; i++)
 378   5                      {
 379   6                          pi->MfData[i] = ReadRawRC(RegFIFOData);//读出FIFO的数据
 380   6                      }
 381   5                  }
 382   4               }
 383   3                       else if (ReadRawRC(RegErrorFlag)&0x01)//如果检测到一个位冲突该位置位该位在PrepareRx 
 384   3                                                                                                 //状态中接收器的启动阶段自动清零
 385   3               {
 386   4                          status = MI_COLLERR;
 387   4                  if (recebyte)
 388   4                  {
 389   5                      n = ReadRawRC(RegFIFOLength);
 390   5                      lastBits = ReadRawRC(RegSecondaryStatus) & 0x07;
 391   5                      if (lastBits)
 392   5                      {
 393   6                         pi->MfLength = (n-1)*8 + lastBits;
 394   6                      }
 395   5                      else
 396   5                      {
 397   6                         pi->MfLength = n*8;
 398   6                      }
 399   5                      if (n == 0)
 400   5                      {
 401   6                         n = 1;
 402   6                      }
 403   5                      for (i=0; i<n; i++)
 404   5                      {
 405   6                          pi->MfData[i+1] = ReadRawRC(RegFIFOData);
 406   6                      }
 407   5                  }
 408   4                              pi->MfData[0]=ReadRawRC(0x0B);
 409   4               }
 410   3      
 411   3            }
 412   2            else if (n & irqEn & 0x20)
 413   2            {   status = MI_NOTAGERR;   }
 414   2            else if (!(ReadRawRC(RegErrorFlag)&0x17))
 415   2            {   status = MI_ACCESSTIMEOUT;   }
 416   2            else
 417   2            {   status = MI_COM_ERR;    }
 418   2            
 419   2            WriteRawRC(RegInterruptEn,0x7F);
 420   2            WriteRawRC(RegInterruptRq,0x7F);
 421   2            SetBitMask(RegControl,0x04);           // stop timer now
 422   2            WriteRawRC(RegCommand,PCD_IDLE); 
 423   2         }
 424   1         return status;
 425   1      }
C51 COMPILER V7.06   SLRC500                                                               05/01/2009 01:52:10 PAGE 8   

 426          
 427          /*
 428          /////////////////////////////////////////////////////////////////////
 429          //读RC500EEPROM
 430          //input :startaddr=EEPROM地址(低位在前)
 431          //       length=读字节数
 432          //output:readdata=读出的数据
 433          /////////////////////////////////////////////////////////////////////
 434          char PcdReadE2(unsigned int startaddr,unsigned char length,unsigned char *readdata)
 435          {
 436              char status;
 437              struct TranSciveBuffer MfComData;
 438              struct TranSciveBuffer *pi;
 439              pi = &MfComData;
 440          
 441              MfComData.MfCommand = PCD_READE2;
 442              MfComData.MfLength  = 3;
 443              MfComData.MfData[0] = startaddr&0xFF;
 444              MfComData.MfData[1] = (startaddr >> 8) & 0xFF;
 445              MfComData.MfData[2] = length;
 446          
 447              status = PcdComTransceive(pi);
 448          
 449              if (status == MI_OK)
 450              {   memcpy(readdata, &MfComData.MfData[0], length);    }
 451              return status;
 452          }
 453          */
 454          
 455          /////////////////////////////////////////////////////////////////////
 456          //写RC500EEPROM
 457          //input :startaddr=EEPROM地址(低位在前)
 458          //       length=写字节数
 459          //       writedata=要写入的数据
 460          /////////////////////////////////////////////////////////////////////
 461          char PcdWriteE2(unsigned int startaddr,unsigned char length,unsigned char *writedata)
 462          {
 463   1          char status;
 464   1          struct TranSciveBuffer MfComData;    
 465   1          struct TranSciveBuffer *pi;
 466   1          pi = &MfComData;
 467   1      
 468   1          MfComData.MfCommand = PCD_WRITEE2;
 469   1          MfComData.MfLength  = length+2;
 470   1          MfComData.MfData[0] = startaddr&0xFF;
 471   1          MfComData.MfData[1] = (startaddr >> 8) & 0xFF;
 472   1          memcpy(&MfComData.MfData[2], writedata, length);    
 473   1      
 474   1          status = PcdComTransceive(pi);
 475   1          return status;
 476   1      }
 477          
 478          /////////////////////////////////////////////////////////////////////
 479          //开启天线  
 480          //每次启动或关闭天险发射之间应至少有1ms的间隔
 481          /////////////////////////////////////////////////////////////////////
 482          char PcdAntennaOn()
 483          {
 484   1          unsigned char i;
 485   1          i = ReadRawRC(RegTxControl);
 486   1          if (i & 0x03)
 487   1          {   return MI_OK;   }
C51 COMPILER V7.06   SLRC500                                                               05/01/2009 01:52:10 PAGE 9   

 488   1          else
 489   1          {
 490   2              SetBitMask(RegTxControl, 0x03);
 491   2              return MI_OK;
 492   2          }
 493   1      }
 494          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1376    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      88
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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