打印

关于68013FIFO IN端点速度问题,求教,这边人气可能高点

[复制链接]
4804|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
阿毛|  楼主 | 2011-2-17 15:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我现在用的是68013,驱动使用的是cyusb.sys,32KB的那个,68013与设备的接口是27MB/S左右,slaveFIFO IN方式,在PC端通过同步或异步方式进行读取,现在速度始终只能保持在16MB/S,在提问之前我也看了论坛里的帖子,之前有大侠使用的这种方式刚开始大概也是这个速度,后来有些是通过修改PC端接收缓冲区大小实现了20+MB/S的,我自己的程序中缓冲区已经做了很多的修改,但是目前来看好像没有什么作用,希望碰到过类似问题的大侠能给指定一下,谢谢!
沙发
tom_2_2| | 2011-2-17 16:23 | 只看该作者
请问你的SlaveFIFO的外部MCU频率是多少?有没有另外外接FIFO存储器,我也在测slaveFIFO 的AUTOOUT传输速度可速度非常可怜只有2.2MB/S

使用特权

评论回复
板凳
tom_2_2| | 2011-2-17 16:31 | 只看该作者
我QQ:947599260 加我一起学USB

使用特权

评论回复
地板
阿毛|  楼主 | 2011-2-17 17:29 | 只看该作者
如果速度只有2.2MB/S的话,应该是PC端接收缓冲区设置得太小了,设置大点,比如10K,或是其他,会有比较大的提升,不过我的极限好像也就16MB/S

使用特权

评论回复
5
易达口香糖| | 2011-2-17 19:31 | 只看该作者
不经过单片机,应该会很快啊!

使用特权

评论回复
6
易达口香糖| | 2011-2-17 19:32 | 只看该作者
用的什么传输模式啊?

使用特权

评论回复
7
tom_2_2| | 2011-2-17 20:21 | 只看该作者
楼上请指点一下,我测试的是SLAVE FIFO AUTOOUT模式 端点2 512*4 PC机发数据 外部主机我使用的是AVR单片机(11.0592MHZ)用单片机来读FIFO中的数据,从而测AUTOOUT的速度,另外我PC的缓冲区设置成了45K了,看来不是缓冲区太小的原因的问题,不知道速度的瓶颈在哪里?
  请问易达口香糖你测的是SLAVE FIFO的什么模式,外部主机是什么配置?

使用特权

评论回复
8
阿毛|  楼主 | 2011-2-17 20:32 | 只看该作者
我觉得首先必须确认外部主机的速度不能成为瓶颈

使用特权

评论回复
9
darthing| | 2011-2-17 20:42 | 只看该作者
我也是16MB/s,下面上传的速度从32MB/s,提到48MB/s,连续传输还是16MB/s,我用的FPGA传数,多半时间空闲,我知道瓶颈在上面,怎么修改缓冲区大小啊?

使用特权

评论回复
10
dqyubsh| | 2011-2-18 00:39 | 只看该作者
AVR用的是8位数据总线吧,它就是一个单片机,用它测USB速率,恐怕没法胜任。可以查一下时序,AVR操作一次外部数据用多少时间,加上其它软件开销,能估算出AVR读/写一个字节耗费的时间。或者上示波器,看看握手信号。

CY提供的例子除了接DSP,就是FPGA的。FIFO不仅可以8位操作,还可以16位操作,比如连16位的DSP总线。

使用特权

评论回复
11
tom_2_2| | 2011-2-18 09:39 | 只看该作者
谢谢楼上各位楼上,鼎力相助!是AVR单片机速度不过快,单片机的读周期是900ns的只有1.1M,很慢!瓶颈在AVR上

使用特权

评论回复
12
tom_2_2| | 2011-2-18 09:53 | 只看该作者
刚才发现一个新问题,还是上面提到的SLAVE FIFO AUTOOUT模式测试。
AVR单片机接收的数据通过串口返回从串口调试助手(通过串口助手读回USB发出去的数据)显示中发现向USB发2次不同的数据时,数据会不同步。
  比如我第一次发512个0x65(此时的开头257个数据不是65,是随机数),第二次再发512个0x65数据(这以后的数据都正常,发n次都行),第3次我发512个0x33数据,开头显示的是刚才的257个0x65数据,然后才是0x33.不知道怎么会这样的?

使用特权

评论回复
13
dqyubsh| | 2011-2-18 12:33 | 只看该作者
第一次就错了,后边的不用看。你发一次测试文件C:\Cypress\USB\Util\Test会看得更清楚。

运行不稳定,时好时坏,说明还是有问题。时序、USB固件、AVR都有可能出错。最大的可能是时序,严格对照FIFO时序和AVR时序,逐项都要满足。可以有意识地把FIFO这边要求的时间间隔拉大,假定AVR要求100,FIFO可以设置150。

使用特权

评论回复
14
tom_2_2| | 2011-2-18 13:54 | 只看该作者
我用的是异步SLAVE FIFO 模式,AVR单片机就判断FIFO有没有空,没有空就读,程序如下
   if(GET_BIT(PINB,7))//fifo不空的话,执行下面(单片机的(PINB,7)跟fx2的FLAGC(CTL2)相连接,反应的是空状态)
      {
             tem=PINA;//读入数据
        SendByte(tem);//串口返回数据
           SLRD(0);
          SLRD(1);
          }

FIFOADR0=0;FIFOADR1=0;选择端点2
固件中PINFLAGSAB PINFLAGSCD FIFOPINPOLAR 都没有设置,使用默认的值按照书上所说,FLAGB(CTL1)反应的是满状态,FLAGC(CTL2)反应的是空状态

使用特权

评论回复
15
tom_2_2| | 2011-2-18 14:00 | 只看该作者
接着上面补充一下:
SLRD(0)等价于SLRD=0
我的满状态一直是高电平,也就是一直不满!当我控制单片机不读FIFO时,USB控制面板发过3次512个数据之后就发不下去了,此时满状态也一直高电平,应该低电平啊LED灯不亮才对,我的这个满LED灯始终是亮的。

使用特权

评论回复
16
tom_2_2| | 2011-2-18 14:20 | 只看该作者
我试了一下单片机不读的情况(和上面设想的不一样,有点乱)USB控制面板一次都不能发数据了,而且我把固件下载好之后,空指示灯一直亮这,说明FIFO有数据状态不对,怀疑是不是没有初始化好!我把代码贴在下面,帮我看看哪里有问题,是不是遗漏了什么设置:

IFCONFIG=0xcb;
SYNCDELAY;
REVCTL=0x03;
SYNCDELAY;
EP2CFG = 0xA0; //输出 块端点 4缓冲
SYNCDELAY;   

FIFORESET=0x80;
  SYNCDELAY;
  FIFORESET=0x02;
  SYNCDELAY;
  FIFORESET=0x04;
  SYNCDELAY;
  FIFORESET=0x06;
  SYNCDELAY;
  FIFORESET=0x08;
  SYNCDELAY;
  FIFORESET=0x00;
  SYNCDELAY;

SYNCDELAY;                    
  EP2BCL = 0x80;                // arm EP2OUT by writing byte count w/skip.
  SYNCDELAY;                    
  EP2BCL = 0x80;

  SYNCDELAY;                    
  EP2BCL = 0x80;                // arm EP2OUT by writing byte count w/skip.
  SYNCDELAY;                    
  EP2BCL = 0x80;
  SYNCDELAY;                    
  EP4BCL = 0x80;                // arm EP4OUT by writing byte count w/skip.
  SYNCDELAY;                    
  EP4BCL = 0x80;
  SYNCDELAY;

EP2FIFOCFG = 0x00;            // AUTOOUT=0, WORDWIDE=0
SYNCDELAY;
EP2FIFOCFG=0x10;//OLD=0x10 0x14
  SYNCDELAY;

使用特权

评论回复
17
dqyubsh| | 2011-2-18 18:18 | 只看该作者
各种定义要显示说明,不要用缺省。用哪个FIFO明确说明,不用的FIFO要禁止,比如下列语句
EP2CFG = 0xA0; // 10100000,EF2激活,输出端点,bulk传输,512字节,4缓冲
EP2将占用512×4=2048字节,那么EP468中的至少一个一定要禁止,已经没有缓冲区了给它了,EP468就不能再用缺省参数。
一般用2个端点,1个out1个in,其它2个关闭。这是好习惯。

同样的理由,所有相关寄存器要明确定义,PINFLAGSAB PINFLAGSCD FIFOPINPOLAR之类的,一个不能少。。。

最后,EP2FIFOCFG最终设置为0x10,自动输出,无需CPU干预,没问题。

FIFO与AVR交互的时候,你要确定所有的控制线和状态线都正确工作了。参看手册9.2.10,图9-22~24。
给我的感觉,AVR那里没有遵循图24。大致应该这样:
if(有写事件发生)
{
     FADDR0=0, FADDR1=0,选择OUT FIFO,这里是EP2
     for(i=0; i<字节总数;i++)
     {
        if(FIFO空标志为假,不空 )
        {
               SLOE高到低
          SLRD高到低
          读取一个字节数据
          SLRD低到高,FIFO指针自动加1
               SLOE低到高,1字节读取完毕
      }
     }
}

使用特权

评论回复
18
dqyubsh| | 2011-2-18 18:23 | 只看该作者
我用过GPIF,没用过SLAVE FIFO,以上凭感觉。

使用特权

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

本版积分规则

6

主题

27

帖子

1

粉丝