#include <GLOBAL.h> #include <stdlib.h> #include <stdbool.h> #include <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=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; }