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

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

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

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


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

USART_ISR_LBDF  флаг выставляется в прерывании при фиксации длинного 0 на линии. ну и можно просто руками опрашивать порт по чтению.

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


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

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

Каким образом можно это отследить? Разумеется что нормальное состояние линии логическая 1.

Что именно "отследить"? Измерить длительность удержания лог."0"? Например: подать на таймерный вход, запрограммированный в режиме захвата на захват по фронту сигнала.

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


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

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

Что именно "отследить"? Измерить длительность удержания лог."0"? Например: подать на таймерный вход, запрограммированный в режиме захвата на захват по фронту сигнала. 

А как на один и тот же пин таймер повесить и UART? Данные то ведь никто не отменял.

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

USART_ISR_LBDF  флаг выставляется в прерывании при фиксации длинного 0 на линии. ну и можно просто руками опрашивать порт по чтению.

Спасибо сейчас посмотрю что за зверь.

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


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

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

А как на один и тот же пин таймер повесить и UART? Данные то ведь никто не отменял.

Зачем "на один"? У вас ног в МК уже не хватает?

Цитата

Спасибо сейчас посмотрю что за зверь.

Можете не утруждаться - в обязанности UART-ов не входит измерение длительности сигналов на их ногах. Максимум что могут - выставить флаг ошибки если 0 держится более длительности слова. Ни о каких 100мсек даже речи идти не может.

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


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

А LBD флаг нормально работает если порт сконфигурирован на UART, а не на LIN?

 

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

Зачем "на один"? У вас ног в МК уже не хватает?

Можете не утруждаться - в обязанности UART-ов не входит измерение длительности сигналов на их ногах. Максимум что могут - выставить флаг ошибки если 0 держится более длительности слова. Ни о каких 100мсек даже речи идти не может. 

Это уже проданный товар, нужно скорректировать прошивку под другое оборудование.

Я понимаю, что юарт не может измерять длительность, но допустим если использовать ЛИН БРЕЙК, как посоветовали выше, можно запустить таймер софтово и поллить ногу в течении следующих 99мс? Или так не выйдет? Наверное с регистра состояния ДЖПИО можно вычитать текущий уровень 1 или 0, по идее альтернативная функция пина не должна на это влиять.

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

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


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

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

Я понимаю, что юарт не может измерять длительность, но допустим если использовать ЛИН БРЕЙК, как посоветовали выше, можно запустить таймер софтово и поллить ногу в течении следующих 99мс? Или так не выйдет? По идее с регистра состояния ДЖПИО можно вычитать текущий уровень 1 или 0, по идее альтернативная функция пина не должна на это влиять.

Что значит "поллить"? Остановить всю работу и непрерывно в коротком цикле читать ногу ожидая фронта? Да, можно. Но девайс только этим и будет заниматься >= 100 мсек

А если будете опрашивать периодически, с каким-то интервалом, то где гарантия что между опросами не проскочит N-ое количество "1"?

А этот LBD, как я подозреваю, выставляет флаг когда длительность нуля превышает какое-то значение и после этого больше не отслеживает состояние линии. По-крайней мере в мануале не говорится ни о каком сигнале завершения этого состояния. А значит - не сможете по нему найти окончание длинного 0. Даже если он будет работать в режиме UART...

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


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

25 минут назад, firstvald сказал:

USART_ISR_LBDF  флаг выставляется в прерывании при фиксации длинного 0

В любом УАРТе есть флаг ошибки фрейма, т.е. когда приходит старт(линия в 0) и вместо стопа на линии все тот же 0, проверять можно совместно с регистром данных, где тоже будет 0. Естественно, скорость передачи данных в линии меняться не должна.

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

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


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

Полить имелось ввиду из обработчика прерывания таймера, который завести на 0.5 - 0.7 мс

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


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

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

В любом УАРТе есть флаг ошибки фрейма, т.е. когда приходит старт(линия в 0) и вместо стопа на линии все тот же 0, проверять можно совместно с регистром данных, где тоже будет 0. Естественно, битрейт в линии должен быть постоянный.

Этот сигнал скажет ТСу только о начале длинного 0. И ничего не скажет о его конце. Как я уже говорил выше. И для продолжительного 0-я - он бесполезен.

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


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

Может кто то пробовал на вход уарта(на джпио) еще включить прерывание exti? будет ли так работать?

 

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


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

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

И ничего не скажет о его конце.

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

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


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

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

Полить имелось ввиду из обработчика прерывания таймера, который завести на 0.5 - 0.7 мс

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

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


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

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

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


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

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

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

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

Что вполне соответствует алгоритму работы UART. А что может ещё генериться, если нового старт-условия нет, а значит - и нового слова данных нет.

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


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

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

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

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

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

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

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

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

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

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