原创 CY7C68013A开发板编程之十(EP_Interrupts)

2011-11-21 14:30 2584 8 8 分类: 通信

  这也是用固件框架实现的一个例子功能是,功能也是块传输,只不过是用中断的方式实现的。首先将程序通过控制面板下载到芯片内部,运行程序看一下,再看程序。下载程序后,单击控制面板上的“Get Pipes”按钮,显示如下,



   可以看到共有6个管道,也就是68013所有的端点全用上了,Endpoint 0(当然不会显示在这里),Endpoint 1 IN,Endpoint 1 OUT,以及4个大端点,分别是Endpoint 2、Endpoint 4、Endpoint 6、Endpoint 8,这些可以查看初始化函数TD_Init(void)看一下,代码如下,


   EP1OUTCFG = 0xA0;
  EP1INCFG = 0xA0;
  SYNCDELAY;                    // see TRM section 15.14
  EP2CFG = 0xA2;
  SYNCDELAY;                   
  EP4CFG = 0xA0;
  SYNCDELAY;                   
  EP6CFG = 0xE2;
  SYNCDELAY;                   
  EP8CFG = 0xE0;


  同时看一下函数 TD_Poll(void),是一个空函数。块传输的功能是通过中断来实现的,查一下中断函数,以端点的中断函数为例,代码如下,


void ISR_Ep2inout(void) interrupt 0
{
   WORD count;
   WORD  i;


   if(!(EP2468STAT & bmEP6FULL))
   {  // check EP6 FULL(busy) bit in EP2468STAT (SFR), core set's this bit when FIFO is full
      APTR1H = MSB( &EP2FIFOBUF );
      APTR1L = LSB( &EP2FIFOBUF );
     
      AUTOPTRH2 = MSB( &EP6FIFOBUF );
      AUTOPTRL2 = LSB( &EP6FIFOBUF );
     
      count = (EP2BCH << 8) + EP2BCL;
     
      // loop EP2OUT buffer data to EP6IN
      for( i = 0x0000; i < count; i++ )
      {
         // setup to transfer EP2OUT buffer to EP6IN buffer using AUTOPOINTER(s)
         EXTAUTODAT2 = EXTAUTODAT1;
      }
      EP6BCH = EP2BCH; 
      SYNCDELAY; 
      EP6BCL = EP2BCL;        // arm EP6IN
      SYNCDELAY;                   
   }


 EZUSB_IRQ_CLEAR();
 EPIRQ = bmBIT4;
}


  其它的端点与此相似,下面看一下实际操作。按下图操作,为了在一幅图里说明问题,将发送的数据定为16个,如下,



 

  可以看到通过Endpoint 2发出去16个字节5,再按下图操作,



 

   余下的功能,自己看程序吧,很简单,不会有看不懂的地方的。


 


 


文章评论0条评论)

登录后参与讨论
我要评论
0
8
关闭 站长推荐上一条 /2 下一条