Перейти к содержанию

Stm32F429I-Disco Usb Usb Cdc Virtual Com Port


zhilenkov

Рекомендуемые сообщения

привет.

Столкнулся с проблемой передачи данных с компьютера на stm32f429i-disco через виртуальный com порт. Проблема заключается в приеме более 63 байт. До 63 байт прием нормальный рис.1, после нет рис.2. После генерирования кубам кода сделал эхо

static int8_t CDC_Receive_HS (uint8_t* Buf, uint32_t *Len)
{
 /* USER CODE BEGIN 11 */
 CDC_Transmit_HS(Buf, *Len);
 //USBD_CDC_SetRxBuffer(hUsbDevice_1,&UserRxBufferHS[0]);
 USBD_CDC_ReceivePacket(hUsbDevice_1);
 return (USBD_OK);
 /* USER CODE END 11 */
}

Usb HS (вроде как должен поддерживать прием 512 байт и в генерированном коде cuba ) стоит

#define CDC_DATA_HS_MAX_PACKET_SIZE 512 /* Endpoint IN & OUT Packet size */

Буфер на прием сделал 512 байт #define APP_RX_DATA_SIZE 512. Почему не корректно принимает пакет больше 63 байт? И почему именно 63 байта а не 64 не понятно.

#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 */
/* CDC Endpoints parameters: you can fine tune these values depending on the needed baudrates and performance. */
#define CDC_DATA_HS_MAX_PACKET_SIZE				 512  /* Endpoint IN & OUT Packet size */
#define CDC_DATA_FS_MAX_PACKET_SIZE				 64  /* Endpoint IN & OUT Packet size */
#define CDC_CMD_PACKET_SIZE						 8  /* Control Endpoint Packet size */#define USB_CDC_CONFIG_DESC_SIZ					 67
#define CDC_DATA_HS_IN_PACKET_SIZE				  CDC_DATA_HS_MAX_PACKET_SIZE
#define CDC_DATA_HS_OUT_PACKET_SIZE				 CDC_DATA_HS_MAX_PACKET_SIZE
#define CDC_DATA_FS_IN_PACKET_SIZE				  CDC_DATA_FS_MAX_PACKET_SIZE
#define CDC_DATA_FS_OUT_PACKET_SIZE				 CDC_DATA_FS_MAX_PACKET_SIZE/*---------------------------------------------------------------------*/
/*  CDC definitions												    */
/*---------------------------------------------------------------------*/
#define CDC_SEND_ENCAPSULATED_COMMAND			   0x00
#define CDC_GET_ENCAPSULATED_RESPONSE			   0x01
#define CDC_SET_COMM_FEATURE					    0x02
#define CDC_GET_COMM_FEATURE					    0x03
#define CDC_CLEAR_COMM_FEATURE					  0x04
#define CDC_SET_LINE_CODING						 0x20
#define CDC_GET_LINE_CODING						 0x21
#define CDC_SET_CONTROL_LINE_STATE				  0x22
#define CDC_SEND_BREAK							  0x23

Descriptor крутил не чего не поменялось. Вот код дескриптора

/* USB CDC device Configuration Descriptor */
__ALIGN_BEGIN uint8_t USBD_CDC_CfgHSDesc[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,
 0x02,   /* bNumInterfaces: 2 interface */
 0x01,   /* bConfigurationValue: Configuration value */
 0x00,   /* iConfiguration: Index of string descriptor describing the configuration */
 0xC0,   /* bmAttributes: self powered */
 0x32,   /* MaxPower 0 mA */

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

 /*Interface 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_HS_MAX_PACKET_SIZE),  /* wMaxPacketSize: */
 HIBYTE(CDC_DATA_HS_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_HS_MAX_PACKET_SIZE),  /* wMaxPacketSize: */
 HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE),
 0x00							   /* bInterval: ignore for Bulk transfer */
} ;

Прошёлся по всей цепочки OTG_HS_IRQHandler -> HAL_PCD_IRQHandler -> HAL_PCD_DataOutStageCallback -> USBD_LL_DataOutStage -> USBD_CDC_DataOut -> CDC_Receive_HS. Где теряются не нашел.

Вот ссылка на архив с исходником https://yadi.sk/d/iCGJN0Ofri2G8 .

post-176222-0-18857800-1463278066_thumb.png

post-176222-0-93392500-1463278069_thumb.png

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

С приемом разобрался. Забыл про микросхему которая нужна usb hs. Теперь не понятно почему не передается 64, 128, 256 байт через функцию

CDC_Transmit_HS(Buf, *Len);

Вот если передавать 63, 127, 255 байт то все норм работает.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Я даже не знаю, что отвечать...  @IomenI , я не про переделку блока питания, а про установку перед аппаратом преобразователя переменного напряжения 220 вольт в переменное 110 вольт (т.е., про установку понижающего трансформатора). Если Вы не сможете найти такой готовый, то всегда есть вариант изготовить его самому. Ну, это если в крови есть жилка конструирования... @Dmitriy Parfenov , я не понимаю Ваших слов "...без издевательств над собой и техникой".  Можно другими словами описать то, что подразумевается? С учётом того, что мы на радиолюбительском сайте и умеем пять и пилить потому что это хобби. 
    • Я тоже БП никогда не разбираю. Удобная штука.  
    • На предыдущей работе остался(или забрал я его, уже не помню) блок питания от ДВД проигрывателя с похожими выходными напряжениями.  Разбирать на детали его не стал
    • Вот именно такой пример я и пробовал но. Всё от дисплея я отказался не нужно тему засорять.  Мне сейчас нужно будет до конца с UART разобраться. Там тоже есть вопросы. Позднее как сформулирую все вопросы напишу. Нужно ещё кое что проверить. Есть свои сложности. Оно как сказать работает, но не во всех случаях. Пока что буду смотреть и изучать документацию дополнительно. 
    • Извините, это кривость рук. Факт. Варвары.  Поэтому я всегда отключаю переключатели 230/110 V.   Паяльник заземлите, достаточно через 100 кОм на батарею. И вас не убьёт и транзистор выживет. Иногда проверяйте паяльник мегаомметром - жало на выводы розетки. 
    • А можно без издевательств над собой и техникой?  Есть же схема оригинального БП - там выходы +12В, +5В и +5 USB. Остаётся понять какой нужен ток по этим линиям, но это можно сделать исходя из общего потребления устройства. Раз это DVD-плеер, то там скорее всего ватт 20 на всё про всё. Воткнуть внутрь два вытащенных из загашников БП - на 5 и на 12 - куда проще.
    • Попробую в ближайшие дни! Можно чуть подробнее насчет напряжений - где именно измерить и какое должно быть?
×
×
  • Создать...