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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版