打印

T5557卡之曼彻斯特码解析

[复制链接]
5229|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
雁舞白沙|  楼主 | 2010-10-21 17:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人的解析方式:

#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%的成功)

次方式本人称之:白沙解码方式,但让如果有朋友以前已经使用过,本人就放弃这个名称,并向其鞠躬感谢!

相关帖子

沙发
雁舞白沙|  楼主 | 2010-10-22 18:57 | 只看该作者
我等

使用特权

评论回复
板凳
雁舞白沙|  楼主 | 2010-10-29 02:11 | 只看该作者
晚上加班,上来看看!

使用特权

评论回复
地板
liangjizeng| | 2015-1-30 09:59 | 只看该作者
原理图提供,谢谢

使用特权

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

本版积分规则

个人签名:学者会友QQ群:72137827 三人行,必有我师!

213

主题

789

帖子

243

粉丝