Перейти к содержанию

    

STM32f4 виртуальный COM порт подключение/отключение USB

Привет.

Как понять программно что шнурок USB отключен от device и сейчас не нужно передавать данные Host? Используется Cube. Стандартные функции приема передачи данных.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мало что понятно.

У вас на STM32F4 сделан CDC Host. К нему соединяется сторонний девайс. Вам надо понять подключено к вашему хосту устройство или нет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет сделан CDC device (виртуальный COM порт). Надо понять отключен device от Host (ПК) или нет.

Изменено пользователем Alex_Golubev

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Нет сделан CDC device (виртуальный COM порт). Надо понять отключен device от Host (ПК) или нет.

Мониторить VBUS?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно смотреть и Vbus.

Что вы думаете о такой конструкции ?

 

if(hUsbDeviceFS.dev_state==USBD_STATE_CONFIGURED) {

CDC_Transmit_FS(testDataToSend, strlen((char*)testDataToSend) );

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Что вы думаете о такой конструкции ?

Ничего не думаю. Чисто по протоколу, по моему, не возможно отследить отключение устройства. То что встроено в STM32 (USB или OTG) основано на мониторинге VBUS.

Ну и, на мой взгляд, это самый надежный вариант.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Ничего не думаю. Чисто по протоколу, по моему, не возможно отследить отключение устройства.

Ну почему невозможно. Можно например отслеживать наличие SOF-ов. Пропали - значит нет хоста.

Но правильнее всё-таки - VBUS.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Но правильнее всё-таки - VBUS.
Это выгоднее с точки зрения экономии ресурсов. Повесить прерывание...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Какой смысл что-то слать, если на той стороне порт не открыт и данные забирать некому? После прихода в CDC запроса setup request с типа SET_CONTROL_LINE_STATE с параметром 3 порт открыт, можно слать привествие. После прихота этого же запроса с другим значением параметра или после установки конфигурации 0 - порт закрыт. Во всяком случае у меня это красиво работает и под линухом и под виндовсом: пользователь запускает терминалку и получает приветствие. Как это сделать в кубе - разбирайтесь сами, когда я скомпилил пример из куба и получил 25 К кода только от голого виртуального последовательного порта - написал свой стек.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
После прихода в 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Вот я также думаю, но можно подстраховаться 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 должна быть заведена в МК.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

prottoss все работает я конечно еще протестирую, но сегодня у меня все работало.

Я хочу еще спросить а как правильно программно делать disconnect от usb в режиме cdc?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
prottoss все работает я конечно еще протестирую, но сегодня у меня все работало.

Я хочу еще спросить а как правильно программно делать disconnect от usb в режиме cdc?

Да вроде ни каких примудростей нет:

1. Запретить прерывания от USB-модуля в МК.

2. Отключить pull-up резистор от шины.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Какой смысл что-то слать, если на той стороне порт не открыт и данные забирать некому?

Сергей, полностью поддерживаю! Почему-то все остальные поняли вопрос буквально...

 

После прихода в CDC запроса setup request с типа SET_CONTROL_LINE_STATE с параметром 3 порт открыт, можно слать привествие. После прихота этого же запроса с другим значением параметра или после установки конфигурации 0 - порт закрыт.

Параметр 3 - это при наличии DTR со стороны хоста.

И если большинство "обычных" софтин поднимают его, то нежно любимый мной Bray Terminal оставляет его на усмотрение пользователя. И по умолчанию он там выключен...

 

Подскажите, установка конфигурации 0 - это закрытие виртуального порта, или отсоединение устройства?

Если первое, то флажок "connected" можно ставить по любому SET_CONTROL_LINE_STATE.

Давно собираюсь переделать свою реализацию...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация