реклама на сайте
подробности

 
 
> Три RS-485 на LPC-1768, Может есть примеры?
Velund
сообщение Nov 6 2013, 21:23
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 693
Регистрация: 19-11-04
Пользователь №: 1 177



Встала задача - реализовать три интерфейса RS-485 на плате расширения к изделию сделанному на LPC1768. Пины всех трех UART (кроме того самого единственного UART1 который аппаратно держит RS-485) и несколько свободных GPIO выведены на разъем расширения. Скорости - скорее всего выше 19200 не будет но хотелось бы потенциально держать до 115200.

Встает целый ряд вопросов с тем, какие "пируэты" придется делать вокруг FIFO этих портов чтобы корректно переключать прием/передачу.
Первая идея была оставить loopback и обрабатывая прерывания приемника от эха определять завершение передачи. Но в чистом виде это не годится - один сбой из за помехи на шине и все "завязывается в узел". Так что видимо придется еще и периодическим таймером поллить состояние передатчиков и "помогать" обработчику прерываний.

Наверняка кто то подобным уже занимался и есть какие то минимально проверенные решения в инете. Может кто нибудь подсказать на что стоит обратить внимание?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Golikov A.
сообщение Nov 7 2013, 21:33
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



А может взять преобразователи RS485 в RS232, а то и UART сразу, те что сами умеют переключать прием - передачу автоматом. С вашей стороны они все будут нормальными 2 направленными интерфейсами, а вопрос направления решат буферы внутри устройств. Вам же на некоторые задержки в передаче - пофиг, как я понимаю...

хотя я думаю легче отключить FIFO на приемнике - передатчике и пусть АРМ все он-лайн разрулит, или он еще что-то делать будет?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Nov 8 2013, 02:31
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Golikov A. @ Nov 8 2013, 03:33) *
хотя я думаю легче отключить FIFO на приемнике - передатчике и пусть АРМ все он-лайн разрулит, или он еще что-то делать будет?

Причём тут FIFO? Чем FIFO мешает? К тому же автор написал, что есть интервалы с высокой загрузкой прикладной задачей, в которые нежелательно много дрыгаться (к тому же под ОС).
Проблема у автора не в FIFO, а в том, что в LPC нет прерывания по установке бита 6 LSR (завершении передачи последнего бита). Это существенный недостаток UART-ов 16550.
Сам постоянно плююсь от этого.

Цитата(Velund @ Nov 7 2013, 21:10) *
Есть сомнения в "корректности" ПО на другой стороне. По части устройств (датчиков) с которыми придется работать уже и производителя нет физически, даже жаловаться некому, если что.
80 MHz, загрузка невысокая в среднем, но периодически более приоритетная задача в RTOS блокирует процессор на 20-50 мсек полностью (прерывания при этом большую часть времени разрешены, но ими нельзя злоупотреблять особо).

Вижу 2 варианта:
1. Классически: по получению прерывания опустошения буфера (одного из UART), разрешаем прерывания таймера и в нём мониторим биты TEMT LSR. Если вы не уверены в корректности ПО на той стороне и в необходимых задержках
RX->TX на той стороне, придётся конечно увеличить частоту этого прерывания до максимума (хоть до максимальной бодовой скорости) и оптимально писать ISR (может на асме). Сильно это не загрузит процессор, так как разрешаться
это прерывание будет по THRE одного из UART, а запрещаться - при TEMT==1 для всех разрешённых UART. А это всего лишь длительность одного байта на текущей скорости (ну конечно могут быть наложения по времени от неск. UART).
Так как характер времён высокой загрузки у вас порядка десятков мсек, то такой ISR никак не помешает.
2. Завести линию TX каждого UART на отдельное прерывание GPIO, разрешать его по THRE, запрещать по TEMT своего UART. В остальном - подобно п.1.
Go to the top of the page
 
+Quote Post
Velund
сообщение Nov 18 2013, 23:27
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 693
Регистрация: 19-11-04
Пользователь №: 1 177



QUOTE (jcxz @ Nov 8 2013, 06:31) *
придётся конечно увеличить частоту этого прерывания до максимума (хоть до максимальной бодовой скорости) и оптимально писать ISR (может на асме).


У меня возникло большое желание отрать один таймер на это дело и использовать все 4 compare регистра для генерации прерываний примерно через половинку битового интервала после расчетного времени окончания передачи очередного символа. После загрузки байта на передачу обработчик прерываний UART вызывает функцию, которая пихает переданное время (плюс текущее значение счетчика) в соответствующий compare канал. При достижении счетчиком заданного значения генерится прерывание, в котором уже разберемся, не пора ли "погасить" передачу. Если канал уже "ждет" предыдущий символ. то значение в compare регистре увеличивается ровно на длину символа со стартом и стопом.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 20:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.01389 секунд с 7
ELECTRONIX ©2004-2016