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

📄 m500auc.c

📁 奥尔斯公司pxa270试验箱射频卡读写器相关资料
💻 C
📖 第 1 页 / 共 4 页
字号:
    char idata status = MI_CODEERR;



    // ************* Cmd Sequence **********************************

    ResetInfo(MInfo);

    SerBuffer[0] = PICC_HALT ;      // Halt command code

    SerBuffer[1] = 0x00;            // dummy address

    MInfo.nBytesToSend = 2;

    status = M500PcdCmd(PCD_TRANSCEIVE,

                       SerBuffer,

                       &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;

}



///////////////////////////////////////////////////////////////////////

// Reset the MF RC500

///////////////////////////////////////////////////////////////////////

char M500PcdReset(void)

{

    char idata status = MI_OK;

    unsigned int idata timecnt=0;



    RC500RST = 0;

    delay_1ms(25);

    RC500RST = 1;

    delay_50us(200);

    RC500RST = 0;

    delay_50us(50);

    timecnt=1000;

    while ((ReadIO(RegCommand) & 0x3F) && timecnt--);

    if(!timecnt)

    {

        status = MI_RESETERR;

    }

    if (status == MI_OK)

    {

        //WriteIO(RegPage,0x80);

        if (ReadIO(RegCommand) != 0x00)

        {

            status = MI_INTERFACEERR;

        }

    }

    return status;

}



///////////////////////////////////////////////////////////////////////

// Configures the MF RC500  配置RC500内部寄存器函数

///////////////////////////////////////////////////////////////////////

char M500PcdConfig(void)

{

    char idata status;



    if ((status = M500PcdReset()) == MI_OK)

    {

        WriteIO(RegClockQControl,0x00);

        WriteIO(RegClockQControl,0x40);

        delay_50us(2);

        ClearBitMask(RegClockQControl,0x40);

        WriteIO(RegBitPhase,0xAD);

        WriteIO(RegRxThreshold,0xFF);

        WriteIO(RegRxControl2,0x01);

        WriteIO(RegFIFOLevel,0x1A);

        WriteIO(RegTimerControl,0x02);

        WriteIO(RegIRqPinConfig,0x03);

        M500PcdRfReset(1);

    }

    return status;

}



///////////////////////////////////////////////////////////////

// Key loading into the MF RC500's EEPROM

// key_type: 选择是keyA 还是kyeB

// sector: 选择扇区号(0~15)

// uncoded_keys: 6 Bytes Key value

///////////////////////////////////////////////////////////////

/*

char M500PcdLoadKeyE2(unsigned char key_type,

                       unsigned char sector,

                       unsigned char *uncoded_keys)

{

    signed char status = MI_OK;

    unsigned int e2addr = 0x80 + sector * 0x18;

    unsigned char coded_keys[12];



    if (key_type == PICC_AUTHENT1B)

    {

        e2addr += 12;           // key B offset

    }

    if ((status = M500HostCodeKey(uncoded_keys,coded_keys)) == MI_OK)

    {

        status = PcdWriteE2(e2addr,12,coded_keys);

    }

    return status;

}

*/

///////////////////////////////////////////////////////////////////////

// Write the MF RC500's EEPROM

// startaddr: RC500  EEPROM 起始地址

// length: 所写Byte 长度

// _data: 要写入的数据的存放起始地址

///////////////////////////////////////////////////////////////////////

/*

char PcdWriteE2(unsigned int startaddr,

                unsigned char length,

                unsigned char* _data)

{

    char status = MI_OK;

    ResetInfo(MInfo);

    SerBuffer[0] = startaddr & 0xFF;

    SerBuffer[1] = (startaddr >> 8) & 0xFF;

    memcpy(SerBuffer + 2,_data,length);



    MInfo.nBytesToSend   = length + 2;



    status = M500PcdCmd(PCD_WRITEE2,

                       SerBuffer,

                       &MInfo);

    return status;

}

*/



///////////////////////////////////////////////////////////////////////

// Select Command defined in ISO14443(MIFARE)

// Select the internal signal applied to pin MFOUT

// type: select MFOUT type( 0~7 )

///////////////////////////////////////////////////////////////////////

char M500PcdMfOutSelect(unsigned char type)

{

    WriteIO(RegMfOutSelect,type&0x7);

    return MI_OK;

}



///////////////////////////////////////////////////////////////////////

// Request Command defined in ISO14443(MIFARE)

// Request,Anticoll,Select,return CardType(2 bytes)+CardSerialNo(4 bytes)

// 寻卡,防冲突,选择卡    返回卡类型(2 bytes)+ 卡系列号(4 bytes)

// req_code: Requset All or Request Std( PICC_REQALL,PICC_REQSTD )

// atq: 16 bit answer to request( ATO)

///////////////////////////////////////////////////////////////////////

char M500PiccCommonRequest(unsigned char req_code,unsigned char *atq)

{

    char idata status = MI_OK;



    M500PcdSetTmo(3);

    WriteIO(RegChannelRedundancy,0x03);

    ClearBitMask(RegControl,0x08);

    WriteIO(RegBitFraming,0x07);

    SetBitMask(RegTxControl,0x03);

    ResetInfo(MInfo);

    SerBuffer[0] = req_code;

    MInfo.nBytesToSend = 1;



    status = M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo);

    if (status)

    {

        *atq = 0;

    }

    else

    {

        if (MInfo.nBitsReceived != 16)

        {

            *atq = 0;

            status = MI_BITCOUNTERR;

        }

        else

        {

            status = MI_OK;

            memcpy(atq,SerBuffer,2);

        }

    }

    return status;

}



///////////////////////////////////////////////////////////////////

// Cascaded Anti-Collision Command defined in ISO14443(MIFARE)

// 防冲突 读卡的系列号 MLastSelectedSnr

// bcnt: SNR-bits number( 0~32)

// snr: 4 Bytes serial number

///////////////////////////////////////////////////////////////////

char M500PiccCascAnticoll (unsigned char bcnt,unsigned char *snr)

{

    char idata status = MI_OK;

    char idata snr_in[4];

    char idata nbytes = 0;

    char idata nbits = 0;

    char idata complete = 0;

    char idata i        = 0;

    char idata byteOffset = 0;

    unsigned char dummyShift1;

    unsigned char dummyShift2;



    M500PcdSetTmo(106);

    memcpy(snr_in,snr,4);



    WriteIO(RegDecoderControl,0x28);

    ClearBitMask(RegControl,0x08);

    complete = 0;

    while (!complete && (status == MI_OK) )

    {

        ResetInfo(MInfo);

        WriteIO(RegChannelRedundancy,0x03);

        nbits = bcnt % 8;

        if(nbits)

        {

            WriteIO(RegBitFraming,nbits << 4 | nbits);

            nbytes = bcnt / 8 + 1;

            if (nbits == 7)

            {

                MInfo.cmd = PICC_ANTICOLL1;

                WriteIO(RegBitFraming,nbits);

            }

        }

        else

        {

            nbytes = bcnt / 8;

        }

        SerBuffer[0] = 0x93;

        SerBuffer[1] = 0x20 + ((bcnt/8) << 4) + nbits;



        for (i = 0; i < nbytes; i++)

        {

            SerBuffer[i + 2] = snr_in[i];

        }

        MInfo.nBytesToSend   = 2 + nbytes;



        status = M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo);

        if (nbits == 7)

        {

            dummyShift1 = 0x00;

            for (i = 0; i < MInfo.nBytesReceived; i++)

            {

                dummyShift2 = SerBuffer[i];

                SerBuffer[i] = (dummyShift1 >> (i+1)) | (SerBuffer[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)

        {

            if ( MInfo.nBitsReceived != (40 - bcnt) )

            {

                status = MI_BITCOUNTERR;

            }

            else

            {

                byteOffset = 0;

                if( nbits != 0 )

                {

                    snr_in[nbytes - 1] = snr_in[nbytes - 1] | SerBuffer[0];

                    byteOffset = 1;

                }



                for ( i =0; i < (4 - nbytes); i++)

                {

                    snr_in[nbytes + i] = SerBuffer[i + byteOffset];

                }



                if (status != MI_COLLERR )

                {

                    dummyShift2 = snr_in[0] ^ snr_in[1] ^ snr_in[2] ^ snr_in[3];

                    dummyShift1 = SerBuffer[MInfo.nBytesReceived - 1];

                    if (dummyShift2 != dummyShift1)

                    {

                        status = MI_SERNRERR;

                    }

                    else

                    {

                        complete = 1;

                    }

                }

                else

                {

                    bcnt = bcnt + MInfo.collPos - nbits;

                    status = MI_OK;

                }

            }

        }

    }

    if (status == MI_OK)

    {

        memcpy(snr,snr_in,4);

    }

    else

    {

        memcpy(snr,"0000",4);

    }

    ClearBitMask(RegDecoderControl,0x20);



    return status;

}



//////////////////////////////////////////////////////////////////

// Cascaded Select command defined in ISO14443(MIFARE)

// 选择卡 Select Card

// snr: PICC's 4 Bytes serial number

// sak: 1 Byte select acknowledge

//////////////////////////////////////////////////////////////////

char M500PiccCascSelect(unsigned char *snr,unsigned char *sak)

{

    char idata status = MI_OK;



    M500PcdSetTmo(106);



    WriteIO(RegChannelRedundancy,0x0F);

    ClearBitMask(RegControl,0x08);

    ResetInfo(MInfo);

    SerBuffer[0] = 0x93;

    SerBuffer[1] = 0x70;



    memcpy(SerBuffer + 2,snr,4);

    SerBuffer[6] = SerBuffer[2] ^ SerBuffer[3] ^ SerBuffer[4] ^ SerBuffer[5];

    MInfo.nBytesToSend   = 7;

    status = M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo);



    *sak = 0;

    if (status == MI_OK)

    {

        if (MInfo.nBitsReceived != 8)

        {

            status = MI_BITCOUNTERR;

        }

        else

        {

	        *sak = SerBuffer[0];

        }

    }

    return status;

}



///////////////////////////////////////////////////////////////////////

// Key loading into the MF RC500's EEPROM

// 校验卡密码(E2)

// auth_mode:选择keyA 还是keyB

// snr: 4 Bytes,代表卡的序列号(Serial Number)

// key: 12 Bytes,认证的密码

// block: 所需要认证的块的地址

///////////////////////////////////////////////////////////////////////

/*

char M500PiccAuthE2( unsigned char auth_mode,unsigned char *snr,

                     unsigned char keynr,unsigned char block)



{

    char idata status = MI_OK;

    unsigned int e2addr = 0x80 + keynr * 0x18;

    //unsigned char *e2addrbuf = (unsigned char*)&e2addr;

    unsigned char *e2addrbuf;



    e2addrbuf = (unsigned char *)&e2addr;

    if (auth_mode == PICC_AUTHENT1B)

    {

        e2addr += 12;

    }

    FlushFIFO();

    ResetInfo(MInfo);



    memcpy(SerBuffer,e2addrbuf,2);

    SerBuffer[2] = SerBuffer[0];

    SerBuffer[0] = SerBuffer[1];

    SerBuffer[1] = SerBuffer[2];

    MInfo.nBytesToSend   = 2;

    if ((status=M500PcdCmd(PCD_LOADKEYE2,SerBuffer,&MInfo)) == MI_OK)

    {

        status = M500PiccAuthState(auth_mode,snr,block);  //11.9

    }

    return status;

}

*/

///////////////////////////////////////////////////////////////////////

// Authentication key coding

// uncoded: 6 Bytes uncoded authentication key

// coded: 12 Bytes coded authentication key

///////////////////////////////////////////////////////////////////////

/*

char M500HostCodeKey(  unsigned char *uncoded, unsigned char *coded)

{

    char idata status = MI_OK;

    unsigned char idata cnt = 0;

    unsigned char idata ln  = 0;

    unsigned char 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;

    }

    return MI_OK;

}

*/

///////////////////////////////////////////////////////////////////

// Authentication with direct key loading from the uC

// 直接校验密码

// auth_mode:选择keyA 还是keyB

// snr: 4 Bytes,代表卡的序列号(Serial Number)

// key: 12 Bytes,认证的密码

// block: 所需要认证的块的地址

//////////////////////////////////////////////////////////////////

/*

char M500PiccAuthKey(  unsigned char auth_mode,

                       unsigned char *snr,

                       unsigned char *keys,

                       unsigned char block)

{

    char idata status = MI_OK;

    //PcdSetTmo(2);

    FlushFIFO();

    ResetInfo(MInfo);

    memcpy(SerBuffer,keys,12);

    MInfo.nBytesToSend = 12;

    if ((status=M500PcdCmd(PCD_LOADKEY,SerBuffer,&MInfo)) == MI_OK)

    {

⌨️ 快捷键说明

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