Отговори на тема  [ 9 мнения ] 
UART TX FIFO въпрос 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение UART TX FIFO въпрос
Иде реч за LPC2000, но въпроса би трябвало да е валиден за всички 16550 базирани UART-ове.

FIFO-то на трансмитера е 16 байта. Но за разлика от ресивера няма как да се сетне нивото на което ще се генерира прекъсване.

Това според мен автоматически значи, че и когато има един свободен байт, ще се изгенерира прекъсване. Прав ли съм? Защото ми се вижда тъпо.
Веднъж напълнен FIFO буфера ще си загуби смисъла - прекъсване ще се генерира на всеки изпратен байт. И процесора ще се омота от прекъсвания.
Или може би аз не съм прав и прекъсването се генерира, едва когато FIFO-то се изпразни?

А пък тоя ред в дейта шита съвсем ме смути :

A THRE interrupt is set immediately if the UART0 THR FIFO has held two or more characters at one time and currently, the U0THR is empty

Как да го преведа?

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Чет Май 11, 2006 5:48 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 2:01 pm
Мнения: 1952
Местоположение: Варна
Мнение 
THRE = Transmitter Holding Register Empty
и този флаг се вдига когато е ПРАЗЕН Tx FIFO.
Няма да имаш прекъсване на всеки изпратен байт.
Цецо написа:
Или може би аз не съм прав и прекъсването се генерира, едва когато FIFO-то се изпразни?

Точно така!
Цитираното изречение се превежда:
"Заявка за прекъсване по THRE се подава ако Tx FIFO е съдържал минимум два байта и в момента е празен(байтовете са прехвърлени към преместващия регистър)."
Когато се подаде заявка по THRE, в преместващия регистър все още се намира последния байт. Когато и той бъде изпратен се вдига и флага TEMT, който обаче не генерира прекъсване а само е достъпен за четене от статус регистъра UxLSR.


Чет Май 11, 2006 6:07 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
Мерси.

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Чет Май 11, 2006 6:35 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
Втори въпрос.

Какво се прави като се засече някакъв сорт грешка при приемане: от типа на OE, FE, BI?

На простите контролери е достатъчно да се изключи и включи ресивера, за да се ресетне, и после почвам наново.

Но при 16550 нещата май не са толкова прости. Трябва ли да изчиствам LSR, регистъра за данни, флага за прекъсване по грешка на линията в U0IIR поотделно или има някакво универсално решение - получи се грешка, изливаме кофата и почваме отново.

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Пет Май 12, 2006 11:05 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Ное 21, 2004 11:31 pm
Мнения: 10088
Мнение 
ОЕ (overrun error) не е грашка по линията. това е ТВОЯ грешка - не си успял за изчетеш поне един байт от фифито (ако е пуснато) или приемащия регистър, а е дошъл нов и си загубил последния приет байт. това е индикация, че ти куца интеръпт процедурата при приемане.

FE (framing error) и PE (parity error) говорят за различно сетване на приемника и предавателя, или (ако са епизодични) дълга линия и лоша характеристика. в този случай би трябвало да се регистрира наличие на грешка и да се реагира на по-горно протоколно ниво (препращане на фрейм)

BI (break interrupt) е индикация, че имаш BREАK състояние на линията. това не е грешка, а индикация за промяна в състояние, като RTS или RI


Пет Май 12, 2006 11:30 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 2:01 pm
Мнения: 1952
Местоположение: Варна
Мнение 
Ако говорим само на хардуерно ниво.
Самото прочитане на статус регистъра(UxLSR) нулира някои от флаговете. За да излезеш нормално от прекъсването трябва и едно четене на UxIIR. Трябва да ресетнеш и Rx FIFO буфера защото в него може да има грешни байтове.
Код:
UxFCR |= 0x02;

Всичко това аз го правя по отделно. И мисля че това е сигурния начин.
На протоколно ниво, разбира се ти решаваш какво да правиш.


Пет Май 12, 2006 11:41 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
ДедоБоре написа:
ОЕ (overrun error) не е грашка по линията. това е ТВОЯ грешка - не си успял за изчетеш поне един байт от фифито (ако е пуснато) или приемащия регистър, а е дошъл нов и си загубил последния приет байт. това е индикация, че ти куца интеръпт процедурата при приемане.

FE (framing error) и PE (parity error) говорят за различно сетване на приемника и предавателя, или (ако са епизодични) дълга линия и лоша характеристика. в този случай би трябвало да се регистрира наличие на грешка и да се реагира на по-горно протоколно ниво (препращане на фрейм)

BI (break interrupt) е индикация, че имаш BREАK състояние на линията. това не е грешка, а индикация за промяна в състояние, като RTS или RI


На LPC то всичките тия генерират RLS (Receive Line Status) прекъсване. Няма да се учудя ако на 16550 е също така. Та затова ги слагам в един кюп.

При мен комуникацията си работи и тия грешки не избиват. Но не мога да оставя траповете отворени. Трябва да има кой да разчисти труповете. И понеже е по изключение, се чудех дали не мога да изключа и включа UART-a. Ама никъде в дейта шита не пише това да рисетва грешките (както например е при пика). Та затова ще се прави поетапно в всеки регистър явно.

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Пет Май 12, 2006 2:23 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Ное 21, 2004 11:31 pm
Мнения: 10088
Мнение 
разбира се, че има някакво обединяване на източниците за прекъсване. иначе няма да ти стигнат векторите :P
твоя крижа е, като влезеш в прекъсване да се огледаш от къде ти е дошло (LSR) и да решиш какво да го правиш. ако искаш не го прави нищо, твоя си работа. но трябва да го обработиш.


Пет Май 12, 2006 2:42 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
Оооо да. Обработвам го - всичко получено от фрейма в коша и рисет на приемника.

Точно тая комуникация дето правя в момента хич не е капризна. Бавна, спокойна, няма риал тайм.

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Пет Май 12, 2006 4:12 pm
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 9 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 13 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни