Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F105 USB CDC receive
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Still Enemy
Есть задача передавать из ПК в МК большой массив данных(~16 МБ). Попробовал программку Terminal - 255 байт передаётся нормально, но больше 255 байт отослать программа не даёт. В этой проге есть еще функция передавать целый файл. Ну я создал файл 32кБ для начала, отправляю этой программкой, а он мне его по байту разбил и отослал) Я думаю, это не очень корректно.
Писал прогу на Qt и пробовал через консольку файл кидать(два разных действия), результат один - передача не проходит. Пользуюсь прогой USBlyzer, в ней при отправке пишется, что передача Cancelled. В Мк приходит 64 байта, остальное хз где теряется. Может кто объяснит почему так?

Код, который обрабатывает прием в Мк по прерыванию:
Код
static int8_t CDC_Init_FS(void)
{
  hUsbDevice_0 = &hUsbDeviceFS;
  /* USER CODE BEGIN 3 */
  /* Set Application Buffers */
  USBD_CDC_SetRxBuffer(hUsbDevice_0, RxBuffer);
  VCPInitialized = 1;
  return (USBD_OK);
  /* USER CODE END 3 */
}

static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len)
{
  USBD_CDC_ReceivePacket(hUsbDevice_0);
  if (RxBufferOffset == 8)
    RxBufferOffset = 0;
  memcpy(UserRxBufferFS+RxBufferOffset*0x40, RxBuffer, 0x40);
  RxBufferOffset++;
  return (USBD_OK);
}
_vladimir
Проверьте максимальный размер пакета в дескрипторе конечной точки через которую передаете. Например:
CODE
static uint8_t USBD_LINK_CfgDesc[USB_LINK_CONFIG_DESC_SIZ] =
{
...........
0x07, /*bLength: Endpoint Descriptor size*/
USB_DESC_TYPE_ENDPOINT, /*bDescriptorType:*/
LINK_EPOUT_ADDR, /*bEndpointAddress: Endpoint Address OUT)*/
USBD_EP_TYPE_INTR, /*bmAttributes: Interrupt endpoint*/
LOBYTE(LINK_EPOUT_SIZE), /*wMaxPacketSize: 2 Byte max */ <--------
HIBYTE(LINK_EPOUT_SIZE), <--------
0x20, /*bInterval: Polling Interval (20 ms)*/
...........
};


Проверьте размеры fifo для всех EP в usbd_conf.h:

CODE
USBD_StatusTypeDef USBD_LL_Init (USBD_HandleTypeDef *pdev)
{
............

HAL_PCD_SetRxFiFo(&hpcd_USB_OTG_FS, 64);
HAL_PCD_SetTxFiFo(&hpcd_USB_OTG_FS, 0, 16);
HAL_PCD_SetTxFiFo(&hpcd_USB_OTG_FS, 1, 16);
HAL_PCD_SetTxFiFo(&hpcd_USB_OTG_FS, 2, 224);
............
}

Здесь сумма всех 4-байтных слов не должна превышать 320 (1280 байт).
Still Enemy
Нет, это не то. Кто нибудь вообще пробовал передавать в МК через USB данные? МНе необходимо запрограммировать передачу, а стандартными средствами в qt не удаётся даже 30 байт впихнуть. Может это как то по другому делается?
A. Fig Lee
Цитата(Still Enemy @ Aug 4 2015, 06:17) *
Нет, это не то. Кто нибудь вообще пробовал передавать в МК через USB данные? МНе необходимо запрограммировать передачу, а стандартными средствами в qt не удаётся даже 30 байт впихнуть. Может это как то по другому делается?


Конечно пробовали. На Виндоус открывается COM порт и туда все пишется.
Мы фирмварь гоняем так. Надо только чтобы контроллер успевал.
Или периодически давал команду "давай дальше данные" или на стороне PC притормаживать.
Потому что все эти скоростя порта типа 9600 на самом деле частенько игнорируются и через USB может сифонить все 12 Мбит.
Ну почти.
Still Enemy
Цитата(A. Fig Lee @ Aug 5 2015, 00:02) *
Или периодически давал команду "давай дальше данные" или на стороне PC притормаживать.

Попробовал второй вариант, всё заработало) Большое спасибо, я в принципе уже делал подобное с одним прибором, но в этот раз чего то затупил)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.