Chengyu 的博客

最远,不是距离而是昨天

解决STM32使用smsc的部分USB phy(如USB3343)时无法枚举为HS的兼容问题

本教程发布于博客园,转载请先征得同意!

解决过程

在使用stm32H743+外置USB2.0高速phy(smsc USB3343)过程中,发现设备无法被枚举为hs模式,而是一直被枚举为fs。测试速度,如下:

16:24:24.672288:开始测试单片机向上位机发送数据……
16:24:25.671740:结束测试,速度约为 831.488K Byte/s

16:24:25.672746:开始测试单片机接收上位机的数据……
16:24:26.673512:结束测试,速度约为 727.04K Byte/s

可见速度确实为fs速度。使用USBlyzer软件查看,也能看到设备处于fs模式。测速方法链接

CubeMX生成项目后,检查了stm32的各种寄存器,设置都正常。示波器查看USB枚举波形,看不到高速设备的握手过程,看不到chirp K信号。自己解决不了问题,百度也找不到解决方案。。。于是谷歌了大半天,终于找到问题的原因以及解决方法。

首先自己查看H743芯片手册,找到了OTG_DCFG寄存器中,一个名为XCVRDLY的寄存器位,手册中描述如下:

直觉认为这应该就是问题关键点。到谷歌搜索,看到该链接中提到,新的smsc USB phy很多都没法在stm32上使用,还给出了列表:

Preliminary data suggests the following:

MANUF   PART            LPM?    WORKING?
ST      STULPI01        NO      YES
SMSC    USB3300         NO      YES
SMSC    USB3320         NO      YES
NXP     ISP1705         NO      YES
SMSC    USB3340         YES     NO
SMSC    USB3343         YES     NO
SMSC    USB3330         YES     NO

我使用的USB3343赫然在列!下面有人说:

I have now had confirmation from ST that there is a bug in the STM32F207 devices as I have described, which means that they can't enumerate at HS with LPM-capable PHYs. I don't know which devices the bug applies to, but I guess all STM32F2xx and F4xx families at least. I expect this will be confirmed in the Errata documents at some point, but note that it isn't yet.

这里有点担心这问题还没解决,不过该回答是2018年的,应该已经修复了。继续搜索:

该链接中提到,在赛灵思fpga上使用usb3340,修改XCVRDLY寄存器即可解决问题

该链接中说,在很多地方修改XCVRDLY也没法解决问题。这让我有点害怕。还是继续搜索看看

最终,在该链接中找到了解决问题的方法——GitHub永远是程序员的家(/≧▽≦)/

总结一下,STM32的库函数还是不够细致,像这样一个寄存器,在H7的库函数中根本没有宏定义,只能自己手动操作寄存器位。且STM32对USB phy的兼容还不够充分,需要在CubeMX生成代码基础上额外设置,才能跑通。

解决方法

链接中写到:

Solution
As mentioned, solution is to enable XCVRDLY in DCFG register. Tested and working with STM32F446 and USB3343 PHY by setting this bit in set_speed function.

也即解决问题的方法:

在stm32h7xx_ll_usb.c中,找到USB_SetDevSpeed函数,在其中修改XCVRDLY寄存器位的值为1。最终,整个函数如下:

HAL_StatusTypeDef USB_SetDevSpeed(USB_OTG_GlobalTypeDef *USBx, uint8_t speed)
{
  uint32_t USBx_BASE = (uint32_t)USBx;
  USBx_DEVICE->DCFG |= (1u << 14);
  USBx_DEVICE->DCFG |= speed;
  
  return HAL_OK;
}

编译下载到电路板,再到USBlyzer中查看,设备成功被枚举为HS:

再次测速,速度符合预期,结果如下:

09:20:01.196515:开始测试单片机向上位机发送数据……
09:20:02.196626:结束测试,速度约为 13355.008K Byte/s

09:20:02.196626:开始测试单片机接收上位机的数据……
09:20:03.196547:结束测试,速度约为 7899.136K Byte/s

大功告成了,,一半!接下来就是轻松的调参优化速度环节啦!

更新:速率已达到23MBps左右,但仍未达到预期,有大佬能告知原因么?

posted @ 2022-04-11 09:58  chengyufeng  阅读(2122)  评论(0编辑  收藏  举报

翻到了这里,不容易啊