2016-05-27 91 views
0

我使用一個USB設備模擬了兩個VCP。我可以在一個具有以下端點地址的VCP中發送數據。用於傳輸數據的USB DUAL CDC端點

#define CDC_IN_EP 0x81 /* EP1 for data IN */ 
#define CDC_OUT_EP 0x01 /* EP1 for data OUT */ 
#define CDC_CMD_EP 0x82 /* EP2 for CDC commands */ 

我想知道是否有可能在其他VCP與其他端點地址發送數據,如:

#define CDC_IN_EP3 0x83 /* EP3 for data IN */ 
#define CDC_OUT_EP3 0x03 /* EP3 for data OUT */ 
#define CDC_CMD_EP4 0x84 /* EP4 for CDC commands */ 

我的問題是地址別人比0×81不允許我送數據通過第二個VCP。我正在使用兩個CDC接口全速。通常我們可以使用CDC_FS中的七個端點,這就是我想要做的事情......我有六個端點:每個VCP三個,第七個端點是配置。

我是否遺漏了端點配置或複合設備描述符中的內容?

/* USB CDC device Configuration Descriptor */ 
__ALIGN_BEGIN uint8_t USBD_CDC_CfgFSDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END = 
{ 
    /* Configuration Descriptor */ 
    0x09, /* bLength: Configuration Descriptor size */ 
    USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ 
    USB_CDC_CONFIG_DESC_SIZ,  /* wTotalLength:no of returned bytes */ 
    0x00, 
    0x04, /* bNumInterfaces: 4 interface */ 
    0x01, /* bConfigurationValue: Configuration value */ 
    0x00, /* iConfiguration: Index of string descriptor describing the configuration */ 
    0xC0, /* bmAttributes: Self powered */ 
    0x32, /* MaxPower 100 mA */ 

    /*---------------------------------------------------------------------------*/ 

    // IAD0 
    0x08, // bLength: Interface Descriptor size 
    0x0B, // bDescriptorType: IAD 
    0x00, // bFirstInterface 
    0x02, // bInterfaceCount 
    0x02, // bFunctionClass: CDC 
    0x02, // bFunctionSubClass 
    0x01, // bFunctionProtocol 
    0x02, // iFunction 

    /* Interface0 Descriptor */ 
    0x09, /* bLength: Interface Descriptor size */ 
    USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ 

    /* Interface descriptor type */ 
    0x00, /* bInterfaceNumber: Number of Interface */ 
    0x00, /* bAlternateSetting: Alternate setting */ 
    0x01, /* bNumEndpoints: One endpoints used */ 
    0x02, /* bInterfaceClass: Communication Interface Class */ 
    0x02, /* bInterfaceSubClass: Abstract Control Model */ 
    0x01, /* bInterfaceProtocol: Common AT commands */ 
    0x00, /* iInterface: */ 

    /* Header Functional Descriptor */ 
    0x05, /* bLength: Endpoint Descriptor size */ 
    0x24, /* bDescriptorType: CS_INTERFACE */ 
    0x00, /* bDescriptorSubtype: Header Func Desc */ 
    0x10, /* bcdCDC: spec release number */ 
    0x01, 

    /* Call Management Functional Descriptor */ 
    0x05, /* bFunctionLength */ 
    0x24, /* bDescriptorType: CS_INTERFACE */ 
    0x01, /* bDescriptorSubtype: Call Management Func Desc */ 
    0x03, /* bmCapabilities: D0+D1 */ 
    0x01, /* bDataInterface: 1 */ 

    /* ACM Functional Descriptor */ 
    0x04, /* bFunctionLength */ 
    0x24, /* bDescriptorType: CS_INTERFACE */ 
    0x02, /* bDescriptorSubtype: Abstract Control Management desc */ 
    0x02, /* bmCapabilities */ 

    /* Union Functional Descriptor */ 
    0x05, /* bFunctionLength */ 
    0x24, /* bDescriptorType: CS_INTERFACE */ 
    0x06, /* bDescriptorSubtype: Union func desc */ 
    0x00, /* bMasterInterface: Communication class interface */ 
    0x01, /* bSlaveInterface0: Data Class Interface */ 


    /* Endpoint 2 Descriptor */ 
    0x07,       /* bLength: Endpoint Descriptor size */ 
    USB_DESC_TYPE_ENDPOINT,  /* bDescriptorType: Endpoint */ 
    CDC_CMD_EP,     /* bEndpointAddress */ 
    0x03,       /* bmAttributes: Interrupt */ 
    LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ 
    HIBYTE(CDC_CMD_PACKET_SIZE), 
    0xFF,       /* bInterval: */ 
    /*---------------------------------------------------------------------------*/ 

    /*Data class interface descriptor*/ 
    0x09, /* bLength: Endpoint Descriptor size */ 
    USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ 
    0x01, /* bInterfaceNumber: Number of Interface */ 
    0x00, /* bAlternateSetting: Alternate setting */ 
    0x02, /* bNumEndpoints: Two endpoints used */ 
    0x0A, /* bInterfaceClass: CDC */ 
    0x00, /* bInterfaceSubClass: */ 
    0x00, /* bInterfaceProtocol: */ 
    0x00, /* iInterface: */ 

    /*Endpoint OUT Descriptor*/ 
    0x07, /* bLength: Endpoint Descriptor size */ 
    USB_DESC_TYPE_ENDPOINT,    /* bDescriptorType: Endpoint */ 
    CDC_OUT_EP,       /* bEndpointAddress */ 
    0x02,         /* bmAttributes: Bulk */ 
    LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ 
    HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), 
    0x00,         /* bInterval: ignore for Bulk transfer */ 

    /*Endpoint IN Descriptor*/ 
    0x07, /* bLength: Endpoint Descriptor size */ 
    USB_DESC_TYPE_ENDPOINT,    /* bDescriptorType: Endpoint */ 
    CDC_IN_EP,       /* bEndpointAddress */ 
    0x02,         /* bmAttributes: Bulk */ 
    LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ 
    HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), 
    0x00,         /* bInterval: ignore for Bulk transfer */ 

    /*---------------------------------------------------------------------------*/ 

    // IAD1 

    0x08, // bLength: Interface Descriptor size 
    0x0B, // bDescriptorType: IAD 
    0x02, // bFirstInterface 
    0x02, // bInterfaceCount 
    0x02, // bFunctionClass: CDC 
    0x02, // bFunctionSubClass 
    0x01, // bFunctionProtocol 
    0x02, // iFunction 

    /* Interface1 Descriptor */ 
    0x09, /* bLength: Interface Descriptor size */ 
    USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ 
    /* Interface descriptor type */ 
    0x02, /* bInterfaceNumber: Number of Interface */ 
    0x00, /* bAlternateSetting: Alternate setting */ 
    0x01, /* bNumEndpoints: One endpoints used */ 
    0x02, /* bInterfaceClass: Communication Interface Class */ 
    0x02, /* bInterfaceSubClass: Abstract Control Model */ 
    0x01, /* bInterfaceProtocol: Common AT commands */ 
    0x00, /* iInterface: */ 

     /*Header Functional Descriptor*/ 
    0x05, /* bLength: Endpoint Descriptor size */ 
    0x24, /* bDescriptorType: CS_INTERFACE */ 
    0x00, /* bDescriptorSubtype: Header Func Desc */ 
    0x10, /* bcdCDC: spec release number */ 
    0x01, 

    /*Call Management Functional Descriptor*/ 
    0x05, /* bFunctionLength */ 
    0x24, /* bDescriptorType: CS_INTERFACE */ 
    0x01, /* bDescriptorSubtype: Call Management Func Desc */ 
    0x03, /* bmCapabilities: D0+D1 */ 
    0x03, /* bDataInterface: 1 */ 

    /*ACM Functional Descriptor*/ 
    0x04, /* bFunctionLength */ 
    0x24, /* bDescriptorType: CS_INTERFACE */ 
    0x02, /* bDescriptorSubtype: Abstract Control Management desc */ 
    0x02, /* bmCapabilities */ 

    /*Union Functional Descriptor*/ 
    0x05, /* bFunctionLength */ 
    0x24, /* bDescriptorType: CS_INTERFACE */ 
    0x06, /* bDescriptorSubtype: Union func desc */ 
    0x02, /* bMasterInterface: Communication class interface */ 
    0x03, /* bSlaveInterface0: Data Class Interface */ 

    /*Endpoint 2 Descriptor*/ 
    0x07,       /* bLength: Endpoint Descriptor size */ 
    USB_DESC_TYPE_ENDPOINT,  /* bDescriptorType: Endpoint */ 
    CDC_CMD_EP4,     /* bEndpointAddress */ 
    0x03,       /* bmAttributes: Interrupt */ 
    LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ 
    HIBYTE(CDC_CMD_PACKET_SIZE), 
    0xFF,       /* bInterval: */ 
    /*---------------------------------------------------------------------------*/ 

    /*Data class interface descriptor*/ 
    0x09, /* bLength: Endpoint Descriptor size */ 
    USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ 
    0x03, /* bInterfaceNumber: Number of Interface */ 
    0x00, /* bAlternateSetting: Alternate setting */ 
    0x02, /* bNumEndpoints: Two endpoints used */ 
    0x0A, /* bInterfaceClass: CDC */ 
    0x00, /* bInterfaceSubClass: */ 
    0x00, /* bInterfaceProtocol: */ 
    0x00, /* iInterface: */ 

    /*Endpoint OUT Descriptor*/ 
    0x07, /* bLength: Endpoint Descriptor size */ 
    USB_DESC_TYPE_ENDPOINT,    /* bDescriptorType: Endpoint */ 
    CDC_OUT_EP3,       /* bEndpointAddress */ 
    0x02,         /* bmAttributes: Bulk */ 
    LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ 
    HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), 
    0x00,         /* bInterval: ignore for Bulk transfer */ 

    /*Endpoint IN Descriptor*/ 
    0x07, /* bLength: Endpoint Descriptor size */ 
    USB_DESC_TYPE_ENDPOINT,    /* bDescriptorType: Endpoint */ 
    CDC_IN_EP3,       /* bEndpointAddress */ 
    0x02,         /* bmAttributes: Bulk */ 
    LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ 
    HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), 
    0x00         /* bInterval: ignore for Bulk transfer */ 
}; 
+0

有人有答案嗎? – HASSAN

回答

0

我有一個STM32 USB設備庫類似的問題。在配置描述符中修改或添加新的端點地址時,還必須在PMA(數據包存儲區)中設置端點地址。你可以做的是,在USBD_LL_INIT塊與HAL_PCDEx_PMAConfig功能:

USBD_StatusTypeDef USBD_LL_Init (USBD_HandleTypeDef *pdev) 
{ 
    /* Init USB_IP */ 
    /* enable USB power on Pwrctrl CR2 register */ 
    HAL_PWREx_EnableVddUSB(); 
    /* Link The driver to the stack */ 
    hpcd_USB_FS.pData = pdev; 
    pdev->pData = &hpcd_USB_FS; 

    hpcd_USB_FS.Instance = USB; 
    hpcd_USB_FS.Init.dev_endpoints = 8; 
    hpcd_USB_FS.Init.speed = PCD_SPEED_FULL; 
    hpcd_USB_FS.Init.ep0_mps = DEP0CTL_MPS_8; 
    hpcd_USB_FS.Init.phy_itface = PCD_PHY_EMBEDDED; 
    hpcd_USB_FS.Init.Sof_enable = DISABLE; 
    hpcd_USB_FS.Init.low_power_enable = DISABLE; 
    hpcd_USB_FS.Init.lpm_enable = DISABLE; 
    hpcd_USB_FS.Init.battery_charging_enable = DISABLE; 
    if (HAL_PCD_Init(&hpcd_USB_FS) != HAL_OK) 
    { 
    Error_Handler(); 
    } 

    HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x00 , PCD_SNG_BUF, 0x18); 
    HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x80 , PCD_SNG_BUF, 0x58); 
    HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x81 , PCD_SNG_BUF, 0xC0); 
    HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x01 , PCD_SNG_BUF, 0x110); 
    HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x82 , PCD_SNG_BUF, 0x100); 
    return USBD_OK; 
} 

那之後我可以使用數據傳輸的新端點。