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

📄 rc500.c

📁 ARM7 SPI RC531驱动程序,数据手册
💻 C
📖 第 1 页 / 共 5 页
字号:
	return M500PcdLoadKeyE2(0x60,bank/4,password);
}





/****************************************************************************
* 名    称:SelectTag
* 功    能:选技卡
* 入口参数:snr 卡序列号
			返回值
* 出口参数:0正常,其它错误码
****************************************************************************/
char SelectTag(unsigned char *snr, unsigned char *sak)
{
	char status;
	snr=snr;
    status=M500PiccCascSelect(snr,sak);		
	return status;

}




/****************************************************************************
* 名    称:CascAnticoll
* 功    能:防碰撞
* 入口参数:bcnt 0
			snr 卡序列号
* 出口参数:0正常,其它错误码
****************************************************************************/
char CascAnticoll(unsigned char bcnt,unsigned char *snr)
{
	unsigned char status;
	status=M500PiccCascAnticoll(bcnt,snr);
	memcpy((void *)MLastSelectedSnr,(void *)snr,4);
	return status;
}




/****************************************************************************
* 名    称:M500PiccRead
* 功    能:读卡实体函数
* 入口参数:_data 	卡数据
			addr 		块号
* 出口参数:0正常,其它错误码
****************************************************************************/
char M500PiccRead(unsigned char addr,unsigned char *_data)
{
	char status = MI_OK;

    FlushFIFO();    

    M500PcdSetTmo(1);  
    WriteIO(RegChannelRedundancy,0x0F);
    ResetInfo(MInfo);   
    SerBuffer[0] = PICC_READ;   
    SerBuffer[1] = addr;
    MInfo.nBytesToSend = 2;   
//	MpIsrInfo
    status = M500PcdCmd(PCD_TRANSCEIVE,(unsigned char *)SerBuffer,(MfCmdInfo *)&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,(void *)SerBuffer,16);
        }
    }
	
    M500PcdSetTmo(1);             
    return status; 
}



/****************************************************************************
* 名    称:M500PiccWrite
* 功    能:写卡实体函数
* 入口参数:ReadData 	卡数据
			bank 		块号
* 出口参数:0正常,其它错误码
****************************************************************************/
char M500PiccWrite( unsigned char addr,unsigned char *_data)
{
    char status = MI_OK;
    
    ResetInfo(MInfo);   
    SerBuffer[0] = PICC_WRITE; 
    SerBuffer[1] = addr;            
    MInfo.nBytesToSend   = 2;
    status = M500PcdCmd(PCD_TRANSCEIVE,(unsigned char *)SerBuffer,(MfCmdInfo *)&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((unsigned char *)SerBuffer,_data,16);
        MInfo.nBytesToSend   = 16;
        status = M500PcdCmd(PCD_TRANSCEIVE,(unsigned char *)SerBuffer,(MfCmdInfo *)&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;
}





/****************************************************************************
* 名    称:ReadCard
* 功    能:读卡
* 入口参数:ReadData 	卡数据
			bank 		块号
* 出口参数:0正常,其它错误码
****************************************************************************/
unsigned char ReadCard(	unsigned char *ReadData,unsigned char bank)
{
	return M500PiccRead(bank,ReadData);
}




/****************************************************************************
* 名    称:WriteCard
* 功    能:写卡
* 入口参数:WriteData 	卡数据
			bank 		块号
* 出口参数:0正常,其它错误码
****************************************************************************/
unsigned char WriteCard(unsigned char *WriteData,unsigned char bank)
{
	return M500PiccWrite(bank,WriteData);
}




/****************************************************************************
* 名    称:fine
* 功    能:寻卡
* 入口参数:req_code 寻卡指令 request code ALL = 0x52  or IDLE = 0x26
			agq 返回卡类型
* 出口参数:0正常,其它错误码
****************************************************************************/
char fine(unsigned char req_code,unsigned char *atq)
{
	unsigned char status;
   	status=M500PiccCommonRequest(req_code,atq);
	if(status!=0)
	{
		status=M500PiccCommonRequest(req_code,atq);
		if(status!=0)				
		{
			
		}
	}
	 return status;
}






/****************************************************************************
* 名    称:M500PiccHalt
* 功    能:终止卡的操作
* 入口参数:无
* 出口参数:0正常,其它错误码
****************************************************************************/
char M500PiccHalt(void)
{
    char 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,(unsigned char *)SerBuffer,(MfCmdInfo *)&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; 
}





/****************************************************************************
* 名    称:Fine_Card
* 功    能:寻卡,碰撞,选卡
* 入口参数:CardSN 卡序列号
			cardtype 返回卡类型
* 出口参数:0正常
			0x10,无卡,
			0x11,碰撞失败
			0x12,选卡失败
****************************************************************************/
unsigned char Fine_Card(unsigned char *CardSN,unsigned char *cardtype)
{
	unsigned char dat[4],sak[4];
	if(fine(0x26,dat)==0)
	{
		*cardtype = dat[0];
		if(CascAnticoll(0,dat)==0)
		{
			CardSN[0]=dat[0];
			CardSN[1]=dat[1];
			CardSN[2]=dat[2];
			CardSN[3]=dat[3];
			if(SelectTag(dat,sak)==0)
			{
				return 0;
			}
			else return 0x12;
		}
		else return 0x11;
	}
	else return 0x10;
}



/****************************************************************************
* 名    称:PiccCMD14443_4
* 功    能:14443-4指令的发送与接收
* 入口参数:senddata				发送的数据
			readdata				接收的数据
			sendlen					发送的字节数
			readlen					接收到的字节数
* 出口参数:0正常,,其它错误码
****************************************************************************/
char PiccCMD14443_4(unsigned char *senddata,unsigned char *readdata,unsigned char sendlen,unsigned char *readlen)
{
   char status = MI_OK;

   	FlushFIFO();    
    M500PcdSetTmo(106);  
    WriteIO(RegChannelRedundancy,0x0F);
    ResetInfo(MInfo);   
    memcpy((void *)SerBuffer,senddata,sendlen);
    MInfo.nBytesToSend  = sendlen;   
    status = M500PcdCmd(PCD_TRANSCEIVE,(unsigned char *)SerBuffer,(MfCmdInfo *)&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,r_data,16); //超时
	  *readlen = 0;
    }
    else                // Response Processing
    {
		*readlen=MInfo.nBytesReceived;
		memcpy(readdata,(void *)SerBuffer,*readlen);
    }
    M500PcdSetTmo(1);             
    return status; 
}





/****************************************************************************
* 名    称:Select_3f02()
* 功    能:外部中断EINT3服务函数,取反B1控制口。
* 入口参数:指令执行状态
* 出口参数:0正常,,其它错误码
****************************************************************************/
unsigned char Select_3f02(unsigned char *p)
{
	unsigned char cmd[]={0x0a,0x00,0x00,0xa4,0x00,0x00,0x02,0x3f,0x02};
	unsigned char len;
	unsigned short st;
	if(PiccCMD14443_4(cmd,p,9,&len)==0)
	{
		st = p[len-2]*0x100+p[len-1];
		if(st==0x9000)
		{
			memcpy(p,&p[0],len);
			return 0;
		}
		else
		{
			return 2;
		}
	}
	return 1;
}




/****************************************************************************
* 名    称:read_ls()
* 功    能:读历吏字节。
* 入口参数:olddata			历吏字节	
* 出口参数:0正常,,其它错误码
****************************************************************************/
unsigned char read_ls(unsigned char *olddata)//ratq读历吏07 77 F7 80 02 47 65 
{
	unsigned char b[4];	
	unsigned char len;
	unsigned char bak;
	b[0]=0xe0;
	b[1]=0x50;
	bak = PiccCMD14443_4(b,olddata,2,&len);
	return bak;
}




/****************************************************************************
* 名    称:GetCardSN()
* 功    能:取卡序列号* 入口参数:SN		卡序列号
* 出口参数:0正常,,其它错误码
****************************************************************************/
unsigned char GetCardSN(unsigned char *SN)
{
	unsigned char  cmd[]={0x0b,0x00,0x00,0xb0,0x95,0x00,0x1c};//0a,0a
	unsigned char  buff[32];
	unsigned char bak,i,len;
	unsigned short st;
	bak = PiccCMD14443_4(cmd,buff,7,&len);
	
	if(bak==0)
	{
		st = buff[len-2]*0x100+buff[len-1];
		if(st==0x9000)
		{
			memcpy(SN,&buff[14],8);
			memcpy(&SN[24],&buff[22],8);
			memcpy(&SN[8],&buff[2],2);
			for( i = 2 ; i < 8 ; i++ )
			{
				SN[8+i] = 0xff;	
			}
			SN[16]=buff[4];
			SN[17]=buff[5]|0x0f;
			for( i = 2 ; i < 8 ; i++ )
			{
				SN[16+i] = 0xff;	

⌨️ 快捷键说明

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