2016-05-27 1 views
0

J'ai émulé deux VCP avec un seul périphérique USB. Je peux envoyer des données dans un VCP qui a l'adresse de point de terminaison suivante.Points de terminaison CDC USB DUAL pour le transfert de données

#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 */ 

Je voudrais savoir s'il est possible d'envoyer des données dans l'autre VCP avec d'autres Adresse Endpoint comme:

#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 */ 

Mon problème est que d'autres adresses que 0x81 ne me permettent pas d'envoyer données sur le second VCP. J'utilise deux interfaces CDC Full-Speed. Normalement, nous pouvons utiliser sept points de terminaison avec CDC_FS et c'est ce que j'essaie de faire ... J'ai six Endpoints: trois pour chaque VCP et le septième est Endpoint 0 pour la configuration. Ai-je manqué quelque chose dans la configuration des points d'extrémité ou dans les descripteurs de périphérique composite?

/* 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

Quelqu'un a-t-il la réponse s'il vous plaît? – HASSAN

Répondre

0

J'ai eu un problème similaire avec la bibliothèque de périphériques USB STM32. Lorsque vous modifiez ou ajoutez une nouvelle adresse de point de terminaison dans le descripteur de configuration, vous devez également définir l'adresse de point de terminaison dans la zone PMA (zone de mémoire de paquet). Vous pouvez le faire dans le bloc USBD_LL_INIT avec la fonction 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; 
} 

Après que je pourrais utiliser les nouveaux critères d'évaluation pour le transfert de données.