搜索
bottom↓
回复: 10

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

[复制链接]

出0入0汤圆

发表于 2012-4-17 09:22:36 | 显示全部楼层 |阅读模式
好人请加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,或加QQ  619897225

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入442汤圆

发表于 2012-4-17 09:37:23 | 显示全部楼层
如果是autoout,则revctl必须设为0x00,否则每来一个包都要设一个寄存器,你可以查手册。手册上说得非常清楚。

出0入0汤圆

 楼主| 发表于 2012-4-17 12:05:22 | 显示全部楼层
wye11083 发表于 2012-4-17 09:37
如果是autoout,则revctl必须设为0x00,否则每来一个包都要设一个寄存器,你可以查手册。手册上说得非常清 ...

NB的大神,非常感谢

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

出0入442汤圆

发表于 2012-4-17 12:18:49 | 显示全部楼层
空标志是自动产生的。在TD_Poll函数里,用这两个:
if(!(EP2468STAT & bmEPxEMPTY)){}

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

出0入0汤圆

 楼主| 发表于 2012-4-17 12:30:24 | 显示全部楼层
wye11083 发表于 2012-4-17 12:18
空标志是自动产生的。在TD_Poll函数里,用这两个:
if(!(EP2468STAT & bmEPxEMPTY)){}

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

出0入442汤圆

发表于 2012-4-17 13:45:51 | 显示全部楼层
其它的是你需要什么就用什么。比如你要用自动指针,就先APTR1H = MSB( &EPxFIFOBUF );
                APTR1L = LSB( &EPxFIFOBUF );然后就可以用EXTAUTODAT1直接取数了,AUTOPTRH2 = MSB( &EPxFIFOBUF );
                AUTOPTRL2 = LSB( &EPxFIFOBUF );用EXTAUTODAT2类似。

出0入0汤圆

 楼主| 发表于 2012-4-17 14:12:01 | 显示全部楼层
本帖最后由 yp19890718 于 2012-4-17 14:25 编辑
wye11083 发表于 2012-4-17 13:45
其它的是你需要什么就用什么。比如你要用自动指针,就先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?

很感谢你!

出0入442汤圆

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

出0入0汤圆

 楼主| 发表于 2012-4-17 15:18:29 | 显示全部楼层
wye11083 发表于 2012-4-17 15:09
if(!(EP2468STAT & 0X01)){}
                 OUTPKTEND=0X02;--这句要放在上面的大括号里。真晕,你是不 ...

笔误~

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

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

出0入442汤圆

发表于 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

出0入0汤圆

 楼主| 发表于 2012-4-17 15:52:08 | 显示全部楼层
wye11083 发表于 2012-4-17 15:46
自己参考

#ifndef _SET_INTERRUPT

真诚的拜谢了!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 11:30

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表