CPU卡程序设计实例(十二)ESAM模块字节接收函数

来源:互联网 发布:淘宝实时交易量 编辑:程序博客网 时间:2024/06/18 00:14

ESAM模块字节接收函数

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

函数名称:EsamReceChar

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

入口参数:无

出口参数:iTemp,ESAM复位响应的13个字节

描述:最多接收3次,与卡接收一字节函数功能一致

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

unsigned char EsamReceChar(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(!(EsamSDAInputCheck)) break;

else if(iTemp>(40000-2))

{

//超时错误

CardError=ErrorRWBIT|CardError;

goto RstOkEnd;

}

}

//接受1个字节,8位

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

{

cTemp=cTemp>>0x1;

Delay1ETU();

if(EsamSDAInputCheck)

{

//生成偶校验

CardWorkFlag=CardWorkFlag^0x80;

cTemp=0x80|cTemp;

}

else

{

cTemp=(~0x80)&cTemp;

}

}

Delay1ETU();

//判断偶校验是否正确

if(EsamSDAInputCheck) CardWorkFlag=ICXOR|CardWorkFlag;

if(CardWorkFlag&ICXOR)

{

if(CardWorkFlag&MXOR) goto RstOkEnd;

}

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

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

CardError=ErrorRWBIT|CardError;

EsamSDAOutput;

EsamSDAOutputLow;

Delay1ETU();

EsamSDAOutputHigh;

}

RstOkEnd:

Delay05XETU();

return cTemp;

}

0 0
原创粉丝点击