解決過程 在使用stm32H743+外置USB2.0高速phy(smsc USB3343)過程中,發現設備無法被枚舉為hs模式,而是一直被枚舉為fs。測試速度,如下: 16:24:24.672288:開始測試單片機向上位機發送數據…… 16:24:25.671740:結束測試,速度約為 831.48 ...
解決過程
在使用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 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?