本人的解析方式:
#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%的成功)
次方式本人称之:白沙解码方式,但让如果有朋友以前已经使用过,本人就放弃这个名称,并向其鞠躬感谢! |