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

📄 commtran.c

📁 此程序为13.56MHz的RFID底层读写卡程序
💻 C
📖 第 1 页 / 共 4 页
字号:
#include <string.h>
#include "Hardware.h"
#include "MfRc500.h"
#include "RcComm.h"
#include "PcdShare.h"
#include "PcdUtils.h"
#include "MfReg.h"
#include "cardhead.h"
#include "MfErrNo.h"
#include <intrins.h>
#include "x5045.h"
#include "newcard.h"

char code * code send_option[3]={ (char *)I_send4,
                                  (char *)I_send1,
                                  (char *)I_1send56k
                                };

char code * code rec_option[3]={ (char *)I_receive4,
                                 (char *)I_receive1,
                                 (char *)I_1Rda56k,
                               };


uchar  xdata  ComBuffer[MAXLEN];
uchar  xdata  TempBuffer[MAXLEN];
uchar  xdata  MADMessage[32];
uchar  xdata  Auth_code[48];
uchar  xdata  CosBuffer[80];
uchar  idata  GPB;
uchar  idata  snr[5];
static uchar  code version_number[11]="JK105B_V1.0";
uchar  xdata  buf2[16];
extern uchar  Block_Index;
extern uchar idata   sw1,sw2;
extern uchar idata rec_bytelen;
ulong  idata  money2 _at_ 0x30;
ulong  xdata  money1 ;
uchar  len_x;
uchar  len_y;
uint   F;
uchar idata D;
uchar idata Baudrate=0x00;
uchar xdata slot1_baud=0xff;
 /****************************************************************/

  extern unsigned char ResetAllCard(void);
  extern unsigned char RfSwitchOff(void);
  extern unsigned char InitPcd(void);
  extern char OpenRC(void);
  extern void CloseRC(void);
  extern char PcdReadE2(unsigned short startaddr,
               unsigned char length,
               unsigned char * DataBuffer);
  extern void ModifyBaudrate12(void);    // pps comand /

/***************************************************************************************************/

      void CommTransact(void)
        {

        uchar  Status,flag1=0;
        uchar idata key_type,keytest;
        uchar idata i,j,key_index,cardsequ,k;
	uchar idata len_index,LEN1,LEN2;
	uchar idata sector_n,block_n,flag=0;
        uchar idata block_ob,Requestmode,piccvaluecmd;
        uchar xdata buf[25],key[6],temp[4];
        uchar ICProtol;
        uint  RAM_address;
        uchar xdata  wdtkey[6];
        uint  xdata  freq;
                           if(flag)
                           {
                            Status=cpucard_send(0x00,(void *)(send_option[0]));
                            Status=cpucard_rec(&sw1,(void *)(rec_option[cardsequ]));
                            block_n=ResetAllCard();
                            block_n=RfSwitchOff();
                            block_n=InitPcd();
                            block_n=OpenRC();
                            CloseRC();
                            block_n=PcdReadE2(00,10,buf);
                           }


        if((ComBuffer[2]==0x39)||(ComBuffer[2]==0x3b)||(ComBuffer[2]==0x52)
      	                       ||(ComBuffer[2]==0x54)||(ComBuffer[2]==0x56)
                               ||(ComBuffer[2]==0x60)) //readfile  writefile decrement increment
	{
	    Status=CheckMad(&sector_n);       /*get sector no.*/
      	    if(Status!=MI_OK) return;

      	    //"当ComBuffer[5]==0时,直接使用KEYSET1的密钥认证
      	    //"当ComBuffer[5]!=0时, 使用SAM卡导出密钥认证
      	    if((ComBuffer[2]==0x39)||(ComBuffer[2]==0x60)) //writefile    and increment
      	         keytest=0x04;    //KEYB
      	    else keytest=0x00;    //KEYA

      	    if(ComBuffer[5]!=0x00)
            {
                Status=Creat_key(keytest,sector_n,ComBuffer[5],key);
                flag1=1;
                if(Status!=MI_OK) return;
            }
            if(keytest==0x04)
            {
             key_type=PICC_AUTHENT1B;
            }
            else key_type=PICC_AUTHENT1A;
            block_n=sector_n<<2;
            if(flag1)
            {
             Status=MF1_authkey(key_type,key,block_n);
            }
            else Status=MF1_auth(key_type,sector_n,block_n);
            if(Status!=MI_OK)
            {
                SendResponse(0x81,1,buf);
                return;
            }
        }
        if((ComBuffer[2]==0x51)||(ComBuffer[2]==0x53)||(ComBuffer[2]==0x55)||ComBuffer[2]==0x59)
        {   /*" 格式:3-密钥类型  4-扇区号 */
            if(ComBuffer[3]==0x01)
	    {
	        keytest=PICC_AUTHENT1B;
	    }
	    else keytest=PICC_AUTHENT1A;

	    sector_n=ComBuffer[4];
            block_n=sector_n<<2;
	    Status=MF1_auth(keytest,sector_n,block_n);
            if(Status!=MI_OK)
            {
                SendResponse(0x81,1,buf);
                return;
            }
     	}
	switch(ComBuffer[2])
	{
	  case 0x35:          /* open reader */

                 Power_on();
                 SleepMs(100);
                 SendResponse(0x01,1,buf);
                 break;

	  case 0x36:                 /* close reader */
   	 	 Power_off();
   	 	 SleepMs(10);
   	 	 SendResponse(0x01,1,buf);
	         SetBaud(Baud115200);
                 break;

	  case 0x37:		     /* Select ADF */
	         if(ComBuffer[1]==3)
	         {
	            buf[0]=ComBuffer[3];
	            buf[1]=ComBuffer[4];
	         }
	         else
	         {
	            buf[0]=0x10;
	            buf[1]=0x03;
                 }
	         Status=SelectADF(buf);
	         SleepMs(10);
	         if(Status==MI_OK)  SendResponse(0x01,1,buf);
	         else SendResponse(0x91,1,buf);    /*ADF error*/
                 break;


        case 0x31:       	         // opencard
               if(ComBuffer[4]==0x00)
	         {
	          key_index=0xF0;
	         }
	         else
	         {
	          if(ComBuffer[3]==0x26)
	          {
	           key_index=0;
	          }
	          else key_index=1;
	         }
	         Status=OpenCard(key_index);

	         if(Status!=MI_OK) return;

                  Read_Ram(0x0000,wdtkey,6);                  //read key from dog's E2ROM
                  Status=MF1_authkey(PICC_AUTHENT1A,wdtkey,0);

	    	 if(Status!=MI_OK)
	    	 {
                   SendResponse(0x81,6,snr);                 // authentication error
                   return;
                 }
                 for(i=1;i<3;i++)                           //get mad message
                 {
                    Status=MF1_read_key(PICC_AUTHENT1A,i,MADMessage+((i-1)<<4),wdtkey);
                    if(Status!=MI_OK) break;
                 }
                 if(Status==MI_OK)
                 {
                    Status=MF1_read_key(PICC_AUTHENT1A,3,buf,wdtkey);
                    if(Status==MI_OK)
                    {
                    	GPB=buf[9];
                    	Read_Ram(0x0010,wdtkey,6);
                        Status=MF1_authkey(PICC_AUTHENT1A,wdtkey,60);    //2003.1.15
                    	if(Status==MI_OK)
                    	{
                    	   for(i=0;i<3;i++)
                    	   {
                    	      Status=MF1_read_key(PICC_AUTHENT1A,60+i,Auth_code+(i<<4),wdtkey);
                    	      if(Status!=MI_OK) break;
                    	   }
                    	}
                    }
                 }
                 if(Status==MI_OK) SendResponse(0x01,6,snr);
                 else SendResponse(0x80,6,snr);
                 break;


            case 0xF1:       	     //"为浙江作的程序,认证码区的由标识来确定,要求
	                             //"使用loadkey方式将32-47(KEYSET1)密钥下载
	         //"格式:60 05 f1 (卡片打开方式1字节(all或idle))(多卡标志1字节)(认证码区标识2字节)
	         //      0   1  2              3                           4             5 6
	         if(ComBuffer[4]==0x00)
	         {
	            key_index=0xF0;
	         }
	         else
	         {
	            if(ComBuffer[3]==0x26)
	            {
	               key_index=0;
	            }
	            else key_index=1;
	         }
	         Status=OpenCard(key_index);

	         if(Status!=MI_OK) return;


                 Read_Ram(0x0000,wdtkey,6);                   //read key from dog's E2ROM 2003.1.15
                 Status=MF1_authkey(PICC_AUTHENT1A,wdtkey,0); //
	    	 if(Status!=MI_OK)
	    	 {
                   SendResponse(0x81,6,snr);                  // authentication error */
                   return;
                 }

	    	 for(i=1;i<3;i++)                            //get mad message*/
                 {
                  Status=MF1_read_key(PICC_AUTHENT1A,i,MADMessage+((i-1)<<4),wdtkey);
                  if(Status!=MI_OK) break;
                 }

                 if(Status==MI_OK)
                 {
                  Status=MF1_read_key(PICC_AUTHENT1A,3,buf,wdtkey);
                  if(Status==MI_OK)
                    {
                    	GPB=buf[9];
                    	//"取认证码区地址
                    	ComBuffer[3]=ComBuffer[5];
                    	ComBuffer[4]=ComBuffer[6];
                    	Status=CheckMad3(&sector_n);
                    	if(Status!=MI_OK) return;
                        Read_Ram(0x0010,wdtkey,6);
                        Status=MF1_authkey(PICC_AUTHENT1A,wdtkey,60);    //2003.1.15
                    	if(Status==MI_OK)
                    	{
                    	   block_n=(sector_n<<2);
                    	   for(i=0;i<3;i++)
                    	   {
                    	    Status=MF1_read_key(PICC_AUTHENT1A,block_n+i,Auth_code+(i<<4),wdtkey);
                    	    if(Status!=MI_OK) break;
                    	   }
                    	}
                    }
                 }
                 if(Status==MI_OK) SendResponse(0x01,6,snr);
                 else SendResponse(0x80,6,snr);

                 break;

           case 0x38:                                 /* close card */
	         Status=Mf500PiccHalt();
	         if(Status==MI_OK)
	         {
	            SendResponse(0x01,1,buf);
	         }
	         else
	         {
	            SendResponse(0x80,1,buf);
	         }

	         break;

           case 0xc1:                                /* change baudrate */
	         SendResponse(0x01,1,buf);
	         SetBaud(ComBuffer[3]);
                 break;

           case 0x32:                                /* read block */

	         sector_n=ComBuffer[4]>>2;           /* sector no. */
	         block_n=ComBuffer[4];               /* block no. */
	         if(ComBuffer[3]==0x01)
	         {
	           key_type=PICC_AUTHENT1B;
	          }
                 else key_type=PICC_AUTHENT1A;
	         Status=MF1_auth(key_type,sector_n,block_n);
	         if(Status==MI_OPEN_ERROR)
	         {
	            SendResponse(0x00,1,buf);
	            return;
	         }
	         if(Status==MI_AUTH_ERROR)
	         {
	            SendResponse(0x81,1,buf);
	            return;
	         }

	         Status=MF1_read(key_type,block_n,buf);

                 if(Status==MI_OK)
	         {
	             SendResponse(0x01,17,buf);
	         }
	         else
	         {
	             SendResponse(0x80,1,buf);
                 }

	         break;

           case 0x33:                                // write block
                 sector_n=ComBuffer[4]>>2;           // sector no.
	         block_n=ComBuffer[4];               // block no.

	         if(ComBuffer[3]==0x01)
	         {
	           key_type=PICC_AUTHENT1B;
	          }
                 else key_type=PICC_AUTHENT1A;

	         Status=MF1_auth(key_type,sector_n,block_n);

	         if(Status==MI_OPEN_ERROR)
	         {
	            SendResponse(0x00,1,buf);
	            return;
	         }
	         if(Status==MI_AUTH_ERROR)
	         {
	            SendResponse(0x81,1,buf);
	            return;
	         }

	         Status=MF1_write(key_type,block_n,ComBuffer+5);

	         if(Status==MI_OK)
	         {
	             SendResponse(0x01,1,buf);
	         }
	         else
	         {
	             SendResponse(0x80,1,buf);
                 }
                 break;

        case 0x41:                          /*open more cards*/
	         for(i=0;i<10;i++)
	         {
	           Status=Mf500PiccRequest(PICC_REQIDL,buf);
	           if(Status==MI_OK) break;
	         }
	         if(Status!=MI_OK)
	         {
	            SendResponse(0x00,1,buf);
	            return;
	         }

⌨️ 快捷键说明

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