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

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

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

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

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

 

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

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

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

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


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

4 минуты назад, Neo_Matrix сказал:

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

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

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


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

Только что, jcxz сказал:

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

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

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


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

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

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

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

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


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

1 минуту назад, Neo_Matrix сказал:

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

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

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


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

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

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

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

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

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


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

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

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

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

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


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

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

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

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

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

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


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

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

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

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

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


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

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

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

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

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


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

А если следующий байт пока еще не идет, а линия приняла нормальное состояние?

 

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


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

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

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

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

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

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

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


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

Только что, jcxz сказал:

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

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

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

Все верно.

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


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

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

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

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

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

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

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

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

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

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