Всем привет! Сегодня будем поднимать USB CDC (VCP) на плате stm32f401c-disco.

USB communications device class (коммуникационный класс устройства) — является составным классом устройства Универсальной последовательной шины. Класс может включать один (или более) интерфейс, такой как интерфейс пользовательского элемента управления, интерфейс передачи данных, аудио или интерфейс запоминающего устройства.

VCP — Виртуальный COM-порт

Базовый класс 02h (Communications and CDC Control)
Этот базовый класс определен для устройств, которые относятся к классу устройств спецификации связи. Эта спецификация определяет используемый набор подкласса и Протокола значений. Значения за пределами определения спецификации защищены. Обратите внимание, что связи класса устройств спецификации требуется несколько значений Кода класса (три), которые будут использоваться в описания устройств, а некоторые, которые будут использоваться в интерфейсе дескрипторов.

Базовый класс 02h
Подкласс xxh
протокол xxh
смысл Communication device class

Базовый класс 0Ah (CDC-Data)
Этот базовый класс определен для устройств, которые относятся к классу устройств спецификации связи. Это спецификация определяет используемый набор подкласса и протокола значений. Значения за пределами определения спецификации защищены. Эти коды класса могут быть использованы только в интерфейсе дескрипторов.

Базовый класс 0Ah
Подкласс xxh
протокол xxh
смысл CDC data device

Дескриптор CDC

1. Находим строку HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0); и меняем на HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
2. Находим строку #define CDC_DATA_HS_MAX_PACKET_SIZE 512 /* Endpoint IN & OUT Packet size */ и меняем на #define CDC_DATA_HS_MAX_PACKET_SIZE 64 /* Endpoint IN & OUT Packet size */
3. Производим изменения в usbd_cdc_if.c

4. Теперь нужно добавить в usbd_cdc_if.h несколько строк кода

5. Устраняем баг для USBD_CDC_TransmitPacket()

6. И добавляем пример в main.c

Проект для CDC

И все готова!, подключаем микро USB к плате, второй вывод к host-у и у нас появляется виртуальный com порт.

By!

6
Отправить ответ

avatar
3 Comment threads
3 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
4 Comment authors
AnatolyAlex62adminAntek Recent comment authors

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

  Subscribe  
Самый новый Самый старый Наиболее проголосовали
Уведомлять о
Antek
Гость

When i debbuged this code i found that for really big messages this doesn’t work right. There was some issue with size off offset. IT send multiple time the same think.

I corrected it with:

if (size > CDC_DATA_HS_OUT_PACKET_SIZE) {
int offset;
for (offset = 0; offset < size; offset += CDC_DATA_HS_OUT_PACKET_SIZE) {
int todo = MIN(CDC_DATA_HS_OUT_PACKET_SIZE, size - offset);
int done = VCP_write(((char *) pBuffer) + offset, todo);
if (done != todo)
return offset + done;
}

return size;
}

Alex62
Гость
Alex62

Ну и зачем столько путанного кода. Всё это легко организуется средствами генерируемого STM32Cube проекта. Достаточно добавить несколько строчек в функцию ( CDC_Receive_FS (uint8_t* UserRxBufferFS, uint32_t *Len)) . И это доходчиво описано здесь: http://habrahabr.ru/post/249395/
Создается впечатление, что вы пытаетесь запутать, выложив обилие непонятной информации и кода.

Anatoly
Гость
Anatoly

Есть одна проблема. Не передаются пакеты более 64 байт. Кто-нибудь решил ее?