打印

MSP430---RF5557读写卡程序

[复制链接]
2269|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
雁舞白沙|  楼主 | 2009-8-7 11:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 雁舞白沙 于 2009-8-7 11:43 编辑

增经有一段程序,也是C语言的,但到处都是GOTO

发现问题后,无从下手,由于项目急,就一直没有修改!

前断时间,遇到了一个很严重的BUG,在万分气愤下,决定重新编写!

故此,今天发出来,还望各位朋友指教!

#include <GLOBAL.h>
#include <stdlib.h>
#include <stdbool.h>
#include <msp430x41x.h>
#define   SysSclOpen          P1SEL|=BIT0;
#define   SysSclClos          P1SEL&=~BIT0;
#define   SysSclIns           P1DIR &=~BIT0
#define   SysSclOut           P1DIR |= BIT0
#define   DataOutIn           P1DIR &=~ BIT2
#define   DataOutSt           P1IN  &   BIT2
#define   CardPowerOut        P1DIR |=  BIT3
#define   CardPowerOpen       P1OUT |=  BIT3
#define   CardPowerClose      P1OUT &= ~BIT3
#define   CardFrequencyOut    P1DIR |= BIT5
#define   CardFrequencyHig    P1OUT |= BIT5
#define   CardFrequencyLow    P1OUT &= ~BIT5
#define   CardChkSt         BIT0
#define   CardChkDirIn        P1DIR &=~ BIT0
#define   SendGapTime         170                 
#define   SendHigTime         256                  
#define   SendLowTime         80
//Delay(43);//---延时63.73微秒
//Delay(89);//----延时126.92微秒
//Delay(182);//---延时254.67微秒
//Delay(276);//---延时383.79微秒
const unsigned char CardPassword[4]={0x47,0x48,0x5A,0x42};
void CardInit(void)
{
    CardPowerOut;
    CardPowerClose;
    CardChkDirIn;
    P1IE  = CardChkSt;
    P1IES = CardChkSt;
}
void FieldClockOpen(void)
{
    //TACCR0 = 13;//-------------------------
    //TACCTL0=0x0080;//----------------------mode 4
    //TACTL=0X0210;//------------------------SMCLK,TA_INT=Dis.
   
    SysSclOut;
    SysSclOpen;
   
    CardFrequencyOut;
    CardFrequencyHig;
    WDT();
    Delay(5000);
}
void FieldClockClos(void)
{
    TACCR0=0;//-------------------------
    TACCTL0=0;//----------------------mode 4
    TACTL=0;//------------------------SMCLK,TA_INT=Dis.
   
    SysSclClos//-----------------------------------------------------------关闭时钟
    SysSclIns;
   
    CardFrequencyLow;
    WDT();
    Delay(5000);
    WDT();
    Delay(5000);
}
void CardPowerOpenConn(void)
{
    CardPowerOut;
    CardPowerOpen;
    FieldClockClos();
    WDT();
    Delay(5000);
    FieldClockOpen();
    DataOutIn;
}
void CardPowerClosConn(void)
{
    CardPowerOut;
    CardPowerClose;
    FieldClockClos();
}
bool HeardChk(void)
{
    bool ChkOk;
    unsigned int ChkTime;
    WDT();
    ChkOk=1;
    ChkTime=0;
    //------------------------------------------------等待上升沿的到来同步信号检测
    do
    {
        _NOP();
    }
    while(!(DataOutSt&BIT2));  
    if(ChkOk)
    {
        ChkTime=2;
        //------------------------------------------------等待下降沿的到来同步信号检测1(24FC---HIG---384)
        do
        {
            ChkTime=ChkTime+12;
            if(ChkTime>1748)//-----最大极限数值:(384+96)*3.64=1748
            {
                break;
            }//-------------------此处数据为等待时间(384微妙)同时防治死机!
        }
        while(DataOutSt&BIT2);
        if((1164 < ChkTime)&&(ChkTime < 1630))//检测同步信号维持时间---最小数值:(384-64)*3.64=1164 最大数值:(384+64)*4=1630
        {
            ChkOk=1;
        }
        else
        {
            ChkOk=0;
        }
    }
    if(ChkOk)
    {
        ChkTime=2;
        //------------------------------------------------等待下降沿的到来同步信号检测1(8FC---LOW---128)
        do
        {
            ChkTime=ChkTime+12;
            if(ChkTime>815)//-----最大极限数值:(128+96)*3.64=815
            {
                break;
            }//-------------------此处数据为等待时间(128微妙)同时防治死机!
        }
        while(!(DataOutSt&BIT2));  
        if((232 < ChkTime)&&(ChkTime < 698))//检测同步信号维持时间---最小数值:(128-64)*3.64=349 最大数值:(128+64)*3.64=698
        {
            ChkOk=1;
            Delay(182);//---延时256
            Delay(42);//---延时63.73微秒
            Delay(89);//----延时126.92微秒
        }
        else
        {
            ChkOk=0;
        }
    }
    return ChkOk;
}
//-----***-unsigned char RecvConn(void)-***-----//
//---功能描述:接收一个数据。
//---输入条件:无。
//---输出项目:RecvData。
void ReadData(void)
{     
    unsigned char i;
    unsigned char Bits;
    for(i=0;i<24;i++)
    {
        Bits = 0;
        State = 1;
        RecvData = 0;
        while(State)
        {
            if( Bits < 8 )   
            {
                Bits ++ ;
                RecvData <<= 1;
                if(DataOutSt&BIT2)
                {
                    RecvData &= 0xFE;
                }
                else
                {
                    
                    RecvData |= 0x01;
                }
                if( Bits < 8)
                {
                      Delay(170);//---16FC
                }
                else
                {
                      Delay(85);//---8FC
                      //------------------------------------------------等待下降沿的到来同步信号检测1(8FC---LOW---128)
                      if(DataOutSt&BIT2)
                      {
                          do
                          {
                              _NOP();
                          }
                          while(DataOutSt&BIT2);  
                      }
                      else
                      {
                          do
                          {
                              _NOP();
                          }
                          while(!(DataOutSt&BIT2));
                      }
                }
            }
            else
            {
                State=0;
            }
        }
        Delay(35);
        CardBuf=RecvData;
    }
}
void CardRead(void)//-------------------读卡调用此函数
{  
    unsigned int i;
    _DINT();
    WDT();
    CardErr=0;
    RamCler(CardBuf,24);
    for(i=0;i<512;i++)
    {
        if(HeardChk())
        {
            ReadData();
            break;
        }
    }
    WDT();
    _EINT();
}
//------------------------------------------------------------------------------写卡程序
void SendZero(void)
{
    CardFrequencyHig;
    Delay(SendLowTime);
}
void SendOne(void)
{
    CardFrequencyHig;
    Delay(SendHigTime);
}
void SendGap(void)
{
    CardFrequencyLow;
    Delay(SendGapTime);
}
void  RfStart(void)
{
    CardFrequencyLow;
    Delay(SendGapTime);
}
void RfReast(void)
{
    RfStart();
    SendZero();        
    SendGap();
    SendZero();           
    SendGap();
    FieldClockClos();
}
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(void)//------------------写卡调用此函数
{
    unsigned char i,j;
    unsigned char DataDptr,TempData;
    _DINT();
    for(i=1;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++) //-----------块的四字节循环
        {
            SendWord(CardBuf[j]); //-------------发送一块数据(四个字节)
        }
        TempData=i<<5;
        for(j=0;j<3;j++)
        {
            if(TempData&0x80)
            {
                SendOne();         
                SendGap();
            }
            else
            {
                SendZero();           
                SendGap();
            }
            TempData=TempData<<1;         
        }
        FieldClockClos();
    }
    WDT();
    Delay(5000);
    _EINT();   
}


特别补充:MCLK采用4M,利用TA输出128KHZ的调制!

相关帖子

沙发
雁舞白沙|  楼主 | 2009-8-7 11:36 | 只看该作者
自己回帖看看,效果!

使用特权

评论回复
板凳
雁舞白沙|  楼主 | 2009-8-7 11:37 | 只看该作者
颜色还很鲜艳啊,比以前好多了,不错!

使用特权

评论回复
地板
雁舞白沙|  楼主 | 2009-8-7 11:38 | 只看该作者
再看下,然后就不敢发了,免得匠人说我乱灌水,怕怕!

使用特权

评论回复
5
mohanwei| | 2009-8-7 11:39 | 只看该作者
写的不错,就是WDT();多了点。如果溢出时间不可以设得长一些,可以考虑用定时器来搞,先估算出最长的循环时间……这样在后台循环里只需复位一次计数值即可。

使用特权

评论回复
6
yewuyi| | 2009-8-7 11:39 | 只看该作者
CardFrequencyLow;
    WDT();
    Delay(5000);
    WDT();
    Delay(5000);
好象和我印象中的白沙有异常。。。

使用特权

评论回复
7
雁舞白沙|  楼主 | 2009-8-7 11:41 | 只看该作者
不好意思,这里的WDT(),是用来计算时间的,并非是单单的喂狗!

使用特权

评论回复
8
sz_kd| | 2009-8-7 14:19 | 只看该作者
你检查边沿变化最好不要死等啊
   do
    {
        _NOP();
    }
    while(!(DataOutSt&BIT2));  
    if(ChkOk)
    {
        ChkTime=2;
        //------------------------------------------------等待下降沿的到来同步信号检测1(24FC---HIG---384)
        do
        {
            ChkTime=ChkTime+12;
            if(ChkTime>1748)//-----最大极限数值:(384+96)*3.64=1748
            {
                break;
            }//-------------------此处数据为等待时间(384微妙)同时防治死机!
        }
        while(DataOutSt&BIT2);

使用特权

评论回复
9
雁舞白沙|  楼主 | 2009-8-7 14:24 | 只看该作者
do
    {
        _NOP();
    }
    while(!(DataOutSt&BIT2));  

这里的死等确实可以加参数,但有狗在,故此取消了!

使用特权

评论回复
10
sz_kd| | 2009-8-7 14:32 | 只看该作者
不是说你加什么参数防止死循环啊,最好做成状态机形式或有外部中断最好。

使用特权

评论回复
11
雁舞白沙|  楼主 | 2009-8-7 14:35 | 只看该作者
呵呵,如果有中断的话,也不用这么麻烦了!

可惜的是已经是成品了,只能使用查询的方式!

使用特权

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

本版积分规则

213

主题

789

帖子

243

粉丝