| Микроконтролери и електроника 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. Няма да имаш прекъсване на всеки изпратен байт.
Точно така! Цитираното изречение се превежда: "Заявка за прекъсване по 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 буфера защото в него може да има грешни байтове.
Всичко това аз го правя по отделно. И мисля че това е сигурния начин. На протоколно ниво, разбира се ти решаваш какво да правиш. |
||||||||||
| Автор: | Цецо [ Пет Май 12, 2006 2:23 pm ] | |||||||||
| Заглавие: | ||||||||||
На LPC то всичките тия генерират RLS (Receive Line Status) прекъсване. Няма да се учудя ако на 16550 е също така. Та затова ги слагам в един кюп. При мен комуникацията си работи и тия грешки не избиват. Но не мога да оставя траповете отворени. Трябва да има кой да разчисти труповете. И понеже е по изключение, се чудех дали не мога да изключа и включа UART-a. Ама никъде в дейта шита не пише това да рисетва грешките (както например е при пика). Та затова ще се прави поетапно в всеки регистър явно. |
||||||||||
| Автор: | ДедоБоре [ Пет Май 12, 2006 2:42 pm ] |
| Заглавие: | |
разбира се, че има някакво обединяване на източниците за прекъсване. иначе няма да ти стигнат векторите твоя крижа е, като влезеш в прекъсване да се огледаш от къде ти е дошло (LSR) и да решиш какво да го правиш. ако искаш не го прави нищо, твоя си работа. но трябва да го обработиш. |
|
| Автор: | Цецо [ Пет Май 12, 2006 4:12 pm ] |
| Заглавие: | |
Оооо да. Обработвам го - всичко получено от фрейма в коша и рисет на приемника. Точно тая комуникация дето правя в момента хич не е капризна. Бавна, спокойна, няма риал тайм. |
|
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|