Jump to content

    
Sign in to follow this  
Alex_Golubev

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

Recommended Posts

Привет.

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
Что вы думаете о такой конструкции ?

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

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

 

Share this post


Link to post
Share on other sites
Ничего не думаю. Чисто по протоколу, по моему, не возможно отследить отключение устройства.

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
После прихода в 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 by Alex_Golubev

Share this post


Link to post
Share on other sites
Вот я также думаю, но можно подстраховаться 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 должна быть заведена в МК.

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
prottoss все работает я конечно еще протестирую, но сегодня у меня все работало.

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

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

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

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

 

Share this post


Link to post
Share on other sites
Какой смысл что-то слать, если на той стороне порт не открыт и данные забирать некому?

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

 

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

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

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

 

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

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

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

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this