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

📄 m500auc.c

📁 51单片机进行mifare1射频卡开发
💻 C
📖 第 1 页 / 共 5 页
字号:
            if (ReadIO(RegSecondaryStatus) & 0x07)
            {
                status = MI_BITCOUNTERR;    /* 认证不成功,置比特计数标志 */
            }
            else
            {
                ResetInfo(MInfo);
                MInfo.nBytesToSend = 0;
                /* 上面为认证命令2的入口参数:相关流动信息,要发送的字节数 */
                if ((status = M500PcdCmd(PCD_AUTHENT2,
                                     SerBuffer,
                                     &MInfo)) == MI_OK)
                {
                    if ( ReadIO(RegControl) & 0x08 )
                    {
                        status = MI_OK;   /* 认证成功,RC500会自动置CRYTON=1 */
                    }
                    else
                    {
                        status = MI_AUTHERR; /* 认证不成功,置认证错标志 */
                    }
                }
            }
        }
    }
    return status;     /* 返回状态值 */
}

////////////////////////////////////////////////////////////////
// Read the mifare card
       /* 读卡,一次读出16字节(一整块BLOCK) */
////////////////////////////////////////////////////////////////
char M500PiccRead(unsigned char addr,unsigned char *_data)
{         /* addr=卡的EEROM数据块地址,_data=读出数据的存放区首址 */
    char idata status = MI_OK;
    char idata tmp    = 0;

    FlushFIFO();      /* 清缓冲区 */

    M500PcdSetTmo(3);
    WriteIO(RegChannelRedundancy,0x0F);     /* 16比特CRC检测,奇校验 */
    ResetInfo(MInfo);
    SerBuffer[0] = PICC_READ;
    SerBuffer[1] = addr;
    MInfo.nBytesToSend   = 2;
    /* 上面为读卡命令的入口参数:读指令,块地址,发送字节数 */
    status = M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo);   /* 读卡 */

    if (status != MI_OK)      /* 读卡命令执行不成功 */
    {
        if (status != MI_NOTAGERR )
        {
            if (MInfo.nBitsReceived == 4)
            {
                SerBuffer[0] &= 0x0f;
                if ((SerBuffer[0] & 0x0a) == 0)
                {
                    status = MI_NOTAUTHERR;    /* 认证不成功,或说无权访问 */
                }
                else
                {
                    status = MI_CODEERR;     /* 编码错误 */
                }
            }
        }
        memcpy(_data,"0000000000000000",16);   /* 执行不成功则返回00 */
    }
    else     /* 读卡命令执行成功 */           // Response Processing
    {
        if (MInfo.nBytesReceived != 16)        /* 如果返回的字节个数不是16 */
        {
            status = MI_BYTECOUNTERR;          /* 则置字节计数错 */
            memcpy(_data,"0000000000000000",16);    /* 返回00 */
        }
        else                                  /* 如果返回的字节个数是16 */
        {
            memcpy(_data,SerBuffer,16);     /* 则将读出的数据送_DATA存储 */
        }
    }
    M500PcdSetTmo(1);         /* 延时(方式0) */
    return status;        /* 返回状态值 */
}

////////////////////////////////////////////////////////////////
// Write the mifare card
/* 写卡,下载密码到15区(1-15)的任意区的第四块(密钥块)*/
////////////////////////////////////////////////////////////////
char M500PiccWrite( unsigned char addr,unsigned char *_data)
{            /* addr=卡的EEROM数据块地址,_data=写入数据的存放区首址 */
    char idata status = MI_OK;

    ResetInfo(MInfo);
    SerBuffer[0] = PICC_WRITE;
    SerBuffer[1] = addr;
    MInfo.nBytesToSend   = 2;
    /* 上面为写卡命令的入口参数:写指令,块地址,发送字节数 */
    status = M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo);

    if (status != MI_NOTAGERR)   /* 如果不是出现无卡情况 */
    {
        if (MInfo.nBitsReceived != 4)   /* 如果返回比特数不是4 */
        {
            status = MI_BITCOUNTERR;    /* 则置比特计数错标志 */
        }
        else    /* 如果返回比特数是4 */
        {
            SerBuffer[0] &= 0x0f;
            if ((SerBuffer[0] & 0x0a) == 0)
            {
                status = MI_NOTAUTHERR;   /* 没有通过授权(有些块是禁止读写的) */
            }
            else
            {
                if (SerBuffer[0] == 0x0a)   /* 如果返回数据第一个字节最后四位是A */
                {
                    status = MI_OK;      /* 则写入命令执行成功 */
                }
                else
                {
                    status = MI_CODEERR;   /* 否则是数据校验出错 */
                }
            }
        }
    }

    if ( status == MI_OK)       /* 如果写入命令执行成功 */
    {
        M500PcdSetTmo(3);

        ResetInfo(MInfo);
        memcpy(SerBuffer,_data,16);
        MInfo.nBytesToSend   = 16;
        /* 上面为写卡命令的入口参数:要写入的数据16字节 */
        status = M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo);     /* 开始写入 */
             /* 要写卡,必须先送命令,再送数据 */
        if (status & 0x80)    /* 如果返回状态最高位为1 */
        {
            status = MI_NOTAGERR;    /* 则是无卡在此场 */
        }
        else            /* 如果返回状态最高位为0 */
        {
            if (MInfo.nBitsReceived != 4)      /* 如果返回比特数不是4 */
            {
                status = MI_BITCOUNTERR;       /* 则置比特计数错标志 */
            }
            else      /* 如果返回比特数是4 */
            {
                SerBuffer[0] &= 0x0f;
                if ((SerBuffer[0] & 0x0a) == 0)    /* 如果返回数据第一个字节最后四位是0 */
                {
                    status = MI_WRITEERR;       /* 写卡失败标志 */
                }
                else         /* 如果返回数据第一个字节最后四位不是0 */
                {
                    if (SerBuffer[0] == 0x0a)   /* 如果返回数据第一个字节最后四位是A,为什么? */
                    {
                        status = MI_OK;        /* 则写卡成功 */
                    }
                    else
                    {
                        status = MI_CODEERR;   /* 否则是数据校验出错 */
                    }
                }
            }
        }
        M500PcdSetTmo(1);       /* 延时(方式1) */
    }
    return status;              /* 返回状态值 */
}

///////////////////////////////////////////////////////////////////////
// Reset Rf Card
/* 重新配置RF 读卡器 */
///////////////////////////////////////////////////////////////////////
char M500PcdRfReset(unsigned char ms)
{
    char idata status = MI_OK;

    if(ms)                /* 如果有重启信号1 */
    {
        ClearBitMask(RegTxControl,0x03);   /* 全部清零,不再有输出 */
        delay_1ms(2);
        SetBitMask(RegTxControl,0x03);     /* 让TX1/TX2脚都能输出 */
    }
    else                 /* 如果没有重启信号0 */
    {
        ClearBitMask(RegTxControl,0x03);   /* 关闭输出 */
    }
    return status;        /* 返回状态值 */
}

#pragma noaregs

                     /* 延时子程序集 */

///////////////////////////////////////////////////////////////////////
// Delay 50us
///////////////////////////////////////////////////////////////////////
void delay_50us(unsigned char _50us)
{
    while(_50us--)
	{
	    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
	    _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
    }
}

///////////////////////////////////////////////////////////////////////
// Delay 1ms
///////////////////////////////////////////////////////////////////////
void delay_1ms(unsigned char _1ms)
{
#ifndef NO_TIMER2
    RCAP2LH = RCAP2_1ms;
    T2LH    = RCAP2_1ms;

    TR2 = TRUE;
    while (_1ms--)
    {
	    while (!TF2);
	    TF2 = FALSE;
    }
    TR2 = FALSE;
#else
    while (_1ms--)
    {
	    delay_50us(20);
    }
#endif
}

///////////////////////////////////////////////////////////////////////
// Delay 10ms
///////////////////////////////////////////////////////////////////////
void delay_10ms(unsigned int _10ms)
{
#ifndef NO_TIMER2
    RCAP2LH = RCAP2_10ms;
    T2LH    = RCAP2_10ms;

    TR2 = TRUE;
    while (_10ms--)
    {
	    while (!TF2);
	    TF2 = FALSE;
    }
    TR2 = FALSE;
#else
    while (_10ms--)
    {
	    delay_50us(19);
	    if (CmdValid)
	        return;
	    delay_50us(20);
	    if (CmdValid)
	        return;
	    delay_50us(20);
	    if (CmdValid)
	        return;
	    delay_50us(20);
	    if (CmdValid)
	        return;
	    delay_50us(20);
	    if (CmdValid )
	        return;
	    delay_50us(20);
	    if (CmdValid)
	        return;
	    delay_50us(20);
	    if (CmdValid)
	        return;
	    delay_50us(20);
	    if (CmdValid)
	        return;
	    delay_50us(20);
	    if (CmdValid)
	        return;
	    delay_50us(19);
	    if (CmdValid)
	        return;
    }
#endif
}

///////////////////////////////////////////////////////////////////////
/* RC500中断处理总程序 */
///////////////////////////////////////////////////////////////////////
void RC500ISR (void) interrupt 0 using 1
{
    static unsigned char idata irqBits;
    static unsigned char idata irqMask;
    static unsigned char idata nbytes;
    static unsigned char idata cnt;

    IE0 = 0;        /* 用的是INT0脚 */
    WriteRawIO(0,0x80);
    if (MpIsrInfo && MpIsrOut)
    {
        while( ReadRawIO(RegPrimaryStatus) & 0x08)     /* 第四位表示是否有中断请求(03H) */
        {
            irqMask = ReadRawIO(RegInterruptEn);       /* IRQMASK=中断使能寄存器内容(06H) */
            irqBits = ReadRawIO(RegInterruptRq) & irqMask;  /* IRQBITS=中断使能+中断请求寄存器内容(07H) */
            MpIsrInfo->irqSource |= irqBits;

⌨️ 快捷键说明

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