реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STM32F105 USB CDC receive
Still Enemy
сообщение Jul 30 2015, 07:19
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 29-01-15
Из: Нижний Новгород
Пользователь №: 84 817



Есть задача передавать из ПК в МК большой массив данных(~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);
}


Сообщение отредактировал Still Enemy - Jul 30 2015, 07:32
Go to the top of the page
 
+Quote Post
_vladimir
сообщение Aug 2 2015, 08:29
Сообщение #2





Группа: Новичок
Сообщений: 4
Регистрация: 26-05-05
Из: Киев
Пользователь №: 5 412



Проверьте максимальный размер пакета в дескрипторе конечной точки через которую передаете. Например:
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 байт).
Go to the top of the page
 
+Quote Post
Still Enemy
сообщение Aug 4 2015, 10:17
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 29-01-15
Из: Нижний Новгород
Пользователь №: 84 817



Нет, это не то. Кто нибудь вообще пробовал передавать в МК через USB данные? МНе необходимо запрограммировать передачу, а стандартными средствами в qt не удаётся даже 30 байт впихнуть. Может это как то по другому делается?

Сообщение отредактировал Still Enemy - Aug 4 2015, 10:19
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Aug 4 2015, 20:02
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



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


Конечно пробовали. На Виндоус открывается COM порт и туда все пишется.
Мы фирмварь гоняем так. Надо только чтобы контроллер успевал.
Или периодически давал команду "давай дальше данные" или на стороне PC притормаживать.
Потому что все эти скоростя порта типа 9600 на самом деле частенько игнорируются и через USB может сифонить все 12 Мбит.
Ну почти.


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
Still Enemy
сообщение Aug 5 2015, 09:55
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 29-01-15
Из: Нижний Новгород
Пользователь №: 84 817



Цитата(A. Fig Lee @ Aug 5 2015, 00:02) *
Или периодически давал команду "давай дальше данные" или на стороне PC притормаживать.

Попробовал второй вариант, всё заработало) Большое спасибо, я в принципе уже делал подобное с одним прибором, но в этот раз чего то затупил)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 01:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.01395 секунд с 7
ELECTRONIX ©2004-2016