在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
EETOP诚邀模拟IC相关培训讲师 创芯人才网--重磅上线啦!
查看: 5738|回复: 2

[求助] cy7c68013《ez_usb_fx2_gpif_primer》里面例子的问题?

[复制链接]
发表于 2010-4-24 20:13:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
我按照里面的GPIF的FIFO的例子
《ez_usb_fx2_gpif_primer___an1197_12.pdf》,
里面有段不明白是什么意思?
TD_Poll()
Code that handles USB OUT Transfers
if( GPIFTRIG & 0x80 ) // if GPIF interface IDLE
{   
  if ( ! ( EP24FIFOFLGS & 0x02 ) ) // if there's a packet in the peripheral domain for EP2
  {
    if ( EXTFIFONOTFULL ) // if the external FIFO is not full
    {  
      if(enum_high_speed)
      {
        SYNCDELAY;   
       GPIFTCB1 = 0x01; // setup transaction count (512 bytes/2 for word wide -> 0x0100)
        SYNCDELAY;
        GPIFTCB0 = 0x00;//为什么要设置成这样?不是应该设置成我具体发多少个Byte的吗??迷惑……
        SYNCDELAY;
      }
      else
      {
        SYNCDELAY;
        GPIFTCB1 = 0x00; // setup transaction count (64 bytes/2 for word wide -> 0x20)
        SYNCDELAY;
        GPIFTCB0 = 0x20;
        SYNCDELAY;
      }
     Setup_FLOWSTATE_Write(); // setup FLOWSTATE registers for FIFO Write operation
      SYNCDELAY;
      GPIFTRIG = GPIF_EP2;     // launch GPIF FIFO WRITE Transaction from EP2 FIFO
      SYNCDELAY;
   
      while( !( GPIFTRIG & 0x80 ) ) // poll GPIFTRIG.7 GPIF Done bit
      {
        ;
      }
      SYNCDELAY;
    }
  }
}
The first thing the OUT handling code does is it checks to see if the GPIF is IDLE. If so, it checks to see if there is at least one packet in the peripheral domain for EP2. Since EP2 is placed into auto mode, the firmware does not need to check if the host sent a USB packet. The USB packets are automatically committed to be used by the GPIF engine. Therefore, the firmware’s job is to check if at least one packet has been committed to the peripheral domain.
Then, if the external FIFO is not full, the TC value is set up for word-wide operation. The TC value is a 32-bit register field, but for this application only the lower 16-bit fields are necessary. Since each GPIF FIFO Write transaction sends 512 bytes to the external FIFO over a 16-bit interface, the number of transactions is always half the number of bytes actually contained within the endpoint buffer. The appropriate TC value is set up for either high-speed (256) or full-speed (32) operation.
The appropriate flow state registers are then set up for the FIFO Write transaction, and a write to the GPIFTRIG register with the appropriate bits triggers the transaction from EP2OUT. The code then waits for the transaction to complete before exiting out of the “if” nest.

最最迷惑的就是:不是工作在autoout方式的吗?为什么还要写代码呢?这段代码究竟是干嘛的呢?

我发现一个问题:
当我写数据到ep2的时候,如果是写512Byte,很正常,PE1没变化,再来个vendor也成功;
但是当我写10Byte的时候,我发现PE1变成低电平了,我再来个vendor就不成功了。

不知道问题出在哪里??
发表于 2010-4-30 19:35:19 | 显示全部楼层
0x0100,需要两个字节来表示
高位:GPIFTCB1 = 0x01;
低位:GPIFTCB0 = 0x00
发表于 2010-8-16 17:03:03 | 显示全部楼层
2L, 说了等于没说,毫无意义。

LZ, 最近我也遇到这样的问题,我是这样解决的,但是个人觉得不是很好,因为感觉不稳定,有待进一步的测试。

前提:WORDWIDE = 0 (即:按字节写,具体原因我下面说)

1. 首先,GPIF传输前,上位机软件(自己写)发送数据总长度。长度变量类型采用LONG,即4Bytes(这里只讨论32bit机器);
2. 固件在启动GPIF传输(具体来说,就是GPIF Write)时候,先设置TC,则可以将接收到得总长度4bytes分别赋值给GPIFTCB0~3(具体哪一个byte赋值给哪一个TC,自己固件代码决定),然后再启动GPIF Write就没有问题了。

按照上面所述,应该能解决楼主说的问题。你遇到的问题我觉得是这个芯片设计的bug,为什么会出现这个bug?个人觉得如下原因:

首先,Cypress gpif 的官方demo 中都是按照512bytes写(即256 word),但是有一个严重的问题就是,在你设置了gpif TC并且启动传输后,GPIF就会一个packet(即256 word)的形式向外传输,这个传输就是:向外发送一个word,然后TC减1,直到TC减小到0,则传输结束。那么问题来了,如果要传输10bytes呢?很明显,GPIF会永远等待,你FIFO的数据填满它需要的TC数目,但是你总共10bytes发送完了呀,怎么办???很好办?大家都等,直接表现就是GPIFTRIG.7 GPIF Done bit永远不等于1,然后EZ-USB一直在检查和等待这个bit拉高,陷入了一个悲剧的死循环。大家想想,一个CPU一直高速在做一件事情的结果是什么?对,那就是你干不了其他的事情了,因为资源耗光了。 所以当你GPIF传输的时候,只能是512的整数倍(注意:仅仅是2的整数倍,是不够的,10不就是嘛?!但还是悲剧了呀。。。)。 我想,写到这里应该能明白为什么上面的解决办法不是用word传输了吧?对,因为你要是奇数,怎么办?按照word传输,那么发送的总长度应该是它的一半,但是奇数的一半?~!@!~@所以,真是悲剧的GPIF TC啊····到现在还没有找到一个很完美的解决办法。

希望高手进来帮忙啊!顺便问下LZ,你的问题是如何解决的?分享一下吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-23 17:28 , Processed in 0.021713 second(s), 11 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表