问答

汇集网友智慧,解决技术难题

21ic问答首页 - 沁恒微CH132C的ULPI时序问题

时序

沁恒微CH132C的ULPI时序问题

Tipasig2026-09-22
我使用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
  • }]





  • 回答 +关注 2
    932人浏览 1人回答问题 分享 举报
    1 个回答
    • 向大家汇报一下进展。
      把CH132C的ULPI时钟模式从输出改为输入,即FPGA PLL生成60MHz给CH132C的CLK管脚后,问题得到了解决。
      USB协议分析仪枚举成功截图祝贺 131066ab397e6caa47.png

      另,更新后的时钟约束为:
      # 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}]

    您需要登录后才可以回复 登录 | 注册