Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

UART TX FIFO въпрос
http://mcu-bg.com/mcu_site/viewtopic.php?f=2&t=2343
Страница 1 от 1

Автор:  Цецо [ Чет Май 11, 2006 5:48 pm ]
Заглавие:  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

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

Автор:  Zdrav [ Чет Май 11, 2006 6:07 pm ]
Заглавие: 

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

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

Автор:  Цецо [ Чет Май 11, 2006 6:35 pm ]
Заглавие: 

Мерси.

Автор:  Цецо [ Пет Май 12, 2006 11:05 am ]
Заглавие: 

Втори въпрос.

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

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

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

Автор:  ДедоБоре [ Пет Май 12, 2006 11:30 am ]
Заглавие: 

ОЕ (overrun error) не е грашка по линията. това е ТВОЯ грешка - не си успял за изчетеш поне един байт от фифито (ако е пуснато) или приемащия регистър, а е дошъл нов и си загубил последния приет байт. това е индикация, че ти куца интеръпт процедурата при приемане.

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

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

Автор:  Zdrav [ Пет Май 12, 2006 11:41 am ]
Заглавие: 

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

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

Автор:  Цецо [ Пет Май 12, 2006 2:23 pm ]
Заглавие: 

ДедоБоре написа:
ОЕ (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:42 pm ]
Заглавие: 

разбира се, че има някакво обединяване на източниците за прекъсване. иначе няма да ти стигнат векторите :P
твоя крижа е, като влезеш в прекъсване да се огледаш от къде ти е дошло (LSR) и да решиш какво да го правиш. ако искаш не го прави нищо, твоя си работа. но трябва да го обработиш.

Автор:  Цецо [ Пет Май 12, 2006 4:12 pm ]
Заглавие: 

Оооо да. Обработвам го - всичко получено от фрейма в коша и рисет на приемника.

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

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/