EZ-USB固件框架的追踪研读之main函数2

书接上回

  任务调度之轮询函数:TD_Poll()

void TD_Poll(void)             // Called repeatedly while the device is idle
{
  WORD i;
  WORD count;

  if(!(EP2468STAT & bmEP2EMPTY))
  { //检查寄存器EP2468STAT中的EP2 EMPTY(busy)位
     if(!(EP2468STAT & bmEP6FULL))
     {  //检查寄存器EP2468STAT中的EP6 EMPTY(busy)位
        APTR1H = MSB( &EP2FIFOBUF );
        APTR1L = LSB( &EP2FIFOBUF );

        AUTOPTRH2 = MSB( &EP6FIFOBUF );
        AUTOPTRL2 = LSB( &EP6FIFOBUF );

        count = (EP2BCH << 8) + EP2BCL;

        //循环将EP2OUT中的数据发送到EP6IN中
        for( i = 0x0000; i < count; i++ )
        {
           //使用AUTOPOINTER(s)
           EXTAUTODAT2 = EXTAUTODAT1;
        }
        EP6BCH = EP2BCH;  
        SYNCDELAY;  
        EP6BCL = EP2BCL;        //启动EP6IN
        SYNCDELAY;                    
        EP2BCL = 0x80;          //重新启动EP2OUT
     }
  }

  if(!(EP2468STAT & bmEP4EMPTY))
  { //检查寄存器EP2468STAT中的EP4 EMPTY(busy)位
     if(!(EP2468STAT & bmEP8FULL))
     {  //检查寄存器EP2468STAT中的EP8 EMPTY(busy)位
        APTR1H = MSB( &EP4FIFOBUF );
        APTR1L = LSB( &EP4FIFOBUF );

        AUTOPTRH2 = MSB( &EP8FIFOBUF );
        AUTOPTRL2 = LSB( &EP8FIFOBUF );

        count = (EP4BCH << 8) + EP4BCL;

        //循环将EP4OUT中的数据发送到EP8IN中
        for( i = 0x0000; i < count; i++ )
        {
           //使用AUTOPOINTER(s)
           EXTAUTODAT2 = EXTAUTODAT1;
        }
        EP8BCH = EP4BCH;  
        SYNCDELAY;  
        EP8BCL = EP4BCL;        //启动EP8IN
        SYNCDELAY;                    
        EP4BCL = 0x80;          //重新启动EP4OUT
     }
  }
}


  1、如果EP2OUT中有数据,且EP6IN还有未使用的空间:

  if(!(EP2468STAT & bmEP2EMPTY))
  { //检查寄存器EP2468STAT中的EP2 EMPTY(busy)位
     if(!(EP2468STAT & bmEP6FULL))
     {  //检查寄存器EP2468STAT中的EP6 EMPTY(busy)位

  2、将EP2FIFOBUF的地址传给AUTOPTRH1:AUTOPTRL1,将EP6FIFOBUF的地址传给AUTOPTRH2:AUTOPTRL2

   APTR1H = MSB( &EP2FIFOBUF );
   APTR1L = LSB( &EP2FIFOBUF );

   AUTOPTRH2 = MSB( &EP6FIFOBUF );
   AUTOPTRL2 = LSB( &EP6FIFOBUF );


  3、将EP2的maximum buffer sizes传给变量count(128)

        count = (EP2BCH << 8) + EP2BCL;

  我推测一下,这里的maximum buffer sizes应该是分割数据包后的最大传输的字节数,为了防止数据包的传输长时间的占用CPU:
这里写图片描述



  4、循环将EP2OUT中的数据发送到EP6IN中

    //循环将EP2OUT中的数据发送到EP6IN中
    for( i = 0x0000; i < count; i++ )
    {
       //使用AUTOPOINTER(s)
       EXTAUTODAT2 = EXTAUTODAT1;
    }
#define EXTAUTODAT1 XAUTODAT1
#define EXTAUTODAT2 XAUTODAT2
EXTERN xdata volatile BYTE XAUTODAT1         _AT_ 0xE67B;  // Autoptr1 MOVX access
EXTERN xdata volatile BYTE XAUTODAT2         _AT_ 0xE67C;  // Autoptr2 MOVX access

这里写图片描述


  5、启动EP6IN,重新启动EP2OUT

     EP6BCH = EP2BCH;  
     SYNCDELAY;  
     EP6BCL = EP2BCL;        //启动EP6IN
     SYNCDELAY;                    
     EP2BCL = 0x80;          //重新启动EP2OUT

为什么这么做就是启动他们了呢?



  对EP4OUT和EP8IN的处理,与上面所述雷同,不再赘述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值