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
把CH132C的ULPI时钟模式从输出改为输入,即FPGA PLL生成60MHz给CH132C的CLK管脚后,问题得到了解决。
USB协议分析仪枚举成功截图祝贺
另,更新后的时钟约束为:
# CH132C
create_clock -name m_usb_clk -period 16.667 -waveform {0 8.334} [get_ports {m_usb_clkout}]
# ========= PHY输出时钟抖动 =========
# 容差0.03MHz/60MHz ~ +-0.00833ns
# Jitter ~ ?
set_clock_uncertainty -setup 0.15 [get_clocks m_usb_clk]
set_clock_uncertainty -hold 0.15 [get_clocks m_usb_clk]
# ========= 输出方向约束(Link -> PHY)=========
# STP : tSC=6.0ns tHC=0ns (ULPI Clock Output Mode)
# DATA : tSD=6.0ns tHD=0ns
# 2.5 1.0 (ULPI Clock Input Mode)
set_output_delay -clock m_usb_clk -max -2.5 -min 1.0 [get_ports {m_usb_stp_o}]
set_output_delay -clock m_usb_clk -max -2.5 -min 1.0 [get_ports {m_usb_d_io}]
# ========= 输入方向约束(PHY -> Link)=========
# DIR,NXT : tDC=(0.8ns, 6.0ns) (ULPI Clock Output Mode)
# 1.5 6.5 (ULPI Clock Input Mode)
set_input_delay -clock m_usb_clk -min 1.5 -max 6.5 [get_ports {m_usb_dir_i m_usb_nxt_i}]
# Data : tDD=(0.8ns, 8.0ns)
# 1.5 7.0
set_input_delay -clock m_usb_clk -min 1.5 -max 7.0 [get_ports {m_usb_d_io}]
评论
2026-09-23
您需要登录后才可以回复 登录 | 注册