OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 14080|回复: 7

STM32F1的USB HOST,使用v2.10的USB库,总是停在URB_IDLE状态

[复制链接]

16

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2014-10-11
在线时间
0 小时
发表于 2014-12-30 10:05:35 | 显示全部楼层 |阅读模式
5金钱
我用的107作为host,直接在官网例程MSC改的,接的设备是打印机类的,目前枚举没问题,进入具体的主机类后,总是停在URB_IDLE状态 
具体如下: 
    case USBH_PRN_DECODE_CSW: 
      URB_Status = HCD_GetURB_State(pdev , PRN_Machine.hc_num_in);  //不断循环执行这步,URB_Status始终为0 
      /* Decode CSW */ 
      if(URB_Status == URB_DONE) 
      { 
        PRN_BOTStallErrorCount = 0; 
        USBH_PRN_BOTXferParam.PRNBOTStateBkp = USBH_PRN_RECEIVE_CSW_STATE; 
         
        USBH_PRN_BOTXferParam.PRNState = USBH_PRN_BOTXferParam.PRNStateCurrent ; 
         
        USBH_PRN_BOTXferParam.PRNBOTXferStatus = USBH_PRN_DecodeCSW(pdev , phost); 
      } 
      else if(URB_Status == URB_STALL)      
      { 
        error_direction = USBH_PRN_DIR_IN; 
        USBH_PRN_BOTXferParam.PRNBOTState  = USBH_PRN_BOT_ERROR_IN; 
      } 
      break; 

此处URB_Status始终为0,即处于URB_IDLE 

请问哪位知道大概是什么问题么,真是一点头绪都没了

最佳答案

查看完整内容[请看2#楼]

本来不想回复了问题解决了就行了 但是看到最近还有人在问这个问题 我想还是回复下帮助广大嵌入式人员 本人解决办法: 本来改库是一件让人觉得不可取的事,但是没办法 ST库虽好用但是BUG确实不少,回到主题 看代码: case CTRL_SETUP: /* send a SETUP packet */ USBH_CtlSendSetup (pdev, phost->Control.setup.d8 , phost->Control.hc_num_out); ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2017-10-21
在线时间
0 小时
发表于 2014-12-30 10:05:36 | 显示全部楼层
本来不想回复了问题解决了就行了 但是看到最近还有人在问这个问题 我想还是回复下帮助广大嵌入式人员
本人解决办法:

   本来改库是一件让人觉得不可取的事,但是没办法 ST库虽好用但是BUG确实不少,回到主题

看代码:

  case CTRL_SETUP:
    /* send a SETUP packet */
    USBH_CtlSendSetup     (pdev,
                           phost->Control.setup.d8 ,
                           phost->Control.hc_num_out);  
    phost->Control.state = CTRL_SETUP_WAIT;  
    break;
   
  case CTRL_SETUP_WAIT:
   
    URB_Status = HCD_GetURB_State(pdev , phost->Control.hc_num_out);
    /* case SETUP packet sent successfully */
    if(URB_Status == URB_DONE)
    {
      direction = (phost->Control.setup.b.bmRequestType & USB_REQ_DIR_MASK);
      
      /* check if there is a data stage */
      if (phost->Control.setup.b.wLength.w != 0 )
      {        
        timeout = DATA_STAGE_TIMEOUT;
        if (direction == USB_D2H)
        {
          /* Data Direction is IN */
          phost->Control.state = CTRL_DATA_IN;
        }
        else
        {
          /* Data Direction is OUT */
          phost->Control.state = CTRL_DATA_OUT;
        }
      }
      /* No DATA stage */
      else
      {
        timeout = NODATA_STAGE_TIMEOUT;
        
        /* If there is No Data Transfer Stage */
        if (direction == USB_D2H)
        {
          /* Data Direction is IN */
          phost->Control.state = CTRL_STATUS_OUT;
        }
        else
        {
          /* Data Direction is OUT */
          phost->Control.state = CTRL_STATUS_IN;
        }
      }         
      /* Set the delay timer to enable timeout for data stage completion */
      phost->Control.timer = HCD_GetCurrentFrame(pdev);
    }
    else if(URB_Status == URB_ERROR)
    {
      phost->Control.state = CTRL_ERROR;     
      phost->Control.status = CTRL_XACTERR;
    }
break;
。。。。。。。。。

看看   在   case CTRL_SETUP:    中有这句
phost->Control.state = CTRL_SETUP_WAIT;
程序下次进来就直接到:case CTRL_SETUP_WAIT:中去了
可是万万没想到
URB_Status = HCD_GetURB_State(pdev , phost->Control.hc_num_out);

URB_Status的值居然还会有:URB_IDLE但是 这里只有:
if(URB_Status == URB_DONE)
{
。。。。。。。。。。。。
}
else if(URB_Status == URB_ERROR)
{
。。。。。
}
只要状态是URB_IDLE 就出现了死等;就其原因我们跟踪
  case CTRL_SETUP_WAIT:中的
   
    URB_Status = HCD_GetURB_State(pdev , phost->Control.hc_num_out);
发现是在
URB_STATE HCD_GetURB_State (USB_OTG_CORE_HANDLE *pdev , uint8_t ch_num)
{
  return pdev->host.URB_State[ch_num] ;
}这里获取状态然而这个状态 的改变估计是usb host 中断里处理的 估计是接收超时中断处理就给它赋值了个URB_IDLE
所以看看库里的
  case CTRL_SETUP:
    /* send a SETUP packet */
    USBH_CtlSendSetup     (pdev,
                           phost->Control.setup.d8 ,
                           phost->Control.hc_num_out);  
    phost->Control.state = CTRL_SETUP_WAIT;  
          USB_OTG_BSP_mDelay(50);
    break;
这里在发数据 估计这里是发送后要么usb device没收到 没响应 要么是回复了 结果我们的host 在哪里处理的时候给把状态清掉了  没收到 所以两边估计都在等但是我在想usb 作为master 必须主动传输所以这时候我们必须让host 再次发一次数据试试  
就在  case CTRL_SETUP_WAIT:
后面加了 如下代码
   else if(URB_Status==URB_IDLE)//modify by ÕÅĬ
{
       phost->Control.state = CTRL_SETUP;
}
让它在回去再发一次。。。。。可是万万没想到啊  这个再次发送居然还没起效  还是不行。。。。。。
估计是不是发送了马上获取在 wait中获取状态 是不是单片机会在获取状态之后把状态给清了  所以一不做二不休 在发送完数据之后给加个延时
所以就成这样了
          case CTRL_SETUP:
    /* send a SETUP packet */
    USBH_CtlSendSetup     (pdev,
                           phost->Control.setup.d8 ,
                           phost->Control.hc_num_out);  
    phost->Control.state = CTRL_SETUP_WAIT;  
          USB_OTG_BSP_mDelay(50);   //这是我自己加的
break;        
再次编译运行 居然优盘认出来了   皆大欢喜  
但是这修改的两处去掉一处 都不行 所以都保留着
这个办法 虽不可取  但是我坚定的认为这是 st库的bug 所以坚决的改了
以上是我的处理办法  本人接触单片机已 10年左右 喜欢交朋友 如果有愿意交行业朋友的可以加我qq2656045050 加我 我们互相交流 传输经验
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-12-30 22:53:53 | 显示全部楼层
只能说官方的例程能用,但是bug也不少,只能慢慢琢磨了,呵呵
参考下我们的F4的例程解决办法吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

4

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2016-12-15
在线时间
5 小时
发表于 2017-8-12 10:23:57 | 显示全部楼层
楼主,你的问题解决没,我也遇到这个问题了
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2018-3-16
在线时间
0 小时
发表于 2018-3-26 19:47:25 | 显示全部楼层
感谢楼主
回复

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2019-7-15
在线时间
3 小时
发表于 2020-3-1 14:51:18 | 显示全部楼层
谢谢分享!!!
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2018-5-11
在线时间
5 小时
发表于 2020-12-22 20:44:18 | 显示全部楼层
qsnet3 发表于 2020-3-1 14:51
谢谢分享!!!

您好,我也遇到了楼主所说的问题,可是按照楼主的方法修改了,还是不行啊!
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2021-10-19
在线时间
1 小时
发表于 2022-8-3 19:02:10 | 显示全部楼层
2022年了,有好的方法解决一下嘛
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-18 22:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表