rtthread usb未识别和插拔出错

rtthread usb未识别和插拔出错

问题描述

rtthread usb驱动某些U盘只能读出大小,文件系统挂在不成功,多插拔几次后不能识别u盘。

解决方案

  1. 上电不能识别

fatfs文件系统还没注册已进入usb中断

int elm_init(void)
{
	dfs_register(&dfs_elm);
}
//INIT_COMPONENT_EXPORT(elm_init);
INIT_PREV_EXPORT(elm_init);
  1. 热插入不能识别

能读u盘大小但是挂载失败。具体原因不明,望告知。但可以通过修改代码成功挂载u盘。代码在后面

  1. 多次插拔出错

connect_status状态问题。情况2和3修改代码如下:

static int drv_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes, int timeouts)
{
   int timeout = timeouts;	
   rt_err_t ret = RT_EOK;

   while (1)
   {
       if (!connect_status)
       {
           return -1;
       }
   	int times = 10;
   	while(times > 0)
   	{
   		times--;
   		rt_completion_init(&urb_completion);
   		HAL_HCD_HC_SubmitRequest(&stm32_hhcd_fs,
   								 pipe->pipe_index,
   								 (pipe->ep.bEndpointAddress & 0x80) >> 7,
   								 pipe->ep.bmAttributes,
   								 token,
   								 buffer,
   								 nbytes,
   								 0);
   		ret = rt_completion_wait(&urb_completion, timeout);
   		if(RT_EOK == ret)
   			break;
   		else
   			RT_DEBUG_LOG(RT_DEBUG_USB, ("rt_completion_wait = %d\n", ret));
   	}			
   	if(ret)
   	{						
   		connect_status = RT_FALSE;
   		return -RT_ETIMEOUT;
   	}
       rt_thread_mdelay(1); 

需要在 usb_common.h中修改USB_TIMEOUT_LONG时间

/*
 * Time of usb timeout
 */
#ifndef USB_TIMEOUT_BASIC
#define USB_TIMEOUT_BASIC               (RT_TICK_PER_SECOND)        /* 1s */
#endif
#ifndef USB_TIMEOUT_LONG
#define USB_TIMEOUT_LONG                (RT_TICK_PER_SECOND)    /* 1s */
#endif
#ifndef USB_DEBOUNCE_TIME
#define USB_DEBOUNCE_TIME               (RT_TICK_PER_SECOND / 5)    /* 0.2s */
#endif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值