您的位置:首页 > 其它

CPU卡程序设计实例(十一)CPU卡字节数据接收

2017-04-28 19:16 197 查看
CPU卡字节接收函数

/*******************************************

函数名称:CardReceChar

函数功能:卡接收一个字节

输入参数:无

输出参数:cTemp,卡复位响应的13个字节

描述:最多接收3次,接收10位,第一位是起始位,第10位是校验位

,每接收一位(起始位除外),都要计算校验位(偶校验),

然后与接收的校验位比较,相等则数据正确

*******************************************/

unsigned char CardReceChar(void)

{

unsigned int iErrCoun;

unsigned long int iTemp;

unsigned char cTemp=0;

CardWorkFlag=~(ICXOR+MXOR)&CardWorkFlag;

for(iErrCoun=0;iErrCoun<3;iErrCoun++)

{

for(iTemp=0;iTemp<40000;iTemp++)

{

//判断起始位

if(!(CardSDAInputCheck)) break;

else if(iTemp>(40000-2))

{

//超时错误

CardError=ErrorRWBIT|CardError;

goto RstOkEnd;

}

}

//接受1个字节,8位

for(iTemp=8;iTemp>=1;iTemp--)

{

cTemp=cTemp>>0x1;

Delay1ETU();

if(CardSDAInputCheck)

{

CardWorkFlag=CardWorkFlag^0x80; //生成偶校验

cTemp=0x80|cTemp;

}

else

{

cTemp=(~0x80)&cTemp;

}

}

Delay1ETU();

//判断偶校验是否正确

if(CardSDAInputCheck) CardWorkFlag=ICXOR|CardWorkFlag;

if(CardWorkFlag&ICXOR)

{

if(CardWorkFlag&MXOR) goto RstOkEnd;

}

else if(!(CardWorkFlag&MXOR)) goto RstOkEnd;

//如果校验位错,则将I/O口置低—高,等待字符的再次发送。最多3次

CardError=ErrorRWBIT|CardError;

CardSDAOutput;

CardSDAOutputLow;

Delay1ETU();

CardSDAOutputHigh;

}

RstOkEnd:

Delay05XETU();

return cTemp;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息