📄 mf_rc500.lst
字号:
MInfo.nBytesToSend = 2;
status = RC_Command(PCD_TRANSCEIVE,
SerBuffer,
&MInfo);
if (status != MI_NOTAGERR)
C51 COMPILER V7.08 MF_RC500 01/18/2004 17:34:11 PAGE 12
{
if (MInfo.nBitsReceived != 4)
{
status = MI_BITCOUNTERR;
}
else
{
SerBuffer[0] &= 0x0f;
switch(SerBuffer[0])
{
case 0x00:
status = MI_NOTAUTHERR;
break;
case 0x0a:
status = MI_OK;
break;
case 0x01:
status = MI_VALERR;
break;
default:
status = MI_CODEERR;
break;
}
}
}
}
return status;
}
#endif
706
707 char MF_ChgAvailableKey( unsigned char *uncoded,
708 unsigned char *coded)
709 {
710 1 char idata status = MI_OK;
711 1 unsigned char idata cnt = 0;
712 1 unsigned char idata ln = 0;
713 1 unsigned char idata hn = 0;
714 1 for (cnt = 0; cnt < 6; cnt++)
715 1 {
716 2 ln = uncoded[cnt] & 0x0F;
717 2 hn = uncoded[cnt] >> 4;
718 2 coded[cnt * 2 + 1] = (~ln << 4) | ln;
719 2 coded[cnt * 2 ] = (~hn << 4) | hn;
720 2
721 2 }
722 1 return MI_OK;
723 1 }
724
725 char MF_AuthKey( unsigned char auth_mode,unsigned char *snr,unsigned char *keys,unsigned char block)
-
726 {
727 1 char idata status = MI_OK;
728 1 RC_FlushFIFO();
729 1 ResetInfo(MInfo);
730 1 MF_ChgAvailableKey(keys,SerBuffer);
731 1 MInfo.nBytesToSend = 12;
732 1 if ((status=RC_Command(PCD_LOADKEY,SerBuffer,&MInfo)) == MI_OK)
733 1 {
734 2 status = MF_AuthState(auth_mode,snr,block);
735 2 }
736 1 return status;
C51 COMPILER V7.08 MF_RC500 01/18/2004 17:34:11 PAGE 13
737 1 }
738
739 char MF_AuthState( unsigned char auth_mode,
740 unsigned char *snr,
741 unsigned char block)
742 {
743 1 char idata status = MI_OK;
744 1 unsigned char idata i = 0;
745 1
746 1 status = RC_ReadRC(RegErrorFlag);
747 1 if (status != MI_OK)
748 1 {
749 2 if (status & 0x40)
750 2 status = MI_KEYERR;
751 2 else
752 2 status = MI_AUTHERR;
753 2 }
754 1 else
755 1 {
756 2 SerBuffer[0] = auth_mode;
757 2
758 2 SerBuffer[1] = block;
759 2 memcpy(SerBuffer + 2,snr,4);
760 2 ResetInfo(MInfo);
761 2 MInfo.nBytesToSend = 6;
762 2 if ((status = RC_Command(PCD_AUTHENT1,
763 2 SerBuffer,
764 2 &MInfo)) == MI_OK)
765 2 {
766 3 if (RC_ReadRC(RegSecondaryStatus) & 0x07)
767 3 {
768 4 status = MI_BITCOUNTERR;
769 4 }
770 3 else
771 3 {
772 4 ResetInfo(MInfo);
773 4 MInfo.nBytesToSend = 0;
774 4 if ((status = RC_Command(PCD_AUTHENT2,
775 4 SerBuffer,
776 4 &MInfo)) == MI_OK)
777 4 {
778 5 if ( RC_ReadRC(RegControl) & 0x08 )
779 5 {
780 6 status = MI_OK;
781 6 }
782 5 else
783 5 {
784 6 status = MI_AUTHERR;
785 6 }
786 5 }
787 4 }
788 3 }
789 2 }
790 1 return status;
791 1 }
792 char MF_ReadCard( unsigned char addr,
793 unsigned char *_data)
794 {
795 1 char idata status = MI_OK;
796 1 char idata tmp = 0;
797 1
798 1 RC_FlushFIFO();
C51 COMPILER V7.08 MF_RC500 01/18/2004 17:34:11 PAGE 14
799 1
800 1 RC_SetTmod(tmod_6ms);
801 1 RC_WriteRC(RegChannelRedundancy,0x0F);
802 1 ResetInfo(MInfo);
803 1 SerBuffer[0] = PICC_READ;
804 1 SerBuffer[1] = addr;
805 1 MInfo.nBytesToSend = 2;
806 1 status = RC_Command(PCD_TRANSCEIVE,
807 1 SerBuffer,
808 1 &MInfo);
809 1
810 1 if (status != MI_OK)
811 1 {
812 2 if (status != MI_NOTAGERR )
813 2 {
814 3 if (MInfo.nBitsReceived == 4)
815 3 {
816 4 SerBuffer[0] &= 0x0f;
817 4 if ((SerBuffer[0] & 0x0a) == 0)
818 4 {
819 5 status = MI_NOTAUTHERR;
820 5 }
821 4 else
822 4 {
823 5 status = MI_CODEERR;
824 5 }
825 4 }
826 3 }
827 2 memcpy(_data,"0000000000000000",16);
828 2 }
829 1 else // Response Processing
830 1 {
831 2 if (MInfo.nBytesReceived != 16)
832 2 {
833 3 status = MI_BYTECOUNTERR;
834 3 memcpy(_data,"0000000000000000",16);
835 3 }
836 2 else
837 2 {
838 3 memcpy(_data,SerBuffer,16);
839 3 }
840 2 }
841 1 RC_SetTmod(tmod_1ms);
842 1 return status;
843 1 }
844
845
846 char MF_WriteCard( unsigned char addr,
847 unsigned char *_data)
848 {
849 1 char idata status = MI_OK;
850 1 ResetInfo(MInfo);
851 1 SerBuffer[0] = PICC_WRITE;
852 1 SerBuffer[1] = addr;
853 1 MInfo.nBytesToSend = 2;
854 1 status = RC_Command(PCD_TRANSCEIVE,
855 1 SerBuffer,
856 1 &MInfo);
857 1
858 1 if (status != MI_NOTAGERR)
859 1 {
860 2 if (MInfo.nBitsReceived != 4)
C51 COMPILER V7.08 MF_RC500 01/18/2004 17:34:11 PAGE 15
861 2 {
862 3 status = MI_BITCOUNTERR;
863 3 }
864 2 else
865 2 {
866 3 SerBuffer[0] &= 0x0f;
867 3 if ((SerBuffer[0] & 0x0a) == 0)
868 3 {
869 4 status = MI_NOTAUTHERR;
870 4 }
871 3 else
872 3 {
873 4 if (SerBuffer[0] == 0x0a)
874 4 {
875 5 status = MI_OK;
876 5 }
877 4 else
878 4 {
879 5 status = MI_CODEERR;
880 5 }
881 4 }
882 3 }
883 2 }
884 1
885 1 if ( status == MI_OK)
886 1 {
887 2
888 2 RC_SetTmod(tmod_6ms);
889 2
890 2 ResetInfo(MInfo);
891 2 memcpy(SerBuffer,_data,16);
892 2 MInfo.nBytesToSend = 16;
893 2 status = RC_Command(PCD_TRANSCEIVE,
894 2 SerBuffer,
895 2 &MInfo);
896 2
897 2 if (status & 0x80)
898 2 {
899 3 status = MI_NOTAGERR;
900 3 }
901 2 else
902 2 {
903 3
904 3 if (MInfo.nBitsReceived != 4)
905 3 {
906 4 status = MI_BITCOUNTERR;
907 4 }
908 3 else
909 3 {
910 4 SerBuffer[0] &= 0x0f;
911 4 if ((SerBuffer[0] & 0x0a) == 0)
912 4 {
913 5 status = MI_WRITEERR;
914 5 }
915 4 else
916 4 {
917 5 if (SerBuffer[0] == 0x0a)
918 5 {
919 6 status = MI_OK;
920 6 }
921 5 else
922 5 {
C51 COMPILER V7.08 MF_RC500 01/18/2004 17:34:11 PAGE 16
923 6 status = MI_CODEERR;
924 6 }
925 5 }
926 4 }
927 3 }
928 2 RC_SetTmod(tmod_1ms);
929 2 }
930 1 return status;
931 1 }
932
933 void MF_RfReset(unsigned char ms)
934 {
935 1 if(ms)
936 1 {
937 2 RC_ClearBit(RegTxControl,0x03);
938 2 delay_1ms(4);
939 2 RC_SetBit(RegTxControl,0x03);
940 2 }
941 1 else
942 1 RC_ClearBit(RegTxControl,0x03);
943 1 }
944
945 void delay_50us(unsigned char _50us)
946 {
947 1 while(_50us--)
948 1 {
949 2 WDG=!WDG;
950 2 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
951 2 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
952 2 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
953 2 }
954 1 }
955 void delay_1ms(uchar _1ms)
956 {
957 1 while (_1ms--)
958 1 {
959 2 WDG=!WDG;
960 2 delay_50us(25);
961 2 }
962 1 }
963
964 void delay_10ms(uchar _10ms)
965 {
966 1 while (_10ms--)
967 1 {
968 2 WDG=!WDG;
969 2 delay_1ms(10);
970 2 }
971 1 }
972
973 //RC500 operation interrupt server rount
974 void RC_Interrupt(void) interrupt 0 using 1
975 {
976 1 static unsigned char idata irqBits;
977 1 static unsigned char idata irqMask;
978 1 static unsigned char idata nbytes;
979 1 static unsigned char idata cnt;
980 1
981 1 IE0 = 0;
982 1 RC_WriteRawData(0,0x80);
983 1 if (MpIsrInfo && MpIsrOut)
984 1 {
C51 COMPILER V7.08 MF_RC500 01/18/2004 17:34:11 PAGE 17
985 2 while( RC_ReadRawData(RegPrimaryStatus) & 0x08)
986 2 {
987 3 irqMask = RC_ReadRawData(RegInterruptEn);
988 3 irqBits = RC_ReadRawData(RegInterruptRq) & irqMask;
989 3 MpIsrInfo->irqSource |= irqBits;
990 3 if (irqBits & 0x01)
991 3 {
992 4 nbytes = 64 - RC_ReadRawData(RegFIFOLength);
993 4 if ((MpIsrInfo->nBytesToSend - MpIsrInfo->nBytesSent) <= nbytes)
994 4 {
995 5 nbytes = MpIsrInfo->nBytesToSend - MpIsrInfo->nBytesSent;
996 5 RC_WriteRawData(RegInterruptEn,0x01);
997 5 }
998 4 for ( cnt = 0;cnt < nbytes;cnt++)
999 4 {
1000 5 RC_WriteRawData(RegFIFOData,MpIsrOut[MpIsrInfo->nBytesSent]);
1001 5 MpIsrInfo->nBytesSent++;
1002 5 }
1003 4 RC_WriteRawData(RegInterruptRq,0x01);
1004 4 }
1005 3 if (irqBits & 0x10)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -