/*******************************************
函数名称:CardReceChar
函数功能:卡接收一个字节
输入参数:无
输出参数:cTemp,卡复位响应的13个字节
描述:最多接收3次,接收10位,第一位是起始位,第10位是校验位
,每接收一位(起始位除外),都要计算校验位(偶校验),
然后与接收的校验位比较,相等则数据正确
*******************************************/
unsigned char CardReceChar(void)
{
unsigned int iErrCoun;
unsigned long int iTemp;
unsigned char cTemp=0;
icflag1=~(ICXOR+MXOR)&icflag1;
for(iErrCoun=0;iErrCoun<3;iErrCoun++)
{
for(iTemp=0;iTemp<40000;iTemp++)
{
//判断起始位
if(!(CardSDAInputCheck)) break;
else if(iTemp>(40000-2))
{
//超时错误
iErrorRWrCard=ErrorReadWriteBIT|iErrorRWrCard;
goto RstOkEnd;
}
}
//接受1个字节,8位
for(iTemp=8;iTemp>=1;iTemp--)
{
cTemp=cTemp>>0x1;
Delay1ETU();
if(CardSDAInputCheck)
{
icflag1=icflag1^0x80; //生成偶校验
cTemp=0x80|cTemp;
}
else
{
cTemp=(~0x80)&cTemp;
}
}
Delay1ETU();
//判断偶校验是否正确
if(CardSDAInputCheck) icflag1=ICXOR|icflag1;
if(icflag1&ICXOR)
{
if(icflag1&MXOR) goto RstOkEnd;
}
else if(!(icflag1&MXOR)) goto RstOkEnd;
//如果校验位错,则将I/O口置低—高,等待字符的再次发送。最多3次
iErrorRWrCard=ErrorReadWriteBIT|iErrorRWrCard;
CardSDAOutput;
CardSDAOutputLow;
Delay1ETU();
CardSDAOutputHigh;
}
RstOkEnd:
Delay05XETU();
return cTemp;
}
/**************************************
函数名称:EsamReceChar
函数功能:Esam接收一个字节
入口参数:无
出口参数:iTemp,ESAM复位响应的13个字节
描述:最多接收3次,与卡接收一字节函数功能一致
***************************************/
unsigned char EsamReceChar(void)
{
unsigned int iErrCoun;
unsigned long int iTemp;
unsigned char cTemp=0;
icflag1=~(ICXOR+MXOR)&icflag1;
for(iErrCoun=0;iErrCoun<3;iErrCoun++)
{
for(iTemp=0;iTemp<40000;iTemp++)
{
//判断起始位
if(!(EsamSDAInputCheck)) break;
else if(iTemp>(40000-2))
{
//超时错误
iErrorRWrCard=ErrorReadWriteBIT|iErrorRWrCard;
goto RstOkEnd;
}
}
//接受1个字节,8位
for(iTemp=8;iTemp>=1;iTemp--)
{
cTemp=cTemp>>0x1;
Delay1ETU();
if(EsamSDAInputCheck)
{
//生成偶校验
icflag1=icflag1^0x80;
cTemp=0x80|cTemp;
}
else
{
cTemp=(~0x80)&cTemp;
}
}
Delay1ETU();
//判断偶校验是否正确
if(EsamSDAInputCheck) icflag1=ICXOR|icflag1;
if(icflag1&ICXOR)
{
if(icflag1&MXOR) goto RstOkEnd;
}
else if(!(icflag1&MXOR)) goto RstOkEnd;
//如果校验位错,则将I/O口置低—高,等待字符的再次发送。最多3次
iErrorRWrCard=ErrorReadWriteBIT|iErrorRWrCard;
EsamSDAOutput;
EsamSDAOutputLow;
Delay1ETU();
EsamSDAOutputHigh;
}
RstOkEnd:
Delay05XETU();
return cTemp;
}