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

STM32 и USB

 

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

 

Работать с 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 устройства в Хост.

Но что-то никак не получается... :(

 

"Люди добрые ! Поможите чем можете ! (с)

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

 

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

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


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

1) выкинуть кал!

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

 

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

Изменено пользователем Эдди

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


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

Любой вывод на выход, с него резистор 1.5К на D+

Ставите его в 0, пауза, в 1.

Начинается нумерация.

Хоть через HAL, SPL - не в них дело.

Примеры можно посмотреть USB CDC для понимания, что бы тупо не делать.

 

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


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

Любой вывод на выход, с него резистор 1.5К на D+

Ставите его в 0, пауза, в 1.

Начинается нумерация.

 

Попробовал - не помогло.

Полазив по буржуйским форумам нашел кучу решений, но все из них зависят от конкретной "борды" и МК.

Причём в одних случаях через транзистор и резистор в 1.5К одни сажают D+ на "землю" - другие на шину питания :cranky:

Сочленил вот такую схему:

 

 

USB_Renumer.jpg

 

Теперь заработало. Видимо не хватало "мощщи" дабы посадить канал 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 мс.

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

Тем не менее он имеет место и им пользуются... :)

 

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

 

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

Заранее благодарен.

 

 

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

 

P.P.S.

 

Любой вывод на выход, с него резистор 1.5К на D+

 

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

 

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

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


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

Как уже написали: 1.5K на D+ с подтяжкой к +3.3V

далее программно переключам порт на OpenDrain, подтягиваем к 0V на 2сек, и инициализируем порт как USB.

Будет счастье. Не надо никаких дополнительных телодвижений.

Доточенный под STM32F103 пример: https://github.com/open-plc-com/firmwares/t.../USB-VCP_Sample

 

 

1) выкинуть кал!

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

 

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

Млин... Ну что вы так уперлись в дополнительную обвеску?! А инициализировать порт как OpenDrain, установить его в 0, пауза, снова инициализировать как USB - религия не позволяет?

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


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

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

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

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

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

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

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

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

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

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