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

CPU卡设计实例及程序设计(十)字节发送及校验位生成

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

/**************************************
函数名称:EsamSendChar
函数功能:向Esam发送一个字节
入口参数:cSendChar,要发送的字节
出口参数:无
描述:发送10位,第一位起始位(始终为低),第10位是校验位,
      最多发3次,
***************************************/
void EsamSendChar(unsigned char cSendChar)
{
  unsigned int iTempTran,iErrCoun;
  unsigned int iTemp=cSendChar;
  iTemp=iTemp<<1;
  iTemp=iTemp&(~BIT0);
  icflag1=~(ICXOR+MXOR)&icflag1;
  PorCheckBit(cSendChar);
  if(icflag1&0x80) iTemp=iTemp|BIT9;
  else iTemp=iTemp&(~BIT9);
  EsamSDAOutput;
  
  for(iErrCoun=0;iErrCoun<3;iErrCoun++)
  {   
    for(iTempTran=0;iTempTran<10;iTempTran++)              
    {
      if(iTemp&0x01)     
      {
        EsamSDAOutputHigh;      
      }
      else 
      { 
        EsamSDAOutputLow;      
      }
      iTemp=iTemp>>0x01;  
      Delay1ETU();       
   }
   EsamSDAInput;    
    Delay05XETU();
    //发送OK
    if(EsamSDAInputCheck)                  
    {
      Delay1ETU();
      Delay05XETU();
      goto EsamSendCharOk;
    } 
    //发送错误
    else                             
    {
      iErrorRWrCard=ErrorReadWriteBIT|iErrorRWrCard;
      Delay1ETU();
      EsamSDAOutput;    
      Delay1ETU();
    }
 } 
EsamSendCharOk:;   
}

/**************************************
函数名称:CardSendChar
函数功能:向CPU卡发送一字节
入口参数:cSendChar,要发送的字节
出口参数:无
描述:发送10位,第一位起始位(始终为低),第10位是校验位,
      最多发3次,
***************************************/
void CardSendChar(unsigned char cSendChar)
{
  unsigned int iTempTran,iErrCoun;
  unsigned int iTemp=cSendChar;
  iTemp=iTemp<<1;
  iTemp=iTemp&(~BIT0);
  //清除校验位,然后计算校验位
  icflag1=~(ICXOR+MXOR)&icflag1;
  PorCheckBit(cSendChar);
  if(icflag1&0x80) iTemp=iTemp|BIT9;
  else iTemp=iTemp&(~BIT9);
  //开始数据发送
  CardSDAOutput;  
  for(iErrCoun=0;iErrCoun<3;iErrCoun++)
  {      
    //发送1个字节,8位
    for(iTempTran=0;iTempTran<10;iTempTran++)              
    {
      if(iTemp&0x01)     
      {
        CardSDAOutputHigh;      
      }
      else 
      {  
        CardSDAOutputLow;      
      }
      iTemp=iTemp>>0x01;  
      Delay1ETU();       
   }
    CardSDAInput;    
    Delay05XETU();
    //发送OK
    if(CardSDAInputCheck)                   
    {     
      Delay1ETU();
      Delay05XETU();
    goto SendCharOk;
    } 
    //发送错误
    else                             
    {
    iErrorRWrCard=ErrorReadWriteBIT|iErrorRWrCard;
    Delay1ETU();
    CardSDAOutput;    
    Delay1ETU();
    }
 } 
SendCharOk:;
}

/**************************************
函数名称:PorCheckBit
函数功能:计算待发送字符的偶校验
输入参数:cSendChar,要发送的字符
输出参数:无
描述:生成偶校验位
**************************************/
void PorCheckBit(unsigned char cSendChar)
{
  unsigned char SendCommandBufBit=cSendChar;
  int itemp;
  for(itemp=0;itemp<8;itemp++)
  {
    if(SendCommandBufBit&0x01)
    {
      icflag1=icflag1^0x80;
    } 
    SendCommandBufBit=SendCommandBufBit>>0x01; 
  }
}

评论 (0 个评论)

facelist doodle 涂鸦板

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

热门文章