📄 fm1702.lst
字号:
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 + -