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

📄 iso14443a.c

📁 RC500可用的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
    struct TranSciveBuffer *pi;
    pi = &MfComData;

    PcdSetTmo(4);
    MfComData.MfCommand = PCD_LOADKEY;
    MfComData.MfLength  = 12;
    memcpy(&MfComData.MfData[0], pKeys, 12);    

    status = PcdComTransceive(pi);

    return status;
}

/////////////////////////////////////////////////////////////////////
//功能:用存放RC500的FIFO中的密钥和卡上的密钥进行验证
//input:auth_mode=验证方式,0x60:验证A密钥,0x61:验证B密钥
//      block=要验证的绝对块号
//      g_cSNR=序列号首地址
/////////////////////////////////////////////////////////////////////
char PcdAuthState(unsigned char auth_mode,unsigned char block,unsigned char *pSnr)
{
    char status;
    struct TranSciveBuffer MfComData;
    struct TranSciveBuffer *pi;
    pi = &MfComData;

    WriteRawRC(RegChannelRedundancy,0x0F);
    PcdSetTmo(4);
    MfComData.MfCommand = PCD_AUTHENT1;
    MfComData.MfLength  = 6;
    MfComData.MfData[0] = auth_mode;
    MfComData.MfData[1] = block;
    memcpy(&MfComData.MfData[2], pSnr, 4);    
      
    status = PcdComTransceive(pi);
    if (status == MI_OK)
    {
        if (ReadRawRC(RegSecondaryStatus) & 0x07) 
        {   status = MI_BITCOUNTERR;    }
        else
        {
             MfComData.MfCommand = PCD_AUTHENT2;
             MfComData.MfLength  = 0;
             status = PcdComTransceive(pi);
             if (status == MI_OK)
             {
                 if (ReadRawRC(RegControl) & 0x08)
                 {   status = MI_OK;   }
                 else
                 {   status = MI_AUTHERR;   }
                
             }
         }
    }
    return status;
}

/////////////////////////////////////////////////////////////////////
//读mifare_one卡上一块(block)数据(16字节)
//input: addr = 要读的绝对块号
//output:readdata = 读出的数据
/////////////////////////////////////////////////////////////////////
char PcdRead(unsigned char addr,unsigned char *pReaddata)
{
    char status;
    struct TranSciveBuffer MfComData;
    struct TranSciveBuffer *pi;
    pi = &MfComData;

    PcdSetTmo(4);
    WriteRawRC(RegChannelRedundancy,0x0F);
    MfComData.MfCommand = PCD_TRANSCEIVE;
    MfComData.MfLength  = 2;
    MfComData.MfData[0] = PICC_READ;
    MfComData.MfData[1] = addr;

    status = PcdComTransceive(pi);
    if (status == MI_OK)
    {
        if (MfComData.MfLength != 0x80)
        {   status = MI_BITCOUNTERR;   }
        else
        {   memcpy(pReaddata, &MfComData.MfData[0], 16);  }
    }
    return status;
}

/////////////////////////////////////////////////////////////////////
//写数据到卡上的一块
//input:adde=要写的绝对块号
//      writedata=写入数据
/////////////////////////////////////////////////////////////////////
char PcdWrite(unsigned char addr,unsigned char *pWritedata)
{
    char status;
    struct TranSciveBuffer MfComData;
    struct TranSciveBuffer *pi;
    pi = &MfComData;
    
    PcdSetTmo(5);
    WriteRawRC(RegChannelRedundancy,0x07); 
    MfComData.MfCommand = PCD_TRANSCEIVE;
    MfComData.MfLength  = 2;
    MfComData.MfData[0] = PICC_WRITE;
    MfComData.MfData[1] = addr;

    status = PcdComTransceive(pi);
    if (status != MI_NOTAGERR)
    {
        if(MfComData.MfLength != 4)
        {   status=MI_BITCOUNTERR;   }
        else
        {
           MfComData.MfData[0] &= 0x0F;
           switch (MfComData.MfData[0])
           {
              case 0x00:
                 status = MI_NOTAUTHERR;
                 break;
              case 0x0A:
                 status = MI_OK;
                 break;
              default:
                 status = MI_CODEERR;
                 break;
           }
        }
    }
    if (status == MI_OK)
    {
        PcdSetTmo(5);
        MfComData.MfCommand = PCD_TRANSCEIVE;
        MfComData.MfLength  = 16;
        memcpy(&MfComData.MfData[0], pWritedata, 16);
        
        status = PcdComTransceive(pi);
        if (status != MI_NOTAGERR)
        {
            MfComData.MfData[0] &= 0x0F;
            switch(MfComData.MfData[0])
            {
               case 0x00:
                  status = MI_WRITEERR;
                  break;
               case 0x0A:
                  status = MI_OK;
                  break;
               default:
                  status = MI_CODEERR;
                  break;
           }
        }
        PcdSetTmo(4);
    }
    return status;
}


/////////////////////////////////////////////////////////////////////
//扣款和充值
//input:dd_mode=命令字,0xC0:扣款,0xC1:充值
//      addr=钱包的绝对块号
//      value=4字节增(减)值首地址,16进制数,低位在前
/////////////////////////////////////////////////////////////////////
char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue)
{
    char status;
    struct TranSciveBuffer MfComData;
    struct TranSciveBuffer *pi;
    pi = &MfComData;														  

    PcdSetTmo(5);
//	WriteRawRC(RegCRCPresetLSB,0x63);
//	WriteRawRC(RegCwConductance,0x3F);
    WriteRawRC(RegChannelRedundancy,0x0F);
    MfComData.MfCommand = PCD_TRANSCEIVE;
    MfComData.MfLength  = 2;
    MfComData.MfData[0] = dd_mode;
    MfComData.MfData[1] = addr;

    status = PcdComTransceive(pi);
    if (status != MI_NOTAGERR)
    {
        if (MfComData.MfLength != 4)														
       {   status = 0x21;   } //{   status = MI_BITCOUNTERR;   }
        else
        {
           MfComData.MfData[0] &= 0x0F;
           switch (MfComData.MfData[0])
           {
              case 0x00:
                 status = 0x22;//status = MI_NOTAUTHERR;
                 break;
              case 0x0A:
                 status = MI_OK;
                 break;
              case 0x01:
                 status = 0x23;//status = MI_VALERR;
                 break;
              default:
                status = 0x24; //status = MI_CODEERR;
                 break;
           }
        }
     }
     if (status == MI_OK)
     {
        PcdSetTmo(5);
        MfComData.MfCommand = PCD_TRANSCEIVE;
        MfComData.MfLength  = 4;
        pi = &MfComData;
        memcpy(&MfComData.MfData[0], pValue, 4);

        status = PcdComTransceive(pi);
        if (status==MI_OK)
        {
           if (MfComData.MfLength != 4)
          {   status = 0x25;   }// {   status = MI_BITCOUNTERR;   }
           else
           {   status = MI_OK;            }
        }
        else if(status == MI_NOTAGERR)
        {   status = MI_OK;    }
        else
       {   status=0x26;     }// {   status=MI_COM_ERR;     }
     }
     
     if (status == MI_OK)
     {
        MfComData.MfCommand = PCD_TRANSCEIVE;
        MfComData.MfLength  = 2;
        MfComData.MfData[0] = PICC_TRANSFER;
        MfComData.MfData[1] = addr;
        
        status = PcdComTransceive(pi);
        if (status != MI_NOTAGERR)
        {
            if (MfComData.MfLength != 4)
            {   status = MI_BITCOUNTERR;    }
            else
            {
               MfComData.MfData[0] &= 0x0F;
               switch(MfComData.MfData[0])
               {
                  case 0x00:
                    status = 0x27; //status = MI_NOTAUTHERR;
                     break;
                  case 0x0a:
                     status = MI_OK;
                     break;
                  case 0x01:
                    status = 0x28;// status = MI_VALERR;
                     break;
                  default:
                    status = 0x29; //status = MI_CODEERR;
                     break;
               }
            }
        }
     }
     return status;
}

/////////////////////////////////////////////////////////////////////
//命令卡进入休眠状态
/////////////////////////////////////////////////////////////////////
char PcdHalt()
{
    char status = MI_OK;
    struct TranSciveBuffer MfComData;
    struct TranSciveBuffer *pi;
    pi = &MfComData;

    MfComData.MfCommand = PCD_TRANSCEIVE;
    MfComData.MfLength  = 2;
    MfComData.MfData[0] = PICC_HALT;
    MfComData.MfData[1] = 0;

    status = PcdComTransceive(pi);
    if (status)
    {
        if (status==MI_NOTAGERR || status==MI_ACCESSTIMEOUT)
        status = MI_OK;
    }
    WriteRawRC(RegCommand,PCD_IDLE);
    return status;
}


⌨️ 快捷键说明

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