Миландр

Ключевым подразделением нашей компании
является Центр Проектирования интегральных микросхем
Текущее время: 2020-дек-05 00:00

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 12 сообщений ] 
Автор Сообщение
 Заголовок сообщения: USB Virtual COM Port
СообщениеДобавлено: 2019-сен-06 14:50 
Не в сети

Зарегистрирован: 2019-янв-15 11:24
Сообщения: 4
Организация: АО ЭВРИКА
Откуда: Москва
Выкладываю проект реализации на MDR32F1Q виртуального COM порта, может кому пригодится.

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


Вложения:
mdr32-ftdi.zip [330.45 КБ]
250 скачиваний
Вернуться к началу
 Заголовок сообщения: Re: USB Virtual COM Port
СообщениеДобавлено: 2019-сен-09 11:05 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 473
Организация: Milandr
Откуда: ПКК "Миландр"
Спасибо!


Вернуться к началу
 Заголовок сообщения: Re: USB Virtual COM Port
СообщениеДобавлено: 2019-окт-02 07:58 
Не в сети

Зарегистрирован: 2019-сен-25 08:22
Сообщения: 5
Организация: ОмГТУ
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


Вернуться к началу
 Заголовок сообщения: Re: USB Virtual COM Port
СообщениеДобавлено: 2019-окт-22 12:59 
Не в сети

Зарегистрирован: 2019-янв-15 11:24
Сообщения: 4
Организация: АО ЭВРИКА
Откуда: Москва
WinUSB - класс USB устройств, имеющих стандартный драйвер и позволяющий работать напрямую с USB Endpoint из userspace, без написания собственного драйвера.
В Windows начиная с 7 поддерживается из коробки, устройства можно найти в системе по классу интерфейса (по GUID интерфейса)
В Linux только через библиотеку libusb
В приложении файл с проектом реализующим WinUSB совместимое устройство на MDR32F1Q


Вложения:
mdr32-winusb.zip [338.95 КБ]
210 скачиваний
Вернуться к началу
 Заголовок сообщения: Re: USB Virtual COM Port
СообщениеДобавлено: 2020-янв-15 17:01 
Не в сети

Зарегистрирован: 2016-окт-14 19:39
Сообщения: 75
Организация: АО "РИРВ"
Откуда: СПБ
Спасибо за полезный проект.

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

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


Вернуться к началу
 Заголовок сообщения: Re: USB Virtual COM Port
СообщениеДобавлено: 2020-янв-15 23:30 
Не в сети

Зарегистрирован: 2016-окт-14 19:39
Сообщения: 75
Организация: АО "РИРВ"
Откуда: СПБ
bugfix usbd.c
Если не задать выравнивание и попадет на нечетный адрес, то валится в HardFault.
static uint8_t SetupPacket[8] __attribute__ ((aligned (4)));
static uint8_t SetupDataIn[2] __attribute__ ((aligned (4)));


Вернуться к началу
 Заголовок сообщения: Re: USB Virtual COM Port
СообщениеДобавлено: 2020-янв-16 16:38 
Не в сети

Зарегистрирован: 2019-янв-15 11:24
Сообщения: 4
Организация: АО ЭВРИКА
Откуда: Москва
Насколько помню в блоке USB нет никаких событий связанных с отключением кабеля. Как вариант мониторить приход SOF, SOF должен приходить каждую 1мс, если нет значит отключили.

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


Вернуться к началу
 Заголовок сообщения: Re: USB Virtual COM Port
СообщениеДобавлено: 2020-янв-17 08:58 
Не в сети

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


Вернуться к началу
 Заголовок сообщения: Re: USB Virtual COM Port
СообщениеДобавлено: 2020-янв-17 10:49 
Не в сети

Зарегистрирован: 2016-окт-14 19:39
Сообщения: 75
Организация: АО "РИРВ"
Откуда: СПБ
ЧумА писал(а): *
Короче, с WM_DEVICECHANGE получилось как и описано (реагирует на отрывание флешек и всего другого), подробностей ни кто не помнит.
Так понимаю, речь о реакции Windows на подключение/отключение к нему. А я говорил о реакции контроллера, как device, при отключении его от host'а.


Вернуться к началу
 Заголовок сообщения: Re: USB Virtual COM Port
СообщениеДобавлено: 2020-янв-17 12:47 
Не в сети

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


Вернуться к началу
 Заголовок сообщения: Re: USB Virtual COM Port
СообщениеДобавлено: 2020-янв-17 16:00 
Не в сети

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 502
Уже озвучено неплохое решение
Цитата:
Как вариант мониторить приход 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мс :)

_________________
О сколько нам открытий чудных
Готовит просвященья дух,
И опыт - сын ошибок трудных ... (Пушкин)

Пергаменты не утоляют жажду ("Фауст",Гете)


Вернуться к началу
 Заголовок сообщения: Re: USB Virtual COM Port
СообщениеДобавлено: 2020-апр-07 12:57 
Не в сети
Аватара пользователя

Зарегистрирован: 2018-авг-10 23:14
Сообщения: 71
Организация: Milandr
Откуда: АО «ПКК Миландр»
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

_________________
Отдел технической поддержки support@milandr.ru


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 12 сообщений ] 

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 5 гостей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти: 

cron
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB