Миландр
https://forum.milandr.ru/

USB Virtual COM Port
https://forum.milandr.ru/viewtopic.php?f=22&t=4082
Страница 1 из 1

Автор:  deni [ 2019-сен-06 14:50 ]
Заголовок сообщения:  USB Virtual COM Port

Выкладываю проект реализации на MDR32F1Q виртуального COM порта, может кому пригодится.

МК эмулирует работу микросхемы FT232BM в режиме VCP. Возможна сборка проекта как чисто программного VCP,
так и в качестве законченного переходника USB-UART. Проект сделан в Eclipse CDT + GNU MCU Plugins, компилятор GNU Tools ARM Embedded.

Вложения:
mdr32-ftdi.zip [330.45 КБ]
390 скачиваний

Автор:  Vasiliy [ 2019-сен-09 11:05 ]
Заголовок сообщения:  Re: USB Virtual COM Port

Спасибо!

Автор:  Dmitro25 [ 2019-окт-02 07:58 ]
Заголовок сообщения:  Re: USB Virtual COM Port

deni
Спасибо за полезный проект.

Собрал в Keil v5 под evaluation board 1986VE91T. Из опыта:
- startup файл берём стандартный, предложенный Keil-ом;
- файл "src\syscalls.c" в проект не добавляем;
- в проект можно добавить только один из модулей: либо src\usb_vcp.c (чтобы плата функционировала в режиме VCP, когда все данные по USB обрабатываются самим микроконтроллером), либо src\usb_uart.c (чтобы плата функционировала в режиме переходника USB-UART);
- если частота кварцевого резонатора отличается от той, что использовалась в проекте автора (16 МГц), то:
---- правим значение HSE_Value в файле src\usbd_config.h (строка 86);
---- правим процедуру USBVCP_Init() в модуле src\usb_vcp.c. Значения USB_Clock_InitStruct.USB_USBC1_Source и USB_Clock_InitStruct.USB_PLLUSBMUL устанавливаем таким образом, чтобы модуль USB тактировался 48 МГц (в моём случае (кварц на 8 МГц) это USB_C1HSEdiv2 и USB_PLLUSBMUL12);
---- аналогичные изменения производим в процедуре USBD_Init() в модуле src\usb_uart.c

Автор:  deni [ 2019-окт-22 12:59 ]
Заголовок сообщения:  Re: USB Virtual COM Port

WinUSB - класс USB устройств, имеющих стандартный драйвер и позволяющий работать напрямую с USB Endpoint из userspace, без написания собственного драйвера.
В Windows начиная с 7 поддерживается из коробки, устройства можно найти в системе по классу интерфейса (по GUID интерфейса)
В Linux только через библиотеку libusb
В приложении файл с проектом реализующим WinUSB совместимое устройство на MDR32F1Q

Вложения:
mdr32-winusb.zip [338.95 КБ]
315 скачиваний

Автор:  azimuth [ 2020-янв-15 17:01 ]
Заголовок сообщения:  Re: USB Virtual COM Port

Спасибо за полезный проект.

На 1986ВЕ92 тоже работает.

Насколько понял, подключение USB можно отследить в USB_DeviceContext.USB_DeviceState А можно ли отследить отключение USB?

Автор:  azimuth [ 2020-янв-15 23:30 ]
Заголовок сообщения:  Re: USB Virtual COM Port

bugfix usbd.c
Если не задать выравнивание и попадет на нечетный адрес, то валится в HardFault.
static uint8_t SetupPacket[8] __attribute__ ((aligned (4)));
static uint8_t SetupDataIn[2] __attribute__ ((aligned (4)));

Автор:  deni [ 2020-янв-16 16:38 ]
Заголовок сообщения:  Re: USB Virtual COM Port

Насколько помню в блоке USB нет никаких событий связанных с отключением кабеля. Как вариант мониторить приход SOF, SOF должен приходить каждую 1мс, если нет значит отключили.

Да если не выровнять по адресу uint8_t SetupPacket[8], то возможен вылет на M0(M1), так как далее идет каст к USB_SetupPacket_TypeDef и возможно обращение по не выравненному адресу. Спасибо за поиск ошибок.

Автор:  ЧумА [ 2020-янв-17 08:58 ]
Заголовок сообщения:  Re: USB Virtual COM Port

azimuth писал(а): *
Насколько понял, подключение USB можно отследить в USB_DeviceContext.USB_DeviceState А можно ли отследить отключение USB?
Из переписки с моим программистом:
Недостатки решения: воспримет как отрывание кабеля также всовывание/удаление левых флешек, но ведь мы предполагаем, что в процессе работы такого быть не должно, так ведь? Просто в момент возникновения WM_DEVICECHANGE порт еще как бы есть по всем системным структурам, а если чуть замешаться с отключением, пока он из них пропадет, то он опять же моментально раком встанет...
Короче, с WM_DEVICECHANGE получилось как и описано (реагирует на отрывание флешек и всего другого), подробностей ни кто не помнит.

Автор:  azimuth [ 2020-янв-17 10:49 ]
Заголовок сообщения:  Re: USB Virtual COM Port

ЧумА писал(а): *
Короче, с WM_DEVICECHANGE получилось как и описано (реагирует на отрывание флешек и всего другого), подробностей ни кто не помнит.
Так понимаю, речь о реакции Windows на подключение/отключение к нему. А я говорил о реакции контроллера, как device, при отключении его от host'а.

Автор:  ЧумА [ 2020-янв-17 12:47 ]
Заголовок сообщения:  Re: USB Virtual COM Port

azimuth писал(а): *
ЧумА писал(а): *
Короче, с WM_DEVICECHANGE получилось как и описано (реагирует на отрывание флешек и всего другого), подробностей ни кто не помнит.
Так понимаю, речь о реакции Windows на подключение/отключение к нему. А я говорил о реакции контроллера, как device, при отключении его от host'а.
Ну тогда можно (если ножку не жалко) мониторить пропадание 5V USB

Автор:  редактор [ 2020-янв-17 16:00 ]
Заголовок сообщения:  Re: USB Virtual COM Port

Уже озвучено неплохое решение
Цитата:
Как вариант мониторить приход SOF, SOF должен приходить каждую 1мс, если нет значит отключили.
У меня сделано так
 
       SOF_num_l0 = (MDR_USB->SFN_L <<8) | MDR_USB->SFN_H;
       if (SOF_num_l0 == SOF_num_l1)
         { ReInitDevise ();
          }
       SOF_num_l1 = SOF_num_l0;
То, что старший и младший байты перепутаны - указывалось давно, но в документации не исправлено (поменять названия регистров - не проблема)
То, что регистры содержат 8 и 2 значащих бита тоже умалчивается.
В принципе можно обойтись контролем только MDR_USB->SFN_H (содержит младший байт счетчика), если период опроса не кратен 256мс :)

Автор:  Lampadov [ 2020-апр-07 12:57 ]
Заголовок сообщения:  Re: USB Virtual COM Port

Dmitro25 писал(а): *
deni
Спасибо за полезный проект.

Собрал в Keil v5 под evaluation board 1986VE91T. Из опыта:
- startup файл берём стандартный, предложенный Keil-ом;
- файл "src\syscalls.c" в проект не добавляем;
- в проект можно добавить только один из модулей: либо src\usb_vcp.c (чтобы плата функционировала в режиме VCP, когда все данные по USB обрабатываются самим микроконтроллером), либо src\usb_uart.c (чтобы плата функционировала в режиме переходника USB-UART);
- если частота кварцевого резонатора отличается от той, что использовалась в проекте автора (16 МГц), то:
---- правим значение HSE_Value в файле src\usbd_config.h (строка 86);
---- правим процедуру USBVCP_Init() в модуле src\usb_vcp.c. Значения USB_Clock_InitStruct.USB_USBC1_Source и USB_Clock_InitStruct.USB_PLLUSBMUL устанавливаем таким образом, чтобы модуль USB тактировался 48 МГц (в моём случае (кварц на 8 МГц) это USB_C1HSEdiv2 и USB_PLLUSBMUL12);
---- аналогичные изменения производим в процедуре USBD_Init() в модуле src\usb_uart.c
Дополню для тех, кто будет проект пересобирать: значение HSE_Value исправляется на 86 строчке в файле MDR32F9Qx_config.h

Страница 1 из 1 Часовой пояс: UTC+03:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/