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

📄 fm1702.lst

📁 FM1702SL.rar
💻 LST
📖 第 1 页 / 共 5 页
字号:
 781   1              {
 782   2                      for(i = 0; i < 0x50; i++)
 783   2                      {
 784   3                              _nop_();
 785   3                      }
 786   2      
 787   2                      return FM1702_OK;
 788   2              }
 789   1              else
 790   1              {
 791   2                      temp = SPIRead(ErrorFlag);
 792   2                      if((temp & 0x02) == 0x02)
 793   2                      {
 794   3                              return(FM1702_PARITYERR);
 795   3                      }
 796   2      
 797   2                      if((temp & 0x04) == 0x04)
 798   2                      {
 799   3                              return(FM1702_FRAMINGERR);
C51 COMPILER V7.50   FM1702                                                                10/16/2007 16:33:32 PAGE 14  

 800   3                      }
 801   2      
 802   2                      return(FM1702_NOTAGERR);
 803   2              }
 804   1      }
 805          
 806          ///////////////////////////////////////////////////////////////////////
 807          // 转换密钥格式
 808          ///////////////////////////////////////////////////////////////////////
 809          char M500HostCodeKey(  uchar *uncoded, uchar *coded)   
 810          {
 811   1          char idata status = FM1702_OK;
 812   1          uchar idata cnt = 0;
 813   1          uchar idata ln  = 0;     
 814   1          uchar idata hn  = 0;      
 815   1          for (cnt = 0; cnt < 6; cnt++)
 816   1          {
 817   2              ln = uncoded[cnt] & 0x0F;
 818   2              hn = uncoded[cnt] >> 4;
 819   2              coded[cnt * 2 + 1] = (~ln << 4) | ln;
 820   2              coded[cnt * 2 ] = (~hn << 4) | hn;
 821   2          }
 822   1          return FM1702_OK;
 823   1      }
 824          
 825          /****************************************************************/
 826          /*名称: Load_keyE2 */
 827          /*功能: 该函数实现把E2中密码存入FM1702的keyRevBuffer中*/
 828          /*输入: Secnr: EE起始地址*/
 829          /*输出: True: 密钥装载成功*/
 830          /* False: 密钥装载失败*/
 831          /****************************************************************/
 832          uchar Load_keyE2_CPY(uchar Secnr, uchar Mode)
 833          {
 834   1              char idata status;
 835   1              uchar   temp;   
 836   1              uchar   msb = 0;
 837   1              uchar   lsb = 0;
 838   1              uchar coded_keys[12];
 839   1      
 840   1              uchar   temp1;
 841   1              if(Secnr >= 0x20)
 842   1              {
 843   2                temp1 = Secnr - 0x20;
 844   2                Secnr = 0x20 + temp1 * 4;
 845   2              }
 846   1      
 847   1              temp = Secnr * 12;
 848   1      
 849   1              if(Mode == RF_CMD_AUTH_LA)
 850   1              {
 851   2                      if(temp >= 0x80)        
 852   2                      {
 853   3                              lsb = temp - 0x80;
 854   3                              msb = 0x01;
 855   3                      }
 856   2                      else
 857   2                      {
 858   3                              lsb = temp + 0x80;
 859   3                              msb = 0x00;
 860   3                      }
 861   2              }
C51 COMPILER V7.50   FM1702                                                                10/16/2007 16:33:32 PAGE 15  

 862   1              else
 863   1              {
 864   2                      msb = 0x01;
 865   2                      lsb = temp + 0x40;
 866   2              }
 867   1              
 868   1              status = M500HostCodeKey(&RevBuffer[3],coded_keys);////////////////
 869   1              status = Write_E2(lsb, msb, 12, coded_keys);         ////////////////
 870   1              RevBuffer[0] = lsb;
 871   1              RevBuffer[1] = msb;
 872   1              
 873   1              temp = Command_Send(2, RevBuffer, LoadKeyE2);
 874   1              temp = SPIRead(ErrorFlag) & 0x40;
 875   1              if(temp == 0x40)
 876   1              {
 877   2                      return FALSE;
 878   2              }
 879   1      
 880   1              return TRUE;
 881   1      }
 882          
 883          /****************************************************************/
 884          /*名称: Request */
 885          /*功能: 该函数实现对放入FM1702操作范围之内的卡片的Request操作*/
 886          /*输入: mode: ALL(监测所以FM1702操作范围之内的卡片) */
 887          /* STD(监测在FM1702操作范围之内处于HALT状态的卡片) */
 888          /*输出: FM1702_NOTAGERR: 无卡*/
 889          /* FM1702_OK: 应答正确*/
 890          /* FM1702_REQERR: 应答错误*/
 891          /****************************************************************/
 892          uchar Request(uchar mode)
 893          {
 894   1              
 895   1              uchar idata     temp;
 896   1              
 897   1              SPIWrite(CRCPresetLSB,0x63);            //CRCPresetLSB address is 0x23
 898   1              SPIWrite(CWConductance,0x3f);
 899   1              RevBuffer[0] = mode;            /* Request模式选择 */
 900   1              SPIWrite(Bit_Frame,0x07);               
 901   1              SPIWrite(ChannelRedundancy,0x03);       
 902   1              temp = SPIRead(Control);
 903   1              temp = temp & (0xf7);
 904   1              SPIWrite(Control,temp);                 //Control reset value is 00
 905   1              temp = Command_Send(1, RevBuffer, Transceive);   //Transceive=0x1E      /* 发送接收命令 */
 906   1              if(temp == FALSE)
 907   1              {
 908   2                      return FM1702_NOTAGERR;
 909   2              }
 910   1      
 911   1              Read_FIFO(RevBuffer);           /* 从FIFO中读取应答信息到RevBuffer[]中 */
 912   1              temp = Judge_Req(RevBuffer);    /* 判断应答信号是否正确 */
 913   1              if(temp == TRUE)
 914   1              {
 915   2                      tagtype[0] = RevBuffer[0];
 916   2                      tagtype[1] = RevBuffer[1];
 917   2                      return FM1702_OK;
 918   2              }
 919   1      
 920   1              return FM1702_REQERR;
 921   1      }
 922          
 923          /****************************************************************/
C51 COMPILER V7.50   FM1702                                                                10/16/2007 16:33:32 PAGE 16  

 924          /*名称: AntiColl */
 925          /*功能: 该函数实现对放入FM1702操作范围之内的卡片的防冲突检测*/
 926          /*输入: N/A */
 927          /*输出: FM1702_NOTAGERR: 无卡*/
 928          /* FM1702_BYTECOUNTERR: 接收字节错误*/
 929          /* FM1702_SERNRERR: 卡片序列号应答错误*/
 930          /* FM1702_OK: 卡片应答正确*/
 931          /****************************************************************/
 932          uchar AntiColl(void)
 933          {
 934   1              
 935   1              uchar   temp;
 936   1              uchar   i;
 937   1              uchar   row, col;
 938   1              uchar   pre_row;
 939   1              
 940   1              row = 0;
 941   1              col = 0;
 942   1              pre_row = 0;
 943   1              SPIWrite(CRCPresetLSB,0x63);
 944   1              SPIWrite(CWConductance,0x3f);
 945   1      //      SPIWrite(ModConductance,0x3f);
 946   1              RevBuffer[0] = RF_CMD_ANTICOL;
 947   1              RevBuffer[1] = 0x20;
 948   1              SPIWrite(ChannelRedundancy,0x03);
 949   1              temp = Command_Send(2, RevBuffer, Transceive);
 950   1              while(1)
 951   1              {
 952   2                      if(temp == FALSE)
 953   2                      {
 954   3                              return(FM1702_NOTAGERR);
 955   3                      }
 956   2      
 957   2                      //temp = ErrorFlag;
 958   2      
 959   2                      temp = SPIRead(FIFO_Length);
 960   2                      if(temp == 0)
 961   2                      {
 962   3                              return FM1702_BYTECOUNTERR;
 963   3                      }
 964   2      
 965   2                      Read_FIFO(RevBuffer);
 966   2                      Save_UID(row, col, temp);                       /* 将收到的UID放入UID数组中 */
 967   2                      
 968   2                      
 969   2                      temp = SPIRead(ErrorFlag);                                  /* 判断接収数据是否出错 */
 970   2                      temp = temp & 0x01;
 971   2                      if(temp == 0x00)
 972   2                      {
 973   3                              temp = Check_UID();                     /* 校验收到的UID */
 974   3                              if(temp == FALSE)
 975   3                              {
 976   4                                      return(FM1702_SERNRERR);
 977   4                              }
 978   3      
 979   3                              return(FM1702_OK);
 980   3                      }
 981   2                      else
 982   2                      {
 983   3                              temp = SPIRead(CollPos);                                /* 读取冲突检测寄存器 */
 984   3                              row = temp / 8;
 985   3                              col = temp % 8;
C51 COMPILER V7.50   FM1702                                                                10/16/2007 16:33:32 PAGE 17  

 986   3                              RevBuffer[0] = RF_CMD_ANTICOL;
 987   3                              Set_BitFraming(row + pre_row, col);     /* 设置待发送数据的字节数 */
 988   3                              pre_row = pre_row + row;
 989   3                              for(i = 0; i < pre_row + 1; i++)
 990   3                              {
 991   4                                      RevBuffer[i + 2] = UID[i];
 992   4                              }
 993   3      
 994   3                              if(col != 0x00)
 995   3                              {
 996   4                                      row = pre_row + 1;
 997   4                              }
 998   3                              else
 999   3                              {
1000   4                                      row = pre_row;
1001   4                              }
1002   3      
1003   3                              temp = Command_Send(row + 2, RevBuffer, Transceive);
1004   3                      }
1005   2              }
1006   1      }
1007          
1008          /****************************************************************/
1009          /*名称: Select_Card */
1010          /*功能: 该函数实现对放入FM1702操作范围之内的某张卡片进行选择*/
1011          /*输入: N/A */
1012          /*输出: FM1702_NOTAGERR: 无卡*/
1013          /* FM1702_PARITYERR: 奇偶校验错*/
1014          /* FM1702_CRCERR: CRC校验错*/
1015          /* FM1702_BYTECOUNTERR: 接收字节错误*/
1016          /* FM1702_OK: 应答正确*/
1017          /* FM1702_SELERR: 选卡出错*/
1018          /****************************************************************/
1019          uchar Select_Card(void)
1020          {
1021   1              
1022   1              uchar   temp, i;
1023   1              
1024   1              SPIWrite(CRCPresetLSB,0x63);
1025   1              SPIWrite(CWConductance,0x3f);
1026   1              RevBuffer[0] = RF_CMD_SELECT;
1027   1              RevBuffer[1] = 0x70;
1028   1              for(i = 0; i < 5; i++)
1029   1              {
1030   2                      RevBuffer[i + 2] = UID[i];
1031   2              }
1032   1      
1033   1              SPIWrite(ChannelRedundancy,0x0f);       
1034   1              temp = Command_Send(7, RevBuffer, Transceive);
1035   1              if(temp == FALSE)
1036   1              {
1037   2                      return(FM1702_NOTAGERR);
1038   2              }
1039   1              else
1040   1              {
1041   2                      temp = SPIRead(ErrorFlag);
1042   2                      if((temp & 0x02) == 0x02) return(FM1702_PARITYERR);
1043   2                      if((temp & 0x04) == 0x04) return(FM1702_FRAMINGERR);

⌨️ 快捷键说明

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