реклама на сайте
подробности

 
 
> STM32 и USB, Перезапуск хоста со стороны МК
manul78
сообщение Feb 16 2018, 20:22
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 403
Регистрация: 14-05-07
Из: Россия, г.Пенза
Пользователь №: 27 719




День добрый всем !

Работать с STM32 я начал недавно, поэтому сильно не пинайте.

Суть такая: Есть МК stm32f103c8t6. В процессе настройки программы я использовал UART и переходник-мост USB-COM. Но ведь на борту имеется
USB модуль. Взял шаблон из библиотеки и организовал в контроллере CDC устройство, то бишь Виртуальный COM порт. Всё работает, всё нормально.
Единственная загвоздка, что каждый раз после сброса МК он перегружается, а вот хост на компе нет. Поэтому приходиться тупо выключать и обратно включать тем самым проводить повторную энумерацию и т.д. Физически.
Мне это надоело, постоянно вынимать и опять вставлять штекер разъёма. На Мегах АВР с USB всё было много проще. Функции Attach() и Detach(). С библиотеками для STM32 всё сложнее. Никак не могу организовать программно со стороны МК подключение к компу заново.
Нашёл в библиотеках STM32 функции

Код
@brief  Connect the USB device
  * @param  hpcd: PCD handle
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_PCD_DevConnect(PCD_HandleTypeDef *hpcd)
{
  __HAL_LOCK(hpcd);
  HAL_PCDEx_SetConnectionState (hpcd, 1);
  USB_DevConnect(hpcd->Instance);
  __HAL_UNLOCK(hpcd);
  return HAL_OK;
}

/**
  * @brief  Disconnect the USB device
  * @param  hpcd: PCD handle
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_PCD_DevDisconnect(PCD_HandleTypeDef *hpcd)


Вроде как аналоги Attach() и Detach(). В мануале сказано, что HAL_PCD_DevDisconnect() даёт команду хосту на отключение, затем надо сделать паузу не менне 5 мс, далее вызываем HAL_PCD_DevConnect() и хотст проводит новую процедуру энумерации, как было-бы если я тупо вынул и вставил по новой штекер USB устройства в Хост.
Но что-то никак не получается... sad.gif

"Люди добрые ! Поможите чем можете ! (с)
Может я чего не понимаю, или криво делаю. Если есть примеры кода - напишите пожалуйста. Без разницы, хоть в прямом доступе к регистрам, хоть SPL, HAL или LL... Мне главное суть присходящего понять, и вообще возможно-лт это ?

Заранее благодарен за ответы.


--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
Эдди
сообщение Feb 16 2018, 20:43
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



1) выкинуть кал!
2) зависит от модели (скажем, у 042 есть внутренняя подтяжка на DP), у 103 подтяжки нет, поэтому нужно добавить мосфетик (самый простецкий - копеек за 30), который будет 1.5кОм на DP включать/выключать.

P.S. Извиняюсь, речь о хосте (думал, о девайсе). Процесс енумерации можно запустить по требованию, главное - использовать нормальный стек USB, а не универсальную дрянь от ST!

Сообщение отредактировал Эдди - Feb 16 2018, 20:44
Go to the top of the page
 
+Quote Post
x893
сообщение Feb 16 2018, 21:25
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Любой вывод на выход, с него резистор 1.5К на D+
Ставите его в 0, пауза, в 1.
Начинается нумерация.
Хоть через HAL, SPL - не в них дело.
Примеры можно посмотреть USB CDC для понимания, что бы тупо не делать.
Go to the top of the page
 
+Quote Post
manul78
сообщение Feb 17 2018, 21:16
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 403
Регистрация: 14-05-07
Из: Россия, г.Пенза
Пользователь №: 27 719



Цитата(x893 @ Feb 17 2018, 00:25) *
Любой вывод на выход, с него резистор 1.5К на D+
Ставите его в 0, пауза, в 1.
Начинается нумерация.


Попробовал - не помогло.
Полазив по буржуйским форумам нашел кучу решений, но все из них зависят от конкретной "борды" и МК.
Причём в одних случаях через транзистор и резистор в 1.5К одни сажают D+ на "землю" - другие на шину питания cranky.gif
Сочленил вот такую схему:




Теперь заработало. Видимо не хватало "мощщи" дабы посадить канал D+ на землю как следует.
Но это зависит от Хоста или от конкретной входной схемы платы МК. Ваше решение вполне может работать на конкретно вашей плате.

Покопавшись еще в сети нашел еще один "метод", в котором даже лишний пин использовать не надо и вообще никакой обвязки...

Цитата
Currently when the STM32 is reset, its USB peripheral doesn't re-enumerate. According to this GitHub project, we could do this using some GPIO tricks :

On "generic" boards, the USB reset (to force re-enumeration by the host), is triggered by reconfiguring USB line D+ (PA12) into GPIO mode, and driving PA12 low for a short period, before setting the pin back to its USB operational mode. This system to reset the USB was written by @Victor_pv. Note. It is not guaranteed to work on all "generic" STM32 boards, and relies on PA12 having a pull-up resistor of around 1.5k - however most "generic" boards seem to have this. Its unclear if this method to reset the USB bus conforms precisely to the USB standard, but it seems to work fine on all PC's and Mac's (and Linux boxes) on which its been tested - and seems usable for hobby / non commericial / non-critical systems.


И его попробовал. Всё работает. Программно переключаем пин порта PA12 на ВЫХОД с Открытым стоком и сажаем USB D+ тупо на землю на 500 мс.
Но я данный метод считаю варварским ибо тупо сажать канал на землю, по типу КЗ не есть гуд.
Тем не менее он имеет место и им пользуются... sm.gif

Всем спасибо за помощь !

Если кому-то знакомы более цивилизованные методы (как пишут выше, используя свой USB стек) прошу поделиться.
Заранее благодарен.


P.S. Сижу ржу... В первом случае зачем-то повесил резистор на 1.5К, если в случае конфигурации порта как выход с открытым стоком - в случае А) Выход в Hi-Z состоянии, а в случае Б) линия USB D+ (PA12) тупо стекает накоротко на землю. sm.gif Резистор нужен тут как собаке пятая нога... sm.gif От него только лишняя помеха на линии... sm.gif

P.P.S.

Цитата(x893 @ Feb 17 2018, 00:25) *
Любой вывод на выход, с него резистор 1.5К на D+


Уменьшил резистор до 500 Ом - заработало...


Сообщение отредактировал manul78 - Feb 17 2018, 21:35


--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
Go to the top of the page
 
+Quote Post
leocat
сообщение Apr 16 2018, 03:01
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 109
Регистрация: 12-10-16
Пользователь №: 93 727



Как уже написали: 1.5K на D+ с подтяжкой к +3.3V
далее программно переключам порт на OpenDrain, подтягиваем к 0V на 2сек, и инициализируем порт как USB.
Будет счастье. Не надо никаких дополнительных телодвижений.
Доточенный под STM32F103 пример: https://github.com/open-plc-com/firmwares/t.../USB-VCP_Sample


Цитата(Эдди @ Feb 16 2018, 20:43) *
1) выкинуть кал!
2) зависит от модели (скажем, у 042 есть внутренняя подтяжка на DP), у 103 подтяжки нет, поэтому нужно добавить мосфетик (самый простецкий - копеек за 30), который будет 1.5кОм на DP включать/выключать.

P.S. Извиняюсь, речь о хосте (думал, о девайсе). Процесс енумерации можно запустить по требованию, главное - использовать нормальный стек USB, а не универсальную дрянь от ST!

Млин... Ну что вы так уперлись в дополнительную обвеску?! А инициализировать порт как OpenDrain, установить его в 0, пауза, снова инициализировать как USB - религия не позволяет?
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 18:00
Рейтинг@Mail.ru


Страница сгенерированна за 0.01389 секунд с 7
ELECTRONIX ©2004-2016