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

📄 main.c

📁 读ISO14443 CPU卡源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
    if (MI_OK == PcdTransfer(g_cReceBuf[6]))
    {    AnswerCommandOk();    }
    else
    {    AnswerErr(FAULT24);   }
}




/////////////////////////////////////////////////////////////////////
//响应上位机TYPEA卡高级复位命令
/////////////////////////////////////////////////////////////////////
void ComTypeARst()
{
    unsigned char status,i;
    i = (FSDI << 4) & 0xF0;
    status = PcdRequest(g_cReceBuf[6], &g_cReceBuf[0]);
    
    if (status != MI_OK)
    {   status = PcdRequest(g_cReceBuf[6], &g_cReceBuf[0]);   }

    if (status == MI_OK)
    {   status =  PcdAnticoll(&g_cReceBuf[1]);   }
    
    if (status == MI_OK)
    {   status =  PcdSelect(&g_cReceBuf[1], &g_cReceBuf[6]);   }
    
    if (status == MI_OK)    	
    {   status =  MifareProRst(i, &g_cReceBuf[0], &g_cReceBuf[5]);    }
    
    if (status == MI_OK)
    {	
        g_cFWI         = g_cReceBuf[8]>>4; //0xff;//
        g_cReceBuf[0] += 4;
        g_cCidNad      = 0;//(g_cReceBuf[9] & 0x03) << 2;
        AnswerOk(&g_cReceBuf[1], g_cReceBuf[0]);
    }
    else
    {   AnswerErr(FAULT21);    }
}   
 
/////////////////////////////////////////////////////////////////////
//响应上位机ISO14443-4卡COS命令
/////////////////////////////////////////////////////////////////////
void ComTypeACOS()
{
    g_cReceBuf[0] -= 5;
    if (MI_OK == MifareProCom(g_cCidNad, g_cFWI, &g_cReceBuf[0], &g_cReceBuf[6]))
    {	AnswerOk(&g_cReceBuf[6], g_cReceBuf[0]);   }
    else
    {   AnswerErr(FAULT10);    }
} 

   	
/////////////////////////////////////////////////////////////////////
//响应上位机T=CL卡退出激活状态命令
/////////////////////////////////////////////////////////////////////
void ComCL_Deselect()
{
    if (MI_OK == CL_Deselect(0))
    {    AnswerCommandOk();    }
    else
    {    AnswerErr(-1);   }
}






/////////////////////////////////////////////////////////////////////
//正确执行完上位机指令,应答(无返回数据)
/////////////////////////////////////////////////////////////////////
void AnswerCommandOk()
{    
     unsigned char i,chkdata;
     chkdata = 0;
     
     TI   = 0;                         //发送命令头          
     SBUF = 0xAA;
     while (!TI);           
     TI   = 0;
     SBUF = 0xBB;
     while (!TI);
     
     TI   = 0;                         //发送长度字
     SBUF = 0x06;
     while (!TI);           
     TI   = 0;
     SBUF = 0x00; 
     while (!TI);           
          
     TI   = 0;                         //发送设备标识
     SBUF = g_cIcdevH;
     while (!TI);
     if (g_cIcdevH == 0xAA)
     {
     	TI   = 0;
     	SBUF = 0;
     	while (!TI);
     }
     TI   = 0; 
     SBUF = g_cIcdevL; 
     while (!TI);
     if (g_cIcdevL == 0xAA)
     {
     	TI   = 0;
     	SBUF = 0;
     	while (!TI);
     }
     
     TI   = 0;                         //发送命令码                     
     i = (unsigned char)(g_cCommand & 0xFF);
     SBUF = i;
     chkdata ^= i;
     while (!TI);

     TI   = 0;                         //发送命令码 
     i = (unsigned char)((g_cCommand >>8) & 0xFF);
     SBUF = i;
     chkdata ^= i;
     while (!TI);

     TI   = 0;                         //发送状态字
     SBUF = 0;
     while (!TI);           
     
     TI   = 0;                         //发送效验字
     chkdata ^= g_cIcdevH^ g_cIcdevL;
     SBUF = chkdata;
     while (!TI);           
     if (chkdata == 0xAA)
     {
     	TI   = 0;
     	SBUF = 0;
     	while (!TI);
     }
     TI = 0;
     ES = 1;
}

/////////////////////////////////////////////////////////////////////
//正确执行完上位机指令,应答(有返回数据)
//input:answerdata = 应答数据
//       answernum  = 数据长度
/////////////////////////////////////////////////////////////////////
void AnswerOk(unsigned char *answerdata, unsigned int answernum)
{    
     unsigned char chkdata;
     unsigned int i;
     
     TI   = 0;                         //发送命令头          
     SBUF = 0xAA;
     while (!TI);           
     TI   = 0;
     SBUF = 0xBB;
     while (!TI);
     
     TI   = 0;                         //长度字,包括状态字和效验字
     chkdata = (((unsigned char)((answernum + 6) & 0xFF)));
     SBUF = chkdata;
     while (!TI);           
     TI   = 0;
     chkdata = (((unsigned char)(((answernum + 6)>>8) & 0xFF)));
     SBUF = chkdata;
     while (!TI);           
     
     TI   = 0;                         //发送设备标识
     SBUF = g_cIcdevH;
     while(!TI);
     if (g_cIcdevH == 0xAA)
     {
     	TI   = 0;
     	SBUF = 0;
     	while (!TI);
     }
     TI   = 0;
     SBUF = g_cIcdevL;
     while(!TI);
     if (g_cIcdevL == 0xAA)
     {
     	TI   = 0;
     	SBUF = 0;
     	while (!TI);
     }
     
     TI   = 0;                         //发送命令码 
     i = (unsigned char)(g_cCommand & 0xFF);
	 SBUF = i;
	 chkdata ^= i;
     while (!TI);

	 TI   = 0;                         //发送命令码 
     i = (unsigned char)((g_cCommand >>8) & 0xFF);
	 SBUF = i;
	 chkdata ^= i;
     while (!TI);
     
     TI   = 0;                         //状态字
     SBUF = 0;
     while (!TI);           
     
     chkdata ^= g_cIcdevH ^ g_cIcdevL;
     for (i=0; i<answernum; i++)
     {    
     	  TI   = 0;
     	  chkdata ^= *(answerdata+i);
     	  SBUF = *(answerdata+i);                
          while (!TI);
          if (*(answerdata + i) == 0xAA)
          {
              TI   = 0;
              SBUF = 0;
              while (!TI);
          }
     }
     
     TI   = 0;                         //效验字
     SBUF = chkdata;
     while(!TI);           
     
     if (chkdata == 0xAA)
     {
         TI=0;
         SBUF=0;
         while (!TI);
     }
     
     TI = 0;
     ES = 1;
}

/////////////////////////////////////////////////////////////////////
//未能正确执行上位机指令,应答
//input:faultcode = 错误代码
/////////////////////////////////////////////////////////////////////
void AnswerErr(char faultcode)
{    
     unsigned char i,chkdata;
     chkdata = 0;

     TI   = 0;                         //发送命令头          
     SBUF = 0xAA;
     while (!TI);           
     TI   = 0;
     SBUF = 0xBB;
     while (!TI);
     
     TI   = 0;                         //发送长度字
     SBUF = 0x06;
     while (!TI);           
     TI   = 0;
     SBUF = 0x00; 
     while (!TI);           
          
     TI   = 0;                         //发送设备标识
     SBUF = g_cIcdevH;
     while (!TI);
     if (g_cIcdevH == 0xAA)
     {
     	TI   = 0;
     	SBUF = 0;
     	while (!TI);
     }
     TI   = 0; 
     SBUF = g_cIcdevL; 
     while (!TI);
     if (g_cIcdevL == 0xAA)
     {
     	TI   = 0;
     	SBUF = 0;
     	while (!TI);
     }
     
     TI   = 0;                         //发送命令码                     
     i = (unsigned char)(g_cCommand & 0xFF);
	 SBUF = i;
	 chkdata ^= i;
     while (!TI);

	 TI   = 0;                         //发送命令码 
     i = (unsigned char)((g_cCommand >>8) & 0xFF);
	 SBUF = i;
	 chkdata ^= i;
     while (!TI);

     TI   = 0;                         //发送错误代码
     SBUF = faultcode;
     while (!TI);              
     
     chkdata = g_cIcdevH ^ g_cIcdevL ^ faultcode;
     TI   = 0;                         //效验字
     SBUF = chkdata;
     while (!TI);
     
     TI   = 0;
     ES   = 1;
}

/////////////////////////////////////////////////////////////////////
//串行中断,接收上位机数据
/////////////////////////////////////////////////////////////////////
seri_int () interrupt 4 using 1
{
   unsigned int i,j;
   unsigned char rece_data = SBUF;
   unsigned char verify = 0;
   if (RI)
   {    
       RI = 0;
	   if (g_bReceAA)
	   {  
	       g_bReceAA = 0;
	       switch (rece_data)
	       {    
	     	   case 0x00:
	              break;
	           case 0xBB:
	              g_cReceNum = 0;
	              break;
	           default:
	              i = g_cReceNum;
	              g_cReceBuf[i] = rece_data;
	              break;
	       }
	   }
	   else
	   {    
	       switch (rece_data)
	       {    
	     	   case 0xAA:
	              g_bReceAA = 1;
	           default:
	              i = g_cReceNum++;
	              g_cReceBuf[i] = rece_data;
	              break;
	       }
	   }
	   i = (((unsigned int)(g_cReceBuf[1]<<8)) + (unsigned int)(g_cReceBuf[0]));
	   if ((g_cReceNum == i + 2) && ( i != 0 )) 
       {   
            for (j=1; j<g_cReceNum; j++)
            {   verify ^= g_cReceBuf[j];    }
            if (!verify)
	        {   
	    	    g_bReceOk  = 1;
	    	    g_cCommand = (((unsigned int)(g_cReceBuf[5]<<8)) + (unsigned int)(g_cReceBuf[4]));
	    	    g_bReceAA  = 0;
	    	    ES = 0;
	        }
        }

        if (g_cReceNum >= sizeof(g_cReceBuf))
        {   g_cReceNum=0;   }
    }
    if (TI)
    {	TI = 0;   }
}


/////////////////////////////////////////////////////////////////////
//用T2做延时子程序
/////////////////////////////////////////////////////////////////////
void DelayMs(unsigned int _MS)
{
    RCAP2LH = RCAP2_1ms;
    T2LH    = RCAP2_1ms;

    ET2     = 0; 	                                   // Disable timer2 interrupt
    T2CON   = 0x04;                                        // 16-bit auto-reload, clear TF2, start timer
    TR2     = 1;
    while (_MS--)
    {   while (!TF2);TF2 = 0;  }
    TR2 = 0;
}
void Delay_50us(unsigned char _50us)
{
    RCAP2LH = RCAP2_50us;
    T2LH    = RCAP2_50us;

    ET2     = 0; 	                                   // Disable timer2 interrupt
    T2CON   = 0x04;	                                   // 16-bit auto-reload, clear TF2, start timer
    while (_50us--)
    {   while (!TF2);TF2 = 0;  }
    TR2 = 0;
}


⌨️ 快捷键说明

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