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

📄 mfrc500.c

📁 mifarea卡程序mifarea卡程序mifarea卡程序
💻 C
📖 第 1 页 / 共 5 页
字号:
            for (i = 0; i < MInfo.nBytesReceived; i++)
            {
                dummyShift2 = RcvBuffer[i];
                RcvBuffer[i] = (dummyShift1 >> (i+1)) | (RcvBuffer[i] << (7-i));
                dummyShift1 = dummyShift2;
            }
            MInfo.nBitsReceived -= MInfo.nBytesReceived;
            if ( MInfo.collPos )
                MInfo.collPos += 7 - (MInfo.collPos + 6) / 9;
        }

        if ( status == MI_OK || status == MI_COLLERR)    // no other occured
        {

            byteOffset = 0;
            if( nbits != 0 )
            {
                Snr[nbytes - 1]|= RcvBuffer[0];
                byteOffset = 1;
            }
            for ( i =0; i < (4 - nbytes); i++)
            {
                Snr[nbytes + i] = RcvBuffer[i + byteOffset];
            }
            if (status != MI_COLLERR )
            {
                snr_crc = Snr[0] ^Snr[1] ^Snr[2] ^Snr[3];
                snr_check = RcvBuffer[MInfo.nBytesReceived - 1];
                if (snr_crc != snr_check)
                {
                    status = MI_SERNRERR;
                }
                else
                {
                    complete = 1;
                }
            }
            else
            {
                bcnt = bcnt + MInfo.collPos - nbits;
                status = MI_OK;
            }
        }
    }
    ClearBitMask(RegDecoderControl,0x20);
    return status;
}

uchar M500Select(uchar *Snr)
{

    uchar idata status = MI_OK;
    uchar idata size;


    M500PcdSetTmo(2);   // 1    050418

    WriteIO(RegChannelRedundancy,0x0F);
    ClearBitMask(RegControl,0x08);

    ResetInfo(&MInfo);
    SndBuffer[0] = 0x93;
    SndBuffer[1] = 0x70;
    memcpy(SndBuffer + 2,Snr,4);

    SndBuffer[6] = SndBuffer[2]^SndBuffer[3]^SndBuffer[4]^SndBuffer[5];
    MInfo.nBytesToSend   = 7;
    status = M500PcdCmd(PCD_TRANSCEIVE, SndBuffer, RcvBuffer, &MInfo);
    if (status == MI_OK)
    {
        if (MInfo.nBitsReceived != 8)
        {
            status = MI_BITCOUNTERR;
        }
        else
        {
           size = RcvBuffer[0];
        }
    }
    return status;
}

// cook key
void M500HostCodeKey(uchar *uncoded,uchar *coded)
{
    uchar idata cnt = 0;
    uchar idata ln  = 0;
    uchar idata hn  = 0;

    for (cnt = 0; cnt < 6; cnt++)
    {
        ln = uncoded[cnt] & 0x0F;
        hn = uncoded[cnt] >> 4;
        coded[cnt * 2 + 1] = (~ln << 4) | ln;
        coded[cnt * 2 ] = (~hn << 4) | hn;
    }
}

///////////////////////////////////////////////////////////////////////
//          M I F A R E     H A L T
///////////////////////////////////////////////////////////////////////
/*
char M500Halt(void)
{
   char status = MI_CODEERR;

   M500PcdSetTmo(3);//106);
   // ************* Cmd Sequence ********************************** 
   ResetInfo(&MInfo);   
   SndBuffer[0] = PICC_HALT ;     // Halt command code
   SndBuffer[1] = 0x00;         // dummy address
   MInfo.nBytesToSend   = 2;
   status = M500PcdCmd(PCD_TRANSCEIVE,
                       SndBuffer,
                       RcvBuffer,
                       &MInfo);   
   if (status)
   {
     // timeout error ==> no NAK received ==> OK
     if (status == MI_NOTAGERR || status == MI_ACCESSTIMEOUT)
        status = MI_OK;
   }
    //reset command register - no response from tag
   WriteIO(RegCommand,PCD_IDLE);
   return status; 
}
*/

uchar M500PiccAuthState(uchar AuthMode, uchar *snr, uchar Sector)
{
    uchar idata status = MI_OK;

    status = ReadIO(RegErrorFlag);

    if (status != MI_OK)
    {
        if (status & 0x40)
            status = MI_KEYERR;
        else
            status = MI_AUTHERR;
    }
    else
    {
        SndBuffer[0] = AuthMode;
        SndBuffer[1] = Sector*4+3;
        memcpy(SndBuffer + 2, snr, 4);
        ResetInfo(&MInfo);
        MInfo.nBytesToSend = 6;
        M500PcdSetTmo(3); // 3
        if ((status = M500PcdCmd(PCD_AUTHENT1, SndBuffer, RcvBuffer, &MInfo)) == MI_OK)
        {
            if (ReadIO(RegSecondaryStatus) & 0x07)
            {
                status = MI_BITCOUNTERR;
            }
            else
            {
                ResetInfo(&MInfo);
                MInfo.nBytesToSend = 0;
                if ((status = M500PcdCmd(PCD_AUTHENT2, SndBuffer, RcvBuffer, &MInfo)) == MI_OK)
                {
                    if ( ReadIO(RegControl) & 0x08 )
                    {
                        status = MI_OK;
                    }
                    else
                    {
                        status = MI_AUTHERR;
                    }
                }
            }
        }
    }
    return status;
}

uchar M500Auth(uchar Mode, uchar *snr, uchar *Keys, uchar Sector)
{
    uchar idata status = MI_OK;
    uchar idata keycoded[12];
    uchar idata offset;

    offset = (Mode == PICC_AUTHENT1A) ? 0 : 6;
    M500HostCodeKey(Keys,keycoded);
    FlushFIFO();
    ResetInfo(&MInfo);
    memcpy(SndBuffer,keycoded,12);
    MInfo.nBytesToSend = 12;
    if ((status = M500PcdCmd(PCD_LOADKEY, SndBuffer, RcvBuffer, &MInfo)) == MI_OK)
    {
        status = M500PiccAuthState(Mode, snr, Sector);
    }
    return status;
}

uchar M500Read(uchar Address,uchar *DataBuff)
{

    uchar idata status = MI_OK;
    uchar idata tmp    = 0;

    FlushFIFO();
    M500PcdSetTmo(4); //3
    WriteIO(RegChannelRedundancy,0x0F);
    ResetInfo(&MInfo);
    SndBuffer[0] = PICC_READ;
    SndBuffer[1] = Address;
    MInfo.nBytesToSend = 2;
    status = M500PcdCmd(PCD_TRANSCEIVE, SndBuffer, RcvBuffer, &MInfo);
    if (status != MI_OK)
    {
        if (status != MI_NOTAGERR )
        {
            if (MInfo.nBitsReceived == 4)
            {
                RcvBuffer[0] &= 0x0f;
                if ((RcvBuffer[0] & 0x0a) == 0)
                {
                    status = MI_NOTAUTHERR;
                }
                else
                {
                    status = MI_CODEERR;
                }
            }
        }
    }
    else
    {
        if (MInfo.nBytesReceived != 16)
        {
            status = MI_BYTECOUNTERR;
        }
        else
        {
            memcpy(DataBuff,RcvBuffer,16);
        }
    }
    return status;
}

uchar M500Write(uchar Address,uchar *DataBuff)
{

    uchar idata status = MI_OK;

    ResetInfo(&MInfo);
    SndBuffer[0] = PICC_WRITE;
    SndBuffer[1] = Address;
    MInfo.nBytesToSend = 2;
    status = M500PcdCmd(PCD_TRANSCEIVE, SndBuffer, RcvBuffer, &MInfo);

    if (status != MI_NOTAGERR)
    {
        if (MInfo.nBitsReceived != 4)
        {
            status = MI_BITCOUNTERR;
        }
        else
        {
            RcvBuffer[0] &= 0x0f;
            if ((RcvBuffer[0] & 0x0a) == 0)
            {
                status = MI_NOTAUTHERR;
            }
            else
            {
                if (RcvBuffer[0] == 0x0a)
                {
                    status = MI_OK;
                }
                else
                {
                    status = MI_CODEERR;
                }
            }
        }
    }

    if ( status == MI_OK)
    {

        M500PcdSetTmo(3);

        ResetInfo(&MInfo);
        memcpy(SndBuffer,DataBuff,16);
        MInfo.nBytesToSend   = 16;
        status = M500PcdCmd(PCD_TRANSCEIVE, SndBuffer, RcvBuffer, &MInfo);

        if (status != MI_NOTAGERR)
        {

            if (MInfo.nBitsReceived != 4)
            {
                status = MI_BITCOUNTERR;
            }
            else
            {
                RcvBuffer[0] &= 0x0f;
                if ((RcvBuffer[0] & 0x0a) == 0)
                {
                    status = MI_WRITEERR;
                }
                else
                {
                    if (RcvBuffer[0] == 0x0a)
                    {
                        status = MI_OK;
                    }
                    else
                    {
                        status = MI_CODEERR;
                    }
                }
            }
        }
    }
    return status;
}

uchar M500Increment(uchar addr, uchar *value, uchar bakaddr)
{
    uchar i;
    if((i=M500Value(PICC_INCREMENT, addr, value, addr)) != MI_OK)
        return i;

    if(addr != bakaddr)
        return M500Copy(addr, bakaddr);
    else
        return MI_OK;
}

uchar M500Decrement(uchar addr, uchar *value, uchar bakaddr)
{
    uchar i;
    if((i=M500Value(PICC_DECREMENT, addr, value, addr)) != MI_OK)
        return i;
        
    if(addr != bakaddr)
        return M500Copy(addr, bakaddr);
    else
        return MI_OK;
}

uchar M500Copy(uchar srcaddr, uchar desaddr)
{
    uchar i;
    
    if((i=M500Restore(srcaddr)) != MI_OK)
        return i;
    else
        return M500Transfer(desaddr);
}

uchar M500Restore(uchar Address)
{
    uchar status = MI_OK;

    M500PcdSetTmo(1);
    ResetInfo(&MInfo);
    SndBuffer[0] = PICC_RESTORE;
    SndBuffer[1] = Address;
    MInfo.nBytesToSend   = 2;
    status = M500PcdCmd(PCD_TRANSCEIVE, SndBuffer, RcvBuffer, &MInfo);

    if (status != MI_NOTAGERR)
    {
        if (MInfo.nBitsReceived != 4)
        {
            status = MI_BITCOUNTERR;
        }
        else
        {
            RcvBuffer[0] &= 0x0f;
            switch(RcvBuffer[0])
            {
                case 0x00:
                    status = MI_NOTAUTHERR;
                    break;
                case 0x0a:
                    status = MI_OK;
                    break;
                case 0x01:
                    status = MI_VALERR;
                    break;
                default:
                    status = MI_CODEERR;
                    break;
            }
        }
    }
    if ( status == MI_OK)
    {

        M500PcdSetTmo(3);
        ResetInfo(&MInfo);
        SndBuffer[0]=0;
        SndBuffer[1]=0;
        SndBuffer[2]=0;
        SndBuffer[3]=0;
        MInfo.nBytesToSend   = 4;
        status = M500PcdCmd(PCD_TRANSCEIVE, SndBuffer, RcvBuffer, &MInfo);
        if (status == MI_OK)
        {
            if (MInfo.nBitsReceived != 4)
            {
                status = MI_BITCOUNTERR;
            }
            else
            {
                RcvBuffer[0] &= 0x0f;
                switch(RcvBuffer[0])
                {
                    case 0x00:
                        status = MI_NOTAUTHERR;
                        break;
                    case 0x01:
                        status = MI_VALERR;
                        break;
                    default:
                        status = MI_CODEERR;
                    break;
                }
            }
        }
        else
            if (status == MI_NOTAGERR )
                status = MI_OK;
    }
    return status;
}

uchar M500Transfer(uchar Address)

⌨️ 快捷键说明

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