21ic问答首页 - 沁恒微CH132C的ULPI时序问题
沁恒微CH132C的ULPI时序问题
我使用FPGA实现一个USB 2.0高速设备控制器逻辑,如果USB PHY芯片使用USB3343,则功能一切正常(高速握手,枚举,Bulk通信);但切换到沁恒微的CH132C之后,枚举总是失败。
请各路大神提供解决问题思路,有认识沁恒微技术支持的朋友也麻烦给我支个招。
使用USB协议分析仪捕获如下,详见附图:
1. 高速握手正常,说明Device向USB PHY芯片能正常写入FUNC_CTRL寄存器;
2. 获取设备描述符总是失败在SETUP事务里,Host下发SETUP和DATA0包正常,但Device没有回复ACK包;
3. 在FPGA加ILA观测ulpi_dir_i, ulpi_nxt_i为何Device没收到SETUP或DATA0包,这时设备描述符的获取又能变正常,但获取其它描述符还是有类似问题,包括再次获取设备描述符也可能失败。
怀疑是ULPI时序问题。
1. CH132C使用输出ULPI时钟模式,即XI输入12MHz,CLK输出60MHz给FPGA;
FPGA对该时钟也加了BUFG;
时序报告也没有违例。
2. 比较CH132C和USB3343手册,PHY芯片输出方向(USB OUT方向)的DIR,NXT的输出延迟tDC,以及Data的输出延迟tDD,两个芯片有稍许差异,CH132C的tDC是min=0.8ns, max=6.0ns; tDD是min=0.8ns, max=8.0ns;而USB3343的tDC和tDD都是min=1.5ns,max=6.0ns。
3. 于是综合FPGA时再加如下时序约束,但问题还是没有根本解决。
#PHY->Link方向 加set_input_delay
# Control lines Output Delay: tDC=(0.8ns, 6.0ns)
set_input_delay -clock usb_clk -max 6.0 [get_ports {ulpi_dir_i ulpi_nxt_i}]
set_input_delay -clock usb_clk -min 0.8 [get_ports {ulpi_dir_i ulpi_nxt_i}]
# Data lines Output Delay: tDD=(0.8ns, 8.0ns)
set_input_delay -clock usb_clk -max 8.0 [get_ports {ulpi_data_io}]
set_input_delay -clock usb_clk -min 0.8 [get_ports {ulpi_data_io }]
#PHY<-Link方向 加set_output_delay
# STP:tSC=6.0ns tHC=0ns
set_output_delay -clock usb_clk -max -6.0 [get_ports {ulpi_stp_o}]
set_output_delay -clock usb_clk -min 0.0 [get_ports {ulpi_stp_o}]
# DATA:tSD=6.0ns tHD=0ns
set_output_delay -clock usb_clk -max -6.0 [get_ports {ulpi_data_io }]
set_output_delay -clock usb_clk -min 0.0 [get_ports {ulpi_data_io }]

请各路大神提供解决问题思路,有认识沁恒微技术支持的朋友也麻烦给我支个招。
使用USB协议分析仪捕获如下,详见附图:
1. 高速握手正常,说明Device向USB PHY芯片能正常写入FUNC_CTRL寄存器;
2. 获取设备描述符总是失败在SETUP事务里,Host下发SETUP和DATA0包正常,但Device没有回复ACK包;
3. 在FPGA加ILA观测ulpi_dir_i, ulpi_nxt_i为何Device没收到SETUP或DATA0包,这时设备描述符的获取又能变正常,但获取其它描述符还是有类似问题,包括再次获取设备描述符也可能失败。
怀疑是ULPI时序问题。
1. CH132C使用输出ULPI时钟模式,即XI输入12MHz,CLK输出60MHz给FPGA;
FPGA对该时钟也加了BUFG;
时序报告也没有违例。
2. 比较CH132C和USB3343手册,PHY芯片输出方向(USB OUT方向)的DIR,NXT的输出延迟tDC,以及Data的输出延迟tDD,两个芯片有稍许差异,CH132C的tDC是min=0.8ns, max=6.0ns; tDD是min=0.8ns, max=8.0ns;而USB3343的tDC和tDD都是min=1.5ns,max=6.0ns。
3. 于是综合FPGA时再加如下时序约束,但问题还是没有根本解决。
#PHY->Link方向 加set_input_delay
# Control lines Output Delay: tDC=(0.8ns, 6.0ns)
set_input_delay -clock usb_clk -max 6.0 [get_ports {ulpi_dir_i ulpi_nxt_i}]
set_input_delay -clock usb_clk -min 0.8 [get_ports {ulpi_dir_i ulpi_nxt_i}]
# Data lines Output Delay: tDD=(0.8ns, 8.0ns)
set_input_delay -clock usb_clk -max 8.0 [get_ports {ulpi_data_io
set_input_delay -clock usb_clk -min 0.8 [get_ports {ulpi_data_io
#PHY<-Link方向 加set_output_delay
# STP:tSC=6.0ns tHC=0ns
set_output_delay -clock usb_clk -max -6.0 [get_ports {ulpi_stp_o}]
set_output_delay -clock usb_clk -min 0.0 [get_ports {ulpi_stp_o}]
# DATA:tSD=6.0ns tHD=0ns
set_output_delay -clock usb_clk -max -6.0 [get_ports {ulpi_data_io
set_output_delay -clock usb_clk -min 0.0 [get_ports {ulpi_data_io

问答
赞0
登录/注册后可看大图
USB协议分析仪使用集锦之三:克隆一个USB Sniffer
登录/注册后可看大图
参考对象位于https://github.com/ataradov/usb-sniffer.git,这是一个用Cypress FX2 MCU实现的USB高速设备,USB捕捉功能用Lattice CPLD加Microchip USB PHY芯片实现。
现在用一颗低成本的国产FPGA加USB PHY芯片,来代替Cypress MCU和Lattice CPLD。FPGA用全数字电路实现USB设备控制器、USB标准传输和厂商传输、以及CPLD中的USB捕捉功能,不再需要MCU及其固件。
登录/注册后可看大图
登录/注册后可看大图
1. 克隆第一步,获取该设备的各种USB描述符。
usb-sniffer.git的固件是开源的,其USB描述符可以从源码里扒出来。但这里使用USB协议分析仪抓取枚举过程来获取其USB描述符,这种方法更有普适性以克隆任何USB 2.0设备。图1是抓取的USB Sniffer的枚举过程:
这是一个USB高速(HS)设备,共有8个USB描述符:
* 设备描述符 (USB Device Descriptor)
* 配置描述符 (USB Configuration Descriptor)
* BOS描述符 (Binary Device Object Store Descriptor)
* 微软OS描述符集 (Microsoft OS Descriptor Set)
* 4个字符串描述符 (Language ID, Manufacture, Product, Serial Number)
其中BOS描述符和微软OS描述符集是在Windows操作系统上实现免驱的关键。
登录/注册后可看大图
1.1 复制USB设备描述符。
如图2所示,在"USB概览"和"字段细节"视图里选中"GetDescriptor (Device)";
在"原始数据"视图里右击鼠标,并选中"Copy as Hex Array",
即在系统剪贴板里复制了USB设备描述符:
相关问题
本周活跃用户
问答专家
tyw
325个答案
xch
322个答案
天意无罪
288个答案
dffzh
263个答案
jjjyufan
218个答案
coody
210个答案
LcwSwust
172个答案
地瓜patch
159个答案
本站介绍 合作联络 欢迎投稿 隐私声明 广告业务 网站地图 联系我们 诚聘英才
21IC电子网 2000- 版权所有
京ICP备11013301号
京公网安备 11010802024343号