📄 uartt0.c
字号:
/**********************************************************************************************
PC5 used as RST signal line for smart card
PE0/PC0(MCO) used as clock signal line for smart card
PC4 used as Data Interrupt In
PD4 used as Data Output
***********************************************************************************************/
#include "Map_7265.h"
#include "UARTT0.h"
#include"HID_usb.h"
#include "DTC_Func.h"
#pragma DATA_SEG CRD_RAM
extern unsigned char CardStateFlag;
extern unsigned char CardCommandFlag;
#pragma DATA_SEG UART_RAM
unsigned int WaitingTimeCount;
#pragma DATA_SEG SHORT CRD_BIT_RAM
unsigned char CrdFlags;
unsigned char CardDataNum;
unsigned char ParityFlag;
unsigned char SendDataLength;
unsigned char UARTTempData;
unsigned char ParityCount;
#pragma CODE_SEG CRD_ROM
/*********************************************************************************************
Delay 723 cycle
*********************************************************************************************/
void Delay1Etu() //CALL long 6,
{
asm
{
PUSH X // 3
LD X, #117 // 2
Delay111:
DEC X // 3
JRNE Delay111 // 3
POP X // 4
}
} // return 6,
/*********************************************************************************************
Delay165 cycle
*********************************************************************************************/
void Delay165() // 6
{
asm
{
PUSH X // 3
LD X, #24 // 2
Delay112:
DEC X // 3
JRNE Delay112 // 3
POP X // 4
}
} // 6
/*********************************************************************
NAME: Crd_Initiate
IN/OUT: NONE
DESCRIPT: Initiate parameters for smart card reader
*********************************************************************/
void Crd_Initiate(void)
{
// ITSPR2 &= ~0x0C; // pc interrupt priority level 3
MISCR3 |= 0x08; // Falling edge of PC0 as data interrupt in
PCDDR &= ~0x10;
PCOR |= 0x10; // configue register to make PC4 interrupt in
PCDDR |= 0x20; // PC5 as RST & output High
PCOR |= 0x20;
PCDR &= ~0x20;
PCDDR |= 0x02;
PCOR |= 0x02;
SetPC4Input;
CardStateFlag = NOCOMMAND;
Reset_bTxOutCompleteFlag;
Set_bTxInCompleteFlag;
Reset_bDataReadyFlag;
}
/**********************************************************************
NAME: Start Timer to calculate ETU for send data
**********************************************************************/
void StartSendETUCount(void)
{
if ( TSR & 0x40 )
asm LD A, OCLR1
else if ( TSR & 0x08 )
asm LD A, OCLR2
else if ( TSR & 0x20 )
asm LD A, CRL
CRL = 0xff; // RESET TIMER COUNT
OCHR1 = 0x00; // 0xb7 = 372/2-3
OCLR1 = 0xb7; //
TCR1 |= 0x40; // Output compare interrupt enable
}
/**********************************************************************
NAME: Start Timer to calculate ETU
**********************************************************************/
void StartReceiveETUCount(void)
{
if ( TSR & 0x40 )
asm LD A, OCLR1
else if ( TSR & 0x08 )
asm LD A, OCLR2
else if ( TSR & 0x20 )
asm LD A, CRL
CRL = 0xff; // RESET TIMER COUNT
OCHR1 = 0x00; // 0xb7 = 372/2-3
// OCLR1 = 0xb7; //
OCLR1 = 0x90; // @jin
TCR1 |= 0x40; // interrupt enable
}
/**********************************************************************
NAME : Stop Timer
**********************************************************************/
void StopETUCount(void)
{
if ( TSR & 0x40 )
asm LD A, OCLR1
else if ( TSR & 0x08 )
asm LD A, OCLR2
else if ( TSR & 0x20 )
asm LD A, CRL
CRL = 0xff; // RESET TIMER COUNT
TCR1 &= ~0x78; // OCIE = 0, TOIE = 0, timer compare interrupt disable and Overflow Interrupt disable
}
/************************************************************************************************************
VccOn
*************************************************************************************************************/
void CardPowerOn(void)
{
MISCR1 |= 0x20; // MCO output enable to provide CLK to smart card
ReceiveDataLength = ATRLENGTH; //
ParityFlag = 0;
ParityCount = 0;
ShiftBitFlag = 10;
CardDataNum = 0;
pUsbMessageBuffer = ATRBuffer;
Reset_bCommunicateEndFlag;
Reset_bCardSendFlag;
ResetSmartCard; // reset smart card after power on
SetPC4Interrupt; // enable PC4 interrupt in
}
/**********************************************************************************************************
CardReceive
**********************************************************************************************************/
void CardReceive(void)
{
PDDDR &= ~0x10;
ParityFlag = 0;
ParityCount = 0;
ShiftBitFlag = 10;
CardDataNum = 0;
pUsbMessageBuffer = &UsbMessageBuffer[LeData];
Reset_bCardSendFlag;
SetPC4Interrupt; // enable PC4 interrupt in
}
/**********************************************************************************************************
CardSend
**********************************************************************************************************/
void CardSend(unsigned int SendLength, unsigned char *pBufferAddress )
{
PCOR &= ~0x10;
PCDDR &= ~0x10;
PDDDR &= ~0x10;
TCR1 |= 0x01;
ShiftBitFlag = 0;
ParityFlag = 0;
ParityCount = 0;
SendDataLength = SendLength;
pUsbMessageBuffer = pBufferAddress;
asm LD A, [pUsbMessageBuffer.w]
asm LD UARTTempData, A
Reset_bCommunicateEndFlag;
Set_bCardSendFlag;
StartSendETUCount();
}
/**********************************************************************************************************
Send Data to Card CALLED BY TIMER INTERRUPT ROUTINE
**********************************************************************************************************/
void T0SendData(void)
{
asm {
LD A, ShiftBitFlag // 3
JREQ SendStartBit // 3
CP A, #6 // 2
JREQ SendParity // 3
CP A, #5 //
JREQ IdleTime //
CP A, #3 // 2
JREQ GetError // 3
CP A, #4 // 2
JREQ SendGuardTime // 3
CP A, #3 // 2
JRMI SendGuardTime // 3
SendData: // send 8 bits data
RRC UARTTempData // 5, C = current bit of Byte
JRNC S0 // 3
S1:
INC ParityFlag // 3
BSET TCR1, #0 // output 1 when next timer interrupt occurs
DEC ShiftBitFlag // 5
RET // 8
S0:
BRES TCR1, #0 // output 0 when next timer interrupt occurs
DEC ShiftBitFlag // 5
RET // 8 //total 63 Fcpu
SendStartBit:
CLR ParityFlag // 5
CLR ParityCount // 5
LD A, #15 // 2
LD ShiftBitFlag, A // 4
LD A, SendDataLength // 3
JREQ SendFinish // 3
BSET TCR2, #7 //
BRES TCR1, #0 // output 0 when next timer interrupt occurs
DEC ShiftBitFlag // 5
RET // 6 return // total 48Fcpu
SendFinish:
CALL StopETUCount //
CALL CardReceive // initiate receive
RET // 8
IdleTime:
DEC ShiftBitFlag // 5
RET //
SendParity:
RRC ParityFlag // 5
JRNC Parity0 // 3
Parity1:
BSET TCR1, #0 // output 1 when next timer interrupt occurs
DEC ShiftBitFlag // 5
RET // 8
Parity0:
BRES TCR1, #0 // output 0 when next timer interrupt occurs
DEC ShiftBitFlag // 5
RET // 8 // total 39Fcpu
SendGuardTime:
BRES TCR2, #7 // pd4 is a general I/O
BSET TCR1, #0 //
DEC ShiftBitFlag // 5
RET // 8 //total 55Fcpu or 60Fcpu
GetError:
DEC ShiftBitFlag
BTJF PCDR, #4, Error1 // 5 if data line is low there is an error occur
Correct:
DEC SendDataLength // 5
INC pUsbMessageBuffer:1 // 5
LD A, [pUsbMessageBuffer.w] // 6
LD UARTTempData, A // 3
RET // 8
Error1:
DEC ShiftBitFlag // 5
}
}
/**********************************************************************************************************
Receive Data from Card CALLED BY TIMER INTERRUPT ROUTINE
**********************************************************************************************************/
void T0ReceiveData(void)
{
asm {
LD A, ShiftBitFlag // 3
JREQ ReceiveFinish // 3
CP A, #1 // 2
JREQ SendError // 3
CP A, #2 // 2
JREQ GetParity // 3
GetData:
BTJF PCDR, #4, Get0 // 5
Get1:
INC ParityFlag // 3
LD A, #1 // 2
RRC A // 3
RRC UARTTempData // 5 C->bit7, bit7->bit6
DEC ShiftBitFlag // 5
RET // 8
Get0:
LD A, #0 // 2
RRC A // 3
RRC UARTTempData // 5
DEC ShiftBitFlag // 5
RET // 8
GetParity:
BTJF PCDR, #4, Parity0 // 5
Parity1:
BTJT ParityFlag, #0, NoError //5
JRT ParityError // 3
Parity0:
BTJF ParityFlag, #0, NoError // 5
ParityError:
BSET ParityFlag, #7 // 5
DEC ShiftBitFlag // 5
RET // 8
NoError:
BRES ParityFlag, #7 // 5
DEC ShiftBitFlag // 5
RET // 8
SendError:
BTJF ParityFlag, #7, NoSendError // 5
Error:
BSET PCDDR, #4 // 5, change from input to output
BRES PCDR, #4 // 5, data line low means data parity error
NoSendError:
DEC ShiftBitFlag // 5
RET // 8
ReceiveFinish:
BSET PCDDR, #4 // 5
BSET PCOR, #4 // 5 pc4 interrupt in enable
BRES PCDDR, #4 // 5
CALL StopETUCount //
LD A, #10 // 2 ShiftBitFlag = 10
LD ShiftBitFlag, A // 3
BTJF ParityFlag, #7, ReceiveOK
ReceiveError:
CLR ParityFlag // 5
RET // 8
ReceiveOK:
CLR ParityFlag // 5
CLR ParityCount // 5
LD A, UARTTempData // 3
LD [pUsbMessageBuffer.w], A // 5
INC pUsbMessageBuffer:1 // 5
INC CardDataNum // 5
LD A, CardDataNum // 3
CP A, #1 // 2
JREQ ReceiveFirstByte // 3
CP A, ReceiveDataLength // 4
JREQ ReceiveEnd // 3
RET // 8
ReceiveFirstByte:
LD A, UARTTempData // 3
CP A, #$3B //
JREQ GetATR //
CP A, #$60 //
JREQ GetWaitData //
LD A, ReceiveDataLength
CP A, #2
JREQ GetSW
LD A, IccCommandINS //
CP A, UARTTempData //
JREQ GetINSOK
GetINSError:
LD A, #2 //
LD ReceiveDataLength, A
GetATR:
GetSW:
GetINSOK:
LD A, ReceiveDataLength
CP A, CardDataNum
JREQ ReceiveEnd
RET //
GetWaitData:
CLR CardDataNum //
DEC pUsbMessageBuffer:1 //
RET
ReceiveEnd:
CLR ShiftBitFlag // 5
CLR ParityCount // 5
BSET PCDR, #4 //
BRES PCOR, #4 // pc4 input interrupt disable
BSET CrdFlags, #0 //5 Set bCommunicateEndFlag
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -