发新帖我要提问
12
返回列表
打印

速度很低

[复制链接]
楼主: zwll
手机看帖
扫描二维码
随时随地手机跟帖
21
yinxiangh| | 2017-11-27 18:21 | 只看该作者 回帖奖励 |倒序浏览
第一次就错了,后边的不用看。你发一次测试文件C:\Cypress\USB\Util\Test会看得更清楚。

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

使用特权

评论回复
22
yinxiangh| | 2017-11-27 18:23 | 只看该作者
我用的是异步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)反应的是空状态

使用特权

评论回复
23
yinxiangh| | 2017-11-27 18:26 | 只看该作者

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

使用特权

评论回复
24
yinxiangh| | 2017-11-27 18:27 | 只看该作者
我试了一下单片机不读的情况(和上面设想的不一样,有点乱)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;

使用特权

评论回复
25
chenjunt| | 2017-11-27 18:28 | 只看该作者
各种定义要显示说明,不要用缺省。用哪个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字节读取完毕
       }
      }
}

使用特权

评论回复
26
ousj| | 2017-11-27 18:30 | 只看该作者

我用过GPIF,没用过SLAVE FIFO,以上凭感觉。

使用特权

评论回复
27
xxmmi| | 2017-11-27 18:31 | 只看该作者
AVR单片机速度不过快,单片机的读周期是900ns的只有1.1M 是得对

使用特权

评论回复
28
zwll|  楼主 | 2017-11-27 18:34 | 只看该作者

我再看看,先结贴了

使用特权

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

本版积分规则