|
Как правильно забивать FIFO UART, например в LPC213x |
|
|
|
Nov 20 2010, 13:19
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(GetSmart @ Nov 20 2010, 16:10)  Не особо и надобно. У меня сделано так. Когда возникает 0xC2 и буфер вывода закончился, то таймером задаётся пауза перед переключением (а она нужна) с учётом того, что ещё выводится один последний символ. И уже в прерывании таймера переключается RTS/DE. Вот это как раз жутко и не удобно, - лишний таймер + лишнее прерывание от него - по условию Вашей задачи, есть длинные прерывания (до 5 символов), то есть пауза после окончания передачи (TEMT) и до переключения RTS может сильно затянуться что не всегда хорошо, например если ответ на запрос будет начинаться быстрее чем 5 символов
|
|
|
|
|
Nov 21 2010, 10:30
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(zltigo @ Nov 21 2010, 11:23)  Не надо - лучше прочитайте. Тема большая и про заполнение FIFO там есть. Конечно я был слишком резок... и FIFO там упоминается, но по теме данного топика там нет ничего... Цитата(GetSmart @ Nov 21 2010, 12:46)  Но если бы была возможность читать уровень фифо, либо задавать уровень срабатывания THRE, то был бы идеальный 16550 (с буквой B  ). Буквально мелочи не хватает для полного счастья. И еще добавить прерывание по TEMT, и еще регулируемую софтом паузу в прерывании таймаут, и хардовое руление RTS. И получится почти также хорошо как в уартах у атмеля...
|
|
|
|
|
Nov 21 2010, 10:47
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(GetSmart @ Nov 21 2010, 13:34)  Почитайте описание LPC1114 уарт. Там столько всего есть. Может быть почти всё перечисленное. Даже аппаратное дрыгание RTS/DE. Почитал. Улучшили. Пока еще не все... Ждемс дальше... Цитата А у атмеля есть фифо и чтение его указателей? У него есть ДМА на почти всю переферию, причем с двойной буферизацией, и аппаратный RTS, и прерывание по уходу всего в линию(TEMT в LPC) и настраиваемый таймаут. Поэтому там таких проблем вообще нет. ИМХО, это вообще лучшая реализация уартов в МК. Слабое место атмеловских АРМ это I2C, хотя в новых чипах это вроде подправили.
|
|
|
|
|
Dec 8 2010, 14:34
|
Участник

Группа: Участник
Сообщений: 23
Регистрация: 14-08-06
Пользователь №: 19 528

|
Цитата(GetSmart @ Nov 21 2010, 12:46)  Есть только простое забивание всего фифо в прерывании по THRE. У меня щас так и сделано, но могут происходить паузы в потоке символов, хотя и в несколько раз с меньшей вероятностью чем когда совсем без фифо. Но если бы была возможность читать уровень фифо, либо задавать уровень срабатывания THRE, то был бы идеальный 16550 (с буквой B  ). Буквально мелочи не хватает для полного счастья. А что бы дал вам уровень FIFO ? Ваша проблема как я понял в том, что взведенное прерывание по опустошению FIFO передатчика не обрабатывается с должной скоростью. В результате паузы. Это от того, что кто-то запрещает прерывания надолго. Но это проблема проектирования конкретного софта, и периферийный UART не виноват. Мой совет: используйте вложенные прерывания, или измените код так, чтоб никто не работал в режиме запрета прерываний дольше времени передачи одного символа по UART. Или заассайните FIQ для UARTа. Из былого, бились несколько дней с такой же проблемой, Rowley CrossWorks + CTL на LPC2387. Оказалось реализованная в CTL байтовая очередь была "слишком безопасной", и на все время копирования данных запрещала IRQ. Теперь пользуем самописную очередь.
|
|
|
|
|
Dec 8 2010, 14:45
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(Perepic @ Dec 8 2010, 19:34)  Мой совет: используйте вложенные прерывания, или измените код так, чтоб никто не работал в режиме запрета прерываний дольше времени передачи одного символа по UART. Или заассайните FIQ для UARTа. Я вас умаляю. Я фанат вложенных прерываний  У меня FIQ блокирует остальные прерывания на 5-6 символов уарта. А на FIQе мне нужен нулевой джиттер (он собсно и сделан) и переносить его на IRQ тем более вложенный я не могу. Уровень фифо мне бы помог так, что в периодическом прерывании от таймера (ну скажем в районе 8 символов уарта) я бы его читал и дозабивал фифо до максимума. То есть даже не в прерывании от уарта. Вобщем-то серьёзной проблемы нет. Всё работает и малые паузы не смертельны. Но лучше было бы без них.
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|