hiberhe
驱动牛犊
驱动牛犊
  • 注册日期2004-06-30
  • 最后登录2010-04-10
  • 粉丝0
  • 关注0
  • 积分255分
  • 威望27点
  • 贡献值0点
  • 好评度26点
  • 原创分0分
  • 专家分0分
阅读:9052回复:24

[请教]68013A遇到几个问题

楼主#
更多 发布于:2007-11-30 21:42
我使用的芯片是68013A-56,通过FPGA用同步SlaveFIFO向68013A写数据,仅使用EP2,Bulk方式传输,AutoIN,外部输入时钟,大约为40MHz。使用下来出现以下几个问题:

1.如果FPGA不判断FIFO的FullFlag,一直向68013A写数据,那么将发生68013A的FIFO溢出时,会出现PC上位机无法读取,即读取时发生超时,需要重新复位68013才能继续传输。我最先的理解是,当FPGA写入数据速度过快时,发生FIFO溢出,后写入的数据会丢失,而不是68013A无法传输数据(通过监测FullFlag标志,发现当写入FIFO过快时,FullFLag发生了混乱,再也不会为‘1’了)

2.我的FPGA程序通过判断Full标志为1时,才往FIFO中写入数据,可有时仍会出现传着传着上位机就无法读取数据,需要复位68013A的端点才能继续传输(我是通过控制端点发自定义请求,通过固件复位的EP2的端点),这让我百思不得其解,为什么会出现这种情况?通过观察,发现出现这种情况时是FullFlag一直为非满,即FIFO标志混乱了,不管FPGA怎么写,它都不再满了,而且PC却无法读取数据。

3.我最初使用16位方式,按SlaveFIFO的形式同步向68013A写数据,发生有时会有数据丢失,总是每隔4KB左右,就有一部分错的数据。后来换成了8位数据模式,除偶尔出现上位机读着读着就无法读取数据,需要复位外,没有发生数据丢失。不知道这是为什么?

4.关于Bulk的包长度,我看USB规范,说是一个Packet在Bulk是最大为512,ISO时最大为1024.那么我使用的是EP2,我在固件中,EP2CFG配置成Bulk,4x,1024,然后设置的AutoIN为1024,Dscrptr.a51也中的端点配置的MaxPacketSize也设置为1024,这要可以么?我试下来发现这样是可以传输数据的(就是偶尔出现需要重复位才能再传输数据),如果将Dscrptr.a51中设为512,必须将AUTOIN的长度也改为512才行。我想问一下,EP2CFG的512/1024,与AUTOIN的长度,以及Dscrptr.a51中的MaxPacketSize有什么关系?

我也买了几本讲68013A的书,可几乎没有一本有讲68013A与外部FPGA或CPLD以同步SlaveFIFO方式进行数据输入的例子,Cypress的示例中也没有。我也把手册基本看了,从看手册的情况,同步SlaveFIFO的时序也是非常简单的,照理说不会有错,可我在使用中却总是不正确。

不知道哪位有68013A与FPGA进行同步SlaveFIFO方式AutoIN的例子?我主要是想参考下FPGA或CPLD中的逻辑(虽然我认为这个已经很简单了),固件部分自己倒可以用各种设置都试试。

另外,如果谁有68013A与FPGA以同步SlaveFIFO方式进行AutoIN数据输入的倒子的开发板出售的话,我也可以考虑购读的。不过要求要有固件代码和SlaveFIFO方式的VHDL或VeriLog代码,上位机的软件倒无所谓,我自己可以搞定。

请各位高手帮助解答我的问题,谢谢!

如有开发板出售,请联给我发邮件。hiberhe@163.com。另外,如果没有板子,能提供相关固件和HDL代码也行,我自己有板子的。
wjt810907
驱动中牛
驱动中牛
  • 注册日期2004-08-18
  • 最后登录2011-04-16
  • 粉丝0
  • 关注0
  • 积分86分
  • 威望409点
  • 贡献值1点
  • 好评度402点
  • 原创分2分
  • 专家分0分
沙发#
发布于:2007-11-30 21:59
复杂!
mcu_boy
hiberhe
驱动牛犊
驱动牛犊
  • 注册日期2004-06-30
  • 最后登录2010-04-10
  • 粉丝0
  • 关注0
  • 积分255分
  • 威望27点
  • 贡献值0点
  • 好评度26点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-11-30 22:12
复杂?什么意思?
其实说实在的,我没想到做68013A会遇到这些问题,整个手册我都看过,从手册来看,68013A的操作是相当简单的,我也是按部就班的来做的,可实在想不通为什么会有这些问题。

想上网找个与FPGA或CPLD交互控制的SlaveFIFO的示例,居然找不到。
likee000
驱动牛犊
驱动牛犊
  • 注册日期2007-11-30
  • 最后登录2008-08-18
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望7点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-12-01 01:18
请问楼主有CY7C68013的原理图吗?图片见:http://bbs.driverdevelop.com/htm_data/9/0711/107676.html  , 我最近在搞这块板,但是没有原理图,无从下手.谢谢!  我的邮箱:
daiqiumiao@126.com
likee000
驱动牛犊
驱动牛犊
  • 注册日期2007-11-30
  • 最后登录2008-08-18
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望7点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-12-01 01:31
我找了一个它FIFO的代码,在实验室电脑里面,有空你留一个邮箱.我给你发上来.
hiberhe
驱动牛犊
驱动牛犊
  • 注册日期2004-06-30
  • 最后登录2010-04-10
  • 粉丝0
  • 关注0
  • 积分255分
  • 威望27点
  • 贡献值0点
  • 好评度26点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-12-01 13:31
我的邮箱是:hiberhe@163.com
wowow
驱动牛犊
驱动牛犊
  • 注册日期2004-08-31
  • 最后登录2010-12-29
  • 粉丝0
  • 关注0
  • 积分81分
  • 威望18点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-12-01 16:01
我用的是异步的。同步跟异步的应该差不多吧?要不你用异步的试试看?用bulk时PackageSize和AutoIn都只能设512不能设1024吧?另外你的FullFlag是高有效还是低有效?

今天刚弄的测试程序:
assign       USB_D=16'h0;            
assign       USB_nRD=1'b1;
assign       USB_nOE=1'b1;      
assign       USB_A=2'b10;
assign       PKTEND=1'b0;            // USB packet end

reg [1:0] WE_Count;//4状态机开始运转 3做WHOLD,2做WE输出,低位做状态计数
reg WEEn;

always @(posedge CLK) //25MHz
    if (WE_Count[1:0]==2'b00)
        if (FLGB) WEEn<=1'b0;//Fifo full
        else WEEn<=1'b1;    //fifo not full

always @(posedge CLK)
    WE_Count<=WE_Count+1'b1;

assign       USB_nWE=~(WE_Count[1] & WEEn);
assign       nSLCS=1'b0;            // USB select

我现在的问题是速度太慢,复位FIFO时OUT EP有问题,IN EP没有问题。
y_j_tang
驱动牛犊
驱动牛犊
  • 注册日期2007-09-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分120分
  • 威望13点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-12-01 16:35
EP2CFG的512/1024 表示每一个缓冲区的大小
AUTOIN的长度,以及Dscrptr.a51中的MaxPacketSize 是最大包的大小
最大包肯定要小于缓冲区撒
tomlih
驱动小牛
驱动小牛
  • 注册日期2003-07-16
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望64点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-12-01 17:52
本人倒是在做fx2(68013a)+fpga,方式为slave fifo bulk,autoin
现在可以正常工作,
不过速度目前只到8MBytes/s
cyundong
驱动牛犊
驱动牛犊
  • 注册日期2007-09-13
  • 最后登录2007-12-08
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望9点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-12-03 23:23
我现在也在做FPGA+EZ-FX2的开发,
我用的是异步模式,EP2作为IN端点,EP6作为OUT端点,FPGA做为控制端,现在读写都没有问题,就是速度比较慢,还没有找到原因.
写入FIFO时,判断是否非空,非空就可以写,读FIFO时,判断时否非满,只要不满就可以写
cyundong
驱动牛犊
驱动牛犊
  • 注册日期2007-09-13
  • 最后登录2007-12-08
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望9点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-12-06 16:58
我现在用同步模式的时候,也出现了你上面的问题,就是FLAG位混乱,不知道你的问题解决了吗?怎么解决的.
多谢指点.
hiberhe
驱动牛犊
驱动牛犊
  • 注册日期2004-06-30
  • 最后登录2010-04-10
  • 粉丝0
  • 关注0
  • 积分255分
  • 威望27点
  • 贡献值0点
  • 好评度26点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2007-12-07 13:18
引用第6楼wowow于2007-12-01 16:01发表的  :
我用的是异步的。同步跟异步的应该差不多吧?要不你用异步的试试看?用bulk时PackageSize和AutoIn都只能设512不能设1024吧?另外你的FullFlag是高有效还是低有效?

今天刚弄的测试程序:
assign       USB_D=16'h0;            
assign       USB_nRD=1'b1;
.......


我的FullFlag是低有效,平时是检查其是否为高的,为高则写数据。IFCLK的时钟是FPGA输出的,40MHz,需要写数据时让WR为低。让我觉得不解的时,为什么FullFlag会有时乱。我检查过时序,都能满足数据手册上的要求。

我试过异步方式的SlaveFIFO,好像没出现PC机收不到数据的情况了。不过有点奇怪的时,它对于WR的低电平时间要求好像很长,比高电平还长,否则PC收到的数据有丢。检查下来好像主要在对标志的判断,就是当判断标志为Full低(有效)的时候,要求延时较长时间。

异步的问题是速度太慢,按其最高的WR时序,50+70=120ns,只能达到16M多(16位方式),不过我试下来,整个一个WR周期要200多ns才能比较好的传输。
hiberhe
驱动牛犊
驱动牛犊
  • 注册日期2004-06-30
  • 最后登录2010-04-10
  • 粉丝0
  • 关注0
  • 积分255分
  • 威望27点
  • 贡献值0点
  • 好评度26点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2007-12-07 13:35
引用第7楼y_j_tang于2007-12-01 16:35发表的  :
EP2CFG的512/1024 表示每一个缓冲区的大小
AUTOIN的长度,以及Dscrptr.a51中的MaxPacketSize 是最大包的大小
最大包肯定要小于缓冲区撒


按理说,BULK方式,USB的最大协议上的packet是512字节(同步是1024),而MaxPacketSize是指一次USB的DataIN阶段传输的最大字节数,在2.0Bulk方式不应该大于512.但PC可以请求一个较大的数据,即PC的一个读请求其它可以通过多个packet完成。而AutoIN的大小,我理解是到这个长度了,68013A的逻辑就响应Host的Data IN请求。这样这个AutoIN的长度就是响应IN请求的长度,那么的话就可以比MaxPacketSize大或小:如果小的话,一次发的就不到IN的最大packetSize,大的话,就将一个FIFO通过多次IN完成(好像不能这样,因为PC请求一次大的数据,是以最长一次包不到MAXPacketSize,或长度足够了完成了)。

而在EP2CFG中有一个512或1024,这个是不是设置可用的缓存区大小?也就是说,这个值只是说它能提供给传输可用的最大缓冲区,MaxPacketSize不应该和AutoIN都的确是不应该大于这个值?

USB 2.0的规范我也看了些,不过本来对于传输机制觉得挺清楚的,不过针对68013A,总觉得有点不知道怎么理解。
hiberhe
驱动牛犊
驱动牛犊
  • 注册日期2004-06-30
  • 最后登录2010-04-10
  • 粉丝0
  • 关注0
  • 积分255分
  • 威望27点
  • 贡献值0点
  • 好评度26点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2007-12-07 19:13
使用的是同步方式么?
引用第8楼tomlih于2007-12-01 17:52发表的  :
本人倒是在做fx2(68013a)+fpga,方式为slave fifo bulk,autoin
现在可以正常工作,
不过速度目前只到8MBytes/s


我测试过,使用同步SlaveFIFO方式的话,速度可以达到很高的,30多M是没有问题的。不知道你使用的是不是同步方式?有没有长时间的测试过?我短时间也是可以跑很快的。可不可以参考一下相关固件设置和FPGA代码?
hiberhe
驱动牛犊
驱动牛犊
  • 注册日期2004-06-30
  • 最后登录2010-04-10
  • 粉丝0
  • 关注0
  • 积分255分
  • 威望27点
  • 贡献值0点
  • 好评度26点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2007-12-07 19:18
引用第9楼cyundong于2007-12-03 23:23发表的  :
我现在也在做FPGA+EZ-FX2的开发,
我用的是异步模式,EP2作为IN端点,EP6作为OUT端点,FPGA做为控制端,现在读写都没有问题,就是速度比较慢,还没有找到原因.
写入FIFO时,判断是否非空,非空就可以写,读FIFO时,判断时否非满,只要不满就可以写


从异步方式的时序可以看出,在异步时WR低电平最少50ns,高电平最少70ns,即120ns,那么WR的频率最高为8.3M,使用16位方式,最多为16.7M左右的速率。我也试过异步方式,不过速率没这个高,速率好像接收到的数据就有错误。
hiberhe
驱动牛犊
驱动牛犊
  • 注册日期2004-06-30
  • 最后登录2010-04-10
  • 粉丝0
  • 关注0
  • 积分255分
  • 威望27点
  • 贡献值0点
  • 好评度26点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2007-12-07 19:20
引用第10楼cyundong于2007-12-06 16:58发表的  :
我现在用同步模式的时候,也出现了你上面的问题,就是FLAG位混乱,不知道你的问题解决了吗?怎么解决的.
多谢指点.


目前还没有解决同步SlaveFIFO的问题,先用异步方式传着数据。我的邮件是:hiberhe@163.com,如果你解决了,也告知一下哦!
reanchear
驱动小牛
驱动小牛
  • 注册日期2004-06-17
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望253点
  • 贡献值0点
  • 好评度102点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2007-12-11 16:12
首先你要确认Cypress68013a的WR/RD控制信号是否配置的正确,另外还要参考端点地址的配置是否正确,另外如果选用了bulk传输那么maxpacket size就是512。不过这个长度可以改变。改变之后,.a51里面的配置也要跟这个配置一致,否则会出现问题。你最好是通过autoin的模式来传输数据。
zzusky007
驱动牛犊
驱动牛犊
  • 注册日期2007-10-25
  • 最后登录2010-06-12
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望27点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2008-04-15 16:26
这么好的贴,怎么没人继续顶啊
matom
驱动牛犊
驱动牛犊
  • 注册日期2008-07-08
  • 最后登录2008-11-18
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望15点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2008-07-22 11:17
高速同步的SLAVE FIFO模式下传输搞定没有?我现在也是有很大的困惑,好像向FIFO中写入数据都写不进去,不知道什么原因。可否给指点一下!!!
dyzix
驱动牛犊
驱动牛犊
  • 注册日期2007-10-30
  • 最后登录2008-09-04
  • 粉丝1
  • 关注0
  • 积分3分
  • 威望13点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2008-07-22 13:14
引用楼主hiberhe于2007-11-30 21:42发表的 [请教]68013A遇到几个问题 :
EP2CFG的512/1024,与AUTOIN的长度,以及Dscrptr.a51中的MaxPacketSize有什么关系?


Dscrptr.a51中的MaxPacketSize设备描述符是告诉上位机本设备的配置,而内部其作用的是EP2CFG。当向FIFO中填充够了这么长会自动发送。

就将一个FIFO通过多次IN完成(好像不能这样,因为PC请求一次大的数据,是以最长一次包不到MAXPacketSize,或长度足够了完成了)。

而在EP2CFG中有一个512或1024,这个是不是设置可用的缓存区大小?也就是说,这个值只是说它能提供给传输可用的最大缓冲区,MaxPacketSize不应该和AutoIN都的确是不应该大于这个值?


这不是设置可用缓冲区的大小,内部缓冲区总共长度就是4k,配置好了你可用都用上。如果你配置的是4*1024的话,当你填充够一个1024时会自动设置标志,上位机发动IN包时可用取走数据。如果上位机没有IN时,当然你可用继续发送,这时就填充到第二个1024中的意思。一次类推。当4个都填满时上位机依然没有要,后面的数据都被NAK掉了。

如果有相关经验,请看看我的问题:http://bbs.driverdevelop.com/htm_data/9/0807/112385.html
上一页
游客

返回顶部