|
STM32f4 виртуальный COM порт подключение/отключение USB |
|
|
3 страниц
1 2 3 >
|
 |
Ответов
(1 - 42)
|
Dec 10 2017, 06:24
|
Местный
  
Группа: Участник
Сообщений: 280
Регистрация: 18-03-17
Пользователь №: 95 877

|
Цитата После прихода в CDC запроса setup request с типа SET_CONTROL_LINE_STATE с параметром 3 порт открыт, можно слать привествие. После прихота этого же запроса с другим значением параметра или после установки конфигурации 0 - порт закрыт Вот я также думаю, но можно подстраховаться Vbus еще. В Cube есть: /* Device Status */ #define USBD_STATE_DEFAULT 1 #define USBD_STATE_ADDRESSED 2 #define USBD_STATE_CONFIGURED 3 #define USBD_STATE_SUSPENDED 4 Написал вот так: if( (hUsbDeviceHS.dev_state==USBD_STATE_CONFIGURED) ){ CDC_Transmit_HS(p ,strlen (text)); }
Сообщение отредактировал Alex_Golubev - Dec 10 2017, 06:24
|
|
|
|
|
Dec 10 2017, 07:41
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(Alex_Golubev @ Dec 10 2017, 12:24)  Вот я также думаю, но можно подстраховаться Vbus еще. В Cube есть: /* Device Status */ #define USBD_STATE_DEFAULT 1 #define USBD_STATE_ADDRESSED 2 #define USBD_STATE_CONFIGURED 3 #define USBD_STATE_SUSPENDED 4
Написал вот так: if( (hUsbDeviceHS.dev_state==USBD_STATE_CONFIGURED) ){ CDC_Transmit_HS(p ,strlen (text)); } Устройство будет сконфигурировано хостом, и тут, бац, выдернули шнур. Устройтство осталось сконфигурировано, потому как от хоста не получало пакета SET_CONFIGURATION = 0. Что дальше? Выдернуть могут на любом состоянии. Но узаете о том, что не подключены только через VBUS. В STM32F4 есть регистры/биты, которые могут сигнализировать об отключении (некогда копаться в даташите чтобы указать точно). Но, естественно сама линия VBUS должна быть заведена в МК.
--------------------
|
|
|
|
|
Dec 11 2017, 08:01
|

Профессионал
    
Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877

|
Цитата(Сергей Борщ @ Dec 9 2017, 20:29)  Какой смысл что-то слать, если на той стороне порт не открыт и данные забирать некому? Сергей, полностью поддерживаю! Почему-то все остальные поняли вопрос буквально... Цитата(Сергей Борщ @ Dec 9 2017, 20:29)  После прихода в CDC запроса setup request с типа SET_CONTROL_LINE_STATE с параметром 3 порт открыт, можно слать привествие. После прихота этого же запроса с другим значением параметра или после установки конфигурации 0 - порт закрыт. Параметр 3 - это при наличии DTR со стороны хоста. И если большинство "обычных" софтин поднимают его, то нежно любимый мной Bray Terminal оставляет его на усмотрение пользователя. И по умолчанию он там выключен... Подскажите, установка конфигурации 0 - это закрытие виртуального порта, или отсоединение устройства? Если первое, то флажок "connected" можно ставить по любому SET_CONTROL_LINE_STATE. Давно собираюсь переделать свою реализацию...
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
Dec 11 2017, 13:22
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (esaulenka @ Dec 11 2017, 10:01)  Параметр 3 - это при наличии DTR со стороны хоста. И если большинство "обычных" софтин поднимают его, то нежно любимый мной Bray Terminal оставляет его на усмотрение пользователя. И по умолчанию он там выключен... Другого способа я не нашел. QUOTE (esaulenka @ Dec 11 2017, 10:01)  Подскажите, установка конфигурации 0 - это закрытие виртуального порта, или отсоединение устройства? Если первое, то флажок "connected" можно ставить по любому SET_CONTROL_LINE_STATE. Мысль интересная. Писал давно. При закрытии порта точно вызывается SET_CONTROL_LINE_STATE с параметром 0. А вот set_configuration вроде бы вызывается только при подключении устройства.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 11 2017, 13:22
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Сергей Борщ @ Dec 9 2017, 19:29)  После прихода в CDC запроса setup request с типа SET_CONTROL_LINE_STATE с параметром 3 порт открыт, можно слать привествие. После прихота этого же запроса с другим значением параметра или после установки конфигурации 0 - порт закрыт. Автору вроде нужно не открытие/закрытие COM-порта в винде, а отрывание USB-шнурка. Шнурок могут выдернуть и не закрывая COM. А также по стандартным запросам от host-а никак не определить факт отрывания шнурка. Только VBUS или SOF. SOF кстати - более универсальный способ чем VBUS.
|
|
|
|
|
Dec 11 2017, 13:31
|
Частый гость
 
Группа: Участник
Сообщений: 84
Регистрация: 7-05-05
Пользователь №: 4 819

|
Цитата(prottoss @ Dec 11 2017, 16:13)  Вопрос был о том, чтобы программно определить отключение шнурка устройства от порта. мой вариант прекрасно работает
|
|
|
|
|
Dec 11 2017, 13:44
|
Частый гость
 
Группа: Участник
Сообщений: 84
Регистрация: 7-05-05
Пользователь №: 4 819

|
Цитата(jcxz @ Dec 11 2017, 16:40)  Ваш - находится у вас, а у автора может быть другая схема. у меня тоже через куб, как и у автора. Это штатная переменная в кубе
Сообщение отредактировал 0men - Dec 11 2017, 13:44
|
|
|
|
|
Dec 11 2017, 13:51
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(prottoss @ Dec 11 2017, 15:47)  да, конечно, через SOF - это отличная идея. Но требует определенных программных затрат. Нужны таймауты. Если у ТС устройство в разработке, я бы рекомендовал выделить линию порта МК под мониторинг VBUS. Я делаю именно так. У меня в практике был случай, когда в устройстве (с USB-device) использовалась ADUM4160 и схемотехник VBUS нормально завёл на неё, а вот как МК, находящемуся за барьером, дать знать об отключении хоста - не подумал. И линия VBUS которую он завёл в МК, всегда сидела в "1". Вот тогда только SOF и спасал.
|
|
|
|
|
Dec 11 2017, 13:56
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(0men @ Dec 11 2017, 17:08)  if (hUsbDevice_0 == 0) то шнурок отключен Никогда не использовал КУБ - пользуюсь самописным софтом. Вот мне интересно, как Вы думаете, или может быть точно знаете - каким образом данная библиотека отслеживает выдергивание шнурка. Как говорил раньше - у STM32 c OTG есть средства - есть регистры и биты, по которым можно отследить состояние VBUS (если линия подключена). У МК с USB-device вообще таких средств мониторинга нет. Как там КУБ определит? Возможно, что как предложил jcxz по SOF, но я сомневаюсь, что в КУБ-е это реализовано. Цитата(jcxz @ Dec 11 2017, 19:51)  Вот тогда только SOF и спасал. Повторюсь - идея отличная. Обязательно напишу код для своей библиотеки.
--------------------
|
|
|
|
|
Dec 11 2017, 14:43
|
Частый гость
 
Группа: Участник
Сообщений: 84
Регистрация: 7-05-05
Пользователь №: 4 819

|
Цитата(jcxz @ Dec 11 2017, 16:47)  Куб уже научился и провода подпаивать?  у него все уже подпаяно, если внимательно почитать. куб определяет при вхождении в прерывание OTG_FS_IRQHandler через флаг USB_OTG_GOTGINT_SEDET
Сообщение отредактировал 0men - Dec 11 2017, 14:48
|
|
|
|
|
Dec 11 2017, 15:23
|
Частый гость
 
Группа: Участник
Сообщений: 84
Регистрация: 7-05-05
Пользователь №: 4 819

|
Цитата(prottoss @ Dec 11 2017, 18:15)  Да. Но VBUS должен быть подключен, иначе Вы постоянно будете висеть в этом прерывании. И как решить вопрос с МК, у которых нет OTG? Например STM32F103? ...Хотя ТС озвучил F4xx серию, тем не менее, пускай вопрос будет риторический. там, видимо, как то иначе, не работал с первой серией
|
|
|
|
|
Dec 11 2017, 15:42
|
Частый гость
 
Группа: Участник
Сообщений: 84
Регистрация: 7-05-05
Пользователь №: 4 819

|
Цитата(prottoss @ Dec 11 2017, 18:28)  В первой серии даже встроенного pull-up нет. Но, тем не менее, повторюсь не в первый раз - для точного и быстрого определения отключения шнурка - VBUS. USB_OTG_GOTGINT_SEDET как раз и работает с VBUS Bit 2 SEDET: Session end detected The core sets this bit to indicate that the level of the voltage on VBUS is no longer valid for a B-Peripheral session when VBUS < 0.8 V
|
|
|
|
|
Dec 12 2017, 01:13
|
Местный
  
Группа: Участник
Сообщений: 280
Регистрация: 18-03-17
Пользователь №: 95 877

|
Vbus я опрашиваю. Цитата if (hUsbDevice_0 == 0) то шнурок отключен Чем эта не нравится: if( (hUsbDeviceHS.dev_state==USBD_STATE_CONFIGURED) ){ } ?
|
|
|
|
|
Jan 25 2018, 02:19
|
Участник

Группа: Участник
Сообщений: 66
Регистрация: 15-04-10
Из: Kiev
Пользователь №: 56 654

|
Цитата(Alex_Golubev @ Jan 24 2018, 10:25)  Но если в терминале нажать conect то все нормально. а что посылает терминал при нажатии connec?
|
|
|
|
|
Jan 25 2018, 05:59
|
Местный
  
Группа: Участник
Сообщений: 280
Регистрация: 18-03-17
Пользователь №: 95 877

|
Цитата а что посылает терминал при нажатии connec? данные вываливает (терминал). И программа (зашитая в микроконтроллер), дальше продолжает работать, все нормально. Я так думаю какие-то массивы данных переполняются. Хочу еще узнать, что за: /* Device Status */ #define USBD_STATE_DEFAULT 1 #define USBD_STATE_ADDRESSED 2 #define USBD_STATE_CONFIGURED 3 // эта знаю для чего #define USBD_STATE_SUSPENDED 4 ни где не смог найти для чего они нужны. Может в них разгадка.
|
|
|
|
|
Jan 29 2018, 15:10
|
Местный
  
Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140

|
Цитата(Alex_Golubev @ Jan 25 2018, 08:59)  Я так думаю какие-то массивы данных переполняются. Мне кажется, вы не совсем понимаете парадигму работы USB. Устройство не передаёт данные хосту! Оно кладёт данные у себя в "заветную нычку" (конечную точку) и ждёт пока хост их сам заберёт. Если забрал, то можно ещё положить. Если не забирает, то накапливайте данные вне "нычки" или выкидывайте, тут уж вам решать сколько данные "не протухают". Цитата(Alex_Golubev @ Jan 25 2018, 08:59)  Хочу еще узнать, что за: /* Device Status */ #define USBD_STATE_SUSPENDED 4 Это когда хост не проявляет никакой активности на шине. Например, устройство отключили в диспетчере устройств. Можно переводить процессор в режим энергосбережения. Если не стоит задача микроамперы ловить, то можно забить. Хост сам даст RESET когда захочет с вами поработать. Цитата(SanvaldYV @ Jan 29 2018, 12:30)  #define USBD_STATE_SUSPENDED 4 - по названию понятно, что перевод в некое остановленное состояние, но не знаю в каких случаях хост выполняет перевод подключенного девайса в состояние suspend и выводит из этого состояния (resume), у меня при работе с CDC такое состояние не возникало Это состояние более низкого уровня. Выход из SUSPEND происходит через RESUME, RESET и Enumeration. Пока "жив CDC" не может быть суспенда.
|
|
|
|
|
Aug 5 2018, 19:34
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Вот я нарвался... Как писал выше - определял открытие порта по SET_CONTROL_LINE_STATE. До сих пор устраивало. Теперь потребовалось определять закрытие порта и/или выдергивание кабеля. С закрытием порта никаких проблем - SET_CONTROL_LINE_STATE справляется. А вот с выдергиванием кабеля меня настигла большая ж... неожиданность. Не гененрится прерывание SEDET. Искал-искал, читал-перечитывал описание - ну вроде бы нечему там не работать, напряжение просело - получи прерывание. Ткнулся вольтметром на Vbus - а там 2 вольта... У меня на входе USB стоит защитная сборка USBLC6. Сборка по рекомендации ее производителя подключена к D+, D- и Vbus. И вот тут начинается смешное: при появлении Vbus набортный OTG FS включает подтяжку на D+ и держит ее включенной постоянно: если он ее отключит, host воспримет это как отключение устройства. При пропадании Vbus (проседании ниже 0.8 В) OTG_FS генерит прерывание SEDET и отключает подтяжку (или в обратной последовательности, не знаю) - все должно быть красиво. Но у меня при выдергивании шнурка эта подтяжка через защитные диоды USBLC6 попадает на Vbus и не дает Vbus просесть до 0.8 В. Выпаиваю USBLC6 - все работает. Впаиваю - на Vbus зависает 2 вольта и прерывания нет. Странно, что об этой ситуации ничего не сказано в документации на USBCL6, ведь она позиционируется как защита и для self-powered device тоже. Да еще и в AN4879 от ST встречается вот такая фраза: QUOTE The component needs to be placed as close as possible to the receptacle to add ESD protection against high ESD surge. The USBLC6 component is recommended for such protection on VBUS and USB data lines. For OTG (on-the-go) use cases, the ID pin should also be protected against high ESD surge. То есть вроде тоже никаких предупреждений. И только на картинках между Vbus и входом контроллера стоит делитель из резисторов 47 кОм и 68 кОм, но нигде в описании ни единого слова о его предназначении. В руководстве пользователя этого делителя тоже нет, контакт разъема подключен напрямую ко входу Vbus, но там и защиты нет, а без защиты все работает. Естетсвенно, у меня в схеме этого делителя не было. В общем не повторяйте моих ошибок. Весь день убил. Теперь ночью придется делать то, что должен был делать днем.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Aug 6 2018, 03:39
|
Участник

Группа: Участник
Сообщений: 39
Регистрация: 28-06-13
Пользователь №: 77 311

|
Цитата(Сергей Борщ @ Aug 5 2018, 22:34)  ... сборка USBLC6 ... ... делитель из резисторов 47 кОм и 68 кОм, но нигде в описании ни единого слова о его предназначении... Аналогичная ситуация. У меня на делитель заводится питание с USB разъема. Делитель подключен к контроллеру для определения подключили/отключили разъем. То же долго не мог понять почему при отключении разъема на делителе "висит" 2V. В результате было сделано так: USB VCC -> делитель -> диод -> и только потом питание от USB идет на питание USB сборки и питание схемы. В этом случае при выдергивании шнурка процессор "не продавливает" через сборку делитель.
|
|
|
|
|
Aug 6 2018, 07:27
|
Участник

Группа: Участник
Сообщений: 39
Регистрация: 28-06-13
Пользователь №: 77 311

|
Цитата(Сергей Борщ @ Aug 6 2018, 08:31)  ... резистора 10 кОм последовательно в цепи Vbus между USBCL6 и процессором. Себе для заметки на будущее. Не совсем понял в каком месте. Можете пояснить?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|