STM32G0系列MCU外設-USB Host讀取大容量設備

前言

       目前ST的G0產品線只有STM32G0Bxx與STM32G0Cxx支持USB Host功能,在ST的的Cube庫我們可以找到對應的例程,基於ST的STM32G0C1E-EV評估板,或者用CubeMX工具生成;在給客戶支持的過程中,客戶使用CubeMX生成USB Host基本文件時發生錯誤。

問題描述:

       通過ST的官方配置工具STM32CubeMX生成USB Host基本工程時,主機無法正常啟動,配置過程如下:

       將使能USB外設,選擇Host_Only(FS),選擇默認配置。



此處只為生成基本的USB Host讀取大容量設備代碼,FATFS可不用添加。



在中斷向量表中使能USB中斷,不打開USB無法工作;配置完畢後生成代碼。



       配置完畢,打開工程文件,可以看到While主循環中只有MX_USB_HOST_Process();USB Host將在這個處理函數中完成主機啟動設備,設備連接,設備枚舉,類初始化和類相關命令的發送等,當然也可以在這裡面加入你的應用代碼。




參考 UM1720,編譯運行生成的Code,在工程中,可以通過重定向printf(),來列印Log信息,前提是你配置了USART外設。



  通過列印的Log文件,我們可以清楚的看到程序的運行步驟,配合ST的用戶手冊UM1720的狀態機流程圖,可以很明顯的看出程序卡在了USB主機向設備發送數據的過程中,接下來我們跟蹤一下代碼,看看問題具體出現在什麼地方。

程序跑到USBH_MSC_Process(),獲取scsi_status =0x01 (USBH_BUSY)



進入到USBH_MSC_SCSI_Inquiry()函數內部,error = 0x01 (USBH_BUSY).

在 USBH_MSC_BOT_Process()中,URB_Status = 0x04 (USBH_URB_ERROR)

代碼在GetURBState()的時候出了問題。


       USB請求塊(USB request block,URB)是USB設備驅動中用來描述與USB設備通信所用的基本載體和核心數據結構,與網絡設備驅動中的sk_buff結構體類似,是USB主機與設備之間傳輸數據的封裝。

解決方法

       在usbh_ctlreq.c文件的第561行將

   ep_descriptor->wMaxPacketSize |= USBH_MAX_EP_PACKET_SIZE;

修改成:

   ep_descriptor->wMaxPacketSize |= MIN((uint16_t)(LE16(buf + 4) & 0x7FFU), (uint16_t)USBH_MAX_DATA_BUFFER);

修改後重新編譯一下代碼下載到板子。



然後用串口看看Log,通過CubeMX配置的USB Host MSC代碼能正常跑通了。



總結:

       通過STM32CubeMX配置G0產品USB Host代碼時,需要在usbh_ctlreq.c文件中添加代碼,USB Host才能正常工作。

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論