LINUX.ORG.RU

«Правильное» подключение USB к STM32F103

 , ,


1

1

Фырочки всем.
Играюсь с Blue Pill'ом на тему передачи всякого по USB; при сбросе контроллера десктоп не теряет соединение с ним (в dmesg вообще ничего не появляется), и до перевтыка кабеля интерфейс подвисает - в /dev остаётся его узел, но как-то юзать его бессмысленно.
Интернет-хомячки сказали, что это происходит из-за особенности чипов 103 серии, не имеющих втроенной подтяжки D+ вверх и топорном дизайне Blue Pill'a, «железно» подтягивающего эту линию, даже когда МК очевидно сброшен и не может использовать USB.
В даташите указано, что для функционирования USB действительно нужен внешний резистор, но не приведено примеров «правильного» подключения для, например, возможности дебага без постоянного переподключения кабеля.
Как правильно реализовать сие в железе? Просто завести подтяжку на любой свободный пин и дёргать им вручную? Или HAL сам умеет делать такое? Или у чипа есть вывод, который можно на такую функцию сконфигурировать?

Просто завести подтяжку на любой свободный пин и дёргать им вручную?

This.

CYB3R ★★★★★
()

При инициализации сначала конфигурируешь ножку PA12 на выход, переключаешь в ноль и ждёшь чуть-чуть. Потом возвращаешь в аналоговый вход и инициализируешь периферию USB. Тогда всё отлично энумерируется заново при сбросе.

Вот как здесь, например.

Beewek ★★
()
Ответ на: комментарий от Beewek

Видел такое, но это ж прямой путь к КЗ, если хост что-то передавать надумает. Согласующих резисторов для ограничения тока явно недостаточно.

izzholtik ★★★
() автор топика
Ответ на: комментарий от izzholtik

Там есть резисторы в линии (по 22 ома). Так что не коротнёт.

Я этот способ подсмотрел, если мне не изменяет память, в их родном загрузчике.

Beewek ★★
()
Ответ на: комментарий от izzholtik

USB хостам такое норм. Согласующих резисторов достаточно для того, чтобы не случилось токового пробоя ключей (если бы не было других защит, а они у хоста есть, плюс само внутреннее сопротивление слаботочных ключей достаточно высокое), а нескольких миллисекунд не достаточно для перегрева никакого ключа при таких маленьких токах. К тому же по стандарту хосты должны переживать замыкание любых линий кабеля в течении не менее 24 часов (защита от плохих кабелей).

KivApple ★★★★★
()
Ответ на: комментарий от KivApple

Да так-то вопрос даже не в том, «как», а в том, «как правильно, чтобы не полагаться на защиту хоста» и «нет ли штатного функционала для аппаратного сброса шины».

izzholtik ★★★
() автор топика
Ответ на: комментарий от Beewek

Да, смотрел.
Почему у них 10К подтяжка стоит алсо? По интернетам куча тем с глючащим USB, фиксящимся перепайкой на стандартный..

izzholtik ★★★
() автор топика
Последнее исправление: izzholtik (всего исправлений: 1)
Ответ на: комментарий от izzholtik

вопрос даже не в том, «как», а в том, «как правильно

Если уж совсем правильно, то надо делать как у олимекса вот в STM32-H103. Но я бы стал такое делать только в серийном изделии, и то подумал бы.

Beewek ★★
()
Ответ на: комментарий от izzholtik

Тебе не нужно полагаться на защиту хоста. Всё очень просто - слаботочные ключи не способы выдать большой ток из-за высокого внутреннего сопротивления.

Вот пример от другого контроллера: https://www.silabs.com/content/usergenerated/asi/cloud/attachments/siliconlab...

Аналогичная ситуация и для AVR, и для STM32, и для примёмопередатчика хоста (может быть вариация в 2-3 раза). Даже самое настоящее короткое замыкание не позволит току превысить несколько десятков миллиампер. Тебе будет очень сложно найти МК с такими мощным ключом на рядовом GPIO (по банальной причине - мощный ключ, да на 480 МГЦ (USB High Speed) значительно удорожит чип, но дорогой чип уж точно будет оснащён защитами, требуемыми стандартом USB). А тут оно даже не короткое, а через гарантированные 22 ома.

Токовый пробой таким образом получить невозможно чисто технически. В самом плохом сценарии - перегрев. Но на токах в десятки ма перегрев займёт многие секунды, если не минуты.

А тебе надо притянуть к земле на субсекундный срок.

KivApple ★★★★★
()
Последнее исправление: KivApple (всего исправлений: 2)
Ответ на: комментарий от Beewek

maple mini и blue pill таки отличаются. у maple mini подтяжка заведена не напрямую на плюс, а управляется и PB9 и USB питанием.

NiTr0 ★★★★★
()
Ответ на: комментарий от NiTr0

maple mini и blue pill таки отличаются. у maple mini подтяжка заведена не напрямую на плюс, а управляется и PB9 и USB питанием.

Это подтяжка «вверх». А мы сейчас обсуждаем как притянуть D+ «вниз» при инициализации USB. Для этого в maple mini (в загрузчике) делают как я написал - переключают ножку D+ в режим GPIO, и кратковременно подают на неё ноль. И это отлично работает.

Beewek ★★
()

Для своих поделок ты можешь пуллап прицепить к любой свободной ноге. Без мосфета! Проверено, это работает.

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

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Beewek

Правильней на ногу, которой ты управляешь подтяжкой 1.5к, при инициализации кратковременно подать 0. В этом случае и ток небольшой будет (через 1.5кОм-то!), и хост поймет, что устройство отключилось.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

О, пасиб. Мне как раз очень лень стало искать, куда можно припаять на плате.

izzholtik ★★★
() автор топика
Ответ на: комментарий от izzholtik

Её разве хост вниз не тянет?

Хост тянет вниз через резистор 15К. Устройство тянет вверх через 1.5К. (на blue pill запаян резистор 10К, это неправильно, но работает). 1.5К побеждает, хост видит на D+ единичку, и понимает, что есть устройство.

Нам нужно, чтобы при сбросе (при старте/рестарте программы) подтяжка 1.5К кратковременно отключалась. Но она у нас не отключается, поэтому мы вместо отключения замыкаем D+ на землю. Хост видит, что устройство отключилось. Потом мы отключаем D+ от земли, подтяжка снова тянет D+ вверх, хост находит наше устройство, происходит энумерация.

Можно спокойно отлаживать прошивку без передёргивания. (И без перепайки).

Beewek ★★
()
Последнее исправление: Beewek (всего исправлений: 1)
Ответ на: комментарий от Beewek

Но лучше все же выкинуть этот неправильный R10 на 10кОм и впаять вместо него 1.5кОм между ногами А12 и А15. Резистор 0603 идеально между лап гребенки вписывается. Далее в AFIO->MAPR устанавливаем бит AFIO_MAPR_SWJ_CFG_JTAGDISABLE и можно дергать подтяжку этой ногой. Ну, а на "правильных" своих платах уже вешать либо специальный транзистор с внутренней подтяжкой и резистором на базу, либо маленьким p-мосфетиком подтяжку включать.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Правда, я больше STM32F0 люблю, поэтому здесь у меня только одна железка, для которой изготавливалась печатная плата (хронометр), все остальное — на основе "синей таблетки" в виде прототипов/сниппетов.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от izzholtik

ЕМНИП так было в первых версиях и потом они всё исправили. Но китайцы начали клонить первую версию. Сейчас уже выпускаются с нормальным резистором и у некоторых китайцев уже можно нормальную версию найти (у меня уже норм).

PPP328 ★★★★★
()
Ответ на: комментарий от Eddy_Em

Но лучше все же выкинуть этот неправильный R10 на 10кОм и впаять вместо него 1.5кОм между ногами А12 и А15

У меня этих blue pill штук шесть в наличии. Часть собраны в различные макеты, часть вставлена в бредборды для проверки небольших кусков. Все перепаивать - лень, да и смысла не вижу. И так работает.

Beewek ★★
()
Ответ на: комментарий от Beewek

зачем заниматься техноонанизмом с неизвестным результатом, если можно сделать нормально подтяжку вверх?

максимальный ток пина - 25 мА. сопротивление канала нижнего плеча выхода - менее 65 Ом (при 20 мА токе напряжение на пине не более 1.3В). итого при подаче на D+ 3.3В от мертвого хаба через пин потечет ток 38 мА, что более чем в полтора раза превышает максимально допустимый.

не, может МК и выживет. а может и поджарится…

NiTr0 ★★★★★
()
Ответ на: комментарий от NiTr0

итого при подаче на D+ 3.3В от мертвого хаба через пин потечет ток 38 мА

Подавай уж сразу 220В, если начал фантазировать. Чего мелочиться.

Но даже если будет 38мА (хотя откуда им взяться, если макс. ток, который может выдать пин, 20ма?), то за пару микросекунд не сгорит.

Beewek ★★
()
Ответ на: комментарий от Beewek

хотя откуда им взяться, если макс. ток, который может выдать пин, 20ма?

а вы не пробовали внимательно прочитать даташит, а не брать первую показавшуюся знакомой цифру из него? :)

20 мА - это максимальный ток, который может протекать длительно через пин при нормальной работе. и при этом напряжение на пине будет ниже 1.3В, да. если напряжение на пине сделать выше - то и ток, внезапно, будет больше. вот только чипу это сильно не понравится (пушо в absolute maximal ratings - 25 мА на пин).

NiTr0 ★★★★★
()
Ответ на: комментарий от Eddy_Em

Правда, я больше STM32F0 люблю

Это потому что мы с тобой олд-скул, Эдик …

Владимир

anonymous
()

без постоянного переподключения кабеля

короти D+ (pa12) на землю проводком

anonymous
()
Ответ на: комментарий от NiTr0

а вы не пробовали внимательно прочитать даташит, а не брать первую показавшуюся знакомой цифру из него? :)

А ты не пробовал читать сообщение полностью? Я там даже на 38 мА согласился. Это неважно. Не сгорит.

Сейчас специально для умников сделал замер - подал на ногу PA12 лог. ноль и замкнул её на +3.3В. Типа, «мертвый хаб». Ток получился 45 мА. Подождал 3 минуты - ничего не сгорело. На этом для себя посчитал эксперимент законченным.

Для самых умников повторю: речь не о промышленном оборудовании, а о наколенной поделке на blue pill.

Beewek ★★
()
Ответ на: комментарий от Beewek

Подождал 3 минуты - ничего не сгорело.

повезло. пушо даташит английским по белому говорит в absolute maximum ratings - максимальный ток вывода 25 мА. и да, я не один st-link (в котором, внезапно, stm32f10x) случайно спалил, замкнув ему по ошибке контакты…

NiTr0 ★★★★★
()
Ответ на: комментарий от Beewek

Сейчас специально для умников сделал замер

ну тогда, специально для тех же умников сделай ещё замер тока в розетке. только сохранись перед экспериментом.

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

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.