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

📄 iccpdir.lst

📁 mifarea卡程序mifarea卡程序mifarea卡程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
 361   3              }
 362   2              SoftDelayCyl(ETU);      // delay 2 etu
 363   2      
C51 COMPILER V8.00   ICCPDIR                                                               04/23/2009 15:56:19 PAGE 7   

 364   2              starttime = GetTickCount();
 365   2              mycharp = buf[i];
 366   2      
 367   2              ///////////////////////////////////
 368   2              // initialize for current byte
 369   2              // get parity bit
 370   2              ACC = mycharp;
 371   2              TxParity = P;
 372   2              if(!dir)
 373   2              {
 374   3                  mycharp = ~mycharp;
 375   3                  TxParity = ~TxParity;
 376   3              }
 377   2              
 378   2              // clear parity error
 379   2              parityerror = 0;
 380   2              // clear endflag
 381   2              endflag = 0;
 382   2              // set bit counter
 383   2              bitcounter = 8;
 384   2              
 385   2              // disable receive interrupt
 386   2              IccDisable();   // EX1 = 0;
 387   2      
 388   2              disable();      // enter critical section
 389   2              InitUserTimer(RLD, TxRLDStart);
 390   2              StartSend();
 391   2              enable();       // leave critical section
 392   2              
 393   2              while(TxNotRx)
 394   2              {
 395   3                  if(GetTickCount() - starttime >= TIME_OUT_MS)
 396   3                  {
 397   4                      TxNotRx = 0;
 398   4                      #if DEBUG_ICC
                              ComWrite("\xee", 1);
                              delay(3);
                              #endif
 402   4                      return i;
 403   4                  }
 404   3              }
 405   2              if(parityerror)
 406   2              {
 407   3                  trytimes --;
 408   3                  if(!trytimes)
 409   3                  {
 410   4                      #if DEBUG_ICC
                              ComWrite("\xdd", 1);
                              delay(3);
                              #endif
 414   4                      return i;
 415   4                  }
 416   3                  else
 417   3                      i --;
 418   3              }
 419   2              //SoftDelayCyl(ETU);    // delay 2 etu
 420   2          }
 421   1              return i;
 422   1      }
 423          
 424          void IccClear(void)
 425          {
C51 COMPILER V8.00   ICCPDIR                                                               04/23/2009 15:56:19 PAGE 8   

 426   1          ibufputidx = ibufgetidx;
 427   1          RxWorking = 0;
 428   1          TxNotRx = 0;
 429   1          ICCIO = 1;           // 输入状态
 430   1          
 431   1          // if smart card
 432   1          IccEnable();
 433   1          // else do nothing
 434   1      }
 435          
 436          /*** set time out time in receiving a char from sam ***/
 437          void IccSetTimeout(unsigned int ms)
 438          {
 439   1          TIME_OUT_MS = ms;
 440   1      }
 441          
 442          
 443          int IccOpen(char *buf)    // ICC_INFO *info)
 444          {
 445   1          unsigned char data i, j;
 446   1          unsigned char data format;
 447   1          unsigned char data mylrc;
 448   1          unsigned char data CWI, BWI;
 449   1          unsigned char data inchar;
 450   1          unsigned int data oldtmo;
 451   1          unsigned char data nhistory;
 452   1          
 453   1              if(0x03 == CardId)
 454   1          {
 455   2              ICCUSERSCLK = 0;
 456   2              ICCUSERCLKC = 1;
 457   2          }
 458   1          
 459   1          ICCIO = 1;
 460   1          
 461   1          mylrc = 0;
 462   1          // info->protocolid = 0;
 463   1          // info->infolen = INFOLEN;
 464   1          
 465   1              oldtmo = TIME_OUT_MS;
 466   1              TIME_OUT_MS = 1200;
 467   1          IccEnable();
 468   1          
 469   1          for(j=0; j<4; j++)
 470   1          {
 471   2              parityerrorcnt = 0;
 472   2              attr[CardId].dir = 1;
 473   2              dir = 1;
 474   2          
 475   2              if(0x03 == CardId)
 476   2              {
 477   3                  delay(10);
 478   3                  USERRST = 0;
 479   3                  delay(10);
 480   3                  IccClear();
 481   3                  fReset = 1;
 482   3                  USERRST = 1;
 483   3              }
 484   2              else
 485   2              {
 486   3                  delay(10);
 487   3                  ICCRST = 0;
C51 COMPILER V8.00   ICCPDIR                                                               04/23/2009 15:56:19 PAGE 9   

 488   3                  delay(10);
 489   3                  IccClear();
 490   3                  fReset = 1;
 491   3                  ICCRST = 1;
 492   3              }
 493   2              
 494   2              i=IccRead(buf, 1);  // TS
 495   2              if (i < 1)
 496   2              {
 497   3                  if(parityerrorcnt && attr[CardId].autob)
 498   3                  {
 499   4                      attr[CardId].etu ++;
 500   4                      IccInitETU(IccEtu[attr[CardId].etu]);
 501   4                      continue;
 502   4                  }
 503   3                  else
 504   3                  {
 505   4                      TIME_OUT_MS = oldtmo;
 506   4                      return 0;
 507   4                  }
 508   3              }
 509   2              else if(buf[0] == 0x3b)
 510   2              {
 511   3                  break;
 512   3              }
 513   2              else if(buf[0] == 0x3f)
 514   2              {
 515   3                  attr[CardId].dir = dir;
 516   3                  break;
 517   3              }
 518   2              else if(attr[CardId].autob && (j < 3))
 519   2              {
 520   3                  attr[CardId].etu ++;
 521   3                  IccInitETU(IccEtu[attr[CardId].etu]);
 522   3                  continue;
 523   3              }
 524   2              else
 525   2              {
 526   3                  TIME_OUT_MS = oldtmo;
 527   3                  return 0;
 528   3              }
 529   2          }
 530   1          mylrc ^= buf[0];
 531   1      
 532   1          j = 1;
 533   1          i=IccRead(&format, 1);  // TO               /* T=0: format=0x69, T=1: 0xe9 */
 534   1          if (i < 1)
 535   1          {
 536   2              TIME_OUT_MS = oldtmo;
 537   2              return j;
 538   2          }
 539   1          mylrc ^= format;
 540   1          buf[j++] = format;
 541   1          
 542   1          nhistory = format & 0x0f;
 543   1          
 544   1          if (format & 0x10)
 545   1          {
 546   2              /* TA1: ETU计算字符 */                  /* T=0 and T=1 时不存在 */
 547   2              i=IccRead(&inchar, 1);
 548   2              if (i < 1)
 549   2              {
C51 COMPILER V8.00   ICCPDIR                                                               04/23/2009 15:56:19 PAGE 10  

 550   3                  TIME_OUT_MS = oldtmo;
 551   3                  return j;
 552   3              }
 553   2              mylrc ^= inchar;
 554   2              buf[j++] = inchar;
 555   2          }
 556   1          if (format & 0x20)
 557   1          {
 558   2              /* TB1: 编程电压Vpp信息 */              /* T=0 and T=1 时存在 */
 559   2              i=IccRead(&inchar, 1);
 560   2              if (i < 1)
 561   2              {
 562   3                  TIME_OUT_MS = oldtmo;
 563   3                  return j;
 564   3              }
 565   2              mylrc ^= inchar;
 566   2              buf[j++] = inchar;
 567   2              // info->vpp = inchar;
 568   2          }
 569   1          if (format & 0x40)
 570   1          {
 571   2              /* TC1: 所需额外保护时间 */             /* T=0 and T=1 时存在 */
 572   2              i=IccRead(&inchar, 1);
 573   2              if (i < 1)
 574   2              {
 575   3                  TIME_OUT_MS = oldtmo;
 576   3                  return j;
 577   3              }
 578   2              mylrc ^= inchar;
 579   2              buf[j++] = inchar;
 580   2              // info->guardtime = inchar;
 581   2          }
 582   1          if (format & 0x80)
 583   1          {
 584   2              /* TD1: 格式字符 */                     /* T=1 时存在 */
 585   2              i=IccRead(&format, 1);
 586   2              if (i < 1)
 587   2              {
 588   3                  TIME_OUT_MS = oldtmo;
 589   3                  return j;
 590   3              }
 591   2              mylrc ^= format;
 592   2              buf[j++] = format;
 593   2              // info->protocolid = format & 0x0f;
 594   2              
 595   2              if (format & 0x10)
 596   2              {
 597   3                  /* TA2: 模式选择 */
 598   3                  i=IccRead(&inchar, 1);
 599   3                  if (i < 1)
 600   3                  {
 601   4                      TIME_OUT_MS = oldtmo;
 602   4                      return j;
 603   4                  }
 604   3                  mylrc ^= inchar;
 605   3                  buf[j++] = inchar;
 606   3              }
 607   2              if (format & 0x20)
 608   2              {
 609   3                  /* TB2: 编程电压 */
 610   3                  i=IccRead(&inchar, 1);
 611   3                  if (i < 1)
C51 COMPILER V8.00   ICCPDIR                                                               04/23/2009 15:56:19 PAGE 11  

 612   3                  {
 613   4                      TIME_OUT_MS = oldtmo;
 614   4                      return j;
 615   4                  }
 616   3                  mylrc ^= inchar;
 617   3                  buf[j++] = inchar;
 618   3              }
 619   2              if (format & 0x40)
 620   2              {
 621   3                  /* TC2: 工作等待时间 */
 622   3                  i=IccRead(&inchar, 1);
 623   3                  if (i < 1)
 624   3                  {
 625   4                      TIME_OUT_MS = oldtmo;
 626   4                      return j;
 627   4                  }
 628   3                  mylrc ^= inchar;
 629   3                  buf[j++] = inchar;
 630   3              }
 631   2              if (format & 0x80)
 632   2              {
 633   3                  /* TD2: 格式字符 */                 /* T=1 时存在 */
 634   3                  i=IccRead(&format, 1);
 635   3                  if (i < 1)
 636   3                  {
 637   4                      TIME_OUT_MS = oldtmo;
 638   4                      return j;
 639   4                  }
 640   3                  mylrc ^= format;
 641   3                  buf[j++] = format;
 642   3      
 643   3                  /* SAM_T通讯协议 */
 644   3                  // info->protocolid = format & 0x0f;
 645   3      
 646   3                  if (format & 0x10)
 647   3                  {
 648   4                      /*TA3: IC卡信息域大小整数*/     /* T=1 时存在=0xb7 */
 649   4                      i=IccRead(&inchar, 1);
 650   4                      if (i < 1)
 651   4                      {
 652   5                          TIME_OUT_MS = oldtmo;
 653   5                          return j;
 654   5                      }
 655   4                      mylrc ^= inchar;
 656   4                      buf[j++] = inchar;
 657   4                      // info->infolen = inchar;
 658   4                  }
 659   3                  if (format & 0x20)
 660   3                  {
 661   4                      /*TB3: CWI和BWI*/               /* T=1 时存在=0x45 */
 662   4                      i=IccRead(&inchar, 1);
 663   4                      if (i < 1)
 664   4                      {
 665   5                          TIME_OUT_MS = oldtmo;
 666   5                          return j;
 667   5                      }
 668   4                      mylrc ^= inchar;
 669   4                      buf[j++] = inchar;
 670   4                      CWI = inchar >> 4;
 671   4                      BWI = inchar & 0x0f;
 672   4                      //计算CWT、BWT
 673   4                  }
C51 COMPILER V8.00   ICCPDIR                                                               04/23/2009 15:56:19 PAGE 12  

 674   3                  if (format & 0x40)
 675   3                  {
 676   4                      /*TC3: 块错误检测代码类型*/
 677   4                      i=IccRead(&inchar, 1);
 678   4                      if (i < 1)
 679   4                      {
 680   5                          TIME_OUT_MS = oldtmo;
 681   5                          return j;
 682   5                      }
 683   4                      mylrc ^= inchar;
 684   4                      buf[j++] = inchar;
 685   4                  }
 686   3              }
 687   2          }
 688   1          
 689   1          i = IccRead(buf+j, nhistory);      /* 获取历史字符 */
 690   1          if(i < nhistory)
 691   1          {
 692   2              TIME_OUT_MS = oldtmo;
 693   2              return j+i;
 694   2          }
 695   1          
 696   1          /*    
 697   1          if (info->protocolid != 0)
 698   1          {
 699   1              i = IccRead(&inchar, 1);
 700   1              if(i < 1)
 701   1              {
 702   1                  TIME_OUT_MS = oldtmo;
 703   1                  return 0;
 704   1              }
 705   1                  
 706   1              for(i=0; i<info->historylen; i++)
 707   1                  mylrc ^= info->history[i];
 708   1                  
 709   1              if(mylrc != inchar)     // 校验错误
 710   1              {
 711   1                  TIME_OUT_MS = oldtmo;
 712   1                  return 0;
 713   1              }
 714   1          }
 715   1          */
 716   1              
 717   1          /*reset success*/
 718   1          TIME_OUT_MS = oldtmo;
 719   1          return j+nhistory;
 720   1      }
 721          
 722          /*** install etu for sam ***/
 723          void IccInit(void)
 724          {
 725   1          // disable user power
 726   1          IccUserPower(0);
 727   1      
 728   1          // start sam clk
 729   1          StartCLKO(2);

⌨️ 快捷键说明

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