Alex_Golubev 0 December 9, 2017 Posted December 9, 2017 · Report post Привет. Как понять программно что шнурок USB отключен от device и сейчас не нужно передавать данные Host? Используется Cube. Стандартные функции приема передачи данных. Quote Share this post Link to post Share on other sites More sharing options...
uriy 1 December 9, 2017 Posted December 9, 2017 · Report post Мало что понятно. У вас на STM32F4 сделан CDC Host. К нему соединяется сторонний девайс. Вам надо понять подключено к вашему хосту устройство или нет? Quote Share this post Link to post Share on other sites More sharing options...
Alex_Golubev 0 December 9, 2017 Posted December 9, 2017 (edited) · Report post Нет сделан CDC device (виртуальный COM порт). Надо понять отключен device от Host (ПК) или нет. Edited December 9, 2017 by Alex_Golubev Quote Share this post Link to post Share on other sites More sharing options...
prottoss 0 December 9, 2017 Posted December 9, 2017 · Report post Нет сделан CDC device (виртуальный COM порт). Надо понять отключен device от Host (ПК) или нет. Мониторить VBUS? Quote Share this post Link to post Share on other sites More sharing options...
Alex_Golubev 0 December 9, 2017 Posted December 9, 2017 · Report post Можно смотреть и Vbus. Что вы думаете о такой конструкции ? if(hUsbDeviceFS.dev_state==USBD_STATE_CONFIGURED) { CDC_Transmit_FS(testDataToSend, strlen((char*)testDataToSend) ); } Quote Share this post Link to post Share on other sites More sharing options...
prottoss 0 December 9, 2017 Posted December 9, 2017 · Report post Что вы думаете о такой конструкции ? Ничего не думаю. Чисто по протоколу, по моему, не возможно отследить отключение устройства. То что встроено в STM32 (USB или OTG) основано на мониторинге VBUS. Ну и, на мой взгляд, это самый надежный вариант. Quote Share this post Link to post Share on other sites More sharing options...
jcxz 81 December 9, 2017 Posted December 9, 2017 · Report post Ничего не думаю. Чисто по протоколу, по моему, не возможно отследить отключение устройства. Ну почему невозможно. Можно например отслеживать наличие SOF-ов. Пропали - значит нет хоста. Но правильнее всё-таки - VBUS. Quote Share this post Link to post Share on other sites More sharing options...
prottoss 0 December 9, 2017 Posted December 9, 2017 · Report post Но правильнее всё-таки - VBUS.Это выгоднее с точки зрения экономии ресурсов. Повесить прерывание... Quote Share this post Link to post Share on other sites More sharing options...
Сергей Борщ 60 December 9, 2017 Posted December 9, 2017 · Report post Какой смысл что-то слать, если на той стороне порт не открыт и данные забирать некому? После прихода в CDC запроса setup request с типа SET_CONTROL_LINE_STATE с параметром 3 порт открыт, можно слать привествие. После прихота этого же запроса с другим значением параметра или после установки конфигурации 0 - порт закрыт. Во всяком случае у меня это красиво работает и под линухом и под виндовсом: пользователь запускает терминалку и получает приветствие. Как это сделать в кубе - разбирайтесь сами, когда я скомпилил пример из куба и получил 25 К кода только от голого виртуального последовательного порта - написал свой стек. Quote Share this post Link to post Share on other sites More sharing options...
Alex_Golubev 0 December 10, 2017 Posted December 10, 2017 (edited) · Report post После прихода в 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)); } Edited December 10, 2017 by Alex_Golubev Quote Share this post Link to post Share on other sites More sharing options...
prottoss 0 December 10, 2017 Posted December 10, 2017 · Report post Вот я также думаю, но можно подстраховаться 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 должна быть заведена в МК. Quote Share this post Link to post Share on other sites More sharing options...
Alex_Golubev 0 December 10, 2017 Posted December 10, 2017 · Report post prottoss все работает я конечно еще протестирую, но сегодня у меня все работало. Я хочу еще спросить а как правильно программно делать disconnect от usb в режиме cdc? Quote Share this post Link to post Share on other sites More sharing options...
prottoss 0 December 10, 2017 Posted December 10, 2017 · Report post prottoss все работает я конечно еще протестирую, но сегодня у меня все работало. Я хочу еще спросить а как правильно программно делать disconnect от usb в режиме cdc? Да вроде ни каких примудростей нет: 1. Запретить прерывания от USB-модуля в МК. 2. Отключить pull-up резистор от шины. Quote Share this post Link to post Share on other sites More sharing options...
esaulenka 0 December 11, 2017 Posted December 11, 2017 · Report post Какой смысл что-то слать, если на той стороне порт не открыт и данные забирать некому? Сергей, полностью поддерживаю! Почему-то все остальные поняли вопрос буквально... После прихода в CDC запроса setup request с типа SET_CONTROL_LINE_STATE с параметром 3 порт открыт, можно слать привествие. После прихота этого же запроса с другим значением параметра или после установки конфигурации 0 - порт закрыт. Параметр 3 - это при наличии DTR со стороны хоста. И если большинство "обычных" софтин поднимают его, то нежно любимый мной Bray Terminal оставляет его на усмотрение пользователя. И по умолчанию он там выключен... Подскажите, установка конфигурации 0 - это закрытие виртуального порта, или отсоединение устройства? Если первое, то флажок "connected" можно ставить по любому SET_CONTROL_LINE_STATE. Давно собираюсь переделать свою реализацию... Quote Share this post Link to post Share on other sites More sharing options...
0men 0 December 11, 2017 Posted December 11, 2017 · Report post if (hUsbDevice_0 == 0) то шнурок отключен Quote Share this post Link to post Share on other sites More sharing options...