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

68013FIFO IN端点速度问题

[复制链接]
楼主: zhuww
手机看帖
扫描二维码
随时随地手机跟帖
21
zhuww|  楼主 | 2011-11-21 12:17 | 只看该作者 回帖奖励 |倒序浏览
刚才发现一个新问题,还是上面提到的SLAVE FIFO AUTOOUT模式测试。
AVR单片机接收的数据通过串口返回从串口调试助手(通过串口助手读回USB发出去的数据)显示中发现向USB发2次不同的数据时,数据会不同步。
  比如我第一次发512个0x65(此时的开头257个数据不是65,是随机数),第二次再发512个0x65数据(这以后的数据都正常,发n次都行),第3次我发512个0x33数据,开头显示的是刚才的257个0x65数据,然后才是0x33.不知道怎么会这样的?

使用特权

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

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

使用特权

评论回复
23
zhuww|  楼主 | 2011-11-21 12:25 | 只看该作者
我用的是异步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)反应的是空状态

使用特权

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

使用特权

评论回复
25
zhuww|  楼主 | 2011-11-21 12:30 | 只看该作者
我试了一下单片机不读的情况(和上面设想的不一样,有点乱)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;

使用特权

评论回复
26
langgq| | 2011-11-21 12:33 | 只看该作者
各种定义要显示说明,不要用缺省。用哪个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字节读取完毕
      }
     }
}

使用特权

评论回复
27
langgq| | 2011-11-21 12:33 | 只看该作者
我用过GPIF,没用过SLAVE FIFO,以上凭感觉。

使用特权

评论回复
28
zhuww|  楼主 | 2011-11-21 12:35 | 只看该作者
我再看看,先结贴了

使用特权

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

本版积分规则