解决STM32使用smsc的部分USBphy时无法枚举为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永远是程序员的家(/≧▽≦)/
解决方法
链接中写到:
Solution
As mentioned, solution is to enableXCVRDLY
inDCFG
register. Tested and working with STM32F446 and USB3343 PHY by setting this bit inset_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左右,但仍未达到预期,有大佬能告知原因么?
Have you LBCCed today?
以上是 解决STM32使用smsc的部分USBphy时无法枚举为HS的问题 的全部内容, 来源链接: utcz.com/z/520337.html