Neo_Matrix 0 12 апреля, 2020 Опубликовано 12 апреля, 2020 · Жалоба Привет. Может кто то сталкивался с возможностью отслеживать логический 0 на входе UART который длится более 100мс? В общем есть устройства третьей стороны, которое для отправки сигнала сброса использует притягивание линии UART в логический ноль на время близкое к 100мс. Каким образом можно это отследить? Разумеется что нормальное состояние линии логическая 1. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
firstvald 14 12 апреля, 2020 Опубликовано 12 апреля, 2020 · Жалоба USART_ISR_LBDF флаг выставляется в прерывании при фиксации длинного 0 на линии. ну и можно просто руками опрашивать порт по чтению. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 12 апреля, 2020 Опубликовано 12 апреля, 2020 · Жалоба 42 минуты назад, Neo_Matrix сказал: Каким образом можно это отследить? Разумеется что нормальное состояние линии логическая 1. Что именно "отследить"? Измерить длительность удержания лог."0"? Например: подать на таймерный вход, запрограммированный в режиме захвата на захват по фронту сигнала. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Neo_Matrix 0 12 апреля, 2020 Опубликовано 12 апреля, 2020 · Жалоба 2 минуты назад, jcxz сказал: Что именно "отследить"? Измерить длительность удержания лог."0"? Например: подать на таймерный вход, запрограммированный в режиме захвата на захват по фронту сигнала. А как на один и тот же пин таймер повесить и UART? Данные то ведь никто не отменял. 4 минуты назад, firstvald сказал: USART_ISR_LBDF флаг выставляется в прерывании при фиксации длинного 0 на линии. ну и можно просто руками опрашивать порт по чтению. Спасибо сейчас посмотрю что за зверь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 12 апреля, 2020 Опубликовано 12 апреля, 2020 · Жалоба 5 минут назад, Neo_Matrix сказал: А как на один и тот же пин таймер повесить и UART? Данные то ведь никто не отменял. Зачем "на один"? У вас ног в МК уже не хватает? Цитата Спасибо сейчас посмотрю что за зверь. Можете не утруждаться - в обязанности UART-ов не входит измерение длительности сигналов на их ногах. Максимум что могут - выставить флаг ошибки если 0 держится более длительности слова. Ни о каких 100мсек даже речи идти не может. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Neo_Matrix 0 12 апреля, 2020 Опубликовано 12 апреля, 2020 (изменено) · Жалоба А LBD флаг нормально работает если порт сконфигурирован на UART, а не на LIN? 6 минут назад, jcxz сказал: Зачем "на один"? У вас ног в МК уже не хватает? Можете не утруждаться - в обязанности UART-ов не входит измерение длительности сигналов на их ногах. Максимум что могут - выставить флаг ошибки если 0 держится более длительности слова. Ни о каких 100мсек даже речи идти не может. Это уже проданный товар, нужно скорректировать прошивку под другое оборудование. Я понимаю, что юарт не может измерять длительность, но допустим если использовать ЛИН БРЕЙК, как посоветовали выше, можно запустить таймер софтово и поллить ногу в течении следующих 99мс? Или так не выйдет? Наверное с регистра состояния ДЖПИО можно вычитать текущий уровень 1 или 0, по идее альтернативная функция пина не должна на это влиять. Изменено 12 апреля, 2020 пользователем Neo_Matrix Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 12 апреля, 2020 Опубликовано 12 апреля, 2020 · Жалоба 14 минут назад, Neo_Matrix сказал: Я понимаю, что юарт не может измерять длительность, но допустим если использовать ЛИН БРЕЙК, как посоветовали выше, можно запустить таймер софтово и поллить ногу в течении следующих 99мс? Или так не выйдет? По идее с регистра состояния ДЖПИО можно вычитать текущий уровень 1 или 0, по идее альтернативная функция пина не должна на это влиять. Что значит "поллить"? Остановить всю работу и непрерывно в коротком цикле читать ногу ожидая фронта? Да, можно. Но девайс только этим и будет заниматься >= 100 мсек А если будете опрашивать периодически, с каким-то интервалом, то где гарантия что между опросами не проскочит N-ое количество "1"? А этот LBD, как я подозреваю, выставляет флаг когда длительность нуля превышает какое-то значение и после этого больше не отслеживает состояние линии. По-крайней мере в мануале не говорится ни о каком сигнале завершения этого состояния. А значит - не сможете по нему найти окончание длинного 0. Даже если он будет работать в режиме UART... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 34 12 апреля, 2020 Опубликовано 12 апреля, 2020 (изменено) · Жалоба 25 минут назад, firstvald сказал: USART_ISR_LBDF флаг выставляется в прерывании при фиксации длинного 0 В любом УАРТе есть флаг ошибки фрейма, т.е. когда приходит старт(линия в 0) и вместо стопа на линии все тот же 0, проверять можно совместно с регистром данных, где тоже будет 0. Естественно, скорость передачи данных в линии меняться не должна. Изменено 12 апреля, 2020 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Neo_Matrix 0 12 апреля, 2020 Опубликовано 12 апреля, 2020 · Жалоба Полить имелось ввиду из обработчика прерывания таймера, который завести на 0.5 - 0.7 мс Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 12 апреля, 2020 Опубликовано 12 апреля, 2020 · Жалоба 1 минуту назад, mantech сказал: В любом УАРТе есть флаг ошибки фрейма, т.е. когда приходит старт(линия в 0) и вместо стопа на линии все тот же 0, проверять можно совместно с регистром данных, где тоже будет 0. Естественно, битрейт в линии должен быть постоянный. Этот сигнал скажет ТСу только о начале длинного 0. И ничего не скажет о его конце. Как я уже говорил выше. И для продолжительного 0-я - он бесполезен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Neo_Matrix 0 12 апреля, 2020 Опубликовано 12 апреля, 2020 · Жалоба Может кто то пробовал на вход уарта(на джпио) еще включить прерывание exti? будет ли так работать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 34 12 апреля, 2020 Опубликовано 12 апреля, 2020 · Жалоба 1 минуту назад, jcxz сказал: И ничего не скажет о его конце. Ну как же? А прерывание по приему символов с установленным флагом ошибки кадра до тех пор, пока на линии висит 0? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 12 апреля, 2020 Опубликовано 12 апреля, 2020 · Жалоба 2 минуты назад, Neo_Matrix сказал: Полить имелось ввиду из обработчика прерывания таймера, который завести на 0.5 - 0.7 мс Так можно сделать, если сразу после завершения длинного 0, всегда идёт пауза не менее этих самых 0.5-0.7 мс. А нормальные байты начинают идти только после этой паузы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Neo_Matrix 0 12 апреля, 2020 Опубликовано 12 апреля, 2020 · Жалоба По идее можно после LBD флага запустить таймер и EXTI на подъем сигнала. Далее можно понять был ли перепад за время таймера(100мс) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 12 апреля, 2020 Опубликовано 12 апреля, 2020 · Жалоба 4 минуты назад, mantech сказал: Ну как же? А прерывание по приему символов с установленным флагом ошибки кадра до тех пор, пока на линии висит 0? В тех UART, с которыми я имел дело, оно срабатывало 1 раз - когда счётчик битов достигал стоп-бита, и там оказывался 0. После этого ноль может стоять сколь угодно долго - ничего не генерится до следующего старта. А старт - это переход 1->0. Что вполне соответствует алгоритму работы UART. А что может ещё генериться, если нового старт-условия нет, а значит - и нового слова данных нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться