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

📄 rc500.c

📁 RC500的全部操作,读卡
💻 C
📖 第 1 页 / 共 3 页
字号:
    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)
///////////////////////////////////////////////////////////////////////
/*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
///////////////////////////////////////////////////////////////////////
/*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
// 直接校验密码
//////////////////////////////////////////////////////////////////
/*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)
    {      
        status = M500PiccAuthState(auth_mode,snr,block); 
    }
    return status;
}*/

///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
/*char M500PiccAuthState( unsigned char auth_mode,unsigned char *snr,unsigned char block)
{
    char idata status = MI_OK;
    unsigned char idata i = 0;
   
    status = ReadIO(RegErrorFlag);                                     
    if (status != MI_OK)
    {
        if (status & 0x40)           
        {
            status = MI_KEYERR;
        }
        else
        {
            status = MI_AUTHERR;    
        }
    }
    else
    {
        SerBuffer[0] = auth_mode;    

        SerBuffer[1] = block;  
        memcpy(SerBuffer + 2,snr,4); 
        ResetInfo(MInfo);
        MInfo.nBytesToSend = 6;
        if ((status = M500PcdCmd(PCD_AUTHENT1,SerBuffer,&MInfo)) == MI_OK)
        {
            if (ReadIO(RegSecondaryStatus) & 0x07) 
            {
                status = MI_BITCOUNTERR;
            }
            else
            {
                ResetInfo(MInfo);
                MInfo.nBytesToSend = 0;
                if ((status = M500PcdCmd(PCD_AUTHENT2,
                                     SerBuffer,
                                     &MInfo)) == MI_OK) 
                {
                    if ( ReadIO(RegControl) & 0x08 ) 
                    {
                        status = MI_OK;
                    }
                    else
                    {
                        status = MI_AUTHERR;
                    }
                }
            }
        }
    }
    return status;
}*/

////////////////////////////////////////////////////////////////
// Read the mifare card
// 读卡
////////////////////////////////////////////////////////////////
/*char M500PiccRead(unsigned char addr,unsigned char *_data)
{
    char idata status = MI_OK;
    char idata tmp    = 0;

    FlushFIFO();    

    M500PcdSetTmo(3);  
    WriteIO(RegChannelRedundancy,0x0F);
    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); 
    }
    else                // Response Processing
    {
        if (MInfo.nBytesReceived != 16)
        {
            status = MI_BYTECOUNTERR;
            memcpy(_data,"0000000000000000",16);
        }
        else
        {
            memcpy(_data,SerBuffer,16);
        }
    }
    M500PcdSetTmo(1);             
    return status; 
}*/

////////////////////////////////////////////////////////////////
// Write the mifare card
// 写卡  下载密码
////////////////////////////////////////////////////////////////
/*char M500PiccWrite( unsigned char addr,unsigned char *_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)  
        {
            status = MI_BITCOUNTERR;
        }
        else                     
        {
            SerBuffer[0] &= 0x0f; 
            if ((SerBuffer[0] & 0x0a) == 0)
            {
                status = MI_NOTAUTHERR;                   
            }
            else
            {
                if (SerBuffer[0] == 0x0a)
                {
                    status = MI_OK;
                }
                else 
                {
                    status = MI_CODEERR;
                }
            }
        }
    }

    if ( status == MI_OK)
    {
        M500PcdSetTmo(3);    

        ResetInfo(MInfo);   
        memcpy(SerBuffer,_data,16);
        MInfo.nBytesToSend   = 16;
        status = M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo);
        
        if (status & 0x80)   
        {
            status = MI_NOTAGERR;
        }
        else
        {
            if (MInfo.nBitsReceived != 4) 
            {
                status = MI_BITCOUNTERR;
            }
            else                  
            {
                SerBuffer[0] &= 0x0f; 
                if ((SerBuffer[0] & 0x0a) == 0)
                {
                    status = MI_WRITEERR;
                }
                else
                {
                    if (SerBuffer[0] == 0x0a)
                    {
                        status = MI_OK;
                    }
                    else 
                    {
                        status = MI_CODEERR;
                    }
                }     
            }
        }        
        M500PcdSetTmo(1);  
    }
    return status;
}*/

///////////////////////////////////////////////////////////////////////
// Reset Rf Card
///////////////////////////////////////////////////////////////////////
char M500PcdRfReset(unsigned char ms)
{
    char idata status = MI_OK;
	
    if(ms)
    {
        ClearBitMask(RegTxControl,0x03); 
        delay_ms(2);                
        SetBitMask(RegTxControl,0x03); 
    }
    else
    {
        ClearBitMask(RegTxControl,0x03);  
    }
    return status;
}

///////////////////////////////////////////////////////////////////////
// MF RC500 Config
///////////////////////////////////////////////////////////////////////
char MfConfig(void)
{
	char status=MI_OK;
	
	EX0=1;
	IT0 = 1;	

	M500PcdConfig();
	M500PcdMfOutSelect(2);
	return status;
}

///////////////////////////////////////////////////////////////////////
//外中断0
//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; 	
    WriteRawIO(0,0x80);		//选择寄存器页0
    if (MpIsrInfo && MpIsrOut)
    {
		//PrimaryStatus 寄存器,读取接收器、发送器和FIFO 缓冲区状态标志
        while( ReadRawIO(RegPrimaryStatus) & 0x08)	//test IRQ 
        {
            irqMask = ReadRawIO(RegInterruptEn);	//使能和禁止中断请求通过的控制位
            irqBits = ReadRawIO(RegInterruptRq) & irqMask;	//中断请求标志
            MpIsrInfo->irqSource |= irqBits; 
            if (irqBits & 0x01)   
            {  
                nbytes = 64 - ReadRawIO(RegFIFOLength);		//FIFO 中的缓冲字节数
                if ((MpIsrInfo->nBytesToSend - MpIsrInfo->nBytesSent) <= nbytes)
                {
                    nbytes = MpIsrInfo->nBytesToSend - MpIsrInfo->nBytesSent;
                    WriteRawIO(RegInterruptEn,0x01);	//允许将LoAlert中断请求传递给脚IRQ
                }   
                for ( cnt = 0;cnt < nbytes;cnt++)
                {
                    WriteRawIO(RegFIFOData,MpIsrOut[MpIsrInfo->nBytesSent]);	//FIFO 缓冲区
                    MpIsrInfo->nBytesSent++;
                }
                WriteRawIO(RegInterruptRq,0x01);  	//中断请求标志
            }      
            if (irqBits & 0x10)    
            {
                WriteRawIO(RegInterruptRq,0x10);    
                WriteRawIO(RegInterruptEn,0x82);   
                if (MpIsrInfo->cmd == PICC_ANTICOLL1) 	
	            {                                        
                    WriteIO(RegChannelRedundancy,0x02);	//选择RF 信道上数据完整性检测的类型和模式
                    WriteRawIO(0,0x80);
	            }	
            }
            if (irqBits & 0x0E) 
            {
                nbytes = ReadRawIO(RegFIFOLength);
                for ( cnt = 0; cnt < nbytes; cnt++)               
                {
                    MpIsrOut[MpIsrInfo->nBytesReceived] = ReadRawIO(RegFIFOData);
                    MpIsrInfo->nBytesReceived++;
                }
                WriteRawIO(RegInterruptRq,0x0A & irqBits); 
            }   
            if (irqBits & 0x04) 
            {
                WriteRawIO(RegInterruptEn,0x20); 
                WriteRawIO(RegInterruptRq,0x20); 
                irqBits &= ~0x20; 
                MpIsrInfo->irqSource &= ~0x20;
                WriteRawIO(RegInterruptRq,0x04);
            }
            if (irqBits & 0x20)     
            {
                WriteRawIO(RegInterruptRq,0x20); 
                MpIsrInfo->status = MI_NOTAGERR; 
            }
        }
    }
}


⌨️ 快捷键说明

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