0

我试图用一个 USB 连接器(STM32F4 探索板中的 CN5)模拟两个虚拟 COM 端口,但徒劳无功。

我知道我必须将复合 CDC 类配置为具有多个接口,使用 ACM 功能描述符(抽象控制模型)进行虚拟 COM 端口通信,但是如何使它们成为两个 VCP?

我已经完成了一个 CCI(通信类接口)和一个 DCI(数据类接口),这让我在Device Manager中只有一个 VCP 。

我试过做两个 CCI 和两个 DCI,但是没有用!

这是我的接口关联描述符的设备描述符:

/* USB Standard Device Descriptor */
__ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
  {
    0x12,                       /* bLength */
    USB_DESC_TYPE_DEVICE,       /* bDescriptorType */

    #if (USBD_LPM_ENABLED == 1)
        0x01,                   /* bcdUSB */ /* changed to USB version 2.01
                                               in order to support LPM L1 suspend
                                               resume test of USBCV3.0*/
    #else
        0x00,                   /* bcdUSB */
    #endif

    0x02,
    0xEF,                       /* bDeviceClass */
    0x02,                       /* bDeviceSubClass */
    0x01,                       /* bDeviceProtocol */
    USB_MAX_EP0_SIZE,           /* bMaxPacketSize */

    LOBYTE(USBD_VID),           /* idVendor */
    HIBYTE(USBD_VID),           /* idVendor */

    LOBYTE(USBD_PID_HS),        /* idVendor */
    HIBYTE(USBD_PID_HS),        /* idVendor */

    0x00,                       /* bcdDevice rel. 2.00 */
    0x02,
    USBD_IDX_MFC_STR,           /* Index of manufacturer  string */
    USBD_IDX_PRODUCT_STR,       /* Index of product string */
    USBD_IDX_SERIAL_STR,        /* Index of serial number string */
    USBD_MAX_NUM_CONFIGURATION  /* bNumConfigurations */
  } ;

我的 CDC 配置有两个 IAD,每个 CCI 和一个 DCI:

/* 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 0 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 */
  0x00,   /* 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),
  0x10,                         /* 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 */
  0x00,   /* 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 */
  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),
  0x10,                         /* 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 */
} ;

如何将 CDC 类配置为具有两个 VCP?这些配置有什么问题?

4

1 回答 1

0

第二个呼叫管理功能描述符中有错误 - bDataInterface 设置为 1(第一个呼叫管理功能描述符也设置为使用接口 1 作为数据接口)。第一个描述符的正确值为 1,第二个描述符的正确值为3

于 2017-04-27T16:43:29.730 回答