解決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左右,但仍未達到預期,有大佬能告知原因么?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM