原创 CY7C68013A开发板编程之11(CYStream.exe)续二

2011-2-12 10:11 3745 7 7 分类: 通信

  今天看一下固件程序,最好与上一篇的操作对应起来。


  CYPRESS公司提供了固件程序框架(可以查看我以前的贴子),用这个模板来开发USB应用还是简单、快捷的。具体的固件程序前一个帖子有下载,你可以打开看一看。首先看初始化函数TD_Init(void),


void TD_Init(void)             // Called once at startup
{
   int i,j;


   // set the CPU clock to 48MHz
   CPUCS = ((CPUCS & ~bmCLKSPD) | bmCLKSPD1) ;
   SYNCDELAY;


   // set the slave FIFO interface to 48MHz
   IFCONFIG |= 0x40;
   SYNCDELAY;


    // Default interface uses endpoint 2, zero the valid bit on all others
    // Just using endpoint 2, zero the valid bit on all others
    EP1OUTCFG = (EP1OUTCFG & 0x7F);
 SYNCDELAY;
 EP1INCFG = (EP1INCFG & 0x7F);
 SYNCDELAY;
 EP4CFG = (EP4CFG & 0x7F);
 SYNCDELAY;
 EP6CFG = (EP6CFG & 0x7F);
 SYNCDELAY;
 EP8CFG = (EP8CFG & 0x7F);
 SYNCDELAY;
    EP2CFG = 0xE0;  // EP2 is DIR=IN, TYPE=BULK, SIZE=512, BUF=4x


   // We want to get SOF interrupts
   USBIE |= bmSOF;
  
   mycount = 0;


   // Prepare data
   for (i=1;i<5;i++)
   {
      EP2FIFOBUF[0] = LSB(mycount);
      EP2FIFOBUF[1] = MSB(mycount);
      EP2FIFOBUF[2] = USBFRAMEL;
      EP2FIFOBUF[3] = USBFRAMEH;
      EP2FIFOBUF[4] = MICROFRAME;
      for (j=5;j<1024;j++)
      {
         EP2FIFOBUF[j] = i;
      }
      EP2BCH = 0x02;
      EP2BCL = 0x00;
   }



    Rwuen = TRUE;                 // Enable remote-wakeup
}


  程序中的注释很清楚了,相信你能够看懂。这里主要对大端点EP2进行一下说明,EP2CFG = 0xE0,含义是:DIR=IN, TYPE=BULK, SIZE=512, BUF=4倍缓冲,端点EP2是包含在接口0中的唯一一个端点,其它接口中可能有两个端点,具体的要看那个汇编语言的文件了。还需要说明一下USB协议是这样规定的:设备—>配置—>接口—>端点。初始化程序接下来是USBIE |= bmSOF,使能帧开始中断。再接下来是对点EP2的数据缓冲区EP2FIFOBUF填冲数据,是一个for循环。


  Mycount变量初始化为0,这个变量用来记录调用函数TD_Poll()的次数。


  再看一下另一个函数TD_Poll(void),代码结构如下,


void TD_Poll(void)             // Called repeatedly while the device is idle

 // ...FX2 in high speed mode
 if( EZUSB_HIGHSPEED( ) )
 {
     // Perform USB activity based upon the Alt. Interface selected
      switch (AlternateSetting)
     {
         case Alt0_BulkIN:
             // Send data on EP2
             while(!(EP2468STAT & bmEP2FULL))
             {
                 EP2FIFOBUF[0] = LSB(mycount);
                 EP2FIFOBUF[1] = MSB(mycount);
                 EP2FIFOBUF[2] = USBFRAMEL;
                 EP2FIFOBUF[3] = USBFRAMEH;
                 EP2FIFOBUF[4] = MICROFRAME;
 
                 EP2BCH = 0x02;
                 EP2BCL = 0x00;
 
                 mycount++;
             }
         break;
 


        case Alt2_BulkINOUT:


        case Alt3_IsocIN:


        case Alt5_IsocIN:


        case Alt1_BulkOUT:


        case Alt4_IsocOUT:


        case Alt6_IsocINOUT:


  程序里共有7个接口,对应上面7个case语句。上面的代码仅显示了接口1的代码,是对端点EP2进行操作的,其实也就是准备数据。


  下面开始用上位机程序对开发板进行通信。将固件程序下载到LZ3684开发板上,开发板上的数码管显示数字0,不要显示其它数字。打开上位机程序Streamer.exe,选择BULK IN端点,开始数据传输,如下, 


0cd8d910-2312-44dc-a5c6-7ccf8dd0bf54.jpg


  数据传输率轻松地达到了43MB/s,还是非常快的,但这里要注意两个问题,你的电脑只能插入一个USB设备,也不要开启其它的应用程序,要不然速度会降下来。


  上面的测试应用到自己的项目时,还有两个问题需要解决,所以实际的传输速度肯定没有43MB/s这么快。一是固件程序的数据准备没有上面的理想情况快(当然这一点也可以通过SLAVE FIFO来解决,并且要用同步传输,而不能用异步传输),二是上位机程序的数据传输方式(是同步还是异步,一次发起多少个传输)。


  下面的几个帖子要解决这两个问题,目的是实现数据的高速传输。待续,,,,。。。。


 


更多文章请访问我的博客http://blog.ednchina.com/liangziusb/


LZ3684 USB开发板 请访问我的淘宝http://shop64171919.taobao.com


 


 


 


良子.2011年


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


欢迎交流:liangziusb@163.com


QQ:392425239


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
7
关闭 站长推荐上一条 /3 下一条