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

📄 card.c

📁 此程序为13.56MHz的RFID底层读写卡程序
💻 C
字号:
#include <string.h>
#include "Hardware.h"
#include <absacc.h>
#include "RcComm.h"
#include "PcdShare.h"
#include "PcdUtils.h"
#include "MfReg.h"
#include "MfRc500.h"
#include "MfErrNo.h"
#include <intrins.h>
extern void   W_DOG(void);
extern void   SendMsError(void);
extern void   SendResponse(uchar status,uchar len,uchar *datapr);
extern uchar  picc_b_rats (uchar *ats_part);
extern uchar xdata Auth_code[48];
extern uchar xdata MADMessage[32];
extern uchar xdata ComBuffer[MAXLEN];
extern uchar idata GPB;
extern uchar idata snr[5];
uchar  Block_Index;
uchar  Open_next(void);





/********************************************************************
* Function:		OpenCard								*
*																	*
* input:														*
* output:		snr													*
********************************************************************/



uchar OpenCard(uchar ins_type)
{
    uchar Status,buf[4],i0,ins_mark;
     W_DOG();
    if(ins_type==1)
    {
    	ins_mark=PICC_REQALL;
    }
    else ins_mark=PICC_REQIDL;

    for(i0=0;i0<6;i0++)
    {

      Status=Mf500PiccRequest(ins_mark,buf);    //  ins_mark

      if(Status==MI_OK) break;
    }

    if(Status!=MI_OK)
    {
       SendResponse(0x00,1,buf);  /* no card */
       return Status;
    }

    Status=Mf500PiccAnticoll (0,snr);
    if(Status==MI_OK)
    {
      Status=Mf500PiccSelect(snr,buf);
      if(Status==MI_OK)
      {
      	snr[4]=buf[0];
      	if(snr[4]==0x20)     //mifare pro
      	{
      	   Status=picc_b_rats (buf);        //comand request ATS 2002.11.26
           if(Status!=MI_OK)
           {
              SendResponse(0x80,1,buf);
              return Status;
           }
           Block_Index=0;

           SendResponse(0x01,6,snr);
           return MIF_PRO;
        }

        if(ins_type==0xF0) return MI_OK;
        Status=Mf500PiccHalt();
        for(i0=0;i0<6;i0++)
        {
           Status=Mf500PiccRequest(PICC_REQIDL,buf);
           if(Status==MI_OK)
           {
             Status=Mf500PiccAnticoll (0,buf);
             if(Status==MI_OK)
             {
               if(memcmp(snr,buf,4)!=0) break;   /*if snr(4byte) is different from
                                                        buf(4byte)  break*/
               Status=Mf500PiccSelect(buf,buf);
               Status=Mf500PiccHalt();
               Status=MI_SINGLE_CARD;
             }
           }
        }
        if(Status==MI_OK)
        {

           SendResponse(0x02,1,buf); /* any card */
           return MI_ANY_CARD;
        }
        else
        {
           Status=Open_next();
           if(Status!=MI_OK) SendResponse(0x00,1,buf);
           return Status;
        }
      }
    }
    SendResponse(0x80,1,buf);
    return Status;
}

/********************************************************************
* Function:		Open_next
*																	*
* input:														*
* output:		status													*
********************************************************************/
uchar Open_next(void)
{
   uchar Status,buf[4],i5;
   W_DOG();
   Status=Mf500PiccHalt();
   for(i5=0;i5<6;i5++)
   {
      Status=Mf500PiccRequest(PICC_REQALL,buf);
      if(Status==MI_OK) break;
   }
   if(Status==MI_OK)
   {
      Status=Mf500PiccSelect(snr,buf);
      if(Status==MI_OK)   return MI_OK;
   }
   return MI_OPEN_ERROR;
}



uchar MF1_auth(uchar keytype_set,uchar sector_no,uchar block_no)
{
   uchar Status;
    W_DOG();
    block_no=sector_no<<2;
   Status=Mf500PiccAuth(keytype_set,sector_no,block_no);//key in RAM to auth
   if(Status==MI_OK)  return MI_OK;

   Status=Open_next();
   if(Status!=MI_OK)
   {
         return MI_OPEN_ERROR;
   }

   Status=Mf500PiccAuth(keytype_set,sector_no,block_no);

   if(Status!=MI_OK) return  MI_AUTH_ERROR;
   return MI_OK;
}

uchar MF1_authkey(char key_type,char *key,char block_n)
{
   uchar idata Status,buf4[12];

   W_DOG();
 
   Status=Mf500HostCodeKey(key,buf4);
   if(Status!=MI_OK)
    {
     SendResponse(0x81,1,buf4);
     return MI_HOSTCODE_ERROR;
   }
   Status=Mf500PiccAuthKey(key_type,snr,buf4,block_n);
   if(Status==MI_OK)  return MI_OK;

   Status=Open_next();
   if(Status!=MI_OK)
   {
         return MI_OPEN_ERROR;
   }

   Status=Mf500PiccAuthKey(key_type,snr,buf4,block_n);

   if(Status!=MI_OK) return  MI_AUTH_ERROR;
   return MI_OK;
}

uchar MF1_read_key(uchar keytype_set,uchar block_n,uchar *databuf,char *key)
{
   uchar Status,sector_n,i2;
   W_DOG();
   sector_n=(block_n>>2);
   Status=Mf500PiccRead(block_n,databuf);
   if(Status!=MI_OK)
   {
   	for(i2=0;i2<3;i2++)
   	{
   	   Status=Open_next();
   	   if(Status!=MI_OK)
   	   {
   	      Status=MI_OPEN_ERROR;
	      continue;
	   }

           Status=MF1_authkey(keytype_set,key,block_n);
	   if(Status!=MI_OK)
	   {
	      Status=MI_AUTH_ERROR;
	      continue;
	   }
          Status=Mf500PiccRead(block_n,databuf);
	   if(Status==MI_OK) break;
	}
   }

   return Status;
}

uchar MF1_write_key(uchar keytype_set,uchar block_n,uchar *databuf,char *key)
{
   uchar Status,sector_n,i3;
   W_DOG();
   sector_n=(block_n>>2);

   Status=Mf500PiccWrite(block_n,databuf);
   if(Status!=MI_OK)
   {
   	for(i3=0;i3<3;i3++)
   	{
   	   Status=Open_next();
   	   if(Status!=MI_OK)
   	   {
   	      Status=MI_OPEN_ERROR;
	      continue;
	   }

           Status=MF1_authkey(keytype_set,key,block_n);
	   if(Status!=MI_OK)
	   {
	      Status=MI_AUTH_ERROR;
	      continue;
	   }

          Status=Mf500PiccWrite(block_n,databuf);
	   if(Status==MI_OK) break;
	}
   }

   return Status;
}

uchar MF1_read(uchar keytype_set,uchar block_n,uchar *databuf)
{
   uchar Status,sector_n,i2;
   W_DOG();
   sector_n=(block_n>>2);
   Status=Mf500PiccRead(block_n,databuf);
   if(Status!=MI_OK)
   {
   	for(i2=0;i2<3;i2++)
   	{
   	   Status=Open_next();
   	   if(Status!=MI_OK)
   	   {
   	      Status=MI_OPEN_ERROR;
	      continue;
	   }
	   Status=Mf500PiccAuth(keytype_set,sector_n,block_n);
	   if(Status!=MI_OK)
	   {
	      Status=MI_AUTH_ERROR;
	      continue;
	   }
          Status=Mf500PiccRead(block_n,databuf);
	   if(Status==MI_OK) break;
	}
   }

   return Status;
}

uchar MF1_write(uchar keytype_set,uchar block_n,uchar *databuf)
{
   uchar Status,sector_n,i3;
   W_DOG();
   sector_n=(block_n>>2);

   Status=Mf500PiccWrite(block_n,databuf);
   if(Status!=MI_OK)
   {
   	for(i3=0;i3<3;i3++)
   	{
   	   Status=Open_next();
   	   if(Status!=MI_OK)
   	   {
   	      Status=MI_OPEN_ERROR;
	      continue;
	   }

          Status=Mf500PiccAuth(keytype_set,sector_n,block_n);
	   if(Status!=MI_OK)
	   {
	      Status=MI_AUTH_ERROR;
	      continue;
	   }

          Status=Mf500PiccWrite(block_n,databuf);
	   if(Status==MI_OK) break;
	}
   }

   return Status;
}



uchar CheckMad(uchar *sec_no)
{
   uchar i,buf[2];
   W_DOG();
   if(GPB==0x69)
   {  /* non-personalized card */
      SendResponse(0x84,1,buf);
      return MI_GPB_ERROR;
   }

   if((GPB&&0x01)==0x00)
   {	    /* not MAD */
     SendResponse(0x83,1,buf);
     return MI_NO_MAD;
   }

   for(i=2;i<32;i=i+2)
   {
      if(memcmp(ComBuffer+3,MADMessage+i,2)==0)
      break;
   }

   if(i<32)
   {
      *sec_no=i>>1;
      return MI_OK;
   }

   SendResponse(0x85,1,buf);
   return MI_MAD_ERROR;
}

//"检测同一文件名的多个扇区
uchar CheckMad2(uchar *s_array)
{
   uchar i,buf[2];
   uchar j;
   W_DOG();
   if(GPB==0x69)
   {                                          // non-personalized card
      SendResponse(0x84,1,buf);
      return MI_GPB_ERROR;
   }

   if((GPB&&0x01)==0x00)
   {	                                      // not MAD
     SendResponse(0x83,1,buf);
     return MI_NO_MAD;
   }

   j=0;
   for(i=2;i<32;i=i+2)
   {
      if(memcmp(ComBuffer+3,MADMessage+i,2)==0)
      {
      	j++;
      	s_array[j]=(i>>1);
      }
   }

   if(j>0)
   {

      s_array[0]=j;
      return MI_OK;
   }

   SendResponse(0x85,1,buf);
   return MI_MAD_ERROR;
}

 //"使用于对认证码区的定位
uchar CheckMad3(uchar *sec_no)
{
   uchar i;
   W_DOG();
   if(GPB==0x69)
   {                                                    // non-personalized card
      SendResponse(0x84,6,snr);
      return MI_GPB_ERROR;
   }

   if((GPB&&0x01)==0x00)
   {	                                              // not MAD
     SendResponse(0x83,6,snr);
     return MI_NO_MAD;
   }

   for(i=2;i<32;i=i+2)
   {
      if(memcmp(ComBuffer+3,MADMessage+i,2)==0)
      break;
   }

   if(i<32)
   {
      *sec_no=i>>1;
      return MI_OK;
   }

   SendResponse(0x85,6,snr);
   return MI_MAD_ERROR;
}

⌨️ 快捷键说明

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