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次,发文人进小黑屋喔~

评论