打印
[技术问题解答]

RC531 或者是FM1722读CPU时 ,返回数据溢出的问题

[复制链接]
556|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
学习天天|  楼主 | 2017-5-3 11:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
RC531 或者是FM1722读CPU时 ,返回的字节数据大于64 位,在不使用外部中断的方式下,用查询的方式接收大于64字节以上的数据,这个命令传送函数该怎么写?  请指教,该函数的功能与下面的额类似,但是下面的函数 无法处理 返回64字节以上的数据。 请帮忙,谢谢了

相关帖子

沙发
学习天天|  楼主 | 2017-5-3 11:51 | 只看该作者
/***************************************************************************
º¯ÊýÃû³Æ£ºSendCMD
º¯Êý¹¦ÄÜ£ºÐ´PCDÃüÁî·¢ËÍ¿¨Æ¬²Ù×÷ÃüÁî²¢½ÓÊÕÊý¾Ý
ÊäÈë²ÎÊý£º
                        set:structÀàÐÍ£¬°üº¬ÁËPCDÃüÁ
                                ¿¨Æ¬²Ù×÷ÃüÁ¿¨Æ¬²Ù×÷ÃüÁî²ÎÊý³¤¶È£¨º¬ÃüÁÒÔ¼°½ÓÊÕÊý¾ÝÓ¦Ó㤶È
Êä³ö²ÎÊý£º
                        error_flag:´íÎó±êʶ£¬±êʶµÄºê¶¨ÒåÔÚFM1722.hÖÐ
                        set:º¬½ÓÊÕÊý¾Ý
/******************************************************
*·¢ËÍÖ¸Áî
***************************************************/
unsigned char SendCMD2(Transceive *set)
{
    unsigned char  recebyte = 0;
   char err_flag,sta;
   unsigned char irqEn   = 0x00;
   unsigned char waitFor = 0x00;
   unsigned char lastBits;
   
   unsigned int i;
   switch (set->command)
   {
      case PCD_IDLE:
         irqEn   = 0x00;
         waitFor = 0x00;
         break;
      case PCD_WRITEE2:
         irqEn   = 0x11;
         waitFor = 0x10;
         break;
      case PCD_READE2:
         irqEn   = 0x07;
         waitFor = 0x04;
         recebyte=1;
         break;
      case PCD_LOADCONFIG:
      case PCD_LOADKEYE2:
      case PCD_AUTHENT1:
         irqEn   = 0x05;
         waitFor = 0x04;
         break;
      case PCD_CALCCRC:
         irqEn   = 0x11;
         waitFor = 0x10;
         break;
      case PCD_AUTHENT2:
         irqEn   = 0x04;
         waitFor = 0x04;
         break;
      case PCD_RECEIVE:
         irqEn   = 0x06;
         waitFor = 0x08;
         recebyte=1;
         break;
      case PCD_LOADKEY:
         irqEn   = 0x05;
         waitFor = 0x04;
         break;
      case PCD_TRANSMIT:
         irqEn   = 0x05;
         waitFor = 0x04;
         break;
      case PCD_TRANSCEIVE:  //ÃüÁî·¢ËͽÓÊÕ
         irqEn   = 0x3D;
         waitFor = 0x04;
         recebyte=1;
         break;
      default:
         set->command = MI_UNKNOWN_COMMAND;
         break;
   }
   if (set->command != MI_UNKNOWN_COMMAND)
   {
      WriteIO(RegPage,0x00);  //Çл»ÏßÐÔÑ°Ö·
      WriteIO(RegInterruptEn,0x7F);
      WriteIO(RegInterruptRq,0x7F);
      WriteIO(RegCommand,PCD_IDLE);
      SetBitMask(RegControl,0x01);
      WriteIO(RegInterruptEn,irqEn|0x80);//ÔÊÐí¶ÔÓ¦µÄÖжÏ
                         ClearFIFO();                                                           //Çå¿ÕFIFO
                 
      for (i=0; i<set->length; i++)
      {
         WriteIO(RegFIFOData, set->sr_data[i]); //дÊý¾Ý
      }
      WriteIO(RegCommand, set->command);   //дÃüÁî
                       
      i = 0x2000;
      do
      {
         n = ReadIO(RegInterruptRq);   // ¶ÁÕâ¸öÖжÏ0
                                  i--;
      }while ((i!=0) && !(n&irqEn&0x20) && !(n&waitFor));
{
        sta=ReadIO(RegPrimaryStatus); //¶Á¸÷ÖÖ״̬¼Ä´æÆ÷
        err_flag = 101;         //Êý¾Ý´ÓÕâÀïÌø³öʱ·µ»ØµÄ´íÎóÊÇFIFO ½ÓÊÕµÄÊý¾Ý³¬¹ý
}
        if ((i!=0) && !(n&irqEn&0x20))  // Èç¹ûÕýÈ·µÄ»°£¬¶Á³öµÄÖжϱêʶΪ1
      {
         if (!(ReadIO(RegErrorFlag)&0x17))
         {
              err_flag = MI_OK;
            if (recebyte)
            {
                      n = ReadIO(RegFIFOLength);
                for (i=0; i<n; i++)
                {
                    set->sr_data[i] = ReadIO(RegFIFOData);
                }
            }
         }
                 else if (ReadIO(RegErrorFlag)&0x01)
         {
                        err_flag = MI_COLLERR; //³åͻλ
            if (recebyte)
            {
                      n = ReadIO(RegFIFOLength);
                      lastBits = ReadIO(RegSecondaryStatus) & 0x07;
                if (lastBits)
                {
                   set->length = (n-1)*8 + lastBits;
                }
                else
                {
                   set->length = n*8;
                }
                if (n == 0)
                {
                   n = 1;
                }
                for (i=0; i<n; i++)
                {
                    set->sr_data[i+1] = ReadIO(RegFIFOData);
                }
            }
                              set->sr_data[0]=ReadIO(RegCollpos );
         }

      }
      else if (n & irqEn & 0x20)  //  ÎªÕæ £¬irqen Ó²¼þδ×Ô¶¯ÖÃ0
      {  
      printf(" irqen=%.2X",irqEn);
      printf(" n=%.2X",n);                               
                        err_flag = MI_NOTAGERR;     //FIFOÊý¾Ý³¬ÏÞ
                        }                                               
                       
     else if (!(ReadIO(RegErrorFlag)&0x17))
      {   
                        err_flag = MI_ACCESSTIMEOUT;     //³¬Ê±Í˳ö 27
                        }
                       
      else
      {   err_flag = 102;    }   //ÆäËûÇé¿ö
      
      WriteIO(RegInterruptEn,0x7F);
      WriteIO(RegInterruptRq,0x7F);
      SetBitMask(RegControl,0x04);           // stop timer now
      WriteIO(RegCommand,PCD_IDLE);
   }
   return err_flag;
}

使用特权

评论回复
板凳
学习天天|  楼主 | 2017-5-3 11:53 | 只看该作者
求帮忙,哪位大神帮帮忙,可以把功能类似的源码函数发给我  邮箱1403652139@qq.com

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

6

帖子

0

粉丝