打印

使用430制作的水表---读卡&处理(5557)

[复制链接]
2330|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
雁舞白沙|  楼主 | 2012-2-28 09:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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;
}

相关帖子

沙发
jackwugaopei| | 2014-2-23 22:18 | 只看该作者
请教关于T5557的读卡,同步头是如何判断的,我抓了好久都没找到数据哪个地方是同步头的入口波形!!请教,小弟在此谢过!!QQ670651138

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

213

主题

789

帖子

243

粉丝