Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F4, UART и заваленные фронты сигнала
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Я.К.
Есть проблема: я хочу воспользоваться UART'ом на частоте 1МБод, но из-за заваленных фронтов сигнала ничего не выходит.

Что я делал?
- Есть у меня плата STM32F429-DISC0.
- Я создал болванку проекта с помощью STM32Cube,
- выбрал там 180 МГц частоты,
- включил UART5,
- выставил ему режим Single Wire (Half Duplex),
- да назначил 1000000 бод скорости,
- и даже скорость GPIO поставил HIGH.

В тестовой программке я просто и без затей посылаю 0x55 по этому самому UART'у.
Вроде бы, ломаться тут нечему, но не тут-то было: фронты UART-сигнала завалены просто в хлам: длительность фронта как раз и составляет примерно 1 мкс.

Нажмите для просмотра прикрепленного файла

Имею спросить: как бы мне это забороть?

P.S. Тестовый проект прилагается: Нажмите для просмотра прикрепленного файла

P.P.S. Cнизить скорость UART'а, не могу: то устройство, с которым мне надо общаться, работает именно на 1МБод.
adnega
А на каких пинах висят RXD и TXD UART5?
Я.К.
Цитата(adnega @ Feb 19 2016, 20:13) *
А на каких пинах висят RXD и TXD UART5?


Режим полудуплексный, используется только пин PC12.
adnega
Нашел: GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
Поставьте резисторы подтягивающие.
Огурцов
на каком то уарте висит конденсатор от юсб
Я.К.
Цитата(Огурцов @ Feb 19 2016, 22:43) *
на каком то уарте висит конденсатор от юсб


Вы знаете, я сегодня пробовал переключиться на USART1, но картина от этого не менялась.
iosifk
Цитата(Я.К. @ Feb 19 2016, 20:03) *
Есть проблема: я хочу воспользоваться UART'ом на частоте 1МБод, но из-за заваленных фронтов сигнала ничего не выходит.

А если убрать UART и портом просто управлять напрямую программно, то какие будут фронты? И какой стандарт порта и какая нагрузочная способность?
Я.К.
Цитата(adnega @ Feb 19 2016, 20:16) *
Нашел: GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
Поставьте резисторы подтягивающие.


В смысле, достать паяльник и аппаратно припаять 1 кОм, который будет подтягивать к логической единице? Или вы имеете в виду, что-то более человечное??
Огурцов
Цитата(Я.К. @ Feb 19 2016, 20:45) *
Вы знаете, я сегодня пробовал переключиться на USART1, но картина от этого не менялась.

на первом он и висит, только я не помню, на каком пине
если у вас на разных пинах кажет одно и то же, то это либо нагрузка - отключайте, либо осциллограф
adnega
Цитата(Я.К. @ Feb 19 2016, 23:02) *
В смысле, достать паяльник и аппаратно припаять 1 кОм, который будет подтягивать к логической единице? Или вы имеете в виду, что-то более человечное??

Или настраивайте как push-pull.
Вам открытый коллектор нужен вообще?
Огурцов
Цитата(Я.К. @ Feb 19 2016, 21:02) *
человечное

GPIO_OType_PP

Я.К.
Цитата(adnega @ Feb 19 2016, 23:07) *
Или настраивайте как push-pull.
Вам открытый коллектор нужен вообще?


Боюсь, именно он-то мне и нужен: у меня полудуплексный UART (т.е. один и тот же порт и пишет с МК на периферийное устройство, и потом читает его ответ).

Цитата(Огурцов @ Feb 19 2016, 23:10) *
GPIO_OType_PP


В HAL-драйвере это GPIO_MODE_OUTPUT_PP?
Огурцов
не знаю, в хел - без меня
ViKo
Цитата(Я.К. @ Feb 20 2016, 00:05) *
Боюсь, именно он-то мне и нужен: у меня полудуплексный UART (т.е. один и тот же порт и пишет с МК на периферийное устройство, и потом читает его ответ).

Не одновременно же. Делайте PP выход. Передали, и на вход переключайтесь.
Там встроенные PU резисторы немалые, а емкость у линии связи и входов и выходов имеется.
adnega
Ну, или скорость понижать многократно.
Кста, при работе в полудуплексном режиме UART-у нужно как-то сообщать о намерении передавать/получать?
Дергать направление GPIO - какое-то мутное решение.
Ruslan1
Я.К., правильно Вам про открытый коллектор и подтяжку говорят.
емкость самого пина - 5 pF, максимальное сопротивление подтягивающего резистора- 55 kOhm.

тау = RC = 5e-12*55e3= 0.28 мкс

То есть это если Вы идеальным осциллографом на неподключенном ни к чему пине МК будете измерять.
Ну а у Вас наверняка сильно больше чем 5 pF (проводник на плате, подключенный приемник, осциллограф...)

Природу не обманешь, в плюс тоже нужно тянуть.
Нужно или припаивать внешний подтягивающий резистор, чтобы обеспечить Тау меньше шести длительностей (это чтобы 3*тау было раньше середины, в которой приемник USART хватает бит), или включать полный пуш-пул.
veteq
Судя по картинке, как будто-то щуп осциллографа без делителя, а значит фронты заваливаются самим щупом осциллографа. Такие сигналы лучше смотреть с делителем.
Tarbal
Цитата(adnega @ Feb 20 2016, 12:24) *
Ну, или скорость понижать многократно.
Кста, при работе в полудуплексном режиме UART-у нужно как-то сообщать о намерении передавать/получать?
Дергать направление GPIO - какое-то мутное решение.


Ничуть не мутное. За этим решением такие небывалые возможности. Однажды я делал на 16 пике с 13 GPIO клавиатуру. Делал на трех разных: PIC16C711, PIC16C622 и еще какой-то похожий.
Подключали до 16 кнопок, до 16 светодиодов. Динамик -- один GPIO, два GPIO на связь, один на подсветку. И еще два инфракрасных обнаружителя движения подключали.

Все благодаря манипуляциям с направлением.
ViKo
Цитата(Tarbal @ Feb 22 2016, 06:48) *
Ничуть не мутное. За этим решением такие небывалые возможности. Однажды я делал на 16 пике с 13 GPIO клавиатуру. Делал на трех разных: PIC16C711, PIC16C622 и еще какой-то похожий.
Подключали до 16 кнопок, до 16 светодиодов. Динамик -- один GPIO, два GPIO на связь, один на подсветку. И еще два инфракрасных обнаружителя движения подключали.

Все благодаря манипуляциям с направлением.

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

Цитата(veteq @ Feb 22 2016, 00:25) *
Судя по картинке, как будто-то щуп осциллографа без делителя, а значит фронты заваливаются самим щупом осциллографа. Такие сигналы лучше смотреть с делителем.

А срезы не заваливаются. Чудеса?
adnega
Цитата(Tarbal @ Feb 22 2016, 06:48) *
Все благодаря манипуляциям с направлением.

Обращаю внимание, что в STM32 регистр, отвечающий за направление вывода не имеет атомарного доступа.
Повальное увлечение переключением направления может решить задачу, но приведет к проблеме монопольного доступа.
Для модуля GPIO есть механизм фиксации настроек порта (GPIO locking mechanism), который защелкнет также и направление вывода.
Это еще один намек, что "тут так не делается - ищите другой путь".

Цитата
the TX pin is always released when no data is transmitted. Thus, it acts as a standard
I/O in idle or in reception. It means that the I/O must be configured so that TX is
configured as floating input (or output high open-drain) when not driven by the USART.
ViKo
Цитата(adnega @ Feb 22 2016, 10:59) *
Обращаю внимание, что в STM32 регистр, отвечающий за направление вывода не имеет атомарного доступа.
Повальное увлечение переключением направления может решить задачу, но приведет к проблеме монопольного доступа.

А bit-band?! Достаточно изменить записать один младший бит MODERy[1:0], и вход превращается в выход.
adnega
Цитата(ViKo @ Feb 22 2016, 11:13) *
А bit-band?! Достаточно изменить записать один младший бит MODERy[1:0], и вход превращается в выход.

На F4 возможно. Но есть Cortex-M0, где нет bit-band вообще.
И есть F3, где bit-band в наличии, но GPIO не попадает регион памяти, для которого эта фича возможна.
Я раньше и сам использовал bit-band для GPIO, но на F3 обжегся, зарекся и теперь никому не советую sm.gif
Tarbal
Цитата(ViKo @ Feb 22 2016, 07:40) *
А срезы не заваливаются. Чудеса?


Дык с открытым коллектором всегда так.

Цитата(adnega @ Feb 22 2016, 10:59) *
Обращаю внимание, что в STM32 регистр, отвечающий за направление вывода не имеет атомарного доступа.
Повальное увлечение переключением направления может решить задачу, но приведет к проблеме монопольного доступа.
Для модуля GPIO есть механизм фиксации настроек порта (GPIO locking mechanism), который защелкнет также и направление вывода.
Это еще один намек, что "тут так не делается - ищите другой путь".


Да ясно что не так. Открытый коллектор не для таких скоростей.
ViKo
Цитата(Tarbal @ Feb 22 2016, 22:40) *
Дык с открытым коллектором всегда так.

Да, правильно. Хотя такие сигналы можно получить и из-за емкости самой цепи.
vlad_new
в ф4, да и во всех других стм-ах есть би директ режим в уартах. я пользую этот режим. прекрасно работает по 1 проводу. Если надо именно ок. то тут уже всё что нужно было сказано.
Я.К.
Цитата
Я.К., правильно Вам про открытый коллектор и подтяжку говорят.
емкость самого пина - 5 pF, максимальное сопротивление подтягивающего резистора- 55 kOhm.

тау = RC = 5e-12*55e3= 0.28 мкс

То есть это если Вы идеальным осциллографом на неподключенном ни к чему пине МК будете измерять.
Ну а у Вас наверняка сильно больше чем 5 pF (проводник на плате, подключенный приемник, осциллограф...)

Природу не обманешь, в плюс тоже нужно тянуть.
Нужно или припаивать внешний подтягивающий резистор, чтобы обеспечить Тау меньше шести длительностей (это чтобы 3*тау было раньше середины, в которой приемник USART хватает бит), или включать полный пуш-пул.



В общем и целом, я просто и без затей добавил внешний пулл-ап: подключил ножку PC12 к 5В через 1Kом. И фронты перестали валиться.

Теперь, правда, у меня другая беда, но это уже совсем другая история...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.