@我使用CYUSB3KIT-003 EZ-USB FX3 TM开发板,下载了USBMassStorageDemo固件,SuperSpeed枚举都是正常的,为了验证HighSpeed的枚举情况,我用了一根2.0的线材进行测试,测试了很多主机,枚举结果都是正常的,只有一款主机的其中一个接口(一台电视机中的一个USB3.0接口)枚举失败了,而这个主机接口我用别的U盘或移动硬盘都是枚举正常的,并且从捉包工具和读取文件的速度确认是高速枚举正常。
下图是枚举失败时我捉包工具的截图,从图中来看是红圈中缺少一个ACK包,也就是FX3在这个地方没有返回ACK包,从而引起了主机枚举失败。
下图是我用一个普通U盘的在同一个主机接口的枚举截图,该截图枚举结果是正常的:
我现在是怀疑官方的底层代码还是有一些兼容性的BUG。
另外补充一下,如果我在代码中做了很小的修改,就是通过增加CyU3PUsbForceFullSpeed (CyTrue);强制为FULL SPEED的话,枚举就正常了。yycazheng.rong.14_2919396yliu
已解决! 转到解答。
Hi Xu weifeng,
不好意思,上周工作较忙,没有及时回复你的问题。
- 看到你说在固件里增加了CyU3PUsbForceFullSpeed (CyTrue),
另外补充一下,如果我在代码中做了很小的修改,就是通过增加CyU3PUsbForceFullSpeed (CyTrue);强制为FULL SPEED的话,枚举就正常了
那么你做了如上修改后,是否FX3就可以枚举为USB2.0设备?
2. 如我前面所述,
4. 你截图所示的USB抓包软件我没有用过,你能解释下对应到没有ACK的那次USB transfer是什么吗?
我的意思是:你截图的软件我并没有用过,对它的排版不了解,我不能明白你所指的ACK是属于哪一次transfer/transaction的。是属于前面的get_dscr的transfer/transactiion?
例如下面的USB trace,展开的是一次host获取device 描述符的transfer,
3. FX3 是经过了USB协会兼容性认证的产品,所以在USB兼容性方面,目前是有认证的。
综上,如果需要进一步定位问题,需要你那边提供下USB协议分析仪获取的trace信息。对于你截图的软件,我目前没有更多的建议。
Hi xuweifeng,
请把你测试的工程发出来,我们这边测试下。
xu weifeng 撰写:
只有一款电视机的一个USB3.0接口才出现这种2.0高速枚举失败的情况,该电视机还有一个USB2.0接口也能正常枚举
你是说Fx3的开发板,同样的Mass storage 的固件,在这个电视的USB3.0接口上2.0枚举失败,而在这个电视的另一个USB2.0的接口上则是可以正常枚举的?是这个意思吗?
是的,是您说的这样的,但千万不要理解成这台电视机的这个USB3.0接口有问题,因为我用普通的2.0U盘、3.0移动硬盘、2.0读卡器等,去验证这个接口,都能正常枚举,而且我也用仪器去分析,确定都是2.0高速枚举OK。
yyca您好:能帮忙再分析一下我的这个问题吗,这个问题还没解决,这个问题又必须得解决,已经困扰了我好长时间。
或者说有没有别的渠道可以获取到Cypress直接的技术支持。
谢谢了。
Hi xu weifeng,
前面问题中你提到,Fx3在你的电视的USB的接口上会枚举失败,我想问下。
1. 如果枚举失败,电视端是否有类似Windows的设别管理器或者Linux的/dev 可以查看设备挂载?
2. 如果不烧录固件,bootloader启动的话,是否可以正常枚举为USB2.0的设备?
3. 如果step2 可以正常枚举为USB2.0,那么将固件中USB2.0设备描述符的bcdClass从USB2.1 改为USB2.0是否会不一样?
4. 你截图所示的USB抓包软件我没有用过,你能解释下对应到没有ACK的那次USB transfer是什么吗?
期待你的测试和回复。
Hello yyca, 感谢您的回复,我一直在期待您的答复,因为我实在不知道还能找谁来技术支持我。
1、是一台成品电视机,应该是安卓系统,没有类似设备管理器,也看不到/dev目录。
2、如果不烧录固件,bootload启动的话,也枚举不了,捉包工具捉到的信息与下载USBMassStorageDemo相似,也是FX3返回设备描述符后,主机返回应答,然后FX3不返回ACK,如下图:
3、我试过把描述符2.1改为2.0也不行。
4、那是USB数据传输的标准协议,我稍后找到相关协议再附上来。
“4. 你截图所示的USB抓包软件我没有用过,你能解释下对应到没有ACK的那次USB transfer是什么吗?”
关于这个问题我补充如下:
1.按照USB标准规定,设备刚插入主机的时候,USB主机会通过控制传输(Control Tranfer)读取设备描述符,控制传输包含三个阶段:
1) 建立阶段(Setup)
2) 数据阶段(无数据控制没有此阶段)(DATA)
3) 状态阶段(Status)
2. 出问题的地方属于控制传输的状态阶段,由于是读设备描述符,因此这里HOST返回给DEVICE的状态,分解到包层面的话,HOST返回数据给DEVICE,需要DEVICE返回ACK包。
具体你可以参考USB标准文档,我是参考下面链接中的文章分析的:
Hi Xu weifeng,
不好意思,上周工作较忙,没有及时回复你的问题。
- 看到你说在固件里增加了CyU3PUsbForceFullSpeed (CyTrue),
另外补充一下,如果我在代码中做了很小的修改,就是通过增加CyU3PUsbForceFullSpeed (CyTrue);强制为FULL SPEED的话,枚举就正常了
那么你做了如上修改后,是否FX3就可以枚举为USB2.0设备?
2. 如我前面所述,
4. 你截图所示的USB抓包软件我没有用过,你能解释下对应到没有ACK的那次USB transfer是什么吗?
我的意思是:你截图的软件我并没有用过,对它的排版不了解,我不能明白你所指的ACK是属于哪一次transfer/transaction的。是属于前面的get_dscr的transfer/transactiion?
例如下面的USB trace,展开的是一次host获取device 描述符的transfer,
3. FX3 是经过了USB协会兼容性认证的产品,所以在USB兼容性方面,目前是有认证的。
综上,如果需要进一步定位问题,需要你那边提供下USB协议分析仪获取的trace信息。对于你截图的软件,我目前没有更多的建议。
用FX3的BOOTLOAD固件去枚举我之前没有尝试过,但今天尝试了,发现跟USBMassStorageDemo的情况是一样的,除了FX3返回的设备描述符内容不一样外,其它都一样。我把BOOTLOAD固件的开发板插到这台电视机的另一个USB2.0接口上,枚举就成功了,如下图:
那么从这个现象来看就不是固件程序的问题了,好像是属于电气性能或者时序性能不兼容的问题,或者说最底层寄存器级别的固件问题。
如果是这样的话,有没有可能解决呢,我能不能把东西(一块电视主板和一个电源适配器)寄给你去帮我分析一下呢?