Jump to content

    
Sign in to follow this  
Neo_Matrix

stm32f407 отслеживание логического нуля на UART

Recommended Posts

2 минуты назад, mantech сказал:

Ну как же? А прерывание по приему символов с установленным флагом ошибки кадра до тех пор, пока на линии висит 0?

Ошибка кадра приходит единожды при изменении сигнала в 0.

 

3 минуты назад, jcxz сказал:

Так можно сделать, если сразу после завершения длинного 0, всегда идёт пауза не менее этих самых 0.5-0.7 мс. А нормальные байты начинают идти только после этой паузы. 

Пауза может быть или не быть :)) Неизвесно

Share this post


Link to post
Share on other sites
4 минуты назад, Neo_Matrix сказал:

По идее можно после LBD флага запустить таймер и EXTI на подъем сигнала. Далее можно понять был ли перепад за время таймера(100мс)

Если оно включится при работающей функции "UART" - можно.

Share this post


Link to post
Share on other sites
3 минуты назад, jcxz сказал:

В тех UART, с которыми я имел дело, оно срабатывало 1 раз - когда счётчик битов достигал стоп-бита, и там оказывался 0. После этого ноль может стоять сколь угодно долго - ничего не генерится до следующего старта.

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

Share this post


Link to post
Share on other sites
1 минуту назад, Neo_Matrix сказал:

Нужно попробовать.

В Infineon-ах (XMC4xxx) входных функций на одну ногу можно использовать любое количество - при программировании режима ноги программируется только выходная функция. А входные функции на программируют режим ноги, поэтому можно использовать хоть сразу все, что есть на ноге - и UART.RX и таймер и ещё что угодно.

Share this post


Link to post
Share on other sites
2 минуты назад, jcxz сказал:

можно использовать хоть сразу все,

Наверно и здесь так, ибо проще схемотехнически... Тогда и реинит не нужен.

Edited by mantech

Share this post


Link to post
Share on other sites
6 минут назад, mantech сказал:

В таком случае можно пойти 2мя способами - цикл получаем ошибку кадра, затем реинит уарта,

Вы невнимательно читаете. Я чуть выше, что так работать не будет. Ибо не будет "старт-бита". Старт-бит - это переход 1->0 и затем 1 или 3 проверки в середине битового интервала. Без перехода 1->0 не запустится таймер  вычисляющий середину бита -> не будет старт-бита. Можете сколько угодно реинитить.

Share this post


Link to post
Share on other sites
4 минуты назад, jcxz сказал:

Ибо не будет "старт-бита". Старт-бит - это переход 1->0 и затем 1 или 3 проверки в середине битового интервала

Может и так, никогда не использовал уарт в такой извращенной задаче :biggrin: Тогда только отслеживать переход из0-1 после прерывания ошибки кадра как gpio in.

Edited by mantech

Share this post


Link to post
Share on other sites
2 минуты назад, Neo_Matrix сказал:

Спасибо. Завтра попробую проверить

Ещё вариант (чтобы не менять схему): после получения ошибки фрейма запустить чтение этой GPIO-ноги через DMA с периодом < длины бита, а в ISR разгребать полученный массив и смотреть - все ли биты == 0.

Share this post


Link to post
Share on other sites
3 минуты назад, jcxz сказал:

периодом < длины бита, а в ISR разгребать полученный массив и смотреть - все ли биты == 0.

Зачем? если там не постоянный 0 - получим новый старт уарта и прерывание... Если нет - не получим..

Share this post


Link to post
Share on other sites
2 минуты назад, mantech сказал:

Зачем? если там не постоянный 0 - получим новый старт уарта и прерывание... Если нет - не получим..

Я так понимаю - ТС-у нужно определить, что длительность 0-я не менее чем сколько-то мсек. Т.е. - детектировать сигнал длинного BREAK.

И отличить его от кратковременной помехи на линии.

И если такой сигнал обнаружен - произвести сброс (какого-то протокола приёма).

Share this post


Link to post
Share on other sites
Только что, jcxz сказал:

Я так понимаю - ТС-у нужно определить, что длительность 0-я не менее чем сколько-то мсек. Т.е. - детектировать сигнал длинного BREAK.

И отличить его от кратковременной помехи на линии.

И если такой сигнал обнаружен - произвести сброс (какого-то протокола приёма).

Все верно.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this