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

📄 sam.c

📁 此程序为13.56MHz的RFID底层读写卡程序
💻 C
字号:
#include "Hardware.h"
#include "MfErrNo.h"
#include "MfRc500.h"
#include <string.h>
#include "MFREG.h"
#include "PCDUTILS.h"
 /***********************************************************************/

extern void  W_DOG(void);
extern void  SendResponse(uchar status,uchar len,uchar *datapr);
extern uchar I_receive1(uchar *ch);
extern void  I_send1(uchar I_data);
extern uchar idata snr[5];
extern uchar xdata ComBuffer[MAXLEN];
extern uchar xdata Auth_code[48];

uchar idata sw1,sw2;
uchar idata rec_bytelen;

void I_send(uchar I_data)
   {
     I_send1(I_data);

   }

char I_receive()
    {
      char ch;
       I_receive1(&ch);
       return ch;
    }



void Power_on()
{
     uint idata i,j;

     RST1=0;
     IO1=1;
     for(i=0;i<200;i++)
     {
       W_DOG();
       for(j=0;j<30;j++)
       {
         ;
       }
     }
     RST1=1;
     SleepMs(100);
     //SetBitMask(RegTxControl,0x03);
}

void Power_off()
{
     //PON=1;
     //mifs_close_rf();     /*2002007.17*/
     //ClearBitMask(RegTxControl,0x03);
     SleepMs(50);
}


void Reset1()
{
     uint i,j;
     IO1=1;
     RST1=0;

     for(i=0;i<400;i++)
     {
       W_DOG();
       for(j=0;j<30;j++)
       {
         ;
       }
     }
     RST1=1;

}


/***************************************************/
/*          SelectADF

/***************************************************/
uchar SelectADF(uchar *dir)
{
    uchar temp_buf[2],i,j;

    W_DOG();

    I_send(0x00);
    I_send(0xa4);
    I_send(0x00);
    I_send(0x00);
    I_send(0x02);

    sw1=I_receive();

    for(i=0;i<60;i++)
    {
       ;
    }

    I_send(dir[0]);
    I_send(dir[1]);

    sw1=I_receive();
    sw2=I_receive();

    if(sw1!=0x61)
    {
       if((sw1==0x90)&&(sw2==0x00)) return MI_OK;
       else
       {
       	  return SAM_ADF_ERROR;
       }
    }

    for(i=0;i<60;i++)
    {
       ;
    }

    j=sw2+2;
    I_send(0x00);
    I_send(0xc0);
    I_send(0x00);
    I_send(0x00);
    I_send(sw2);

    sw1=I_receive();
    for(i=0;i<j;i++)
    {
       temp_buf[0]=I_receive();
    }

    return MI_OK;
}
/*
卡片的认证码区格式:
0-1:城市代码 2-3:发行流水号低2字节
4-43:10个认证码
44-47:认证码区的校验码
key_index分成2个部分,低4位为DES加密密钥标识(0-15,当为0时使用认证密钥计算扇区密钥)
高4位为认证密钥标识(1-10)

key_id1为认证密钥标识,
key_id2为加密密钥标识。
*/
uchar Creat_key(uchar keymode,uchar sector_nr,uchar key_index,uchar* new_key )
{
     uchar idata buf[13],i;
     uchar key_no,key_id1,key_id2;

     W_DOG();
     key_no=(sector_nr<<1);
     if(keymode!=0x00)            //11.20  0x00-->0x60
     {
        key_no+=1;
        keymode=PICC_AUTHENT1B;
     }
     else  keymode=PICC_AUTHENT1A;    //11.20
     key_id1=(key_index&0xF0)>>4;
     key_id2=(key_index&0x0F);
     i=key_id1<<2;

     memcpy(buf,Auth_code,2);
     memcpy(buf+2,snr,4);
     memcpy(buf+6,Auth_code+2,2);
     memcpy(buf+8,Auth_code+i,4);
     buf[12]=key_no;

     I_send(0x80);
     I_send(0xfc);
     I_send(key_id2);
     I_send(key_id1);
     I_send(0x0d);

     sw1=I_receive();

     for(i=0;i<60;i++)
     {
       ;
     }

     for(i=0;i<13;i++)
     {
       I_send(buf[i]);
     }

     sw1=I_receive();
     sw2=I_receive();
     if(sw1!=0x61)
     {
        SendResponse(0x89,1,buf);
        return SAM_CYPRT_ERROR;
     }
     for(i=0;i<60;i++)
     {
       ;
     }

     I_send(0x00);
     I_send(0xc0);
     I_send(0x00);
     I_send(0x00);
     I_send(6);

     //Receive INS
     sw1=I_receive();

     buf[0]=I_receive();
     buf[1]=I_receive();
     buf[2]=I_receive();
     buf[3]=I_receive();
     buf[4]=I_receive();
     buf[5]=I_receive();
     buf[6]=I_receive();
     buf[7]=I_receive();
     memcpy(new_key,buf,6);
     return MI_OK;
}

uchar Creat_key2(uchar keymode,uchar sector_nr,uchar key_index,uchar* new_key)
{
     uchar xdata buf[13],i;
     uchar key_no,key_id1,key_id2;

     W_DOG();
     key_no=(sector_nr<<1);

     //keymode"分成两部分:前4位为认证码标识,后4位为KEYA/KEYB标识"

     i=(keymode&0xf0)>>2; //"取认证码标识"
     if((keymode&0x0f)!=0)
     {
        key_no+=1;        //KEYB
        keymode=PICC_AUTHENT1B;
     }
     else keymode=PICC_AUTHENT1A;
     key_id1=(key_index&0xF0)>>4;
     key_id2=(key_index&0x0F);


     memcpy(buf,Auth_code,2);
     memcpy(buf+2,snr,4);
     memcpy(buf+6,Auth_code+2,2);
     memcpy(buf+8,Auth_code+i,4);
     buf[12]=key_no;

     I_send(0x80);
     I_send(0xfc);
     I_send(key_id2);
     I_send(key_id1);
     I_send(0x0d);

     sw1=I_receive();

     for(i=0;i<60;i++)
     {
       ;
     }

     for(i=0;i<13;i++)
     {
       I_send(buf[i]);
     }

     sw1=I_receive();
     sw2=I_receive();
     if(sw1!=0x61)
     {
        SendResponse(0x89,1,buf);
        return SAM_CYPRT_ERROR;
     }
     for(i=0;i<60;i++)
     {
       ;
     }

     I_send(0x00);
     I_send(0xc0);
     I_send(0x00);
     I_send(0x00);
     I_send(6);

     //Receive INS
     sw1=I_receive();

     buf[0]=I_receive();
     buf[1]=I_receive();
     buf[2]=I_receive();
     buf[3]=I_receive();
     buf[4]=I_receive();
     buf[5]=I_receive();
     buf[6]=I_receive();
     buf[7]=I_receive();

     memcpy(new_key,buf,6);

     return MI_OK;

}



uchar picc_b_rats (uchar *ats_part)
{
  uchar status;
  uchar snd_buf[2];
  W_DOG();
  snd_buf[0] =  cmdRATS;
  snd_buf[1] =  0x00;
  status=Mf500PiccExchangeBlock(snd_buf ,4 ,ats_part , &rec_bytelen,1, 4);
  return status ;
}

uchar deselect()
{
        uchar status=0;
        uchar idata buf[14];
        W_DOG();
        buf[0]=0xc2;

        status=Mf500PiccExchangeBlock(buf,3,buf, &rec_bytelen, 1,5);
        return status;
}




⌨️ 快捷键说明

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