请教知情的朋友关于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 如果是autoout,则revctl必须设为0x00,否则每来一个包都要设一个寄存器,你可以查手册。手册上说得非常清楚。 wye11083 发表于 2012-4-17 09:37 static/image/common/back.gif
如果是autoout,则revctl必须设为0x00,否则每来一个包都要设一个寄存器,你可以查手册。手册上说得非常清 ...
NB的大神,非常感谢
还有一问,PC发了数据到OUT,为什么我设置的空标志没有变化? 空标志是自动产生的。在TD_Poll函数里,用这两个:
if(!(EP2468STAT & bmEPxEMPTY)){}
和
if(!(EP2468STAT & bmEPxFULL)){}
来检测EDPx是否为空/满。OUT端点检测空,IN端点检测满。当OUT端点非空,表示主机发包;当IN端点非满,表示下位机可继续写端点。 wye11083 发表于 2012-4-17 12:18 static/image/common/back.gif
空标志是自动产生的。在TD_Poll函数里,用这两个:
if(!(EP2468STAT & bmEPxEMPTY)){}
和
这两个函数的
里面不用加其他的吗? 其它的是你需要什么就用什么。比如你要用自动指针,就先APTR1H = MSB( &EPxFIFOBUF );
APTR1L = LSB( &EPxFIFOBUF );然后就可以用EXTAUTODAT1直接取数了,AUTOPTRH2 = MSB( &EPxFIFOBUF );
AUTOPTRL2 = LSB( &EPxFIFOBUF );用EXTAUTODAT2类似。 本帖最后由 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?
很感谢你!
if(!(EP2468STAT & 0X01)){}
OUTPKTEND=0X02;--这句要放在上面的大括号里。真晕,你是不是对C不太熟?
我不知道你说的停止写是什么意思,OUTPKTEND=0X02把EP2的数据送到FIFO中,然后外部每拉低一个RD,数据出去一个16/8位。只有所有的缓冲都占满数据了,且数据没有送出去,主机才写不进去。
另外,你要是用手动FIFO功能,估计会有些问题,因为你不知道什么时候一个缓冲读空了,要是用纯FIFO,就让CPU处于Bypass模式。 wye11083 发表于 2012-4-17 15:09 static/image/common/back.gif
if(!(EP2468STAT & 0X01)){}
OUTPKTEND=0X02;--这句要放在上面的大括号里。真晕,你是不 ...
笔误~
你说的Bypass是什么模式?没见过
能QQ打扰下你么。你Q多少 自己参考
#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
wye11083 发表于 2012-4-17 15:46 static/image/common/back.gif
自己参考
#ifndef _SET_INTERRUPT
真诚的拜谢了!
页:
[1]