wylew 发表于 2018-2-10 20:09:22

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

基于STM32F4xx手册中31.13.7章节有关OTG_HS的编程模型,想先大家请教一下“通用非同步OUT数据传输”和“通用非周期性IN数据传输”的编程思路,或者大家可有参考代码,在这请大家帮帮忙哈

衔胆栖冰 发表于 2018-2-11 10:26:21

本帖最后由 衔胆栖冰 于 2018-2-11 10:34 编辑

<div class="blockcode"><blockquote>/**
* @briefUSBD_MSC_Init
*         Initializethe mass storage configuration
* @parampdev: device instance
* @paramcfgidx: configuration index
* @retval status
*/
uint8_tUSBD_MSC_Init (USBD_HandleTypeDef *pdev,
                            uint8_t cfgidx)
{
int16_t ret = 0;
   
if(pdev->dev_speed == USBD_SPEED_HIGH)
{
    /* Open EP OUT */
    USBD_LL_OpenEP(pdev,
                   MSC_EPOUT_ADDR,
                   USBD_EP_TYPE_BULK,
                   MSC_MAX_HS_PACKET);
   
    /* Open EP IN */
    USBD_LL_OpenEP(pdev,
                   MSC_EPIN_ADDR,
                   USBD_EP_TYPE_BULK,
                   MSC_MAX_HS_PACKET);
}
else
{
    /* Open EP OUT */
    USBD_LL_OpenEP(pdev,
                   MSC_EPOUT_ADDR,
                   USBD_EP_TYPE_BULK,
                   MSC_MAX_FS_PACKET);
   
    /* Open EP IN */
    USBD_LL_OpenEP(pdev,
                   MSC_EPIN_ADDR,
                   USBD_EP_TYPE_BULK,
                   MSC_MAX_FS_PACKET);
}
pdev->pClassData = USBD_malloc(sizeof (USBD_MSC_BOT_HandleTypeDef));

if(pdev->pClassData == NULL)
{
    ret = 1;
}
else
{
    /* Init the BOTlayer */
    MSC_BOT_Init(pdev);
    ret = 0;
}

return ret;
}
USBD_LL_OpenEP(pdev,MSC_EPOUT_ADDR,USBD_EP_TYPE_BULK,MSC_MAX_HS_PACKET);对USB输出端点进行初始化,包括端点地址、传输类型和最大包长度。USB数据的接收和发送都在中断中完成。你可以用CubeMX生成工程,直接就能枚举成功。至于数据的处理,你可以参考官方的demo,标准库和HAL的都有。对于USB这类复杂的外设,一开始就看参考手册或者datasheet不是明智的选择。

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;
先通过上面两个语句确定端点方向和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里添加一个端点就需要添加一个对应的初始化函数等等吧。。。
页: [1]
查看完整版本: USB高速BULK-IN和BULK-OUT处理数据编程问题