📄 paypass_ttal1_comm.c
字号:
//=============================================================================
// 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 + -