需要帮助:USB不响应ACK

我想将我之前写的rust usb驱动 移植到sf32lb52上面:
但是目前遇到了一个问题,即USB不响应主机SETUP包,不发出ACK。
我主要参考了 bf0_hal_pcd.cusb_glue_sifli.c,并尝试进行了如下初始化。

  1. 配置系统时钟为240Mhz,USB分频为4,(我也试过DLL2)
  2. 配置PA35、PA36为Analog模式。
  3. 使能HPSYS_RCC.ENR2.USBC (HAL_RCC_EnableModule(RCC_MOD_USBC))
  4. 使能USBC中断向量
  5. 使能HPSYS_CFG.USBCR.DM_PD |DP_EN | USB_EN
  6. 使能USBC.USBCFG.AVALID | UAVALID_DR(USB_ENABLE_PHY)

IP内部的配置:

  1. 关闭Dual Buffer(dpbrxdisl = 0xFE)
  2. 打开INTRUSBE、INTRTXE等的中断使能
  3. 使能 USBC.DEVCTL.SESSION
  4. 使能 USBC.POWER.SOFTCONN

在初始化后连接USB线,使用逻辑分析仪可以看到,主机确实发送了SETUP包,但是从机没有ACK:


IP也没有产生csr0l.RxPktRdy和EP0中断。

但是IP已经正确产生RESET中断,也能产生SUSPEND中断。

由于我没有使用官方HAL层,所以极有可能是我某处的配置出现问题。请教各位大佬,我上面所描述的寄存器操作是否完整?

对于上面的初始化操作,我也尝试过进行一定的顺序调整或者禁用某条的排除法。

除此之外我还有个疑问,我看驱动层似乎sf32这个ip配置为了固定fifo大小,如果是这样,能否提供一张端点对应FIFO大小的表格?

感谢回复!

usb_hid_keyboard.elf (6.2 MB)

这是ELF文件,可以随便暂停下查看寄存器情况。我尝试和SDK里的例子对比看了看但是没看出来啥端倪,svd里没有USBC所以对比起来会麻烦点

源码是rust,若有大佬需要看的话说一下,现在还没整理……主要是对不写rust的大佬可能参考价值不大

ftab.bin (11.0 KB)

我写了个程序,读了下FIFO配置(FIFOSIZE等寄存器),请问读出来这个的是正确的FIFO大小嘛

52的fifo大小是固定的64字节

能把52里面的usbc寄存器读出来吗? 应该是某一个位置没有配置对。逻分上的数据有看到主机的reset波形吗?

sdk里面的svd没有usb的寄存器的,我读的时候也要麻烦半糖帮我 :sob: 要么打日志
确实是应该是某一个位置没有配置对 ,hpsys的寄存器以及部分usb寄存器我也对比过但是没有发现什么问题……
逻辑分析仪上能看到正常的四次RESET(从机没有ack,主机就先后reset了四次),也能正确产生对应的四次INTRUSB.RESET中断

(其中实心波形主要是SOF包以及几个无ACK的SETUP)
感谢回复!

感谢思澈工程师的帮助!
终于是跑通了,确实是时钟问题。
配置DLL时,需要先将DLL关闭,然后再配置打开。否则虽然寄存器的值改变了,但是实际上可能是是没起效的。
我在实现sifli-rs时钟配置的时候,没有注意到这一点,修复后ip就能ACK了,现在也跑通CDC ACM和HID了