yp19890718 发表于 2012-4-17 09:22:36

请教知情的朋友关于FPGA和68013 bulk OUT传输的问题

好人请加QQ谈。

大概的问题是这样的,用的是cypress 68013作USB控制器,

我用FPGA作U盘主控制器,采用SLAVE FIFO,设置EP2为OUT,设置为AUTOOUT=1时,设备只能完成初始化描述符等,不能转到EP2端口发送命令。

如果是设置为AUTOOUT=0,初始化可以在总线上看到PC发送了命令到了EP2,

问题来了,为什么AUTOOUT=1就不行?

我用异步的方式读取EP2 的FIFO,就是读不到数据,一直都FFH,为什么?会不会是PC把命令发到了EP2的缓冲区,但没有达到512B就不提交大FIFO里,导致读不到数据,还是其他原因?

希望好心人能帮忙解答,或直接发邮件给我619897225@qq.com,或加QQ619897225

wye11083 发表于 2012-4-17 09:37:23

如果是autoout,则revctl必须设为0x00,否则每来一个包都要设一个寄存器,你可以查手册。手册上说得非常清楚。

yp19890718 发表于 2012-4-17 12:05:22

wye11083 发表于 2012-4-17 09:37 static/image/common/back.gif
如果是autoout,则revctl必须设为0x00,否则每来一个包都要设一个寄存器,你可以查手册。手册上说得非常清 ...

NB的大神,非常感谢

还有一问,PC发了数据到OUT,为什么我设置的空标志没有变化?

wye11083 发表于 2012-4-17 12:18:49

空标志是自动产生的。在TD_Poll函数里,用这两个:
if(!(EP2468STAT & bmEPxEMPTY)){}

if(!(EP2468STAT & bmEPxFULL)){}
来检测EDPx是否为空/满。OUT端点检测空,IN端点检测满。当OUT端点非空,表示主机发包;当IN端点非满,表示下位机可继续写端点。

yp19890718 发表于 2012-4-17 12:30:24

wye11083 发表于 2012-4-17 12:18 static/image/common/back.gif
空标志是自动产生的。在TD_Poll函数里,用这两个:
if(!(EP2468STAT & bmEPxEMPTY)){}



这两个函数的
里面不用加其他的吗?

wye11083 发表于 2012-4-17 13:45:51

其它的是你需要什么就用什么。比如你要用自动指针,就先APTR1H = MSB( &EPxFIFOBUF );
                APTR1L = LSB( &EPxFIFOBUF );然后就可以用EXTAUTODAT1直接取数了,AUTOPTRH2 = MSB( &EPxFIFOBUF );
                AUTOPTRL2 = LSB( &EPxFIFOBUF );用EXTAUTODAT2类似。

yp19890718 发表于 2012-4-17 14:12:01

本帖最后由 yp19890718 于 2012-4-17 14:25 编辑

wye11083 发表于 2012-4-17 13:45 static/image/common/back.gif
其它的是你需要什么就用什么。比如你要用自动指针,就先APTR1H = MSB( &EPxFIFOBUF );
                APTR1L = LSB( &EP ...

目前遇到一个问题,我外部FPGA还没给RD信号,就能探测到FD出了数据。这是什么原因,是不是我禁止了SLCS,它会自动的把数据送到总线上来?还是我在

void TD_Poll(void)            // Called repeatedly while the device is idle
{
             if(!(EP2468STAT & 0X01)){}
               OUTPKTEND=0X02;

}

加了这个 OUTPKTEND=0X02?

现在的现象是:PC传数据给68013,然后FD就有了第一个字(16位)的,接着空标志没了,停止写了。

这是什么原因?

如何将OUT 端缓存里数据提交到FIFO?

很感谢你!

wye11083 发表于 2012-4-17 15:09:03

if(!(EP2468STAT & 0X01)){}
               OUTPKTEND=0X02;--这句要放在上面的大括号里。真晕,你是不是对C不太熟?
我不知道你说的停止写是什么意思,OUTPKTEND=0X02把EP2的数据送到FIFO中,然后外部每拉低一个RD,数据出去一个16/8位。只有所有的缓冲都占满数据了,且数据没有送出去,主机才写不进去。
另外,你要是用手动FIFO功能,估计会有些问题,因为你不知道什么时候一个缓冲读空了,要是用纯FIFO,就让CPU处于Bypass模式。

yp19890718 发表于 2012-4-17 15:18:29

wye11083 发表于 2012-4-17 15:09 static/image/common/back.gif
if(!(EP2468STAT & 0X01)){}
               OUTPKTEND=0X02;--这句要放在上面的大括号里。真晕,你是不 ...

笔误~

你说的Bypass是什么模式?没见过

能QQ打扰下你么。你Q多少

wye11083 发表于 2012-4-17 15:46:34

自己参考

#ifndef _SET_INTERRUPT
#define _SET_INTERRUPT

void SetEPCfg()
{
    EP1OUTCFG = 0xA0;
    SYNCDELAY;
    EP1INCFG = 0xA0;
    SYNCDELAY;
        // Disable EP4 & EP8
    EP2CFG = 0xA0;
    SYNCDELAY;
    EP4CFG = 0x20;
    SYNCDELAY;
    EP6CFG = 0xE0;
    SYNCDELAY;
    EP8CFG = 0x60;
    SYNCDELAY;
    EP6FIFOCFG = 0x0D;
    SYNCDELAY;
    EP8FIFOCFG = 0x0D;
    SYNCDELAY;
}

void ResetEndPoint()
{
    FIFORESET = 0x80;                   // NAK per tutti i pacchetti            
    SYNCDELAY;
    FIFORESET = 0x02;                   // resetta FIFO per endpoint2
    SYNCDELAY;
    FIFORESET = 0x04;                   // resetta FIFO per endpoint4
    SYNCDELAY;
    FIFORESET = 0x06;                   // resetta FIFO per endpoint8
    SYNCDELAY;
    FIFORESET = 0x08;                   // resetta FIFO per endpoint8
    SYNCDELAY;
    FIFORESET = 0x00;                   // fine del NAK-ing a tutti i pacchetti
    SYNCDELAY;

    OUTPKTEND = 0x82;
    SYNCDELAY;
    OUTPKTEND = 0x82;
    SYNCDELAY;
    OUTPKTEND = 0x82;
    SYNCDELAY;
    OUTPKTEND = 0x82;
    SYNCDELAY;
}

void EnterIOMode()
{
    CPUCS = 0x12;
    SYNCDELAY;
    REVCTL = 0x03;
    SYNCDELAY;

    IFCONFIG = 0xC8;
    SYNCDELAY;
        SetEPCfg();
    IOA = 0x88;                                                        //Set IOA = 10001000
        OEA = 0x8A;                                                 //Set OEA = 10001011
       
        // OED & OEB is disabled.
        OED = 0x00;
        OEB = 0x00;
}

void EnterAutoFIFOMode()
{
    CPUCS = 0x12;
    SYNCDELAY;
    REVCTL = 0x00;
    SYNCDELAY;

    IFCONFIG = 0xCB;
    SYNCDELAY;
        SetEPCfg();

    EP2FIFOCFG = 0x15;
    SYNCDELAY;
    EP4FIFOCFG = 0x15;
    SYNCDELAY;

    IOA = 0x88;                                                        //Set IOA = 10001000
        OEA = 0x8A;                                                 //Set OEA = 10001011
}

void EnterCPUFIFOMode()
{
    CPUCS = 0x12;
    SYNCDELAY;
    REVCTL = 0x03;
    SYNCDELAY;

    IFCONFIG = 0xCB;
    SYNCDELAY;
        SetEPCfg();

    EP2FIFOCFG = 0x05;
    SYNCDELAY;
    EP4FIFOCFG = 0x05;
    SYNCDELAY;

        ResetEndPoint();
    IOA = 0x88;                                                        //Set IOA = 10001000
        OEA = 0x8A;                                                 //Set OEA = 10001011
}

#endif

yp19890718 发表于 2012-4-17 15:52:08

wye11083 发表于 2012-4-17 15:46 static/image/common/back.gif
自己参考

#ifndef _SET_INTERRUPT


真诚的拜谢了!
页: [1]
查看完整版本: 请教知情的朋友关于FPGA和68013 bulk OUT传输的问题