原创 CY7C68013A开发板编程之九(Bulksrc)

2011-11-21 14:46 4156 8 8 分类: 通信

   这也是用固件框架实现的一个程序,与其它几个块传输的例子相似。这个程序可以用控制面板来调试,也可以用Bulk.exe来调试。


  第一,先看一下固件程序,在初始化函数TD_Init(void) 中先对程序用到的大端点初始化,接着准备两个OUT端点,最后对IN端点进行数据初始化(第一个数据为0x02,第二个数据为0x03,依次加1,共计512个数据),程序片断如下,


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


  // out endpoints do not come up armed
 
  // since the defaults are double buffered we must write dummy byte counts twice
  SYNCDELAY;                    //
  EP2BCL = 0x80;                // arm EP2OUT by writing byte count w/skip.
  SYNCDELAY;                    //
  EP4BCL = 0x80;   
  SYNCDELAY;                    //
  EP2BCL = 0x80;                // arm EP4OUT by writing byte count w/skip.
  SYNCDELAY;                    //
  EP4BCL = 0x80;   


  // fill up both IN endpoints


  for (i=0;i<512;i++)
     EP6FIFOBUF = i+2;
  SYNCDELAY;                    //
  EP6BCH = 0x02;
  SYNCDELAY;                    //
  EP6BCL = 0x00;


  for (i=0;i<512;i++)
     EP6FIFOBUF = i+2;
  SYNCDELAY;                    //
  EP6BCH = 0x02;
  SYNCDELAY;                    //
  EP6BCL = 0x00;


  myBufferCount = 0;


  // enable dual autopointer(s)
  AUTOPTRSETUP |= 0x01; 
}


   第二,在程序实现函数TD_Poll(void) 中,主要有以下几个功能,


   // if there is some data in EP2 OUT, re-arm it
   if(!(EP2468STAT & bmEP2EMPTY))
   {
      SYNCDELAY;                //
      EP2BCL = 0x80;
   }


  如上的程序片断,端点2随时可以接受上位机发来的数据。


   // if EP6 IN is available, re-arm it
   if(!(EP2468STAT & bmEP6FULL))
   {
      SYNCDELAY;                //
      EP6BCH = 0x02;
      SYNCDELAY;                //
      EP6BCL = 0x00;
   }


  如上的程序片断,端点6随时都有512 个数据准备向上位机发送。


   // if there is new data in EP4FIFOBUF, then copy it to a temporary buffer
   if(!(EP2468STAT & bmEP4EMPTY))
   {
      APTR1H = MSB( &EP4FIFOBUF );
      APTR1L = LSB( &EP4FIFOBUF );


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


      myBufferCount = (EP4BCH << 8) + EP4BCL;


      for( i = 0x0000; i < myBufferCount; i++ )
      {
         EXTAUTODAT2 = EXTAUTODAT1;
      }


      SYNCDELAY;                //
      EP4BCL = 0x80;            // re(arm) EP4OUT
   }


  如上的程序片断,主要是对端点4进行操作,如果端点4有上位机发来的数据,将数据暂时保存在数组myBuffer 中,myBuffer 是一个512字节的数组。


   // if there is room in EP8IN, then copy the contents of the temporarty buffer to it
   if(!(EP2468STAT & bmEP8FULL) && myBufferCount)
   {
      APTR1H = MSB( &myBuffer );
      APTR1L = LSB( &myBuffer );


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


      for( i = 0x0000; i < myBufferCount; i++ )
      {
         // setup to transfer EP4OUT buffer to EP8IN buffer using AUTOPOINTER(s) in SFR space
         EXTAUTODAT2 = EXTAUTODAT1;
      }
      SYNCDELAY;                    //
      EP8BCH = MSB(myBufferCount);
      SYNCDELAY;                    //
      EP8BCL = LSB(myBufferCount);  // arm EP8IN
   }


  如上的程序片断,是对端点8进行操作。如果端点8为空,则将暂存在数组myBuffer中数据拷贝到端点8中。


  程序还是比较简单的。


 


 

更多文章请访问:

我的博客1:http://bbs.ednchina.com/BLOG_liangziusb_440752.HTM

我的博客2:   http://www.eefocus.com/liangziusb/blog/

EDN小组http://group.ednchina.com/GROUP_GRO_14600_3466.HTM

LZ3684 USB2.0开发板(CY7C68013A), 请访问我的淘宝http://shop64171919.taobao.com

LZ3014 USB3.0开发板(CYUSB3014),请访问我的淘宝http://shop64171919.taobao.com

实体店铺:北京新中发电子市场2557号

 

良子.2011年

沈阳市东陵区白塔街龙盛家园

欢迎交流:liangziusb@163.com

QQ:392425239

文章评论0条评论)

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