📄 samcard.c
字号:
/************************************************************************/
/* */
/* Project title: InformationTerminal */
/* */
/* */
/* Author: Yesy */
/* Date: 2005-05-21 */
/* Reviewed by: */
/* Date: */
/* */
/* Contents: */
/* */
/* Last changed by: */
/* Date: */
/* Change report: */
/* Change description: */
/* */
/* */
/************************************************************************/
#include <msp430x14x.h>
#include <string.h>
#include "..\..\mod\lib\easyc.h"
#include "..\..\mod\lib\mess_882.exp"
#include "..\..\mod\lib\errordef.h"
#include "..\..\mod\lib\data_def.h"
#include "..\..\mod\lib\def.h"
#include "..\..\mod\lib\clib.h"
#include "..\..\mod\eemanagr\eemanagr.h"
/* Publics for this module */
#include "..\..\mod\lib\hwsubr.h"
/* LTC 1955 yesy 2005.5.20 */
#define LTC1955_DIN0 P3OUT &=~BIT1
#define LTC1955_DIN1 P3OUT |=BIT1
#define LTC1955_LD0 P3OUT &=~BIT0
#define LTC1955_LD1 P3OUT |=BIT0
#define LTC1955_DOUT0 P3OUT &=~BIT2
#define LTC1955_DOUT1 P3OUT |=BIT2
#define LTC1955_SCLK0 P3OUT &=~BIT3
#define LTC1955_SCLK1 P3OUT |=BIT3
#define LTC1955_DATA0 P6OUT &=~BIT4
#define LTC1955_DATA1 P6OUT |=BIT4
#define LTC1955_RIN0 P6OUT &=~BIT5
#define LTC1955_RIN1 P6OUT |=BIT5
#define LTC1955_SYNC0 P6OUT &=~BIT6
#define LTC1955_SYNC1 P6OUT |=BIT6
#define LTC1955_ASYNC0 P5OUT &=~BIT5
#define LTC1955_ASYNC1 P5OUT |=BIT5
// ABOUT 20 US PER UNIT
#define LTC1955_tDS 1 //Min 8 us
#define LTC1955_tDH 4 //Min 8
#define LTC1955_tDD 1 //15-60
#define LTC1955_tL 3 //50-
#define LTC1955_tH 3 //50-
#define LTC1955_tLW 3 //50-
#define LTC1955_tCL 3 //50-
#define LTC1955_tLC 1 //Min 0 us
#define OUTCARDDATA0 P6OUT &=~BIT1
#define OUTCARDDATA1 P6OUT |=BIT1
/* IC CARD SIGNAL INPUT--READ */
#define INCARDDATA1 (P6IN&BIT1)
/* IC CARD SIGNAL OUTPUT--WRITE */
#define OUTSAMCARDCLOCK0 P5OUT &=~BIT5 //ASYNC
#define OUTSAMCARDCLOCK1 P5OUT |=BIT5
#define OUTSAMCARDRESET0 P6OUT &=~BIT5 //RIN
#define OUTSAMCARDRESET1 P6OUT |=BIT5
#define OUTSAMCARDDATA0 P6OUT &=~BIT4 //DATA
#define OUTSAMCARDDATA1 P6OUT |=BIT4
/* IC CARD SIGNAL INPUT--READ */
#define INSAMCARDDATA1 (P6IN&BIT4) //DATA
//define int Timer B use-mode
#define BAUDTATE 372
#define DEF_T0_NONE 0x00
#define DEF_T0_ICREC 0x01
#define DEF_T0_ICSEND 0x02
#define DEF_T0_SAMREC 0x03
#define DEF_T0_SAMSEND 0x04
static void _SamCardSetPower(byte Level);
static void _SamCardSetReset(byte Leval);
static void _SamCardSetClock(byte Leval);
static void _SamCardSetCLK4(byte Level);
static void _DisableSamRec(void);
static void _EnableSamRec(void);
static void _EnableSamSend(void);
static void _SamCardPutByte(byte IOData);
static byte _SamCheckStartBit(void);
byte _SamCardOpen(void);
void _SamCardClose(void);
void _SamCardApduSend(byte *SendBuff,byte SendLen,byte FlagReverse);
byte _SamCardApdu(APDU_COMM *apducom,APDU_RESP *apduresp);
byte _SamCardReadIOLimit(byte *recdata,byte Reverse);
byte CheckSum;
//From smartcard.c
extern void _Delay(uint mSec);
extern byte _CardReadByte(void);
extern void _InitSmartCard(void);
extern byte _ReverseData(byte SouData);
extern byte _Chck_Parity(byte InData);
extern byte PUB_Card_Counter;
extern byte PUB_Card_RecData;
extern byte PUB_Card_RecBuff;
extern uint PUB_Card_SendBuff;
extern byte PUB_Card_RecData;
extern byte PUB_Card_ICNO;
extern uint PUB_Card_RecLimit;
extern uint PUB_Card_GuardTime;
extern byte PUB_Card_TI;
extern byte PUB_Card_RI;
extern byte PUB_Card_ICReverse[8];
extern byte PUB_Card_ICPCB[8];
extern byte PUB_Card_ICT01[8];
extern byte PUB_T0Type;
/************************************************************************/
/* */
/* Module title: IC/SAM Card opration functions */
/* / _CardSetPower */
/* / _CardSetReset */
/* /_CardSetClock */
/* /_CardSetCLK4 */
/* /_CardPutBit */
/* Author: JPA */
/* Date: 2005-03-08 */
/* Reviewed by: */
/* Date: */
/* */
/* */
/* Functional Description: */
/* */
/* CPU Card basic opration functions */
/************************************************************************/
static void _SamCardSetPower(byte Level)
{
if ( Level == 0 )
P4OUT &=~BIT4;
else
P4OUT |=BIT4;
return;
}
static void _SamCardSetReset(byte Level)
{
P6DIR |=BIT5; //P6.5(RIN) OUTPUT MODE
if (Level) OUTSAMCARDRESET1;
else OUTSAMCARDRESET0;
return;
}
static void _SamCardSetClock(byte Level)
{
if ( Level == 0 )
{ P5SEL &=~BIT5;
P5OUT &=~BIT5;
}
else
P5SEL |=BIT5;
return;
}
static void _SamCardPutBit(byte IOBit)
{
P6DIR |=BIT4; //P6.4(Data) OUTPUT MODE
if (IOBit) OUTSAMCARDDATA1; //OUT PUT HIGH LEVEL ON I/O
else OUTSAMCARDDATA0;
return;
}
/************************************************************************
* *
* Module title: _DelaynSec *
* Module type: subprogram *
* *
* Author: Yesy *
* Date: 2005-05-21 *
* Reviewed by: *
* Date: *
* *
* Last changed by: *
* Date: *
* *
* Functional Description: delay for 20 nsec per unit, but not accurately *
************************************************************************/
void _DelaynSec(uint nSec) //20ns
{
byte j;
for(j=0;j<nSec;j++)
{
_NOP();
};
return;
}
/************************************************************************
* *
* Module title: _SamCheckStartBit *
* Module type: subprogram *
* *
* Author: Yesy *
* Date: 2005-05-21 *
* Reviewed by: *
* Date: *
* *
* Last changed by: *
* Date: *
* *
* Functional Description: Checks the start Bit when communicates *
************************************************************************/
static byte _SamCheckStartBit(void)
{
P6DIR &=~BIT4;
if(INSAMCARDDATA1) return (FALSE);
else
{
PUB_Card_Counter = 0;
PUB_Card_RecBuff = 0;//yesy add 2005.06.22
CheckSum=0;//yesy add 2005.06.22
PUB_T0Type = DEF_T0_SAMREC;
PUB_Card_RI = 0x00;
_NOP(); // etu/2 = 192us/2
_NOP(); // etu/2 = 192us/2
_NOP(); // etu/2 = 192us/2
_NOP(); // etu/2 = 192us/2
_NOP(); // etu/2 = 192us/2
TBCTL = TBSSEL_2 + MC_1; //Enable Interrupt
return (TRUE);
}
}
/************************************************************************
* *
* Module title: _CardSetRecLimit *
* Module type: subprogram *
* *
* Author: JPA *
* Date: 2005-03-08 *
* Reviewed by: *
* Date: *
* *
* Last changed by: *
* Date: *
* *
* Functional Description: The deadline time when Received *
************************************************************************/
static void _CardSetRecLimit(uint RecLimit)
{
PUB_Card_RecLimit = RecLimit;
return;
}
/************************************************************************
* *
* Module title: _InitSmartCard *
* Module type: subprogram *
* *
* Author: JPA *
* Date: 2005-03-09 *
* Reviewed by: *
* Date: *
* *
* Last changed by: *
* Date: *
* *
* Functional Description: *
************************************************************************/
/************************************************************************
* *
* Module title: _SamCardReset *
* Module type: subprogram *
* *
* Author: Yesy *
* Date: 2005-05-21 *
* Reviewed by: *
* Date: *
* *
* Last changed by: *
* Date: *
* *
* Functional Description: *
* do a reset operation on the Card *
* Output: Faulse --failure *
* Other --sucess *
************************************************************************/
byte _SamCardReset(byte *ResetData)
{
byte ResetLen;
byte i;
byte loop;
_CardSetRecLimit(500);
_SamCardSetReset(0);
_SamCardSetReset(1);
_EnableSamRec();
ResetLen = 0;
loop = 1;
while(loop)
{
loop = _SamCardReadIOLimit(ResetData+ResetLen,0);
ResetLen = ResetLen + loop;
_CardSetRecLimit(100);
}
_CardSetRecLimit(2500);
if ( ResetData[0] == 0x3B )
PUB_Card_ICReverse[PUB_Card_ICNO] = 0;
else if ( ResetData[0] == 0x03)
{
PUB_Card_ICReverse[PUB_Card_ICNO] = 1;
for (i=0;i<ResetLen;i++)
*(ResetData+i) = _ReverseData(*(ResetData+i));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -