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

📄 paypass_anticollision.c

📁 读RF卡的源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
	v_fnSendHALTA(p_pStructReader);
	// no response waiting from the PICC

	// WAIT DURING tH = 100etu = 0,94ms = 2*472祍
	for(l_bDelay=2;l_bDelay>0;l_bDelay--) 
	{	
		delay_us(472);
	}

	// SEND REQ A
	l_bStatus = b_fnSendReceiveREQAWUPA(_ISOA_REQA,&l_abBuffer[0],p_pStructReader,&g_lDataBytesReceived);

  
	// IF A CARD A ANSWERS --> RETURN ERROR		// FP COLLISION RETURN 23/08/07
	if (l_bStatus != ERR_NOCARD) 
	{	
		return COLLISION_ERROR ; // return TRANSMISSION_ERROR;
	}

	// CHANGE PROTOCOL AND WAIT DURRING THE SAME TIME tP = 4,72ms
	// delay(500 etu = 4,72 ms = 10 * 419 祍 + t(ProtocolChange) )  	 
    for(l_bDelay=10;l_bDelay>0;l_bDelay--) 
	{	
		delay_us(419);
	}
	// LOAD ISO14443-B PROTOCOL
	v_fnProtocolChange(ISOB_PROTOCOL,&g_abP6Config14443B_PayPass[0],g_bRFReceiveEOFB,p_pStructReader);   
	
	// SEND WUPB
	l_bStatus = b_fnSendReceiveREQBWUPB_PayPass(_ISOB_WUPB_NO_SLOT,&l_abBuffer[0],p_pStructReader,&g_lDataBytesReceived);


	// IF A CARD B ANSWERS: COLLISION --> RETURN ERROR	  // FP COLLISION RETURN 23/08/07
	if (l_bStatus != ERR_NOCARD) 
	{		
		return COLLISION_ERROR ;// return TRANSMISSION_ERROR;
	}

	//CHANGE PROTOCOL AND WAIT DURRING THE SAME TIME tP = 4,72ms
	//delay(500 etu = 4,72 ms = 10 * 419 祍 + t(ProtocolChange) )  	 
    for(l_bDelay=10;l_bDelay>0;l_bDelay--) 
	{	
		delay_us(419);
	}
	// LOAD ISO14443-A PROTOCOL
	v_fnProtocolChange(ISOA_PROTOCOL,&g_abP6Config14443A_PayPass[0],g_bRFReceiveEOFA,p_pStructReader);   

#ifdef MODE_DEBUG
	printf("Card A ready for activate \n");
	printf("UID : ");
	for(i=0;i<*p_bUIDLength;i++)
	{
		printf("%02x",p_abUID[i]);
	}
	printf("         PUID Lenght : ");
	printf("%02d\n",*p_bUIDLength);
#endif
	return END_COLLISION_A;
}


//-----------------------------------------------------------------------------
// Function name : b_fnCollisionB(unsigned char* l_abBuffer, StructReader* p_pStructReader)
//-----------------------------------------------------------------------------
// Description : Do the type B collision detection
//               
//
// IN       :   p_pStructReader : Pointer to the used StructReader structure.
//				l_abBuffer		: ATQB extract from the WUPB of POLLING
//
// OUT      :   - none -
//  
// RETURN   :	END_COLLISION_B	   one card B 
//				PROTOCOL_ERROR
//				TIME_OUT_ERROR
//				TRANSMISSION_ERROR Collision
//
// Notes    :  	- none -
//-----------------------------------------------------------------------------
unsigned char b_fnCollisionB(unsigned char* l_abBuffer, StructReader* p_pStructReader)
{
	unsigned char l_bStatus;
	unsigned char i;
	unsigned char l_bDelay;
	
	// EXTRACT FWI FROM THE ATQB TO CALCULATE THE FWT FOR THE HALTB COMMAND
	g_FWT_SFGT = b_fnFWT_SFGTCalculate(_FWT,l_abBuffer[11],1);
	g_FWT_SFGT += _PICOREAD_TIMEOUT_OFFSET_B;

	/*--------------COLLISION DETECTION B--------------*/
	// SEND HALT CMD TO THE CHIP 			
	i = 0;
	do					   //loop(x3) for time-out error
	{
		i += 1;
		// TIMEOUT VALUE (礢) = g_FWT_SFGT : calculate with the FWI of ATQB
		p_pStructReader->s_bRTimeoutUsed = g_FWT_SFGT; 
		// SEND HALTB COMMAND AND RECEIVE RESPONSE  
		l_bStatus = b_fnSendReceiveHALTB(&l_abBuffer[0],p_pStructReader);
	
		// CHECK ERROR
	    l_bStatus = b_fnPayPassAnticollisionErrorHandling(_ISOB_HALT, l_bStatus,&l_abBuffer[0],g_lDataBytesReceived);
	}
	while (( i < 3 ) && (l_bStatus == ERR_NOCARD));

	// RETURN ERROR
	if ((l_bStatus == ERR_NOCARD) && (i = 2)) 
	{
		return TIME_OUT_ERROR;
	}

	// FP COLLISION RETURN 23/08/07
	if (l_bStatus == ERR_COLL)
	{
		return COLLISION_ERROR ;	 
	}


	if(l_bStatus != ERR_NO_ERROR) 
	{
		return TRANSMISSION_ERROR; 		//	return l_bStatus; FP 23/08/07
	}


#ifdef MODE_DEBUG
	printf("Card B halted\n");
#endif

	/*----------COLLISION CHECKING----------*/
	// TIMEOUT VALUE + PICOREAD OFFSET (祍)
	p_pStructReader->s_bRTimeoutUsed = (_FWT_ATQB + _PICOREAD_TIMEOUT_OFFSET_B);		
	// SEND REQB COMMAND
 	l_bStatus = b_fnSendReceiveREQBWUPB_PayPass(_ISOB_REQB_NO_SLOT,&l_abBuffer[0],p_pStructReader,&g_lDataBytesReceived);


	// IF CARD B ANSWERS: COLLISION --> RETURN ERROR   // FP COLLISION RETURN 23/08/07
	if(l_bStatus != ERR_NOCARD) 
	{
		return COLLISION_ERROR ; //eturn TRANSMISSION_ERROR;
	}

	//CHANGE PROTOCOL AND WAIT DURRING THE SAME TIME tP = 4,72ms
	//delay(500 etu = 4,72 ms = 10 * 419 祍 + t(ProtocolChange) )  	 
    for(l_bDelay=10;l_bDelay>0;l_bDelay--) 
	{
		delay_us(419);
	}
	// LOAD ISO14443-A PROTOCOL	
	v_fnProtocolChange(ISOA_PROTOCOL,&g_abP6Config14443A_PayPass[0],g_bRFReceiveEOFA,p_pStructReader);   
	
	// SEND WUPA COMMAND
	l_bStatus = b_fnSendReceiveREQAWUPA(_ISOA_WUPA,&l_abBuffer[0],p_pStructReader,&g_lDataBytesReceived);
    

	// If CARD A ANSERS: COLLISION --> RETURN ERROR			// FP COLLISION RETURN 23/08/07
	if (l_bStatus != ERR_NOCARD) 
	{
		return COLLISION_ERROR ;	// return TRANSMISSION_ERROR;
	}

	//CHANGE PROTOCOL AND WAIT DURRING THE SAME TIME tP = 4,72ms
	//delay(500 etu = 4,72 ms = 10 * 419 祍 + t(ProtocolChange) )  	 
    for(l_bDelay=10;l_bDelay>0;l_bDelay--) 
	{
		delay_us(419);
	}
	// LOAD ISO14443-B PROTOCOL	
	v_fnProtocolChange(ISOB_PROTOCOL,&g_abP6Config14443B_PayPass[0],g_bRFReceiveEOFB,p_pStructReader);   

#ifdef MODE_DEBUG
	printf("Card B ready for activate\n");
#endif
	return END_COLLISION_B;
}


//-----------------------------------------------------------------------------
// Function name : b_fnActivateA(unsigned char* p_abATQAResponse_polling,unsigned char* p_abUID, StructReader* p_pStructReader)
//-----------------------------------------------------------------------------
// Description : Do the type A Activate
//               
// IN       :   p_pStructReader : Pointer to the used StructReader structure.
//				p_abATQAResponse_polling : ATQA memorized in the polling
//				p_abUID			: UID memorized in COLLISION
//
// OUT      :    - none -
//  
// RETURN   :	END_ACTIVATE_A	   card A activated 
//				PROTOCOL_ERROR
//				TIME_OUT_ERROR
//				TRANSMISSION_ERROR Collision
//
// Notes    :  	- none -
//-----------------------------------------------------------------------------
unsigned char b_fnActivateA(unsigned char* p_abATQAResponse_polling, unsigned char* p_abUID, StructReader* p_pStructReader)
{
	unsigned char l_bStatus;
	unsigned char l_abBuffer[20];
	unsigned char l_bDelay;
	unsigned char i,v;
	unsigned char l_bSEL;
	unsigned char l_bCurrentSerial, l_lDataBytesReceived;
	unsigned char l_abDataForPrintf[3];

	v = 0;
	
	l_lDataBytesReceived = 0;
	l_abDataForPrintf[0] = 0;

	/*----------WUPA----------*/
	//CONFIGURE DATA TO SEND & SEND COMMANDE		 
	i = 0;
	do						  //loop(x3) for time-out error
	{
		i += 1;

		//Option for Host mode
	/*	#ifdef TTAL1
		printf("WUPA Command:	%02x\n",_ISOA_WUPA);
		if(g_sLog.enable)
		{
			sprintf(g_sLog.buffer,"WUPA Command:	%02x\n",_ISOA_WUPA);
		}
		#endif
	  */		
	  //TA311 retarde

		// SEND WUPA COMMAND AND RECEIVE ATQA
		l_bStatus = b_fnSendReceiveREQAWUPA(_ISOA_WUPA,&l_abBuffer[0],p_pStructReader,&g_bATQALength);
		// CHECK ERROR
		l_bStatus = b_fnPayPassAnticollisionErrorHandling(_ISOA_WUPA, l_bStatus,&l_abBuffer[0],g_bATQALength);

	/*	#ifdef TTAL1
		//Option for Host mode
					printf("ATQA received:	%02x%02x\n",l_abBuffer[0],l_abBuffer[1]);
		if(g_sLog.enable)
		{
		
			sprintf(g_sLog.buffer + strlen(g_sLog.buffer),"ATQA received:	%02x%02x\n",l_abBuffer[0],l_abBuffer[1]);
		}		
		#endif
		*/
		//TA311 Retarde
	}
	while ((i < 3) && (l_bStatus == ERR_NOCARD));
	
	// RETURN ERROR
	if ((i = 3) && (l_bStatus == ERR_NOCARD)) 
	{
		return TIME_OUT_ERROR;  // time-out error within tresetdelay
	}

		// FP COLLISION RETURN 23/08/07
	if (l_bStatus == ERR_COLL)
	{
		return COLLISION_ERROR ;	 
	}

	if (l_bStatus != ERR_NO_ERROR)
	{
	 	return TRANSMISSION_ERROR;      //return l_bStatus; FP 23/08/07
	}	
									 
   // VERIFY THE ATQA VALUE	(Requirements 9.4)
	for(i=0;i<(g_bATQALength);i++) 
	{
		if (p_abATQAResponse_polling[i] != l_abBuffer[i])  
		{
			return PROTOCOL_ERROR;
		}
	}
	 	
#ifdef MODE_DEBUG
	printf("Card A awoken, ATQA OK\n");
#endif
   /*----------UID SIZE DETECTION----------*/
   l_bCurrentSerial  =0;
   l_bSEL = _ISOA_SELECT;
   do 
   {	
   		// CLEAR BUFFER		
   		memset(&l_abBuffer[5],0,10);
		// COPY UID IN BUFFER TO SEND					 
		memcpy(&l_abBuffer[2],&p_abUID[l_bCurrentSerial],4);

		//SELECT COMMAND
		i = 0;
		do				   //loop(x3) for time-out error
		{
			i += 1;
			
			#ifdef TTAL1
			//Option for Host mode
			if(g_sLog.enable)	   
			{
				//BUFFER CONCATENATION
				l_abDataForPrintf[0] = l_bSEL;
				l_abDataForPrintf[1] = 0x70;
				l_abDataForPrintf[2] = l_abBuffer[2];
				l_abDataForPrintf[3] = l_abBuffer[3];
				l_abDataForPrintf[4] = l_abBuffer[4];
				l_abDataForPrintf[5] = l_abBuffer[5];
				l_abDataForPrintf[6] = l_abBuffer[2] ^ l_abBuffer[3] ^ l_abBuffer[4] ^ l_abBuffer[5]; // LRC (BCC calculate)	  
				sprintf(g_sLog.buffer + strlen(g_sLog.buffer),"SELECT Command: %02x%02x%02x%02x%02x%02x%02x\n",l_abDataForPrintf[0],l_abDataForPrintf[1],l_abDataForPrintf[2],l_abDataForPrintf[3],l_abDataForPrintf[4],l_abDataForPrintf[5],l_abDataForPrintf[6]);
			}
			#endif

		
			// SEND SELECT COMMAND AND RECEIVE SAK
			l_bStatus = b_fnSendReceiveSELECT_ISOA(l_bSEL,&l_abBuffer[0],p_pStructReader);
			// CHECK ERROR
			l_bStatus = b_fnPayPassAnticollisionErrorHandling(_ISOA_SELECT, l_bStatus,&l_abBuffer[0],g_lDataBytesReceived);

			#ifdef TTAL1
			//Option for Host mode
			if(g_sLog.enable)	   
			{
				//BUFFER CONCATENATION (WITH VARIABLE SIZE OF RESPONSE)
				sprintf(g_sLog.buffer+strlen(g_sLog.buffer),"SELECT Response: %02x\n",l_abBuffer[0]);
			}
			#endif
	    }
		while ((i < 3) && (l_bStatus == ERR_NOCARD));
		
		// RETURN ERROR
		if ((i = 3) && (l_bStatus == ERR_NOCARD)) 
		{
			return TIME_OUT_ERROR; //time-out error witih tresetdelay
		}

		// FP COLLISION RETURN 23/08/07
		if (l_bStatus == ERR_COLL)
		{
			return COLLISION_ERROR ;	 
		}

		if (l_bStatus != ERR_NO_ERROR) 
		{
			return TRANSMISSION_ERROR;
		}

		// CHECK UID LENGTH: IF = CT --> DOUBLE OR TRIPLE UID SIZE
		if (p_abUID[l_bCurrentSerial]==0x88) 
		{
			l_bSEL += 2;	 
			l_bCurrentSerial += 5;
		}
		else 
		{	
			l_bCurrentSerial += 5;
			break;
		}
		
		// VERIFY THE LAST SELECT RESPONSE: 
	   	// CASCADE BIT : IF BIT3=0 --> VALID SAK --> COMPLETE UID 
	   	if ((l_abBuffer[0]& 0x04) == 0x00 ) 
		{
			return PROTOCOL_ERROR;
		}									   
	}			  
	while (l_bSEL < 0x98);
	
   // VERIFY THE LAST SELECT RESPONSE: 
   		// CASCADE BIT : IF BIT3=1 --> NOT COMPLETE UID 
   if((l_abBuffer[0]& 0x04) == 0x04 )  
	{
		return PROTOCOL_ERROR;
	}

//Debug OC
#ifdef MODE_DEBUG
	printf("Card A selected\n");
//	printf("g_sLog.enable: %X\n",g_sLog.enable);
//	g_sLog.enable=1;
#endif

	/*----------RATS/ATS----------*/ 
	i = 0;
	do               //loop(x3) for time-out error
	{
		i += 1;
		#ifdef TTAL1
		//Option for Host mode
		if(g_sLog.enable)	   
		{
			//CONCATENATION BUFFER
			l_abDataForPrintf[0] = _ISOA_RATS;
			l_abDataForPrintf[1] = 0x80;
			
			sprintf(g_sLog.buffer+strlen(g_sLog.buffer),"RATS Command:	%02x%02x\n",l_abDataForPrintf[0],l_abDataForPrintf[1]);
		}
		#endif

		// TIMEOUT + PICOREAD OFFSET
		p_pStructReader->s_bRTimeoutUsed = (_FWT_ACTIVATION + _PICOREAD_TIMEOUT_OFFSET_A);
		g_bPayPassTimeoutValue = p_pStructReader->s_bRTimeoutUsed;
  
		// SEND RATS COMMAND AND RECEIVE RESPONSE
		l_bStatus = b_fnSendReceiveRATS_PayPass(&g_abRATS_ATTRIB[0],p_pStructReader);

⌨️ 快捷键说明

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