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

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

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

Совершенно верно. Я об этом и говорил много постов в этом топике.

 

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


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

Vbus я опрашиваю.

if (hUsbDevice_0 == 0) то шнурок отключен

Чем эта не нравится:

if( (hUsbDeviceHS.dev_state==USBD_STATE_CONFIGURED) ){

 

}

?

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


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

Столкнулся с еще одной проблемой USB.

Когда подключен шнурок USB и есть напряжение Vbus и выполняется условие hUsbDeviceHS.dev_state==USBD_STATE_CONFIGURED. И при этих условиях передавать данные на пк без открытого терминала COM порта (просто шлем данные). То через некоторое время микроконтроллер зависает. Функция передачи while(CDC_Transmit_HS(p ,strlen (text)) != USBD_OK); выдает USBD_BUSY. Но если в терминале нажать conect то все нормально.

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


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

Но если в терминале нажать conect то все нормально.

а что посылает терминал при нажатии connec?

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


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

а что посылает терминал при нажатии connec?
данные вываливает (терминал). И программа (зашитая в микроконтроллер), дальше продолжает работать, все нормально. Я так думаю какие-то массивы данных переполняются.

Хочу еще узнать, что за:

/* Device Status */

#define USBD_STATE_DEFAULT 1

#define USBD_STATE_ADDRESSED 2

#define USBD_STATE_CONFIGURED 3 // эта знаю для чего

#define USBD_STATE_SUSPENDED 4

ни где не смог найти для чего они нужны. Может в них разгадка.

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


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

#define USBD_STATE_DEFAULT 1 - это исходное состояние USB-device, устанавливается при инициализации и остаётся таковым до подключения к хосту

#define USBD_STATE_ADDRESSED 2 - промежуточное состояние при подключении, хост уже установил адрес, но ещё не передал конфигурацию

#define USBD_STATE_SUSPENDED 4 - по названию понятно, что перевод в некое остановленное состояние, но не знаю в каких случаях хост выполняет перевод подключенного девайса в состояние suspend и выводит из этого состояния (resume), у меня при работе с CDC такое состояние не возникало

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


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

Я так думаю какие-то массивы данных переполняются.

Мне кажется, вы не совсем понимаете парадигму работы USB. Устройство не передаёт данные хосту! Оно кладёт данные у себя в "заветную нычку" (конечную точку) и ждёт пока хост их сам заберёт. Если забрал, то можно ещё положить. Если не забирает, то накапливайте данные вне "нычки" или выкидывайте, тут уж вам решать сколько данные "не протухают".

 

Хочу еще узнать, что за:

/* Device Status */

#define USBD_STATE_SUSPENDED 4

Это когда хост не проявляет никакой активности на шине. Например, устройство отключили в диспетчере устройств. Можно переводить процессор в режим энергосбережения. Если не стоит задача микроамперы ловить, то можно забить. Хост сам даст RESET когда захочет с вами поработать.

 

#define USBD_STATE_SUSPENDED 4 - по названию понятно, что перевод в некое остановленное состояние, но не знаю в каких случаях хост выполняет перевод подключенного девайса в состояние suspend и выводит из этого состояния (resume), у меня при работе с CDC такое состояние не возникало

Это состояние более низкого уровня. Выход из SUSPEND происходит через RESUME, RESET и Enumeration. Пока "жив CDC" не может быть суспенда.

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


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

Вот я нарвался... Как писал выше - определял открытие порта по 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 встречается вот такая фраза:

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, но там и защиты нет, а без защиты все работает. Естетсвенно, у меня в схеме этого делителя не было. В общем не повторяйте моих ошибок.

 

Весь день убил. Теперь ночью придется делать то, что должен был делать днем.

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


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

... сборка USBLC6 ...

... делитель из резисторов 47 кОм и 68 кОм, но нигде в описании ни единого слова о его предназначении...

 

Аналогичная ситуация.

У меня на делитель заводится питание с USB разъема.

Делитель подключен к контроллеру для определения подключили/отключили разъем.

То же долго не мог понять почему при отключении разъема на делителе "висит" 2V.

В результате было сделано так:

USB VCC -> делитель -> диод -> и только потом питание от USB идет на питание USB сборки и питание схемы.

В этом случае при выдергивании шнурка процессор "не продавливает" через сборку делитель.

 

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


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

USB VCC -> делитель -> диод ->
Я тоже сначала думал про диод, но потом нашел AN4879 и понял, что делителя будет достаточно. У меня включена нижняя подтяжка на Vbus, поэтому оазалось достаточно резистора 10 кОм последовательно в цепи Vbus между USBCL6 и процессором.

 

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


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

... резистора 10 кОм последовательно в цепи Vbus между USBCL6 и процессором.

 

Себе для заметки на будущее.

Не совсем понял в каком месте.

Можете пояснить?

 

 

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


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

У меня на входе USB стоит защитная сборка USBLC6. Выпаиваю USBLC6 - все работает. Впаиваю - на Vbus зависает 2 вольта

Я использую NUF2042XV6T1G, с ней таких проблем нет.

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


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

Не совсем понял в каком месте.

Можете пояснить?

post-17095-1533561453_thumb.png

И внутри включаем подтяжку вниз. Она по документации 40 кОм, но у меня измерения на трех платах показывают 2.8 В на входе Vbus после резистора 10 кОм, т.е. реально сопротивление внутренней подтяжки около 15 кОм. Ну или ставить там полноценный делитель 47 кОм и 68 кОм, как нарисовано в AN4879 и внутреннюю подтяжку не включать.

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...