📄 duxiexitongrc500.lst
字号:
568 3 }
569 2 temp = ErrorFlag;
570 2 // if((temp & 0x02)==0x02)
571 2 // return(RC500_PARITYERR);
572 2 // if((temp & 0x04)==0x04)
573 2 // return(RC500_FRAMINGERR);
574 2 temp=FIFO_Length;
575 2 //sen(temp);
576 2 if (temp==0)
577 2 {
578 3 //sen(0x30);
579 3 return RC500_BYTECOUNTERR;//
580 3 }
581 2 Read_FIFO(buffer);//05
582 2 Save_UID(row, col, temp); //将收到的UID放入UID数组中
583 2 temp = ErrorFlag; //判断接収数据是否出错
584 2 temp = temp & 0x01;
585 2 if(temp == 0x00)
586 2 {
587 3 temp = Check_UID(); //校验收到的UID
588 3 if(temp == FALSE)
589 3 {
590 4 //sen(0x30);
591 4 return(RC500_SERNRERR);
592 4 }
593 3 //sen(0x03);
594 3 return(RC500_OK);
595 3 }
596 2 else
597 2 {
598 3
599 3 temp = CollPos; //读取冲突检测寄存器
600 3 //sen(0x30);
601 3 row = temp / 8;
602 3 col = temp % 8;
603 3 buffer[0] = RF_CMD_ANTICOL;
604 3 Set_BitFraming(row + pre_row, col); //设置待发送数据的字节数
605 3 pre_row = pre_row + row;
606 3 for(i = 0; i < pre_row + 1; i++)
607 3 {
608 4 buffer[i + 2] = UID[i];
609 4 }
610 3 if(col != 0x00)
611 3 {
C51 COMPILER V7.06 DUXIEXITONGRC500 06/29/2008 08:54:14 PAGE 11
612 4 row = pre_row + 1;
613 4 }
614 3 else
615 3 {
616 4 row = pre_row;
617 4 }
618 3 temp = Command_Send(row + 2, buffer, Transceive);
619 3 }
620 2 }
621 1 }
622 /****************************************************************/
623 /*名称: powerdown */
624 /*功能: 该函数实现RC500处于软件掉电模式 */
625 /***************************************************************/
626 /*uchar Powerdown(void)
627 {
628
629 CRCPresetLSB=0x63;
630 CWConductance=0x3f;
631 ChannelRedundancy=0x03;
632 MFOUTSelect=0x02;//调整输出功率以及电流消耗和操作距离.
633 TxControl=0x50;//TX2/1上的输出信号能量载波
634 Control=0x10;
635 DelayMS(200);
636 //Control=0x10;
637 DelayMS(1000);
638 //NCS = 1;//guanpianxuan
639 CardStatus=0x01;
640 return(CardStatus);
641
642
643 }*/
644
645 /****************************************************************/
646 /*名称: MIF_Halt */
647 /*功能: 该函数实现暂停MIFARE卡 */
648 /*输出: RC500_OK: 应答正确 */
649 /* RC500_PARITYERR: 奇偶校验错 */
650 /* RC500_CRCERR: CRC校验错 */
651 /* RC500_NOTAGERR: 无卡 */
652 /****************************************************************/
653 uchar MIF_Halt(void)
654 {
655 1 uchar temp;
656 1 uint i;
657 1 CRCPresetLSB=0x63;
658 1 CWConductance=0x3f;
659 1 ChannelRedundancy=0x03;
660 1 *buffer=RF_CMD_HALT;
661 1 *(buffer+1)=0x00;
662 1 temp=Command_Send(2,buffer,Transmit);
663 1 if
664 1 (temp==TRUE)
665 1 {
666 2 for(i=0;i<0x50;i++)
667 2 {
668 3 _nop_();
669 3 }
670 2 //sen(0x01);
671 2 return RC500_OK;
672 2 }
673 1 else
C51 COMPILER V7.06 DUXIEXITONGRC500 06/29/2008 08:54:14 PAGE 12
674 1 {
675 2 //sen(temp);
676 2 //sen(0x10);
677 2 temp=ErrorFlag;
678 2 if((temp&0x02)==0x02)
679 2 {
680 3 return RC500_PARITYERR;
681 3 }
682 2 if((temp&0x04)==0x04)
683 2 {
684 3 return RC500_FRAMINGERR;
685 3 }
686 2 return RC500_NOTAGERR;
687 2 }
688 1 }
689 ////////////////////////////////////////////////////////
690 uchar Select_Card(void)
691 {
692 1 uchar temp,i;
693 1 CRCPresetLSB=0x63;
694 1 CWConductance=0x3f;
695 1 buffer[0] =RF_CMD_SELECT;//0x93
696 1 buffer[1]=0x70;
697 1 for(i=0;i<5;i++)
698 1 {
699 2 buffer[i+2]=UID[i];
700 2 //sen(buffer[i+2]);
701 2 }
702 1 //Bit_Frame=0x07;
703 1 ChannelRedundancy=0x0f;//对发送数据进行CRC/接收帧的最后字节被解释为CRC
704 1 temp=Command_Send(7,buffer,Transceive);
705 1 if(temp==FALSE)
706 1 {
707 2 //sen(0x40);
708 2 return(RC500_NOTAGERR);
709 2 }
710 1 else
711 1 {
712 2 temp=ErrorFlag;
713 2 //sen(ErrorFlag);//40
714 2 if((temp&0x02)==0x02)
715 2 //return(RC500_PARITYERR);//卡片奇偶校验错误
716 2
717 2 if((temp&0x04)==0x04)
718 2 //sen(RC500_FRAMINGERR);
719 2 return (RC500_FRAMINGERR);//FM1715帧错误
720 2 if((temp&0x08)==0x08)
721 2 return (RC500_CRCERR); //卡片CRC校验错误
722 2 temp=FIFO_Length;
723 2 //sen(FIFO_Length);
724 2 if(temp!=1)
725 2 return(RC500_BYTECOUNTERR);////从卡片接收到的字节数错误
726 2 Read_FIFO(buffer);//01
727 2 temp=*buffer;
728 2 //sen(temp); //08
729 2 if((temp==0x08)||(temp==0x88)||(temp==0x53))
730 2 {
731 3 //sen(0x04);
732 3 return(RC500_OK);
733 3 }
734 2 else {
735 3 //sen(0x40);
C51 COMPILER V7.06 DUXIEXITONGRC500 06/29/2008 08:54:14 PAGE 13
736 3 return(RC500_SELERR);
737 3 }
738 2 }
739 1 }
740 //////////////////////////////////////////////////////
741 uchar RC500_Bus_Sel(void) //zhong线选择;通过
742 {
743 1 uchar i;
744 1 Page_Sel=0x80;
745 1 for(i=0;i<RF_TimeOUT;i++)
746 1 {
747 2 if(Command ==0x00)
748 2 {
749 3 Page_Sel=0x00;
750 3 //for (j=0;j<5;j++)
751 3 //sen(tongxunceshixinxi[j]);
752 3 //sen(0x99);
753 3 return TRUE;
754 3 }
755 2 }
756 1 return FALSE;
757 1 //for (j=0;j<5;j++)
758 1 // sen(cuowufanhui[i]);
759 1 }
760 ////////////////////////////////////////////////////////////密码认证的过程
761 uchar mimarenzhen(uchar idata *UID,uchar SecNR,uchar mode)
762 {
763 1 uchar idata i;
764 1 uchar idata temp,temp1;
765 1 CRCPresetLSB = 0x63;
766 1 CWConductance = 0x3f;
767 1 //ModConductance = 0x3f;
768 1 temp1 = Control;
769 1 //sen(temp1); //00
770 1 temp1 = temp1 & 0xf7;
771 1 Control = temp1;
772 1 CardStatus=0;
773 1 if (mode == 1)
774 1 buffer[0] = RF_CMD_AUTH_LB;
775 1 else
776 1 //sen(0x06);
777 1 buffer[0] = RF_CMD_AUTH_LA;
778 1 buffer[1] = SecNR * 4 + 3;//2008年4月26日改SECNR为块号原先为扇区号!
-
-
-
-
779 1 for (i = 0; i < 4; i++)
780 1 {
781 2 buffer[2 + i] = UID[i];
782 2 /////sen(buffer[2 + i]);
783 2 }
784 1 ChannelRedundancy = 0x0f; //开启CRC,奇偶校验校验
785 1 temp = Command_Send(6, buffer, Authent1);//验证命令认证过程第1步
786 1 ////sen(temp);//01
787 1 if (temp == FALSE)
788 1 {//sen(0x60);
789 2 CardStatus=0;
790 2 return RC500_NOTAGERR;
791 2 }
792 1 temp = ErrorFlag;
793 1 //sen(ErrorFlag);//40//00
C51 COMPILER V7.06 DUXIEXITONGRC500 06/29/2008 08:54:14 PAGE 14
794 1 if ((temp & 0x02) == 0x02)
795 1 return RC500_PARITYERR;//
796 1 if((temp & 0x04) == 0x04)
797 1 return RC500_FRAMINGERR;//
798 1 if ((temp & 0x08) == 0x08)
799 1 return RC500_CRCERR;
800 1 //for (i = 0; i < 4; i++)
801 1 // {
802 1 //buffer[2 + i] = 0x00;}
803 1 temp = Command_Send(0, buffer, Authent2); //验证命令认证过程第2步
804 1 if(temp == FALSE)
805 1 {CardStatus=0;
806 2 // P13=1;
807 2 //P14=1;
808 2 return RC500_NOTAGERR;
809 2 }
810 1 temp = ErrorFlag;
811 1 //sen(ErrorFlag);//00
812 1 if ((temp & 0x02) == 0x02)
813 1 return RC500_PARITYERR;
814 1 if((temp & 0x04) == 0x04)
815 1 return RC500_FRAMINGERR;
816 1 if ((temp & 0x08) == 0x08)
817 1 return RC500_CRCERR;
818 1 temp1 = Control;
819 1 temp1 = temp1 & 0x08; //Crypto1on=1验证通过
820 1 if (temp1 == 0x08)
821 1 {
822 2 CardStatus=0x01;
823 2 return RC500_OK;
824 2 }
825 1 CardStatus=0;
826 1 return RC500_AUTHERR;
827 1 }
828 /****************************************************************/
829 /*名称: Load_keyE2 */
830 /*功能: 该函数实现把修改后的密码存入FM1715的keybuffer中 */
831 /*输入: Secnr: EE起始地址 */
832 /*输出: True: 密钥装载成功 */
833 /* False: 密钥装载失败 */
834 /****************************************************************/
835 /*uchar Load_keyE2_CPY(uchar Secnr,uchar Mode)
836 {
837 uchar temp;
838 uchar msb = 0;
839 uchar lsb = 0;
840 temp = Secnr * 12;
841 if (Mode == 0)
842 {
843 sen(temp);//84
844 if (temp >= 0x80) //计算密码存放地址
845 {
846 lsb = temp - 0x80;//0x04
847 msb = 0x01;
848 }
849 else
850 {
851 msb = 0x00;
852 lsb = temp + 0x80;
853 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -