📄 mfrc500uc.lst
字号:
742 3 if (nbits)
743 3 {
744 4 WriteRC(RegBitFraming,nbits << 4 | nbits); // TxLastBits/RxAlign auf nb_bi
745 4 nbytes = bcnt / 8 + 1;
746 4 // number of bytes known
747 4
748 4 // in order to solve an inconsistancy in the anticollision sequence
749 4 // (will be solved soon), the case of 7 bits has to be treated in a
750 4 // separate way
751 4 if (nbits == 7 )
752 4 {
753 5 MInfo.RxAlignWA = 1;
754 5 MInfo.nBitsReceived = 7; // set flag for 7 bit anticoll, which is evaluated
755 5 // in the ISRnBitsReceived
756 5 WriteRC(RegBitFraming,nbits); // reset RxAlign to zero
757 5 }
758 4 }
759 3 else
760 3 {
761 4 nbytes = bcnt / 8;
762 4 }
763 3
764 3 MSndBuffer[0] = select_code;
765 3 MSndBuffer[1] = 0x20 + ((bcnt/8) << 4) + nbits; //number of bytes send
766 3
767 3 for (i = 0; i < nbytes; i++) // Sende Buffer beschreiben
768 3 {
769 4 MSndBuffer[i + 2] = snr_in[i];
770 4 }
771 3 MInfo.nBytesToSend = 2 + nbytes;
772 3
773 3 status = PcdSingleResponseCmd(PCD_TRANSCEIVE,
774 3 MSndBuffer,
775 3 MRcvBuffer,
776 3 &MInfo);
777 3
778 3 // in order to solve an inconsistancy in the anticollision sequence
779 3 // (will be solved soon), the case of 7 bits has to be treated in a
780 3 // separate way
781 3 if (MInfo.RxAlignWA)
782 3 {
783 4 // reorder received bits
784 4 dummyShift1 = 0x00;
785 4 for (i = 0; i < MInfo.nBytesReceived; i++)
786 4 {
787 5 dummyShift2 = MRcvBuffer[i];
788 5 MRcvBuffer[i] = (dummyShift1 >> (i+1)) | (MRcvBuffer[i] << (7-i));
789 5 dummyShift1 = dummyShift2;
790 5 }
791 4 MInfo.nBitsReceived -= MInfo.nBytesReceived; // subtract received parity bits
792 4 // recalculation of collision position
793 4 if ( MInfo.collPos ) MInfo.collPos += 7 - (MInfo.collPos + 6) / 9;
794 4 }
795 3
796 3 if ( status == MI_OK || status == MI_COLLERR) // no other occured
797 3 {
798 4
799 4 byteOffset = 0;
C51 COMPILER V7.00 MFRC500UC 03/05/2004 15:25:52 PAGE 14
800 4 if ( nbits != 0 ) // last byte was not complete
801 4 {
802 5 snr_in[nbytes - 1] = snr_in[nbytes - 1] | MRcvBuffer[0];
803 5 byteOffset = 1;
804 5 }
805 4 for ( i =0; i < (4 - nbytes); i++)
806 4 {
807 5 snr_in[nbytes + i] = MRcvBuffer[i + byteOffset];
808 5 }
809 4 // R e s p o n s e P r o c e s s i n g
810 4 if ( MInfo.nBitsReceived != (40 - bcnt) ) // not 5 bytes answered
811 4 {
812 5 status = MI_BITCOUNTERR;
813 5 }
814 4 else
815 4 {
816 5 if (status != MI_COLLERR ) // no error and no collision
817 5 {
818 6 // SerCh check
819 6 snr_crc = snr_in[0] ^ snr_in[1] ^ snr_in[2] ^ snr_in[3];
820 6 snr_check = MRcvBuffer[MInfo.nBytesReceived - 1];
821 6 if (snr_crc != snr_check)
822 6 {
823 7 status = MI_SERNRERR;
824 7 }
825 6 else
826 6 {
827 7 complete = 1;
828 7 }
829 6 }
830 5 else // collision occured
831 5 {
832 6 bcnt = bcnt + MInfo.collPos - nbits;
833 6 status = MI_OK;
834 6 }
835 5 }
836 4 }
837 3 }
838 2 }
839 1 // transfer snr_in to snr - even in case of an error - for
840 1 // debugging reasons
841 1 memcpy(snr,snr_in,4);
842 1
843 1 //----------------------Einstellungen aus Initialisierung ruecksetzen
844 1 ClearBitMask(RegDecoderControl,0x20); // ZeroAfterColl disable
845 1
846 1 return status;
847 1 }
848
849 ///////////////////////////////////////////////////////////////////////
850 // M I F A R E S E L E C T
851 // for std. select
852 ///////////////////////////////////////////////////////////////////////
853 char Mf500PiccSelect(unsigned char *snr,
854 unsigned char *sak)
855 {
856 1 return Mf500PiccCascSelect(0x93,snr,sak); // first cascade level
857 1 }
858
859 ///////////////////////////////////////////////////////////////////////
860 // M I F A R E C A S C A D E D S E L E C T
861 // for extended serial number
C51 COMPILER V7.00 MFRC500UC 03/05/2004 15:25:52 PAGE 15
862 ///////////////////////////////////////////////////////////////////////
863 char Mf500PiccCascSelect(unsigned char select_code,
864 unsigned char *snr,
865 unsigned char *sak)
866 {
867 1 char status = MI_OK;
868 1
869 1 if ((status = Mf500PcdSetDefaultAttrib()) == MI_OK)
870 1 {
871 2 PcdSetTmo(106);
872 2
873 2 WriteRC(RegChannelRedundancy,0x0F); // RxCRC,TxCRC, Parity enable
874 2 ClearBitMask(RegControl,0x08); // disable crypto 1 unit
875 2
876 2 //************* Cmd Sequence **********************************
877 2 ResetInfo(MInfo);
878 2 MSndBuffer[0] = select_code;
879 2 MSndBuffer[1] = 0x70; // number of bytes send
880 2
881 2 memcpy(MSndBuffer + 2,snr,4);
882 2 MSndBuffer[6] = MSndBuffer[2]
883 2 ^ MSndBuffer[3]
884 2 ^ MSndBuffer[4]
885 2 ^ MSndBuffer[5];
886 2 MInfo.nBytesToSend = 7;
887 2 MInfo.DisableDF = 1;
888 2 status = PcdSingleResponseCmd(PCD_TRANSCEIVE,
889 2 MSndBuffer,
890 2 MRcvBuffer,
891 2 &MInfo);
892 2
893 2 *sak = 0;
894 2 if (status == MI_OK) // no timeout occured
895 2 {
896 3 if (MInfo.nBitsReceived != 8) // last byte is not complete
897 3 {
898 4 status = MI_BITCOUNTERR;
899 4 }
900 3 else
901 3 {
902 4 memcpy(MLastSelectedSnr,snr,4);
903 4 }
904 3 }
905 2 // copy received data in any case - for debugging reasons
906 2 *sak = MRcvBuffer[0];
907 2 }
908 1 return status;
909 1 }
910
911 ///////////////////////////////////////////////////////////////////////
912 // M I F A R E P I C C A C T I V A T I O N S E Q E N C E
913 ///////////////////////////////////////////////////////////////////////
914 char Mf500PiccActivateIdle(unsigned char br,
915 unsigned char *atq,
916 unsigned char *sak,
917 unsigned char *uid,
918 unsigned char *uid_len)
919 {
920 1 unsigned char cascade_level;
921 1 unsigned char sel_code;
922 1 unsigned char uid_index;
923 1 signed char status;
C51 COMPILER V7.00 MFRC500UC 03/05/2004 15:25:52 PAGE 16
924 1 unsigned char cmdASEL;
925 1
926 1 *uid_len = 0;
927 1
928 1 //call activation with def. divs
929 1 status = Mf500PcdSetDefaultAttrib();
930 1 if (status == MI_OK)
931 1 {
932 2 status = Mf500PiccCommonRequest(PICC_REQIDL,atq);
933 2 }
934 1 if (status == MI_OK)
935 1 {
936 2 if((atq[0] & 0x1F) == 0x00) // check lower 5 bits, for tag-type
937 2 // all tags within this 5 bits have to
938 2 // provide a bitwise anticollision
939 2 {
940 3 status = MI_NOBITWISEANTICOLL;
941 3 }
942 2 }
943 1 if (status == MI_OK)
944 1 {
945 2 //Get UID in 1 - 3 levels (standard, [double], [triple] )
946 2 //-------
947 2 switch(br)
948 2 {
949 3 case 0: cmdASEL = PICC_ANTICOLL1; break;
950 3 case 1: cmdASEL = PICC_ANTICOLL11; break;
951 3 case 2: cmdASEL = PICC_ANTICOLL12; break;
952 3 case 3: cmdASEL = PICC_ANTICOLL13; break;
953 3 default:
954 3 status = MI_BAUDRATE_NOT_SUPPORTED; break;
955 3 }
956 2 }
957 1 if (status == MI_OK)
958 1 {
959 2 cascade_level = 0;
960 2 uid_index = 0;
961 2 do
962 2 {
963 3 //Select code depends on cascade level
964 3 sel_code = cmdASEL + (2 * cascade_level);
965 3 cmdASEL = PICC_ANTICOLL1; // reset anticollistion level for calculation
966 3 //ANTICOLLISION
967 3 status = Mf500PiccCascAnticoll(sel_code, 0, &uid[uid_index]);
968 3 //SELECT
969 3 if (status == MI_OK)
970 3 {
971 4 status = Mf500PiccCascSelect(sel_code, &uid[uid_index], sak);
972 4 if (status == MI_OK)
973 4 {
974 5 cascade_level++;
975 5
976 5 //we differ cascaded and uncascaded UIDs
977 5 if (*sak & 0x04) // if cascaded, bit 2 is set in answer to select
978 5 {
979 6 //this UID is cascaded, remove the cascaded tag that is
980 6 //0x88 as first of the 4 byte received
981 6 memmove(&uid[uid_index], &uid[uid_index + 1], 3);
982 6 uid_index += 3;
983 6 *uid_len += 3;
984 6 }
985 5 else
C51 COMPILER V7.00 MFRC500UC 03/05/2004 15:25:52 PAGE 17
986 5 {
987 6 //this UID is not cascaded -> the length is 4 bytes
988 6 uid_index += 4;
989 6 *uid_len += 4;
990 6 }
991 5 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -