USB

10 USB HOST应用程序在drv_pipe_xfer函数里循环

发布于 2020-07-13 11:36:29    浏览:655

我用正点原子的探索者开发板根据官网教程STM32 上使用 USB Host 读写 U 盘将USB驱动程序通过ENV移植到rt-threadbspstm32stm32f407-atk-explorer这个工程里。硬件上应该没问题了。U盘插到开发板上后,串口调试界面没反应。一步一步调试发现程序会在drv_pipe_xfer函数里WHILE(1)一直循环。

如下是我程序上的设置

//stm32f4xx_hal_msp.c的硬件设置    
void HAL_HCD_MspInit(HCD_HandleTypeDef* hhcd)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(hhcd->Instance==USB_OTG_FS)
  {
  /* USER CODE BEGIN USB_OTG_FS_MspInit 0 */

  /* USER CODE END USB_OTG_FS_MspInit 0 */
  
    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**USB_OTG_FS GPIO Configuration    
    PA11     ------> USB_OTG_FS_DM
    PA12     ------> USB_OTG_FS_DP 
    */
    GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* Peripheral clock enable */
    __HAL_RCC_USB_OTG_FS_CLK_ENABLE();
    /* USB_OTG_FS interrupt Init */
    HAL_NVIC_SetPriority(OTG_FS_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(OTG_FS_IRQn);
  /* USER CODE BEGIN USB_OTG_FS_MspInit 1 */

  /* USER CODE END USB_OTG_FS_MspInit 1 */
  }

}

查看更多

Jone
Jone 2020-07-13
This guy hasn't written anything yet

看下是不是注释这里的问题,根据注释自行修改,如果不是这个这导致的我也帮不了你了

int rt_usb_hcd_pipe_xfer(uhcd_t hcd, upipe_t pipe, void* buffer, int nbytes, int timeout)
{
    rt_size_t remain_size;
    rt_size_t send_size;
    remain_size = nbytes;
    rt_uint8_t * pbuffer = (rt_uint8_t *)buffer;
    do
    {
        RT_DEBUG_LOG(RT_DEBUG_USB,("pipe transform remain size,: %d\n", remain_size));
        send_size = (remain_size > pipe->ep.wMaxPacketSize) ? pipe->ep.wMaxPacketSize : remain_size;
        if(hcd->ops->pipe_xfer(pipe, USBH_PID_DATA, pbuffer, send_size, timeout) == send_size)    //返回值可能大于零但不等于send_size,需要将返回值累加和与send_size比较大小
        {
            remain_size -= send_size;
            pbuffer += send_size;
        }
        else
        {
            return 0;
        }
    }while(remain_size > 0);
    return nbytes;
}
6 个回答
bernard
bernard 2020-07-13
This guy hasn't written anything yet

这个只是初始化的设置,其他的呢?

DQXG_3150
DQXG_3150 2020-07-13
This guy hasn't written anything yet

project.png

MG_ML
MG_ML 2020-08-13
This guy hasn't written anything yet

请问一下我现在用USB+host驱动EC20模块,但在枚举设备全部配置描述符时,读取两包(128bytes/209bytes)数据后,就进入NAK状态,一直卡死在那,请问这种情况怎么解决呢?

zxiang
zxiang 2021-01-25
This guy hasn't written anything yet

楼主你好,请问你解决这个问题了吗
我在HAL_Delay内部补上rt_thread_mdelay,却进入了hardfault,请问你有没有遇到这个问题

出出啊
出出啊 2021-06-11
This guy hasn't written anything yet

奇迹发生了,现在3.0的读卡器不行,2.0的读卡器和U盘可以。修改 drv_common.c HAL_Delay 函数。添加代码

if (rt_thread_self())
    {
        rt_thread_mdelay(Delay);
    }
    else
    {
        for (rt_uint32_t count = 0; count < Delay; count++)
        {
            rt_hw_us_delay(1000);
        }
    }

或者用 4.0.3 的源码。

接下来的问题就是,怎么在应用层发现U盘挂载了,以及挂载路径是哪个?

撰写答案

请登录后再发布答案,点击登录
关注者
0
被浏览
655

发布
问题

分享
好友

手机
浏览

扫码手机浏览