单片机开发,方案定制开发

单片机软硬件开发:0755-8398,9709

T5557卡曼彻斯特码解析,T5557卡读写控制

时间:2014-03-15 11:15点击:
大豪测控提供T5557卡控制程序的开发,欢迎新老客户来电咨询!
解析方式:

#include <GLOBAL.h>
#include <stdlib.h>
#include <stdbool.h>
#include <msp430x41x2.h>
///----
#define DataStrOut             P7DIR |=  BIT4
#define DataStrIns             P7DIR &= ~BIT4
#define DataStrHig             P7OUT |=  BIT4
#define DataStrLow             P7OUT &=~ BIT4
#define DataSclOut             P1DIR |=  BIT5
#define DataSclIns             P1DIR &= ~BIT5
#define DataSclHig             P1OUT |=  BIT5
#define DataSclLow             P1OUT &=~ BIT5
///---
#define   SysSclOut           P1DIR |= BIT0
#define   SysSclHig           P1OUT |= BIT0
#define   SysSclIns           P1DIR &= ~BIT0
#define   SysSclOpen          P1SEL |= BIT0 
#define   SysSclClos          P1SEL &=~BIT0
#define   DataOutIn           P7DIR &=~ BIT6 
#define   DataOutSt           P7IN  &   BIT6

#define   CardPowerOut        P1DIR |=  BIT6
#define   CardPowerOpen       P1OUT |=  BIT6
#define   CardPowerClose      P1OUT &= ~BIT6
#define   CardChkSt         BIT7
#define   CardChkDirIn        P1DIR &=~ BIT7
#define   CardChkhHig         P1OUT |=  BIT7

//*参数定义
#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 ReadNop(void)
{
    _NOP();
    _NOP();
    _NOP();
    _NOP();
    _NOP();
    _NOP();
    _NOP();
    _NOP();
    _NOP();
    _NOP();
}
void WriteNop(void)
{
    _NOP();
    _NOP();
    _NOP();
    _NOP();
    _NOP();
    _NOP();
    _NOP();
    _NOP();
    _NOP();
    _NOP();
    _NOP();
    _NOP();
}
//-----***-void CardInit(void)-***-----//
//---功能描述:长系统接口初始化。 
//---输入条件:无。 
//---输出项目:无。
//MSP430操作T5557卡原程序---(初始化)
void CardInit(void)
{
    CardPowerOut; 
    CardPowerClose;
    
    CardChkDirIn;
    CardChkhHig;
    
    DataOutIn;
    
    SysSclOut;
    SysSclClos;//-----------------------------------------------------------关闭时钟
    SysSclIns;
    
    P1IE  = CardChkSt;
    P1IES = CardChkSt;
}
//-----***-void FieldClockOpen(void)-***-----//
//---功能描述:卡基频输出。 
//---输入条件:无。 
//---输出项目:无。
//MSP430操作T5557卡原程序---(基频输出)
void FieldClockOpen(void)

    SysSclOut;
    SysSclOpen;
    
    TACCR0 = 7;//-------------------------125Khz
    TA0CCTL0=0x0080;//----------------------mode 4
    TA0CTL=0X0210;//------------------------SMCLK,TA_INT=Dis.
    Delay(5000);
}
//-----***-void FieldClockClos(void)-***-----//
//---功能描述:卡基频关闭 
//---输入条件:无。 
//---输出项目:无。
//MSP430操作T5557卡原程序---(基频关闭)
void FieldClockClos(void)
{
    SysSclClos;//-----------------------------------------------------------关闭时钟
    Delay(5000);
}
//-----***-void CardPowerOpenConn(void)-***-----//
//---功能描述:卡上电 
//---输入条件:无。 
//---输出项目:无。
//MSP430操作T5557卡原程序---(卡上电)
void CardPowerOpenConn(void)
{
    SCFQCTL=SCFQ_2M;//---------------------时钟为2M
    DataStrOut;
    DataStrHig;
    DataSclOut;
    DataSclHig;
    FieldClockOpen();
    Delay(5000);
    CardPowerOut;
    CardPowerOpen; 
    LongDelay(3); 
    DataStrLow;
}
//-----***-void CardPowerClosConn(void)-***-----//
//---功能描述:卡下电 
//---输入条件:无。 
//---输出项目:无。
//MSP430操作T5557卡原程序---(卡下电)
void CardPowerClosConn(void)
{
    CardPowerOut;
    CardPowerClose;
    TA0CCTL0=0;//----------------------
    TA0CTL=0;//------------------------
    FieldClockClos();
    DataStrIns;
    DataSclIns;
    CardInit();
    Delay(5000);
    SCFQCTL=SCFQ_1M;//---------------------时钟为1M
}
//---时钟2M周期0。500
//---输出按照125.000KH---周期是8.0微秒
//---时钟周期是8.000×2=16.000微秒
//Delay(27);//----延时63.000微秒-----0.25场周=4时钟周期(16.00*4=64)
//Delay(59);//----延时127.000微秒---0.5场周=8时钟周期(16.00*8=128)
//Delay(123);//---延时255.000微秒----1.0场周=16时钟周期(16.00*16=256)
//Delay(187);//---延时383.000微秒---1.5场周=24时钟周期(16.00*24=384)
bool HeardChk(void)

    bool ChkOk;
    unsigned int ChkTime;
    ChkOk=1;
    ChkTime=0; 
    //------------------------------------------------
    //------------------------------------------------等待上升沿的到来同步信号检测
    do
    {
        ChkTime++;
        if(ChkTime>2500)
        {
            break; 
        }//-------------------
    }
    while(!(DataOutSt&BIT6));//---如果是低电平一直等待高电平到来 
    if(ChkOk)
    {
        ChkTime=2;
        //------------------------------------------------等待下降沿的到来同步信号检测1(检测1.5个场24个周期的时间384微秒)
        do
        {
            ChkTime=ChkTime+12;
            if(ChkTime>2500)
            {
               break; 
            }//-------------------此处数据为等待时间(375微妙)同时防止死机!
        }
        while(DataOutSt&BIT6);///---如果是高电平一直等待低电平到来并且计时
        if((640 < ChkTime)&&(ChkTime < 896))//检测同步信号维持时间---最小数值:(384-64)*2.00=最大数值:(384+64)*2.00=最小等待时间
        {
            ChkOk=1;
        }
        else
        {
            ChkOk=0; 
        }
    }
    if(ChkOk)
    {
        ChkTime=2;
        //------------------------------------------------等待上升同步信号检测1(检测0.75个12个周期的时间192微秒) 
        do
        {
            ChkTime=ChkTime+12;
            if(ChkTime>2500)
            {
                break; 
            }//-------------------
        }
        while(!(DataOutSt&BIT6));  
        if((256 < ChkTime)&&(ChkTime < 512))//检测同步信号维持时间---最小数值:(192-64)*2.00=264 最大数值:(192+64)*2.00=520
        {
            ChkOk=1;
            DataStrLow;
            Delay(20);//----
            Delay(35);//----
            Delay(90);//---延时460微秒 
        }
        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;
    i=0;
    for(i=0;i<24;i++)
    {
        Bits = 0;
        State = 1;
        RecvData = 0;
        DataOutIn;
        while(State)
        {
            if( Bits < 8 )    
            {
                Bits ++ ; 
                RecvData <<= 1;
                DataStrHig;
                DataSclHig;
                ReadNop();
                DataStrLow;
                if(DataOutSt&BIT6)
                {
                    RecvData &= 0xFE; 
                }
                else
                {
                    RecvData |= 0x01;
                }
                if( Bits < 8)
                { 
                    Delay(88);//---16FC--延时256毫秒
                }
                else
                {
                      ChkTime=0;
                      Delay(55);//---8FC--延时113毫秒
                      ReadNop();
                      DataSclLow;
                      //------------------------------------------------等待下降沿的到来同步信号检测1(8FC---LOW---128) 
                      if(DataOutSt&BIT6)
                      {
                          do
                          {
                              ChkTime++;
                              ReadNop();
                              if(ChkTime>5000)
                              {
                                  break; 
                              }//-------------------此处数据为等待时间(384微妙)同时防止死机!
                          }
                          while(DataOutSt&BIT6); 
                          DataSclHig;
                      }
                      else
                      {
                          do
                          {
                              ChkTime++;
                              ReadNop();
                              if(ChkTime>5000)
                              {
                                  break; 
                              }//-------------------此处数据为等待时间(384微妙)同时防止死机!
                          }
                          while(!(DataOutSt&BIT6));
                          DataSclHig;
                      }
                      _NOP();
                      
                }
            }
            else
            {
                State=0;
                Bits = 0;
                CardBuf[i]=RecvData; 
                RecvData=0;
            }
        }   
    }
}
void CardRead(void)//-------------------读卡调用此函数 
{  
    unsigned char i;
    CardErr=0;
    CardPowerOpenConn();
    RamCler(CardBuf,24);
    for(i=0;i<250;i++)
    {
        if(HeardChk()) 
        {
            ReadData(); 
            break;
        }
    }
}

本程序还望大家仔细推敲下因为:整个程序没有用到捕获没有用到定时器,但读卡完全没有问题,并且还没有发现其它朋友使用过相同的方式。

故此发帖让大家来验证下我的这个方式是否合适,是否可以保证稳定运行(读卡是否100%的成功)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------