你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

USB高速BULK-IN和BULK-OUT处理数据编程问题

[复制链接]
wylew 提问时间:2018-2-10 20:09 /
基于STM32F4xx手册中31.13.7章节有关OTG_HS的编程模型,想先大家请教一下“通用非同步OUT数据传输”和“通用非周期性IN数据传输”的编程思路,或者大家可有参考代码,在这请大家帮帮忙哈
通用非同步 OUT 数据传输.PNG
通用非周期性IN数据传输.PNG
收藏 评论4 发布时间:2018-2-10 20:09

举报

4个回答
衔胆栖冰 回答时间:2018-2-11 10:26:21
本帖最后由 衔胆栖冰 于 2018-2-11 10:34 编辑
  1. <div class="blockcode"><blockquote>/**
  2.   * @brief  USBD_MSC_Init
  3.   *         Initialize  the mass storage configuration
  4.   * @param  pdev: device instance
  5.   * @param  cfgidx: configuration index
  6.   * @retval status
  7.   */
  8. uint8_t  USBD_MSC_Init (USBD_HandleTypeDef *pdev,
  9.                             uint8_t cfgidx)
  10. {
  11.   int16_t ret = 0;
  12.    
  13.   if(pdev->dev_speed == USBD_SPEED_HIGH  )
  14.   {
  15.     /* Open EP OUT */
  16.     USBD_LL_OpenEP(pdev,
  17.                    MSC_EPOUT_ADDR,
  18.                    USBD_EP_TYPE_BULK,
  19.                    MSC_MAX_HS_PACKET);
  20.    
  21.     /* Open EP IN */
  22.     USBD_LL_OpenEP(pdev,
  23.                    MSC_EPIN_ADDR,
  24.                    USBD_EP_TYPE_BULK,
  25.                    MSC_MAX_HS_PACKET);  
  26.   }
  27.   else
  28.   {
  29.     /* Open EP OUT */
  30.     USBD_LL_OpenEP(pdev,
  31.                    MSC_EPOUT_ADDR,
  32.                    USBD_EP_TYPE_BULK,
  33.                    MSC_MAX_FS_PACKET);
  34.    
  35.     /* Open EP IN */
  36.     USBD_LL_OpenEP(pdev,
  37.                    MSC_EPIN_ADDR,
  38.                    USBD_EP_TYPE_BULK,
  39.                    MSC_MAX_FS_PACKET);  
  40.   }
  41.   pdev->pClassData = USBD_malloc(sizeof (USBD_MSC_BOT_HandleTypeDef));
  42.   
  43.   if(pdev->pClassData == NULL)
  44.   {
  45.     ret = 1;
  46.   }
  47.   else
  48.   {
  49.     /* Init the BOT  layer */
  50.     MSC_BOT_Init(pdev);
  51.     ret = 0;
  52.   }
  53.   
  54.   return ret;
  55. }
复制代码
USBD_LL_OpenEP(pdev,MSC_EPOUT_ADDR,USBD_EP_TYPE_BULK,MSC_MAX_HS_PACKET);对USB输出端点进行初始化,包括端点地址、传输类型和最大包长度。USB数据的接收和发送都在中断中完成。你可以用CubeMX生成工程,直接就能枚举成功。至于数据的处理,你可以参考官方的demo,标准库和HAL的都有。对于USB这类复杂的外设,一开始就看参考手册或者datasheet不是明智的选择。

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

wylew 回答时间:2018-2-11 11:27:05
衔胆栖冰 发表于 2018-2-11 10:26
USBD_LL_OpenEP(pdev,MSC_EPOUT_ADDR,USBD_EP_TYPE_BULK,MSC_MAX_HS_PACKET);对US ...

我的USB模块虽然和stm32用的是相同的IP核,但实现方式很不一样,没有像stm32这样分的很清楚,它是在一个otg_endpoint_creat函数中:
otg_endpoint_index =  endpoint -> ux_slave_endpoint_descriptor.bEndpointAddress & ~UX_ENDPOINT_DIRECTION;
/* Fetch the address of the physical endpoint.  */
ed =  &dcd_otg -> ux_dcd_otg_ed[otg_endpoint_index];
先通过上面两个语句确定端点方向和ID号
然后再构建端点DIEP或DOEP寄存器,在再通过switch函数来case宏,如UX_CONTROL_ENDPOINT、UX_BULK_ENDPOINT等等,其中如批量端点,
case UX_BULK_ENDPOINT:
       put_string("UX_BULK_ENDPOINT");
       /* Set the MPS field.  */
       otg_endpoint_register |= endpoint -> ux_slave_endpoint_descriptor.wMaxPacketSize;
       /* Set the SD0PID flag.  */
       otg_endpoint_register |= UX_DCD_OTG_FS_DIEPCTL_SD0PID;
       /* Bulk endpoint. Set the USBAEP and SNAK fields.  */
       otg_endpoint_register |=  UX_DCD_OTG_FS_DIEPCTL_EPTYP_BULK ||UX_DCD_OTG_FS_DIEPCTL0_USBAEP | UX_DCD_OTG_FS_DIEPCTL0_SNAK;
       /* Store the endpoint type.  */
       ed -> ux_dcd_otg_ed_type  = UX_BULK_ENDPOINT;
       break;  
这样是不是只通过这一个函数,就可以将在描述符中设置的端点都能初始化吗?            
衔胆栖冰 回答时间:2018-2-11 14:55:21
wylew 发表于 2018-2-11 11:27
我的USB模块虽然和stm32用的是相同的IP核,但实现方式很不一样,没有像stm32这样分的很清楚,它是在一个o ...

这里对结构体变量进行赋值,赋值完了再进行配置吧
wylew 回答时间:2018-2-11 16:28:33
衔胆栖冰 发表于 2018-2-11 14:55
这里对结构体变量进行赋值,赋值完了再进行配置吧

是的,所以想,这样似乎不需要像stm32里添加一个端点就需要添加一个对应的初始化函数等等吧。。。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版