#i nclude <GLOBAL.h>
#i nclude <stdlib.h>
#i nclude <stdbool.h>
#i nclude <msp430x41x.h>//*========================================================
//*开始日期:2009-09-09
//*完成日期:2009-09-10
//*软件版本:MarkWork
//*功能说明:读卡写函数
//*程序修正------------------------------------------------
//*功能修正:
//*原有功能:
//*现有功能:
//*修正日期:
//*端口定义
#define SysSclOut P1DIR |= BIT0
#define SysSclIns P1DIR &= ~BIT0
#define SysSclOpen P1SEL |= BIT0
#define SysSclClos P1SEL &=~BIT0
#define DataOutIn P1DIR &=~ BIT2
#define DataOutSt P1IN & BIT2
#define CardPowerOut P1DIR |= BIT3
#define CardPowerOpen P1OUT |= BIT3
#define CardPowerClose P1OUT &= ~BIT3
#define JopNopOut P2DIR |= BIT4
#define JopNopIns P2DIR &= ~BIT4
#define JopNopHig P2OUT |= BIT4
#define JopNopLow P2OUT &= ~BIT4
#define CardChkDirSt P1IN & BIT5
#define CardChkDirIn P1DIR &=~ BIT5
#define CardChkSt BIT5
#define BatPowerChk BIT4
//*参数定义
#define SendGapTime 123
#define SendHigTime 187
#define SendLowTime 59
//---时钟2M周期0。500
//---输出按照125.000KH---周期是8.0微秒
//---时钟周期是7.8125×2=15.625微秒
//Delay(27);//----延时63.000微秒-----0.25场周=4时钟周期(16.00*4=64)
//Delay(59);//----延时127.000微秒---0.5场周=4时钟周期(16.00*8=128)
//Delay(123);//---延时255.000微秒----1.0场周=4时钟周期(16.00*16=256)
//Delay(187);//---延时383.000微秒---1.5场周=4时钟周期(16.00*24=384)
const unsigned char CardPassword[4]={0x47,0x48,0x5A,0x42};//---写卡密码
void JopNop(void)
{
//JopNopHig;
JopNopIns;
_NOP();
JopNopIns;
//JopNopLow;
}
//------------------------------ *** - 时间延时 - *** ------------------------------//
void Delay(unsigned int count)
{
unsigned int i;
_NOP();
_NOP();
for(i=count; i>0; i--);
}
void LongDelay(unsigned char DelayData)
{
unsigned char i;
for(i=0;i<DelayData;i++)
{
WDT();
Delay(3000);
}
WDT();
}
//-----***-void CardInit(void)-***-----//
//---功能描述:长系统接口初始化。
//---输入条件:无。
//---输出项目:无。
//MSP430操作T5557卡原程序---(初始化)
void CardInit(void)
{
CardPowerOut;
CardPowerClose;
CardChkDirSt;
CardChkDirIn;
CardParseOverFg=1;
SysSclClos;//-----------------------------------------------------------关闭时钟
SysSclIns;
P1IE=0;
P1IES=0;
P1IE |= CardChkSt;
P1IES |= CardChkSt;
P1IE |= BatPowerChk;
P1IES |= BatPowerChk;
}
//-----***-void FieldClockOpen(void)-***-----//
//---功能描述:卡基频输出。
//---输入条件:无。
//---输出项目:无。
//MSP430操作T5557卡原程序---(基频输出)
void FieldClockOpen(void)
{
SysSclOut;
SysSclOpen;
TACCR0 = 7;//-------------------------121.1212Khz
TACCTL0=0x0080;//----------------------mode 4
TACTL=0X0210;//------------------------SMCLK,TA_INT=Dis.
WDT();
Delay(5000);
}
//-----***-void FieldClockClos(void)-***-----//
//---功能描述:卡基频关闭
//---输入条件:无。
//---输出项目:无。
//MSP430操作T5557卡原程序---(基频关闭)
void FieldClockClos(void)
{
SysSclClos;//-----------------------------------------------------------关闭时钟
WDT();
Delay(5000);
}
//-----***-void CardPowerOpenConn(void)-***-----//
//---功能描述:卡上电
//---输入条件:无。
//---输出项目:无。
//MSP430操作T5557卡原程序---(卡上电)
void CardPowerOpenConn(void)
{
DataOutIn;
CardPowerOut;
CardPowerOpen;
LongDelay(3);
FieldClockOpen();
LongDelay(5);
}
//-----***-void CardPowerClosConn(void)-***-----//
//---功能描述:卡下电
//---输入条件:无。
//---输出项目:无。
//MSP430操作T5557卡原程序---(卡下电)
void CardPowerClosConn(void)
{
CardPowerOut;
CardPowerClose;
TACCR0=0;//-------------------------
TACCTL0=0;//----------------------mode 4
FieldClockClos();
WDT();
SysSclIns;
Delay(5000);
}
bool HeardChk(void)
{
bool ChkOk;
unsigned int ChkTime;
WDT();
ChkOk=1;
ChkTime=0;
//------------------------------------------------
//------------------------------------------------等待上升沿的到来同步信号检测
do
{
ChkTime++;
WDT();
if(ChkTime>2000)
{
WDT();
break;
}//-------------------此处数据为等待时间(375微妙)同时防止死机!
}
while(!(DataOutSt&BIT2));
if(ChkOk)
{
ChkTime=2;
//------------------------------------------------等待下降沿的到来同步信号检测1(24FC---HIG---384)
do
{
ChkTime=ChkTime+12;
if(ChkTime>5000)
{
break;
}//-------------------此处数据为等待时间(384微妙)同时防止死机!
}
while(DataOutSt&BIT2);
if((640 < ChkTime)&&(ChkTime < 896))//检测同步信号维持时间---最小数值:(384-64)*2=640 最大数值:(384+64)*2=896
{
ChkOk=1;
}
else
{
ChkOk=0;
}
}
if(ChkOk)
{
ChkTime=2;
//------------------------------------------------等待下降沿的到来同步信号检测1(8FC---LOW---128)
do
{
ChkTime=ChkTime+12;
if(ChkTime>469)
{
break;
}//-------------------此处数据为等待时间(128微妙)同时防止死机!
}
while(!(DataOutSt&BIT2));
if((192 < ChkTime)&&(ChkTime < 320))//检测同步信号维持时间---最小数值:(128-32)*2=192 最大数值:(128+32)*2=320
{
ChkOk=1;
Delay(27);//----延时63.000微秒-----0.25场周=4时钟周期(16.00*4=64)
Delay(59);//----延时127.000微秒---0.5场周=4时钟周期(16.00*8=128)
Delay(110);//---延时255.000微秒----1.0场周=4时钟周期(16.00*16=256)
}
else
{
ChkOk=0;
}
}
return ChkOk;
}
//-----***-unsigned char RecvConn(void)-***-----//
//---功能描述:接收一个数据。
//---输入条件:无。
//---输出项目:RecvData。
void ReadData(void)
{
bool State;
unsigned char i;
unsigned char Bits,RecvData;
unsigned int ChkTime;
for(i=0;i<24;i++)
{
WDT();
Bits = 0;
State = 1;
RecvData = 0;
while(State)
{
if( Bits < 8 )
{
Bits ++ ;
RecvData <<= 1;
JopNop();
if(DataOutSt&BIT2)
{
RecvData &= 0xFE;
}
else
{
RecvData |= 0x01;
}
if( Bits < 8)
{
Delay(110);//---16FC
}
else
{
WDT();
ChkTime=0;
Delay(55);//---8FC
//------------------------------------------------等待下降沿的到来同步信号检测1(8FC---LOW---128)
if(DataOutSt&BIT2)
{
do
{
WDT();
ChkTime++;
if(ChkTime>5000)
{
break;
}//-------------------此处数据为等待时间(384微妙)同时防止死机!
}
while(DataOutSt&BIT2);
}
else
{
do
{
WDT();
ChkTime++;
if(ChkTime>5000)
{
break;
}//-------------------此处数据为等待时间(384微妙)同时防止死机!
}
while(!(DataOutSt&BIT2));
}
}
}
else
{
State=0;
}
}
Delay(10);
CardBuf[i]=RecvData;
}
}
void CardRead(void)//-------------------读卡调用此函数
{
unsigned int i;
_DINT();
SysSclOpen;
LongDelay(3);
CardErr=0;
RamCler(CardBuf,24);
for(i=0;i<1024;i++)
{
WDT();
if(HeardChk())
{
ReadData();
break;
}
}
WDT();
_EINT();
}
//------------------------------------------------------------------------------写卡程序
void SendZero(void)
{
SysSclOpen;
Delay(SendLowTime);
}
void SendOne(void)
{
SysSclOpen;
Delay(SendHigTime);
}
void SendGap(void)
{
SysSclClos;
Delay(SendGapTime);
}
void RfStart(void)
{
SysSclClos;
Delay(SendGapTime);
}
void RfReast(void)
{
RfStart();//-----场关
SendZero();//----场开
SendGap();//-----场关
SendZero();//----场开
SendGap();//-----场关
SysSclOpen;//---场开
WDT();
Delay(5000);
}
void SendWord(unsigned char Temp)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(Temp&0x80)
{
SendOne();
SendGap();
}
else
{
SendZero();
SendGap();
}
Temp=Temp<<1;
}
}
void CardWrite(unsigned char BlockNum)//------------------写卡调用此函数
{
unsigned char i,j;
unsigned char DataDptr,TempData;
_DINT();
for(i=BlockNum;i<7;i++)
{
WDT();
DataDptr=(i-1)*4;//----------------节起始地址
RfReast();
RfStart();//----场开关
SendOne();
SendGap();
SendZero();
SendGap();
for(j=0;j<4;j++) //--------密码发送的四字节循环
{
WDT();
SendWord(CardPassword[j]);//----------------------------------发送密码
}
SendZero();
SendGap();
for(j=DataDptr;j<DataDptr+4;j++) //-----------块的四字节循环
{
WDT();
SendWord(CardBuf[j]); //-------------发送一块数据(四个字节)
}
TempData=i<<5;
for(j=0;j<3;j++)
{
WDT();
if(TempData&0x80)
{
SendOne();
SendGap();
}
else
{
SendZero();
SendGap();
}
TempData=TempData<<1;
}
SysSclOpen;
LongDelay(3);
}
SysSclClos;
LongDelay(5);
_EINT();
}
void CardCmdParse(void)
{
switch(CardBuf[0])
{
case 0x61 :// ---用户卡
UserCard();
break;
case 0x62 :// ---检查卡
ChkCard();
break;
case 0x63 :// ---换表卡
ChangeCard();
break;
case 0x69 :// ---清零卡
ClerCard();
break;
case 0x6b :// ---设置卡
SetCard();
break;
case 0x6c :// ---预置卡
BeforCard();
break;
case 0x6e :// ---清余卡
ClerBuyCard();
break;
case 0x6f :// ---出厂卡
OutCard();
break;
default:
ComperEn=0;
WriteCardOkFg=0;
CardParseTime=0;
CardParseOverFg=1;
break;
}
DisturbFg=0;
}
void CardChk(void)
{
CardErr=1;
UserCardFg=0;
if(CardBuf[0]!=0)
{
if(CardBuf[0]==0x62)
{
CardErr=0;
}
else
{
CardErr=0;
if(!DataXorChk(&CardBuf[0],11))
{
UserCardFg=0;
if(!DataXorChk(&CardBuf[0],23))
{
CardErr=1;
}
}
else
{
UserCardFg=1;
RamCler(&CardBuf[12],8);
}
}
}
}
void CardPars(void)
{
if(CardParseEn)
{
LongDelay(20);
if(!(CardChkDirSt&BIT5))
{
CardPowerOpenConn();
CardRead();
CardChk();
CardParseEn=0;
if(!CardErr)
{
ComperEn=1;
DataSave();
WriteCardOkFg=1;
CardCmdParse();
}
CardParseOver();
}
}
}
#pragma vector=PORT1_VECTOR
__interrupt void P1ISR(void)
{
if(P1IFG&BIT5)
{
if(CardParseOverFg)
{
CardParseEn=1;
CardParseOverFg=0;
SleepEn=0;
LPM4_EXIT;
BasicTimer=75;
}
}
if(P1IFG&BIT4)
{
LPM4_EXIT;
BasicTimer=75;
}
P1IFG = 0;
} |