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

📄 paypass_ttal1_comm.c

📁 读RF卡的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
//=============================================================================
//                  Copyright (C) INSIDE Contactless 1998-2005
//
// INSIDE Contactless reserves the right to make changes, without notice,
// to any product (including application note) herein to improve
// reliability, functionality, or design. INSIDE Contactless advises its
// customers to obtain the latest version of device data sheets to verify,
// before placing orders, that the information being relied upon by the
// customer is current.
//
// INSIDE Contactless makes no warranty that the use will not infringe any
// third party patent, copyright or trademark.
//
// Information furnished by INSIDE Contactless is believed to be accurate
// and reliable. However, INSIDE Contactless does not assume any liability
// resulting from the application or use of any product described within.
//
// All rights are reserved. Reproduction in whole or in part is prohibited
// without the written consent of the copyright owner.
//
//      Bat 11a,
//      Parc Club du Golf,
//      Z.A.C. du Pichaury                      Tel :   +33 (0)4.42.39.33.00
//      13856 Aix-en-Provence Cedex 3           Fax :   +33 (0)4.42.39.63.19
//      FRANCE                                  Email : info@insidefr.com
//
//-----------------------------------------------------------------------------
// Project Code : PAYPASS LIBRARY
// Project Name : PAYPASS LIBRARY
// Module Name  : PAYPASS_TTAL1_Comm.c
// Platform dev : Keil 礦ision 3 (IDE ) + Keil ARM Compiler
// Target       : LPC2103 (ARM7TDMI Core)
// Language     : C ANSI
// Revision     : 1.0
// Description  : Low level communication protocol with Picoread RF chip
//=============================================================================
// When		Who	Ver		What
// 06-04-24	MCY	1.1		creation
// 06-05-12	FPK	1.2		corrections
//=============================================================================

#include "\DEV\Projects\LIB\PayPass\Defines\Paypass_Main_Defines.h"  




//-----------------------------------------------------------------------------
// Function name : v_fnReceivedFromHostVersion
//-----------------------------------------------------------------------------
// Description : This function clear a of an unsigned char
//
// IN       :   - none -
// OUT      :   - none -
// RETURN   :   - none -
// Notes    :   - none -
//-----------------------------------------------------------------------------
void v_fnReceivedFromHostVersion()
{
	v_fnSendToHostEcho("Version 1.0");
	v_fnSendToHostDone();
}

//-----------------------------------------------------------------------------
// Function name : v_fnReceivedFromHostHelp
//-----------------------------------------------------------------------------
// Description : This function clear a of an unsigned char
//
// IN       :   - none -
// OUT      :   - none -
// RETURN   :   - none -
// Notes    :   - none -
//-----------------------------------------------------------------------------
void v_fnReceivedFromHostHelp()
{
	v_fnSendToHostEcho("\n\nupdate 1*****************************************");
	v_fnSendToHostEcho("   O --> Carrier (O)N");
	v_fnSendToHostEcho("   F --> Carrier O(F)F");
	v_fnSendToHostEcho("   Y --> Displa(Y) P6 configuration");
	v_fnSendToHostEcho("   M --> (M)odify P6 configuration ISO A");
	v_fnSendToHostEcho("   N --> Modify P6 co(N)figuration ISO B");
	v_fnSendToHostEcho("   P --> (P)olling");
	v_fnSendToHostEcho("   R --> (R)eset");
	v_fnSendToHostEcho("   A --> Wup(A)");
	v_fnSendToHostEcho("   a --> Wup(a) in transparent Mode");
	v_fnSendToHostEcho("   B --> Wup(B)");
	v_fnSendToHostEcho("   b --> Wup(b) in transparent Mode");
	v_fnSendToHostEcho("   H --> (H)altA");
	v_fnSendToHostEcho("   J --> HaltB");
	v_fnSendToHostEcho("   S --> WUPA-RAT(S)");
	v_fnSendToHostEcho("   T --> WUPB_A(T)TRIB");
	v_fnSendToHostEcho("   L --> (L)oop back function");
	v_fnSendToHostEcho("   C --> Full Anti(C)ollision");
	v_fnSendToHostEcho("   I --> Help (I)nfo");
	v_fnSendToHostEcho("   V --> (V)ersion");

	v_fnSendToHostEcho("   X --> (X)Abort current command (Polling)");
	v_fnSendToHostEcho("   E --> (E)PCB ask the host to echo next char till)");
	v_fnSendToHostEcho("   D --> (D)PCB notify host of command done)");
	v_fnSendToHostEcho("   U --> (U)PCB notify host of unknown command)");
	v_fnSendToHostEcho("*****************************************");
	v_fnSendToHostDone();
}

//-----------------------------------------------------------------------------
// Function name : v_fnReceivedFromHostCarrierOn
//-----------------------------------------------------------------------------
// Description : This function clear a of an unsigned char
//
// IN       :   - none -
// OUT      :   - none -
// RETURN   :   - none -
// Notes    :   - none -
//-----------------------------------------------------------------------------
void v_fnReceivedFromHostCarrierOn()
{
	v_fnSendToHostEcho("->Carrier On");
    
	v_fnCS_reset();								
    v_fnSPI_SendByte(P0_REG_NO_RST | P0_PAGE_SELECT_6 | P0_RFON);
    v_fnCS_reset();
	
	v_fnSendToHostDone();
}

//-----------------------------------------------------------------------------
// Function name : v_fnReceivedFromHostCarrierOff
//-----------------------------------------------------------------------------
// Description : 
//
// IN       :   - none -
// OUT      :   - none -
// RETURN   :   - none -
// Notes    :   - none -
//-----------------------------------------------------------------------------
void v_fnReceivedFromHostCarrierOff()
{
	v_fnSendToHostEcho("->Carrier Off");

    v_fnCS_reset();
    v_fnSPI_SendByte(P0_REG_NO_RST | P0_PAGE_SELECT_6);
    v_fnCS_reset();

	v_fnSendToHostDone();
}

//-----------------------------------------------------------------------------
// Function name : v_fnReceivedFromHostPolling
//-----------------------------------------------------------------------------
// Description : 
//
// IN       :   - none -
// OUT      :   - none -
// RETURN   :   - none -
// Notes    :   - none -
//-----------------------------------------------------------------------------
void v_fnReceivedFromHostPolling()
{
    StructReader	myReaderStruct;

	unsigned char 	l_bStatus;
	unsigned char 	p_abATQResponse[16];
	unsigned short	p_bATQLength;
	unsigned char 	i;
	char			l_cCMD;		// Command from Host


	v_fnSendToHostEcho("->Polling");

	// CARRIER OFF
	v_fnCS_reset();
    v_fnSPI_SendByte(P0_REG_NO_RST | P0_PAGE_SELECT_1);			  
	// CARRIER ON
	v_fnCS_reset();
	v_fnSPI_SendByte(P0_REG_NO_RST | P0_PAGE_SELECT_1 | P0_RFON); 
	
	//Host Mode passive 
	g_sLog.enable = FALSE;

	// DO POLLING + COLLISION DETECTION WHILE ERROR
	do
	{
		//POLLING WHILE ERROR, COLLISION OR NO CARD
		do
		{
			// CHECK IF "POLLING ABORT" IS REQUESTED BY THE HOST
			if ( kbhit() )
			{
				l_cCMD = getchar();
				if ( l_cCMD == PTTAL1_CMD_ABORT)
				{
					
					sprintf(g_sLog.buffer,"Polling Abort");
					v_fnSendToHostEcho(g_sLog.buffer);
					v_fnSendToHostDone();
				
					return;
				}
			}
			// DO THE POLLING
			l_bStatus = b_fnPolling(&p_abATQResponse[0],&p_bATQLength,&myReaderStruct);
			
			//IF COLLISION IN THE POLLING --> RESET
			if (l_bStatus == TRANSMISSION_ERROR)	
			{
				// WAIT END OF TRANSMISSION
				delay_us(430);
		
				v_fnExceptionProcessing(l_bStatus);
			}
		}
		while(l_bStatus == RETRY_POLLING); 

		//COLLISION DETECTION
		if (l_bStatus == END_POLLING_A)
		{
			// Memorize ATQA in "p_abATQAResponse" for future comparaison in ACTIVATE_A
			memcpy(&g_abATQAResponse[0],&p_abATQResponse[0],2);
			//TYPE A COLLISION DECTECTION
			l_bStatus = b_fnCollisionA(&p_abATQResponse[0],&g_abUID[0],&g_bUIDLength,&myReaderStruct);
		}
		if (l_bStatus == END_POLLING_B)
		{
			// Memorize ATQB in "p_abATQBResponse" for future comparaison in ACTIVATE_B
			memcpy(&g_abATQBResponse[0],&p_abATQResponse[0],12);
			//TYPE B COLLISION DETECTION
			l_bStatus = b_fnCollisionB(&p_abATQResponse[0],&myReaderStruct);
		}
		
		// ERROR IN THE COLLISION DETECTION --> RESET
		if ((l_bStatus == TRANSMISSION_ERROR)||(l_bStatus == PROTOCOL_ERROR)||(l_bStatus == TIME_OUT_ERROR))	
		{
			// WAIT END OF TRANSMISSION
			delay_us(430);
	
			v_fnExceptionProcessing(l_bStatus);
		}
	}	
	while ( (l_bStatus == TRANSMISSION_ERROR)||(l_bStatus == PROTOCOL_ERROR)||(l_bStatus == TIME_OUT_ERROR) );	

	// DISPLAY UID FOR ISO14443-A (WITH VARIABLE SIZE DEPENDING OF CARD)
	if (l_bStatus == END_COLLISION_A)	
	{
	
		sprintf(g_sLog.buffer,"Card A  --> UID memorized:  ");
		i=0;
		while(g_bUIDLength!=0)
		{
			sprintf(g_sLog.buffer+strlen(g_sLog.buffer),"%02x",g_abUID[i]);
			i+=1;
			g_bUIDLength-=1;
		}

	}
	// DISPLAY "CARD B"
	if (l_bStatus == END_COLLISION_B)		
	{
		sprintf(g_sLog.buffer,"Card B");
	}
	v_fnSendToHostEcho(g_sLog.buffer);

	v_fnSendToHostDone();
}

//-----------------------------------------------------------------------------
// Function name : v_fnReceivedFromHostReset
//-----------------------------------------------------------------------------
// Description :  This function executes the reset (exception processing)
//
// IN       :   - none -
// OUT      :   - none -
// RETURN   :   - none -
// Notes    :   - none -
//-----------------------------------------------------------------------------
void v_fnReceivedFromHostReset()
{
	v_fnSendToHostEcho("->Reset");

	v_fnResetWait();

	v_fnSendToHostDone();
}

//-----------------------------------------------------------------------------
// Function name : v_fnReceivedFromHostWUPA
//-----------------------------------------------------------------------------
// Description :  This function executes a WUPA
//
// IN       :   - none -
// OUT      :   - none -
// RETURN   :   - none -
// Notes    :   - none -
//-----------------------------------------------------------------------------
void v_fnReceivedFromHostWUPA()
{
    StructReader		myReaderStruct;

	unsigned char  l_bStatus;
	unsigned char  l_abBuffer[255];
	unsigned short p_bATQALength;

	v_fnSendToHostEcho("->WUPA");

	// TO ENABLE LOOP OF WUPA
	// CARRIER OFF
	v_fnCS_reset();
    v_fnSPI_SendByte(P0_REG_NO_RST | P0_PAGE_SELECT_1);			  
	// CARRIER ON
	v_fnCS_reset();
	v_fnSPI_SendByte(P0_REG_NO_RST | P0_PAGE_SELECT_1 | P0_RFON); 

	// LOAD ISO14443-A PROTOCOL
	v_fnProtocolChange(ISOA_PROTOCOL,&g_abP6Config14443A_PayPass[0],g_bRFReceiveEOFA,&myReaderStruct);   	
	
	// Host Mode active 
	g_sLog.enable = TRUE;

	// WUPA CMD & RESPONSE
	// Option for Host mode
	if(g_sLog.enable)
	{
		sprintf(g_sLog.buffer,"WUPA Command:	%02x\n",_ISOA_WUPA);
	}
	// SEND WUPA COMMAND AND RECEIVE ATQA
	l_bStatus = b_fnSendReceiveREQAWUPA(_ISOA_WUPA,&l_abBuffer[0],&myReaderStruct,&p_bATQALength);

	// CHECK ERROR
	l_bStatus = b_fnPayPassAnticollisionErrorHandling(_ISOA_WUPA, l_bStatus,&l_abBuffer[0],p_bATQALength);

	// DISPLAY WUPA CMD & RESPONSE (ATQA)
	if (l_bStatus == ERR_NO_ERROR) 
	{
		// Option for Host mode
		if(g_sLog.enable)
		{
			sprintf(g_sLog.buffer + strlen(g_sLog.buffer),"ATQA received:	%02x%02x\n",l_abBuffer[0],l_abBuffer[1]);
		}		
	}
	else
	{
		sprintf(g_sLog.buffer + strlen(g_sLog.buffer),"No type A card\n");
 	}
	v_fnSendToHostEcho(g_sLog.buffer);

	v_fnSendToHostDone();
}

//-----------------------------------------------------------------------------
// Function name : v_fnReceivedFromHostWUPB
//-----------------------------------------------------------------------------
// Description :   This function executes a WUPB
//
// IN       :   - none -
// OUT      :   - none -
// RETURN   :   - none -
// Notes    :   - none -
//-----------------------------------------------------------------------------
void v_fnReceivedFromHostWUPB()
{
	StructReader  myReaderStruct;

	unsigned char l_bStatus;
	unsigned short p_bATQBLength;
	unsigned char l_abDataForPrintf[3];

	v_fnSendToHostEcho("->WUPB");
	
	// LOAD ISO14443-B PROTOCOL
	v_fnProtocolChange(ISOB_PROTOCOL,&g_abP6Config14443B_PayPass[0],g_bRFReceiveEOFB,&myReaderStruct);   

	// Host Mode active 
	g_sLog.enable = TRUE;
	
	// Option for Host mode
	if(g_sLog.enable)
	{
		// WUPB COMMAND
		l_abDataForPrintf[0] = _ISOB_REQB;		
		l_abDataForPrintf[1] = _ISOB_AFI_ALL;       
		l_abDataForPrintf[2] = _ISOB_WUPB_NO_SLOT;
	
		sprintf(g_sLog.buffer,"WUPB Command:	%02x%02x%02x\n",l_abDataForPrintf[0],l_abDataForPrintf[1],l_abDataForPrintf[2]);
	}		  

	// SEND WUPB AND RECEIVE ATQA
	l_bStatus = b_fnSendReceiveREQBWUPB_PayPass(_ISOB_WUPB_NO_SLOT,&g_abATQBResponse[0],&myReaderStruct,&p_bATQBLength);	
	
	// CHECK ERROR
	l_bStatus = b_fnPayPassAnticollisionErrorHandling(_ISOB_WUPB_NO_SLOT, l_bStatus,&g_abATQBResponse[0],p_bATQBLength);
	
	// DISPLAY WUPB CMD & RESPONSE (ATQB)
	if (l_bStatus==ERR_NO_ERROR)
	{
		//Option for Host mode
		if(g_sLog.enable)
		{
			sprintf(g_sLog.buffer + strlen(g_sLog.buffer),"ATQB Received:	%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n",
						g_abATQBResponse[0],
						g_abATQBResponse[1],
						g_abATQBResponse[2],
						g_abATQBResponse[3],
						g_abATQBResponse[4],
						g_abATQBResponse[5],
						g_abATQBResponse[6],
						g_abATQBResponse[7],
						g_abATQBResponse[8],

⌨️ 快捷键说明

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