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

📄 mifare.c

📁 采用单片机89C52对飞利浦13.56Mhz的射频芯片MFRC500进行密码的配置与扇区的读写。可以由电脑通过串口发送命令来对MFRC500进行寄存器的配置读写。
💻 C
📖 第 1 页 / 共 2 页
字号:
    {   status = MI_ERR;   }
    return status;
}

/////////////////////////////////////////////////////////////////////
//功    能:写数据到M1卡一块
//参数说明: addr[IN]:块地址
//          pData[IN]:写入的数据,16字节
//返    回: 成功返回MI_OK
/////////////////////////////////////////////////////////////////////                  
char PcdWrite(unsigned char addr,unsigned char *pData)
{
    char status;
    unsigned int  unLen;
    unsigned char idata ucComBuf[FSD]; 
    
    PcdSetTmo(5);
    WriteRawRC(RegChannelRedundancy,0x0F); 
    
    ucComBuf[0] = PICC_WRITE;
    ucComBuf[1] = addr;

    status = PcdComISO14443(PCD_TRANSCEIVE,ucComBuf,2,ucComBuf,&unLen);
    
    if ((status != MI_OK) || (unLen != 4) || ((ucComBuf[0] & 0x0F) != 0x0A))
    {   status = MI_ERR;   }
    
    if (status == MI_OK)
    {
        memcpy(ucComBuf, pData, 16);
        
        status = PcdComISO14443(PCD_TRANSCEIVE,ucComBuf,16,ucComBuf,&unLen);
       
        if ((status != MI_OK) || (unLen != 4) || ((ucComBuf[0] & 0x0F) != 0x0A))
        {   status = MI_ERR;   }
    }
    
    return status;
}

/////////////////////////////////////////////////////////////////////
//功    能:扣款和充值
//参数说明: dd_mode[IN]:命令字
//               0xC0 = 扣款
//               0xC1 = 充值
//          addr[IN]:钱包地址
//          pValue[IN]:4字节增(减)值,低位在前
//返    回: 成功返回MI_OK
/////////////////////////////////////////////////////////////////////                 
char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue)
{
    char status;
    unsigned int  unLen;
    unsigned char idata ucComBuf[FSD]; 

    PcdSetTmo(5);
    ucComBuf[0] = dd_mode;
    ucComBuf[1] = addr;

    status = PcdComISO14443(PCD_TRANSCEIVE,ucComBuf,2,ucComBuf,&unLen);

    if ((status != MI_OK) || (unLen != 4) || ((ucComBuf[0] & 0x0F) != 0x0A))
    {   status = MI_ERR;   }
        
    if (status == MI_OK)
    {
        memcpy(ucComBuf, pValue, 4);

        status = PcdComISO14443(PCD_TRANSCEIVE,ucComBuf,4,ucComBuf,&unLen);
        if (status != MI_ERR)
        {    status = MI_OK;    }
     }
     
     if (status == MI_OK)
     {
        ucComBuf[0] = PICC_TRANSFER;
        ucComBuf[1] = addr;
        
        status = PcdComISO14443(PCD_TRANSCEIVE,ucComBuf,2,ucComBuf,&unLen);
      
        if ((status != MI_OK) || (unLen != 4) || ((ucComBuf[0] & 0x0F) != 0x0A))
        {   status = MI_ERR;   }
    }
    return status;
}

/////////////////////////////////////////////////////////////////////
//功    能:备份钱包
//参数说明: sourceaddr[IN]:源地址
//          goaladdr[IN]:目标地址
//返    回: 成功返回MI_OK
/////////////////////////////////////////////////////////////////////
char PcdBakValue(unsigned char sourceaddr, unsigned char goaladdr)
{
    char status;
    unsigned int  unLen;
    unsigned char idata ucComBuf[FSD]; 

    ucComBuf[0] = PICC_RESTORE;
    ucComBuf[1] = sourceaddr;
 
    status = PcdComISO14443(PCD_TRANSCEIVE,ucComBuf,2,ucComBuf,&unLen);

    if ((status != MI_OK) || (unLen != 4) || ((ucComBuf[0] & 0x0F) != 0x0A))
    {   status = MI_ERR;   }
    
    if (status == MI_OK)
    {
        ucComBuf[0] = 0;
        ucComBuf[1] = 0;
        ucComBuf[2] = 0;
        ucComBuf[3] = 0;
 
        status = PcdComISO14443(PCD_TRANSCEIVE,ucComBuf,4,ucComBuf,&unLen);
        if (status != MI_ERR)
        {    status = MI_OK;    }
    }
    
    if (status != MI_OK)
    {    return MI_ERR;   }
    
    ucComBuf[0] = PICC_TRANSFER;
    ucComBuf[1] = goaladdr;

    status = PcdComISO14443(PCD_TRANSCEIVE,ucComBuf,2,ucComBuf,&unLen);

    if ((status != MI_OK) || (unLen != 4) || ((ucComBuf[0] & 0x0F) != 0x0A))
    {   status = MI_ERR;   }

    return status;
}

/////////////////////////////////////////////////////////////////////
//功    能:命令卡片进入休眠状态
//返    回: 成功返回MI_OK
/////////////////////////////////////////////////////////////////////
char PcdHalt(void)
{
    char status;
    unsigned int  unLen;
    unsigned char idata ucComBuf[FSD]; 

    ucComBuf[0] = PICC_HALT;
    ucComBuf[1] = 0;
 
    status = PcdComISO14443(PCD_TRANSCEIVE,ucComBuf,2,ucComBuf,&unLen);

    return MI_OK;
}

/////////////////////////////////////////////////////////////////////
//M I F A R E   U L T R A L I G H T   A N T I C O L L I S I O N 
//A N D    S E L E C T
//parameter: pSnr[OUT]:7Byte card SNR
/////////////////////////////////////////////////////////////////////
char UL_PcdAnticoll(unsigned char *pSnr)
{
   
    char status ;
    unsigned char i, snr_check = 0;
    unsigned int  unLen;
    unsigned char idata ucComBuf[FSD];

    WriteRawRC(RegDecoderControl,0x28);
    ClearBitMask(RegControl,0x08);
    WriteRawRC(RegChannelRedundancy,0x03);
    PcdSetTmo(4);
    
    ucComBuf[0] = PICC_ANTICOLL1;
    ucComBuf[1] = 0x20;

    status = PcdComISO14443(PCD_TRANSCEIVE,ucComBuf,2,ucComBuf,&unLen);
    
    if (status == MI_OK)
    {
    	 for (i=0; i<4; i++)
         {   
             *(pSnr+i)  = ucComBuf[i];
             snr_check ^= ucComBuf[i];
         }
         if (snr_check != ucComBuf[i])
         {   status = MI_ERR;    }
         else
         {   memcpy(pSnr, &ucComBuf[1], 3);   }
    }
    
    ClearBitMask(RegDecoderControl,0x20);

    snr_check = 0x88;
    WriteRawRC(RegChannelRedundancy,0x0F);
    ClearBitMask(RegControl,0x08);
    PcdSetTmo(4);
    
    ucComBuf[0] = PICC_ANTICOLL1;
    ucComBuf[1] = 0x70;
    ucComBuf[2] = 0x88;
    for (i=0; i<3; i++)
    {
    	snr_check ^= *(pSnr+i);
    	ucComBuf[i+3] = *(pSnr+i);
    }
    ucComBuf[6] = snr_check;
    
    status = PcdComISO14443(PCD_TRANSCEIVE,ucComBuf,7,ucComBuf,&unLen);
    if (status == MI_OK)
    {    
    	if (unLen != 0x08)
        {   status = MI_ERR;     }
    }
    
    if (status == MI_OK)
    {
       snr_check = 0;
       WriteRawRC(RegDecoderControl,0x28);          
       ClearBitMask(RegControl,0x08);
       WriteRawRC(RegChannelRedundancy,0x03);
       PcdSetTmo(4);
    
       ucComBuf[0] = PICC_ANTICOLL2;
       ucComBuf[1] = 0x20;
   
       status = PcdComISO14443(PCD_TRANSCEIVE,ucComBuf,2,ucComBuf,&unLen);
       if (!status)
       {
    	  for (i=0; i<4; i++)
          {  snr_check ^= ucComBuf[i];   }
          if (snr_check != ucComBuf[i])
          {  status = MI_ERR;   }
          else
          {   memcpy(pSnr+3, &ucComBuf[0], 4);    }
       }
       ClearBitMask(RegDecoderControl,0x20);
    
       snr_check = 0;
       WriteRawRC(RegChannelRedundancy,0x0F);
       ClearBitMask(RegControl,0x08);
       PcdSetTmo(4);
    
       ucComBuf[0] = PICC_ANTICOLL2;
       ucComBuf[1] = 0x70;
       for (i=0; i<4; i++)
       {
    	   snr_check ^= *(pSnr+3+i);
    	   ucComBuf[i+2] = *(pSnr+3+i);
       }
       ucComBuf[6] = snr_check;
       
       status = PcdComISO14443(PCD_TRANSCEIVE,ucComBuf,7,ucComBuf,&unLen);
       if (status == MI_OK)
       {    
       	   if (unLen != 0x08)
           {   status = MI_ERR;   }
       }   	
    }
    return status;
}

/////////////////////////////////////////////////////////////////////
//M I F A R E   U L T R A L I G H T   W R I T E
//parameter: addr[IN]:page addr
//           pData[IN]:4byte data
/////////////////////////////////////////////////////////////////////
char UL_PcdWrite(unsigned char addr,unsigned char *pData)
{
    char status;
    unsigned int  unLen;
    unsigned char idata ucComBuf[FSD]; 
    
    PcdSetTmo(4);
    WriteRawRC(RegChannelRedundancy,0x07); 
    
    ucComBuf[0] = 0xA2;
    ucComBuf[1] = addr;
    memcpy(&ucComBuf[2], pData, 4);

    status = PcdComISO14443(PCD_TRANSCEIVE,ucComBuf,6,ucComBuf,&unLen);
    
    if ((status != MI_OK) || (unLen != 4) || ((ucComBuf[0] & 0x0F) != 0x0A))
    {   status = MI_ERR;   }
    
    PcdSetTmo(4);
    return status;
}


⌨️ 快捷键说明

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