注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
tiankai001的个人空间 https://home.eeworld.com.cn/space-uid-139222.html [收藏] [复制] [分享] [RSS]
日志

CPU卡设计实例及程序设计(九)字节接收

已有 473 次阅读2017-2-17 18:13 |个人分类:CPU卡开发设计程序实例| 程序设计, CPU卡

/*******************************************
函数名称: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;
}

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章