Rozdział 13 Łącze szeregowe


Rozdział 13.
Łącze szeregowe



Wymiana informacji między urządzeniami może mieć w ogólności charakter transmisji równoległej lub szeregowej. W rozdziale tym zajmiemy się szeregową fonną wymiany danych. Może ona być synchroniczna lub asynchroniczna.
Transmisja synchroniczna
Oprócz linii przekazujących dane, łącze musi dysponować dodatkowymi połączeniami przesyłającymi przebieg synchronizujący. Zaletą tego systemu jest umożliwienie dowolnych zmian prędkości transmisji. Odbiornik dostosowuje się natychmiast do częstotliwości nadajnika, o ile oczywiście nie zostanie przekroczona pewna prędkość graniczna.
Transmisja asynchroniczna
Strumień danych musi nieść w sobie informację o częstotliwości synchronizującej. Naturalnie nadajnik i odbiornik muszą pracować stale z tą samą, uzgodnioną wcześniej prędkością. Ceną, którą płacimy za zredukowaną w tym trybie pracy liczbę linii łączących korespondentów, jest komplikacja protokołu komunikacyjnego.
Asynchroniczna transmisja szeregowa i ramka danych
Łącza szeregowe, w które wyposażane są komputery klasy PC/XT i AT, przystosowane są do transmisji asynchronicznej. Przeznaczone do przesłania dane w formie szeregowej otrzymują pewien rodzaj "opakowania" - tzw. ramki (ang. frame), zwanej też SDU (ang. Serial Data LJnif). Ramka właśnie, a nie pojedynczy bit danych, jest najmniejszą porcją przekazywanej jednorazowo przez łącze informacji. Jak widać na rysunku 13.1, na ramkę składają się, oprócz właściwych bitów danych, znacznik początku ramki (bit startu), bit
kontroli parzystości i znacznik końca ramki (bit stopu}. Czas trwania jednego bitu ramki, tj. okres wyimaginowanego przebiegu synchronizującego wynika ściśle z uzgodnionej prędkości transmisji.






W ogólności ramka może zawierać 5, 6, 7 lub 8 bitów danych. Bit startu jest obowiązkowy, a liczba bitów stopu może wynosić l lub 2.
Bit kontroli parzystości jest elementarnym i bardzo mało efektywnym sposobem zabezpieczenia danych przed przekłamaniami w trakcie przekazu. Może on oznaczać parzystą lub nieparzystą liczbę ustawionych bitów w polu danych, może być ustawiony na stałe lub na stałe wyzerowany, wreszcie może być w ogóle pominięty.
Wszystkie te charakterystyczne cechy ramki, tj. czas trwania (odpowiadający prędkości transmisji), liczba bitów danych, liczba bitów stopu i tryb kontroli parzystości są uzgadniane między nadajnikiem i odbiornikiem jako format przekazywanych danych jeszcze przed nawiązaniem połączenia (ponieważ parametry transmisji nie są wówczas ustalone, uzgodnienia należy na ogół dokonać "ręcznie", za pomocą programów konfigurują-cych). Tylko w ten sposób możliwe jest prawidłowe odczytanie napływających do odbiornika informacji. Generator odbiornika pracuje więc z założenia z taką samą częstotliwością, z jaką pracował generator nadawczy, formujący dane do postaci szeregowej. Pozostaje jedynie synchronizacja fazy, tzn. uruchomienie układu dekodującego odbiornika precyzyjnie na początku ramki.
Bit startu przyjmuje zawsze wartość zero. Linia danych łącza w stanie spoczynku utrzymywana jest w stanie logicznym 1. Bit startu jest więc wyraźnie zaznaczonym początkiem transmisji. Bit stopu zamyka ramkę i łącze wraca do stanu początkowego lub realizuje transmisję następnej porcji danych.
W warunkach rzeczywistych nie występują oczywiście tak wyidealizowane przebiegi prostokątne jak przedstawione na rysunku 13.1. Przy dużych prędkościach transmisji zaczynają odgrywać rolę pojemności przewodów łączących. Odległość dzieląca nadajnik i odbiornik może dochodzić do 200 metrów, i to w warunkach przemysłowych. Wszystko to powoduje zniekształcenia zboczy sygnałów oraz nakładanie się na nie dodatkowych przebiegów zakłócających.
Przetwarzanie szeregowego strumienia danych napływających do odbiornika musi więc odbywać się w sposób bardziej skomplikowany. Odbiornik pracuje z częstotliwością 16-krotnie większą, niż wynikałoby to z ustalonej szybkości pracy łącza, a każdy bit
ramki jest badany (próbkowany) 16 razy. Wynik pobrania tych 16 próbek jest uśredniany, a na podstawie tej operacji zapada decyzja, czy badanemu wycinkowi czasowemu przyporządkować niski czy wysoki poziom logiczny. Metoda ta podnosi znacznie odporność łącza na zakłócenia impulsowe i eliminuje niekorzystny wpływ zniekształconych zboczy.
Układ scalony 8250
Szeregowy strumień informacji jest w swej nie przekształconej formie nie do przyjęcia przez równoległe magistrale danych komputera. Przetwarzanie danych z postaci szeregowej na równoległą i odwrotnie dokonywane jest w układzie scalonym określanym ogólną nazwą UART (ang. Universal Asynchronons Receiver-Transmitter). Skomplikowana struktura tego układu ma szerokie możliwości programowej adaptacji do różnych prędkości transmisji, konfiguracji łącza i formatów danych.
Modele PC/XT wyposażone były głównie w układy UART typu 8250. Począwszy od modelu AT funkcję tę pełnią zmodernizowane wersje UART typu 16450 lub 82450. Maksymalna prędkość transmisji danych w układzie 8250 wynosi 56000 bodów, zaś dla 16450 - 115200 bodów (bitów na sekundę), tym niemniej funkcje obsługi łącza szeregowego dostępne przez BIOS dopuszczają prędkości transmisji wyłącznie do górnej granicy 9600 bodów (19200 bodów w komputerach PS/2). Przyczyn tego zjawiska należy upatrywać w obszernych procedurach inicjalizujących łącze szeregowe każdorazowo dla odebrania i wysłania jednego znaku. Pełne możliwości układu 8250 (16450) można wykorzystać jedynie sięgając bezpośrednio do jego rejestrów.
Schemat wyprowadzeń układu scalonego 8250 zamieszczony jest na rysunku 13.2. Taki sam rozkład końcówek posiada powszechnie stosowany obecnie układ UART 16450.







Oto znaczenie poszczególnych wyprowadzeń UART:
~CTS=Clear To Send- wejście odpowiadające stanowi linii sterującej CTS interfejsu RS-232 (opis standardu RS-232 zawarto w podrozdziale Interfejs RS-232C), stanem aktywnym jest poziom niski.
~DSR=Data Set Ready - wejście odpowiadające stanowi linii sterującej DSR, stanem aktywnym jest poziom niski.
~RLSD=Received Linę Signal Detect - wejście odpowiadające stanowi linii sterującej DCD, stanem aktywnym jest poziom niski.
~R1=Ring Indicator - wejście odpowiadające stanowi linii sterującej R1, stanem aktywnym jest poziom niski.
~RTS=Reguest To Send- wyjście sterujące stanem linii sterującej RTS, stanem aktywnym jest poziom niski. Wyjście to jest dostępne bezpośrednio przez bit l rejestru wyjściowych sygnałów sterujących UART (rejestr układu o adresie 04h).
~DTR=Data Terminal Ready - wyjście sterujące stanem linii sterującej DTR, stanem aktywnym jest poziom niski. Wyjście to jest dostępne bezpośrednio przez bit O rejestru wyjściowych sygnałów sterujących UART (rejestr 04h).
~MR=Master Reset - podanie na to wejście logicznej jedynki powoduje inicjalizację wszystkich rejestrów wewnętrznych UART, z wyjątkiem buforów odbiornika i nadajnika oraz rejestru podzielnika.
~OUT1,-OUT2=Wyjścia, które mogą być swobodnie programowane.Wyjście steruje w komputerach PC kluczem blokującym przerwania pochodzące od UART.
INTRPT=Interrupt - wysokim poziomem napięcia na tym wyjściu UART sygnalizuje spełnienie warunków wywołania przerwania, określonych maską rejestru przerwań (rejestr O l h).
A2 - A0= Linie adresujące wewnętrzne rejestry UART, umożliwiające
dostęp do nich procesorowi. Trzema liniami można zaadresować 8 rejestrów. Ponieważ ich faktyczna liczba jest większa, rolę czwartej, sztucznej linii adresowej pełni bit 7 rejestru formatu danych (rejestr 03h).
~ADS=Address Strobe - sygnał ten w stanie aktywnym (niski poziom logiczny) oznacza, że adres na liniach A2 - AO jest ustawiony i może być dekodowany przez UART.
CSOUT=Chip Select Out - wyjście to jest aktywowane przez UART, jeżeli został on wybrany przez CPU liniami CSO, CS1 i ~CS2.
DDIS=Driver Disable - sygnał ten przyjmuje wartość zera logicznego w trakcie operacji odczytu wewnętrznych rejestrów UART przez procesor.
DISTR=Data In Strube - wejściowy sygnał sterujący, umożliwiający
~DISTR= w stanie aktywnym (DISTR - l lub -DISTR = 0) odczyt wewnętrznych rejestrów UART.
DOSTR,~DOSTR=ata Out Strobe - wejściowy sygnał sterujący, umożliwiający wstanie aktywnym (DOSTR-1 lub ~DOSTR=0) zapis wewnętrznych rejestrów UART.
SOUT=Serial Output - wyjście toru nadawczego UART. SIN=Serial Input - wejście toru odbiorczego UART.
CSO, CS 1,~CS2=Chip Select - stan CSO = 1, CS l = l i -CS2 = 0 oznacza wybranie układu UART przez procesor w celu dokonania
zapisu lub odczytu jednego z jego rejestrów.
RCLK=Receiver Clock - wejście sygnału synchronizującego tor odbiorczy, o częstotliwości 16 razy większej od zadanej prędkością transmisji.
~BAUDOUT=Wyjście sygnału synchronizującego tor nadawczy, o częstotliwości 16 razy większej od zadanej prędkością transmisji. Jeżeli końcówki ~BAUDOUT i RCLK zostaną połączone (co w PC rzeczywiście ma miejsce), to nadajnik i odbiornik pracują z tą samą prędkością.
XTAL 1,XTAL2 = Końcówki dla przyłączenia zewnętrznego rezonatora kwarcowego; układ akceptuje też w tym miejscu zewnętrznie wytwarzany sygnał synchronizujący;
D0 - D7= Dwukierunkowa, 8-bitowa magistrala danych, służąca
przekazywaniu danych, rozkazów i bajtów statusowych pomiędzy procesorem i UART.
V#CC=Wejście napięcia zasilającego(+5V). GND= Masa zasilania.
Budowa wewnętrzna układu UART - zważywszy na różnorodność spełnianych przez niego funkcji -jest dosyć skomplikowana. Układ posiada niezależny tor nadawczy i odbiorczy. Teoretycznie nadajnik i odbiornik nie muszą pracować z tą samą prędkością. Pomijając bardzo specjalistyczne zastosowania układu, wejście częstotliwości synchro-nizującej odbiornik RCLK praktycznie zawsze połączone jest z wyjściem częstotliwości synchronizującej nadajnik BAUDOUT, tak więc zgodność prędkości ma faktycznie miejsce.
Źródłem częstotliwości odniesienia dla całego układu jest wewnętrzny generator syn-chronizowany rezonatorem kwarcowym o częstotliwości 1,8432 Mhz - dołączonym do końcówek XTAL1 i XTAL2. Układ UART akceptuje też w miejsce rezonatora kwarco-
wego sygnał z zewnętrznego źródła o tej samej częstotliwości. Sygnał o częstotliwości odniesienia kierowany jest do programowalnego 16-bitowego dzielnika częstotliwości, którego współczynnik podziału pobierany jest ze specjalnego rejestru dzielnika. Podział częstotliwości dla nadajnika odbywa się w dwóch etapach. W pierwszym bierze udział wspomniany licznik programowalny, który wydziela częstotliwość nadajnika, będącą 16-krotną wielokrotnością zadanej prędkości transmisji. Sygnał ten po zanegowaniu wyprowadzany jest na zewnątrz wyjściem -BAUDOUT i może (lecz nie musi) być sygnałem odniesienia dla toru odbiornika. W drugim etapie dokonywany jest podział przez stały współczynnik 16, co daje właściwy sygnał synchronizujący tor nadawczy. Jest to ten sam sygnał, który zgodnie z ustaloną prędkością transmisji przetwarza równoległą postać danych na ramki (porównaj rysunek 13.1). Każdy impuls tego przebiegu przetwarza jeden bit danych równoległych na jeden elementarny segment ramki.
Tor odbiorczy układu odbiera z wejścia RCLK sygnał taktujący o częstotliwości 16 razy większej od przyjętej prędkości transmisji. Tak więc połączenie wejścia RCLK z wyjściem -BAUDOUT powoduje, że oba tory pracują z tą samą prędkością. Ewentualne wprowadzenie w to miejsce zewnętrznego dzielnika częstotliwości spowodowałoby obniżenie prędkości pracy toru odbiornika o współczynnik równy stopniowi podziału.
Szeregowy strumień danych na wejściu SIN podlega rozłożeniu na bity danych, startu, stopu i parzystości. Czynności te realizuje specjalny rejestr przesuwny. W szczególności dla użytkownika istotne jest wydzielenie z tego strumienia bajtu danych i złożenie go w rejestrze buforowym odbiornika, skąd może być odebrany przez CPU. Sprawy komplikują się nieco przy nietypowych formatach przekazywanych danych, gdy pomiędzy bitami startu i stopu przesyłanych jest mniej niż 8 bitów danych. Brakujące bardziej znaczące bity rejestru buforowego odbiornika zawierają wtedy wartości przypadkowe i należy je zamaskować.
Po stronie nadawczej pracuje podobny rejestr przesuwny, pobierający dane równoległe z rejestru buforowego nadajnika. Dane do tego bufora dostarcza procesor. Układy logiczne dodają, stosownie do formatu, bity startu, stopu i parzystości, po czym całość ekspediowana jest zgodnie z ustaloną prędkością transmisji do wyjścia SOUT. Chwilowy brak danych w buforze nadajnika powoduje, po ostatnim opróżnieniu rejestru przesuwnego, wstrzymanie dalszego przetwarzania i wyjście SOUT przyjmuje stan wysoki.
Niezależnie od procedury przetwarzania szeregowo-równoległego obsługiwane są sygnały sterujące interfejsu RS-232C. Poziom tych sygnałów na wyjściu układu scalonego zmienia się w granicach O do +5 V, gdyż takie jest napięcie zasilające. Specyfikacja łącza RS-232C definiuje poziomy sygnałów na -12 V do +12 V. Dostosowanie poziomu sygnałów odbywa się za pośrednictwem specjalnych bramek-wzmacniaczy (układy MC 1488 i MC 1489), zwanych odpowiednio nadajnikami i odbiornikami linii. Odwracają one fazę sygnału, ale ponieważ wewnętrzne układy logiczne również odwracają fazę sygnałów sterujących, w efekcie ustawienie bitu rejestru sterującego odpowiada poziomowi napięcia +12 V na odpowiednim wyjściu sterującym. Wyzerowany bit wymusza napięcie -12 V. Ponieważ UART nie zmienia fazy sygnałów SIN i SOUT, wartość O transmitowanego bitu reprezentowany jest napięciem +12 V, a wartość l jako -12 V. Odwrócenie fazy wynika tu z obecności wzmacniaczy linii.
Rozbudowany jest mechanizm wyzwalania przerwań sprzętowych. Układy logiczne UART kontrolują zmiany poziomów na liniach sterujących RS-232C, stan rejestrów buforowych nadajnika i odbiornika, stan linii danych i jakość połączenia z korespondentem (uwzględniając błędy transmisji). Zależnie od zaprogramowania maski rejestru przerwań, zaistnienie określonej sytuacji wywołuje przerwanie sprzętowe, tj. dodatni impuls na wyjściu INTRPT. Dokładną przyczynę przerwania można odczytać z rejestru identyfikacji przerwań (rejestr 02h).
W komputerach PC/XT/AT programowalne wyjście OUT2 układu UART pełni rolę klucza blokującego globalnie (bez konieczności modyfikacji pojedynczych pozycji rejestru przerwań) przepływ sygnału IRQ od UART do kontrolera przerwań. Stanem wyjścia OUT2 zarządza bit 3 rejestru wyjściowych sygnałów sterujących.
Interfejs RS-232C
RS-232C jest określeniem powstałego w USA standardu przesyłania informacji między urządzeniami za pośrednictwem łącza szeregowego. Standard ten definiuje parametry mechaniczne, elektryczne i logiczne łącza.
Standard RS-232C dotyczy wymiany danych pomiędzy tzw. terminalem (ang. DTE, Data Terminal Eguipment) a modemem (ang. DCE, Data Communication Eguipment). Powstał on dla potrzeb ujednolicenia komunikacji między końcówką komputerową a dużym komputerem (hosf) przy użyciu łącz telefonicznych i modemów. Pod pojęciem DTE rozumiemy dziś jednak głównie komputery PC, w przypadku których ma miejsce implementacja zaleceń standardu CCITT (Comite Consultatif International Telegraphi-que et Telephonique - Międzynarodowy Komitet Konsultacyjny Do Spraw Telefonii i Telegrafii) o nazwie V.24. Nie jest to jednak kompletne złącze V.24, a jedynie jego część, w której wykorzystywane są tylko niektóre sygnały. Zalecenie CCITT definiuje na jednym łączu dwa porty szeregowe (dwa wejścia i dwa wyjścia), natomiast w PC używany jest tylko jeden. Wykorzystana jest tu jedynie ogólna specyfikacja złącza V.24.
Połączenie interfejsów RS-232C od strony mechanicznej stanowi 25-żyłowy przewód zakończony zdefiniowanymi przez standard wtykami. Większość z 25 linii przeznaczona została dla potrzeb szeregowej transmisji synchronicznej. W standardzie IBM PC wykorzystywane jest tylko 9 z tych sygnałów, dlatego też często zamiast wtyku 25-koń-cówkowego (DB-25) stosuje się wtyk 9-końcówkowy DB-9. Ta liczba linii w zupełności wystarcza do obsłużenia transmisji asynchronicznej w standardzie RS-232C.
W tabeli 13.1 podano zestawienie sygnałów interfejsu RS-232C używanych w komputerach PC.
Linie TxD (Transmitted Data) i RxD (Received Data} są właściwymi przewodami służącymi wymianie danych. Pozostałe są liniami sterującymi, posiadającymi następujące znaczenie:
Tabela 13.1.

Sygnały interfejsu RS-232C używane w komputerach PC

Wtyk DB-25; Wtyk DB-9; Sygnał; Kierunek transmisji
1; -; -; -
2; 3; TxD; DTE -> DCE
3; 2; RxD; DCE -> DTE
4; 7; RTS; DTE -> DCE
5; 8; CTS; DCE -> DTE
6; 6; DSR; DCE -> DTE
7; 5; -; masa
8; 1; DCD; DCE -> DTE
20; 4; DTR; DTE -> DCE
22; 9; RI; DCE -> DTE
23; -; DSRD; DCE <-> DTE













RTS=Reguest To Send- urządzenie DTE (terminal, PC) sygnalizuje tą linią zamiar przekazywania danych do DCE (modemu). Modem przygotowuje się do odbioru danych.
CTS=Clear To Send- linią tą przesyłane jest potwierdzenie przyjęcia sygnału RTS przez DCE (modem) i stwierdzenie gotowości do odbioru danych od DTE. Komputer może rozpocząć przekazywanie danych.
Para sygnałów sterujących RTS/CTS może przy półdupleksowym trybie pracy łącza (takim, w którym dopuszczalna jest niejednoczesna transmisja w obu kierunkach) sterować kierunkiem transmisji, przydzielając połączonym korespondentom na przemian rolę nadawcy i odbiorcy.
DSR=Data Set Ready - specyfikacja RS-232C określa ten sygnał jako meldunek urządzenia DCE (zwykle modemu), że zostało nawiązane połączenie i układ jest gotów do przyjęcia danych od DTE (zwykle komputera). W praktyce większość modemów nie wykorzystuje tej linii i jest ona sztucznie utrzymywana w stanie aktywnym, nie mówiąc nic o istnieniu połączenia z korespondentem. Po poziomie tego sygnału można co najwyżej wnioskować, czy modem jest w ogóle włączony.
DTR=Data Terminal Ready - sygnał ten wskazuje w ogólności na gotowość urządzenia DTE (komputera). Musi on pozostawać aktywny przez cały czas trwania połączenia.Para sygnałów DTR i DSR
odpowiada za utrzymanie połączenia, podczas gdy sygnały RTS i CTS są odpowiedzialne za przekazywanie danych i ewentualne sterowanie kierunkiem ich przepływu (w trybie półdupleksowym), czyli tzw. handshaking.




DCD=Data Carrier Detect - modem (DCE) sygnalizuje tą linią odbiór fali nośnej, co oznacza, że druga strona jest w trakcie nawiązywania połączenia. Sygnał DCD pozostaje aktywny przez cały czas trwania transmisji.
RI=Ring Indicator - w przypadku połączenia modemów przez sieć telefoniczną urządzenie DTE (komputer) informowane jest o odebraniu sygnału odpowiadającego wywołaniu abonenta (dzwonieniu).
DSRD=Data Signal Ratę Detector - linia ta występuje tylko w 25 końcówkowej wersji łącza. Umożliwia dostosowanie się korespondentów do jednej z dwóch możliwych prędkości transmisji. Z sygnału tego mogą korzystać obie strony połączenia.
Rysunek 13.3. przedstawia zachowanie się sygnałów sterujących interfejsu w trakcie uruchamiania urządzeń DTE i DCE, nawiązywania połączenia, w czasie jego trwania oraz rozłączenia.
Łącze szeregowe może teoretycznie pracować w jednym z trzech trybów: simplekso-wym, półdupleksowym i dupleksowym.

Tryb simpleksowy
Łącze skonfigurowane jest na stałe na jeden z możliwych kierunków transmisji: DTE -> DCE lub DCE - DTE. Rozpatrzmy dla przykładu pierwszą z tych możliwości. DTE wykorzystuje wówczas wyłącznie linię TxD, zaś linia RxD nie jest podłączona. Modem (DCE) nie bierze pod uwagę stanu sygnału RTS, bądź też sygnał ten jest utrzymywany przez DTE stale w stanie aktywnym. Podobnie, komputer (DTE) nie uwzględnia sygnału CTS od modemu (DCE) lub też modem utrzymuje ten sygnał na poziomie aktywnym przez cały czas trwania połączenia. Sygnał DCD modemu z założenia nigdy nie może być aktywny. Sygnał DSR jest albo stale aktywny, albo aktywowany w momencie nawiązania kontaktu z korespondentem (drugim modemem). DTE (komputer) może przez sygnał DTR zgłaszać swoją gotowość modemowi (DCE); w rozwiązaniach praktycznych sygnał ten włącza i wyłącza modem. Linia RI z oczywistych względów nie ma tutaj znaczenia.
Tryb półdupleksowy
W trybie tym zarówno DTE, jak i DCE mogą być stroną nadającą oraz odbierającą jednak do dyspozycji jest tylko jeden logiczny kanał danych, który można naprzemiennie wykorzystywać w obydwu kierunkach. Wyjścia TxD każdego z urządzeń połączone są z wejściami RxD partnera. Wybór aktualnego kierunku transmisji dokonywany jest za pomocą sygnałów RTS-CTS, a prawo tego wyboru przysługuje w jednakowym stopniu obydwu stronom. Przykładowo, DCE (modem) chcąc przesłać dane do DTE (PC) aktywuje swój sygnał RTS i czeka na potwierdzenie na linii CTS. Uzgodnienie to upoważnia w tym przypadku modem do wysyłania danych, a komputer do ich odbioru. Pozostałe sygnały zachowują swoje naturalne znaczenie, tzn. modem może aktywować linię DCD chcąc przekazywać dane do komputera, DSR oznacza trwały kontakt z korespondentem (drugim modemem), zaś DTR może służyć do włączania i wyłączania modemu. Urządzenie DCE może też robić użytek z linii RI, sygnalizując nią chęć ' nawiązania kontaktu przez partnera modemu znajdującego się po drugiej stronie łącza (zwykle telefonicznego).
Tryb dupleksowy
Dane mogą być przekazywane pomiędzy DTE i DCE jednocześnie w obydwu kierunkach. Większość nowoczesnych modemów może pracować w tym trybie. Nie jest wymagane uzyskiwanie przez żadną ze stron zezwolenia na nadawanie. Kanał logiczny połączenia otwarty jest stale w obie strony, a sygnały RTS/CTS nie mają znaczenia; są one albo nie podłączone, albo stale aktywne. Stale aktywna jest też na ogół linia DSR, chyba że sygnalizuje ona nawiązywanie połączenia z drugim modemem. Sygnał DCD aktywowany jest w naturalny sposób jako odpowiedź na wykrycie fali nośnej, a linią DTR można sterować włączaniem i wyłączaniem modemu.
Rysunek 13.4. przedstawia klasyczny układ połączeń łącza szeregowego RS-232 pomiędzy urządzeniem DTE i DCE.
Standard RS-232C powstał dla potrzeb ujednolicenia połączeń typu końcówka kompu-terowa-modem. W czasach jego opracowywania pod pojęciem końcówki komputerowej (terminala) rozumiano niewiele więcej niż klawiaturę i ekran, a często wręcz elektromechaniczny dalekopis. Standard ten przetrwał jednak do czasów dzisiejszych, a ponieważ miał ugruntowaną pozycję, został adaptowany do łączenia różnych innych urządzeń. Klasycznym przykładem jest wykorzystanie łącza szeregowego do realizacji połączenia z drukarką i ploterem. Sprawy komplikują się tutaj, gdyż chodzi tu o połączenie dwóch urządzeń klasy DTE, co na pierwszy rzut oka niewiele ma wspólnego ze standardem RS-232C. Schemat takiego połączenia przedstawia rysunek 13.5.
Jest to klasyczny przykład simpleksowego trybu pracy, bowiem dane przekazywane są tylko w jednym kierunku. Jest rzeczą oczywistą, że drukarka szeregowa znacznie różni się zachowaniem od modemu, niemniej jednak znaczenie pewnych sygnałów sterujących można zmienić i połączyć linie ze sobą tak, że patrząc na łącze od strony komputera będziemy widzieć "coś", co zachowuje się jak DCE.
Sygnał RTS pochodzący od komputera połączony jest z jego własnym wejściem CTS, co imituje natychmiastową zgodę drugiej strony na nadawanie. Drukarka "czuje się" również urządzeniem klasy DTE i oczekuje, zgodnie ze specyfikacją RS-232C, określonego zachowania swego partnera (DCE). Osiąga się to łącząc ze sobą jej linie RTS i CTS oraz wprowadzając własny sygnał DTR drukarki z powrotem na jej wejścia DCD i DSR. Aktywowanie sygnału DTR powoduje więc natychmiastową (fikcyjną) "odpowiedź drugiej strony" na liniach DSR i DCD.
Nawet najszybsza drukarka nie może drukować z prędkością taką, jaką gwarantuje przepustowość łącza szeregowego. Drukarka dysponuje na ogół pewnym buforem wejściowym, ale i ten zostanie wreszcie zapełniony. Dalsze wysyłane przez komputer znaki zostałyby w takiej sytuacji zignorowane. Aby temu zapobiec, należy przesłać do komputera sygnał nakazujący wstrzymanie transmisji. Do tego celu właśnie stworzona została linia DSR. Od strony drukarki korzysta się z jednej z linii obsługujących transmisję synchroniczną (a więc w tym przypadku zbędnych). Końcówka 19 przekazuje więc sygnał zapełnienia bufora, utrzymując go w stanie aktywnym tak długo, jak długo drukarka jest w stanie odbierać dane. Przepełnienie bufora prowadzi natomiast w prostej linii do podania zera logicznego na wejście DSR komputera, a to oznacza wstrzymanie nadawania.
Dostęp do łącza szeregowego z poziomu systemu MS-DOS
Użytkownik systemu operacyjnego może modyfikować parametry łącza szeregowego posługując się poleceniem zewnętrznym modę, które odwołuje się do przerwania 14h BIOS-u. Bezpośredni dostęp do łącza z poziomu systemu operacyjnego jest bardzo ograniczony. Przerwanie 21h DOS-u nie umożliwia nawet zainicjalizowania łącza przez określenie prędkości transmisji i formatu danych.
Programiści mogą korzystać z następujących czterech funkcji przerwania 21h DOS:
03h - odbiór jednego znaku ze łącza AUX (COMl),
04h - wysłanie jednego znaku do łącza AUX (COM l),
3Fh - odczyt znaków z pliku lub urządzenia,
40h - zapis znaków do pliku lub urządzenia.
Funkcje 03h i 04h obsługują wyłącznie urządzenie AUX (synonim portu COM1) i nie dają dostępu do łącz COM2,
COM3 i COM4. Funkcje te są reliktami systemu operacyjnego CP/M. Podczas transmisji większych grup znaków
przez łącze szeregowe system MS-DOS korzysta z koncepcji uchwytów (handle), tj. jednorazowo nadawanych numerów
identyfikacyjnych plików dyskowych i urządzeń. Nazwy COM1 - COM4 znajdują się, podobnie jak LPT1 - LPT4, CON,
PRN, AUX i NUL, na liście nazw zastrzeżonych, co oznacza, że nie wolno nadawać ich żadnemu plikowi dyskowemu.
Symbol AUX jest synonimem COM1, podobnie jak PRN odpowiada LPT1. Po wydaniu polecenia copy plik. a com2
zawartość pliku o nazwie plik.a przekazywana jest programowi obsługi (sterownikowi) portu szeregowego COM2.
Ogromną zaletą

funkcji 3Fh i 40h jest niewątpliwie możliwość jednoczesnego przesyłania całego łańcucha znaków.

Funkcja 03h

Działanie:

Funkcja 03h odbiera z łącza COM1 (AUX) jeden znak i umieszcza go w rejestrze AL.

Parametry wejściowe:
AH 03h.

Wartości zwracane:
AL odebrany z portu AUX znak.

Funkcja 04h

Działanie:

Funkcja 04h wysyła do łącza COM1 (AUX) jeden znak, przekazywany w rejestrze DL.

Parametry wejściowe:
AH 04h;
DL kod ASCII znaku.

Wartości zwracane:
- brak -

Uwaga:
W przypadku błędu DOS przekazuje sterowanie do procedury obsługi przerwania 24h, obsługującej błędy sprzętowe (Critical Error Handler}.

Funkcja 3Fh

Działanie:

Funkcja ta odbiera znaki z dowolnego łącza COMn i umieszcza je w zadanym buforze. Numer uchwytu dla łącza COM1 jest definiowany przez system automatycznie i wynosi 3. Innym łączom należy taki uchwyt najpierw przydzielić używając funkcji otwarcia pliku lub urządzenia 3Dh.

Parametry wejściowe:
AH 3Fh;
BX numer uchwytu;
CX liczba bajtów do odczytania;
DS:DX adres bufora przeznaczonego na pobrane z łącza znaki.

Wartości zwracane:
AX liczba faktycznie odczytanych bajtów lub kod błędu w przypadku CF= 1;
CF 1 w przypadku wystąpienia błędu.

Funkcja 40h

Działanie:

Funkcja ta przesyła do dowolnego łącza COMn znaki przygotowane w określonym buforze. Numer uchwytu dla łącza COM1 jest definiowany przez system automatycznie i wynosi 3. Innym łączom należy taki uchwyt najpierw przydzielić używając funkcji otwarcia pliku lub urządzenia 3Dh.

Parametry wejściowe:
AH 40h;
BX numer uchwytu;
CX liczba bajtów do wysłania;
DS:DX adres bufora przeznaczonego na wysyłane łączem znaki.

Wartości zwracane:
AX liczba faktycznie przesłanych bajtów lub kod błędu w przypadku
CF= 1;
CF 1 w przypadku wystąpienia błędu.

Przykład:

bufor DB 8 DUP('*') ;zestaw znaków do wysłania
mov ah,40h ;numer funkcji
mov bx,3 ;uchwyt urządzenia AUX
mov cx,08h ;wyślij 8 znaków
mov dx,OFFSET bufor ;DX = adres (przemieszczenie) bufora
;zakładamy, że DS zawiera
;adres segmentowy bufora
int 21h ;wywołaj funkcję DOS - wyślij 8 gwiazdek

Funkcje BIOS obsługujące łącze szeregowe

Funkcje DOS-u ograniczają się praktycznie do przesyłania znaków między pamięcią operacyjną i łączem. Dużo więcej możliwości dają funkcje przerwania 14h BIOS-u. Mamy tu następujące możliwości:

00h - inicjalizacja łącza, tj. określenie formatu danych i prędkości transmisji,
01h - wysyłanie znaków,
02h - odbiór znaków,
03h - określenie statusu łącza.
Każda z tych funkcji zwraca w rejestrze AH bajt informujący o aktualnym stanie transmisji. Postać tego bajtu przedstawiono poniżej.

bit 7; bit 6; bit 5; bit 4; bit 3; bit 2; bit 1; bit 0;

bit 7=1 - nastąpiło przekroczenie czasu oczekiwania (Time Ouf).
bit 6=1 - rejestr przesuwny nadajnika jest pusty.
bit 5=1 - rejestr buforowy nadajnika jest pusty.
bit 4=1 - połączenie zostało przerwane (Break).
bit 3=1 - wystąpił błąd protokołu (Frame Error}.
bit 2=1 - stwierdzono błąd parzystości (Parity Error}.
bit 1=1 - nastąpił błąd przepełnienia bufora odbiornika (Overrun Error}.
bit 0=1 - bufor odbiornika zawiera nie odczytany przez CPU znak.

Przekroczenie czasu (Time Out)
Standardowy czas oczekiwania BIOS-u na reakcję korespondenta przy próbie nawiązania połączenia, wysłania lub odbioru znaku łączem szeregowym wynosi 20 sekund. Po przekroczeniu tego czasu ustawiany jest bit 7 statusu (Time Out}. Wartości czasów oczekiwania dla każdego z łącz przechowywane są w obszarze danych BIOS-u.

Adres; Znaczenie;

0040:007Ch; limit czasu dla łącza COM ł (w sekundach)
0040:007Dh; limit czasu dla łącza COM2 (w sekundach)
0040:007Eh; limit czasu dla łącza COM3 (w sekundach)
0040:007Fh; limit czasu dla łącza COM4 (w sekundach)






Czas oczekiwania dla dowolnego łącza COM/7 można ustawić na nieskończenie długi poleceniem DOS-u mode comn, , p.
Przerwanie połączenia (Break)
Stan ten sygnalizowany jest w momencie, gdy końcówka wejściowa RxD odbiornika znajduje się w niskim stanie logicznym przez czas dłuższy od czasu trwania jednej ramki. Oznacza to przerwanie linii danych, ewentualnie uszkodzenie nadajnika. Linia danych łącza w stanie spoczynku (nie przekazującego danych) utrzymywana jest przez nadajnik w wysokim stanie logicznym.
Błąd protokołu (Frame Error)
Ma on miejsce, gdy oczekiwany przez odbiornik bit stopu nadejdzie za wcześnie lub zbyt późno. Oznacza to, że długość ramki jest inna od uzgodnionej, co może wskazywać na niewłaściwą liczbę bitów stopu, parzystości, danych lub odmienną od deklarowanej prędkość transmisji.
Błąd parzystości (Parity Error)
Może on oznaczać przekłamanie bitu (bitów) w bajcie danych na drodze między odbiornikiem a nadajnikiem, ewentualnie niezgodność sposobu kontroli parzystości po obu stronach łącza.
Błąd przepełnienia (Overrun Error)
Błąd ten wystąpi, jeżeli dane napływają do łącza szybciej, niż mogą być pobierane z bufora wejściowego odbiornika przez program obsługi łącza. Skompletowany w buforze odbiornika bajt zostanie w takiej sytuacji zamazany przez następną porcję danych.
Bajt statusu modemu

Funkcje 00h i 03h przerwania 14h zwracają dodatkowo w rejestrze AL tzw. bajt statusu modemu, obrazujący stan linii sterujących łącza RS-232C.

bit 7; bit 6; bit 5; bit 4; bit 3; bit 2; bit 1; bit 0;

bit 7=1 - aktywny sygnał DCD (Data Carrier Detecf).
bit 6=1 - aktywny sygnał RI (Ring Indicator).
bit 5=1 - aktywny sygnał DTR (Data Terminal Ready).
bit 4=1 - aktywny sygnał CTS (Clear to Send).
bit 3=1 - stwierdzono zmianę sygnału DCD.
bit 2=1 - stwierdzono zmianę sygnału RI.
bit 1=1 - stwierdzono zmianę sygnału DTR.
bit 0=1 - stwierdzono zmianę sygnału CTS.

Bity 7-4 odzwierciedlają bezpośrednio stan odpowiednich wejść sterujących łącza szeregowego. Mniej znacząca połowa bajtu dostarcza informacji o ewentualnych zmianach poziomu danego sygnału od czasu ostatniego wywołania funkcji 03h.

Poniżej opisano funkcje przerwania 14h BIOS-u, realizujące obsługę portu szeregowego.

Funkcja 00h

Działanie:

Funkcja 00h inicjalizuje wybrane łącze, ustalając parametry transmisji.

Parametry wejściowe:
AH 00h:
AL bajt określający parametry transmisji;
DX numer łącza:
0=COM1 (AUX),
1=COM2,
2=COM3,
3=COM4.

Wartości zwracane:
AH bajt statusu łącza;
AL bajt statusu linii modemu.

Format danych przekazywanych w rejestrze AL (bajt parametrów transmisji) ma następującą budo we:

bit 7; bit 6; bit 5; bit 4; bit 3; bit 2; bit 1; bit 0;

bity 7-5=Prędkość transmisji:
000- 110 bodów,
001- 150 bodów,
010- 300 bodów,
011- 600 bodów,
100- 1 200 bodów,
101- 2 400 bodów,
110- 4 800 bodów,
111- 9 600 bodów.
bity 4-3=Rodzaj kontroli parzystości:
00 - brak kontroli,
01 - parzysta,
10 - brak kontroli,
11 - nieparzysta.
bit 2=Liczba bitów stopu:
0 - jeden bit stopu,
1 - dwa bity stopu.
bity 1-0=Liczba bitów danych:
10-7 bitów danych,
11-8 bitów danych.

Przykład:

;inicjalizacja portu COM3 na 2400 bodów,
;1 bit stopu, 8 bitów danych,
;bez kontroli parzystości 2400-8-N-l
mov ah,00h ;numer funkcji
mov al,10100011b ;bajt parametrów
mov dx,02h ;COM3
int l4h ;inicjalizuj łącze

Uwagi:
Funkcja 00h przerwania 14h umożliwia, jak widać, skonfigurowanie łącza do maksymalnej prędkości transmisji 9 600 bodów. BIOS modeli PS/2 dysponuje funkcją 04h (Extended Initialize), która dopuszcza prędkość 19 200 bodów jak również ramkę zawierającą 5 i 6 bitów danych. Pełne możliwości układu UART, tj. prędkość transmisji 115 200 bodów można wykorzystać tylko programując bezpośrednio rejestry układu.

Funkcja 0lh

Działanie:

Funkcja ta wysyła jeden znak do wybranego łącza szeregowego.

Parametry wejściowe:
AH 01h;
AL kod ASCII wysyłanego znaku;
DX numer łącza:
0 = COM1 (AUX),
1 = COM2,
2 = COM3,
3 = COM4.

Wartości zwracane:
AH bajt statusu łącza.

Funkcja 02h

Działanie

Funkcja ta odbiera jeden znak z wybranego łącza szeregowego.

Parametry wejściowe:
AH 02h;
DX numer łącza:
0 = COM1 (AUX),
1 = COM2,
2 - COM3,
3 = COM4.

Wartości zwracane:
AH bajt statusu łącza;
AL odebrany znak.

Funkcja 03h

Działanie

Funkcja 03h określa status wybranego łącza szeregowego.

Parametry wejściowe:
AH 03h;
DX numer łącza:
0=COM1(AUX),
0=COM2,
2 = COM3,
3=COM4.
Wartości zwracane:
AH bajt statusu łącza;
AL bajt statusu modemu.

Bezpośrednie programowanie rejestrów UART
Każdemu z zaakceptowanych przez BIOS łącz szeregowych przydzielany jest fragment przestrzeni adresowej wejścia-wyjścia. W przydzielonym danemu łączu obszarze widziane są jego rejestry; początek obszaru stanowi adres bazowy. Informacja o przyporządkowaniu adresów bazowych łączom szeregowym przechowywana jest w obszarze danych BIOS-u.

Tabela 13.2.

Adresy bazowe portów równoległych

Adres; Wielkość; Zawartość; Wartość standardowa
0040:0000h; słowo; adres bazowy łącza COM1; 3F8h
0040:0002h; słowo; adres bazowy łącza COM2; 2F8h
0040:0004h; słowo; adres bazowy łącza COM3; 3E8h
0040:0006h; słowo; adres bazowy łącza COM4; 2E8h

Liczbę zainstalowanych w systemie łącz określają trzy najmniej znaczące bity bajtu zlokalizowanego pod adresem 0040:0011 h. W bajtach tych kodowana jest binarnie liczba łącz. Starsze wersje BIOS-u często nie obsługują łącz COM3 i COM4, które nie są wręcz rozpoznawane przez procedury POST, a ich adresy nie są umieszczane w obszarze danych BIOS-u.
Standardową linią przerwań sprzętowych stowarzyszoną z łączami COM l i COM3 jest IRQ4. Łącza COM2 i COM4 dołączane są zwykle do linii IRQ3. Przerwania nie są jedyną możliwością obsługi łącza szeregowego - drugą z nich jest polling. Szczegóły znajdzie czytelnik w dalszej części tego rozdziału.






Adresy rejestrów danego łącza podaje się zwykle w stosunku do jego adresu bazowego (jako przemieszczenie - offset}. Przemieszczenie równe zero oznacza adres bazowy. Trzy linie adresowe A2 - AO układu 8250 dają możliwość zaadresowania ośmiu portów (przemieszczenie O - 7). Ponieważ sumaryczna liczba wszystkich rejestrów układu przekracza 8, wprowadzona zastała sztuczna, czwarta linia adresowa. Jej funkcję pełni bit 7 (B7) rejestru formatu danych (przemieszczenie 03h), określany często mianem DLAB (ang. Divisor Latch Access Bit). Bit ten musi być ustawiony, jeżeli adresujemy jedną ze składowych rejestru podzielnika częstotliwości i wyzerowany przy dostępie do rejestrów buforowych nadajnika i odbiornika oraz rejestru konfiguracji przerwań (przemieszczenie O l h). W obydwu stanach bitu 7 adresy na liniach A2 - AO pokrywają się. Przy dostępie do pozostałych rejestrów układu UART stan bitu B7 nie odgrywa roli.

Tabela 13.3.

Zestaw rejestrów uktadii UART

Rejestr UART; Przemieszczenie; DLAB; A2; A1; A0;

Bufor odbiornika (RBR - Receiver Buffer Register); 00h; 0; 0; 0; 0;
Bufor nadajnika (THR - Transmitter Holding Register); 00h; 0; 0; 0; 0;
Rejestr konfiguracji przerwań (IMR - Interrupt Mask Register); 01h; 0; 0; 0; 1;
Mniej znacząca (LSB) część podzielnika; 00h; 1; 0; 0; 0;
Bardziej znacząca (MSB) część podzielnika; 01h; 1; 0; 0; 1;
Rejestr identyfikacji przerwania (IIR - Interrupt Identification Register); 02h; puste; 0; 1; 0;
Rejestr formatu danych (LCR - Line Control Register); 03h; puste; 0; 1; 1;
Rejestr wyjściowych sygnałów sterujących RS-232C (MCR- Modem Control Register); 04h; puste; 1; 0; 0;
Rejestr stanu transmisji (LSR - Line Status Register); 05h; puste; 1; 0; 1;
Rejestr wejściowych sygnałów sterujących RS-232C (MSR-Modem Status Register); 06h; puste; 1; 1;0;
Rejestr dodatkowy (tylko w układzie 16450); 07h;puste; 1; 1; 1

Napływający do łącza szeregowy strumień danych przetwarzany jest na postać równoległą i składany w rejestrze buforowym odbiornika (przemieszczenie 0). Bit danych, który nadejdzie jako pierwszy, zajmuje w bajcie pozycję najmniej znaczącą. Należy pamiętać, że formaty ramki o 5, 6 i 7 bitach danych wymagają zamaskowania brakujących, bardziej znaczących pozycji bitowych, które są nieokreślone. Rozkaz in odczytuje zawsze pełny bajt.













Odczytanie zawartości rejestru buforowego odbiornika, np.:
mov dx,2f8h ; adres portu COM2
in al,dx ; pobierz znak

powoduje automatycznie opróżnienie tego rejestru, który może przyjąć następny odebrany znak. Analogicznie,
zapisanie znaku do rejestru buforowego nadajnika:

mov al,'X' ; znak 'X'
mov dx,3f8h ; adres portu COM1
out dx,al ; wyślij znak

spowoduje załadowanie rejestru przesuwnego nadajnika i wysłanie linią SOUT bajtu przetworzonego do postaci
szeregowej (zgodnie z obowiązującym aktualnie formatem danych). Najmniej znaczący bit będzie wysłany jako pierwszy.

Przerwania generowane przez łącze szeregowe

Układ UART może być źródłem przerwań sprzętowych, sygnalizując tym samym konieczność obsługi przez procesor.
Metodą alternatywną do stosowania przerwań jest polling. Procesor testuje w wybranych przez siebie momentach
stan łącza i w przypadku stwierdzenia obecności znaku w buforze odbiornika zostaje on odczytany. Łatwo tu zauważyć
niebezpieczeństwo "połykania" już odebranych przez łącze znaków, które nie zostały na czas odczytane z bufora i uległy
zamazaniu nowymi wartościami. Zaistnienie takiego faktu można co prawda stwierdzić badając bit l bajtu statusu
łącza (por. funkcje przerwania 14h), ale straconego znaku nie da się już odzyskać.
Rejestr konfiguracji przerwań
Warunki, w których UART będzie generował przerwanie sprzętowe (tj. dodatni impuls na wyjściu INTRPT) można określić programując rejestr konfiguracji przerwań IMR (przemieszczenie O l h).

x; x; x; x; bit 3; bit 2; bit 1; bit 0;

bity 7-4=Bez znaczenia;
bit 3=1 - Przerwanie generowane jest w wyniku zmiany stanu jednego z wejściowych sygnałów sterujących łącza
RS-232C (CTS, DSR, DCD, RI).
bit 2=1 - przerwanie generowane jest w wyniku błędu parzystości, protokołu, przepełnienia lub zerwania połączenia.
bit 1=1 - przerwanie generowane jest na skutek opróżnienia rejestru przesuwnego nadajnika (ang. THRE -
Transmitter Holding Register Empty}.
bit 0=1 - przerwanie generowane jest, gdy w rejestrze buforowym odbiornika znajduje się odebrany bajt danych.

Rejestr identyfikacji przerwań

Dokładną przyczynę przerwania można określić analizując rejestr identyfikacji przerwań 1IR (przemieszczenie 02h), którego
budowę pokazano poniżej.

0; 0; 0; 0; 0; bit 2; bit 1; bit 0;

bity 7-3=00000.
bity 2-1 =Kod identyfikacyjny przerwania.
bit 0=Stan przerwania:
0 - przerwanie oczekuje na obsługę,
1 - brak przerwań.

Przyczynę przerwania określa kod identyfikacyjny:

Bit 2; Bit 1; Przyczyna przerwania; Priorytet

0; 0; zmiana stanu jednego z sygnałów sterujących łącza RS-232C (CTS, DSR, RI, DCD); najniższy(3)
0; 1; bufor nadajnika jest pusty; 2
1; 0; w buforze odbiornika znajduje się nie odebrany bajt; 1
1; 1; stwierdzono błąd parzystości, protokołu, przepełnienie bufora odbiornika lub zerwanie łączności; najwyższy (0)

Naturalnie można zidentyfikować tylko te przerwania, które zostały wcześniej dopuszczone maską rejestru przerwań
IMR (przesunięcie 0 l h). Jeżeli jednak wyjście INTRPT układu UART jest połączone z odpowiednią linią IRQ, a procedura
obsługi tego przerwania składa się z samej instrukcji iret (co oznacza natychmiastowy powrót bez podejmowania żadnych
czynności), to mimo istnienia fizycznego połączenia INTR-IRQ>? mamy tu do czynienia z pollingiem.

Bit 0 rejestru identyfikacji umożliwia szybką diagnozę, czy procedura obsługi przerwania ma wkraczać do akcji. Wszystkie
przerwania o niższym priorytecie są zablokowane tak długo, jak długo nie zostanie obsłużone przerwanie o priorytecie
wyższym. Procedura obsługująca łącze musi więc podjąć stosowne kroki. Dla układu UART obsługa przerwania oznacza:

Źródło przerwania = Obsługa przerwania
Zmiana stanu jednego z wejść sterujących łącza RS-232C - Odczytanie rejestru wejściowych sygnałów sterujących MSR
(przemieszczenie 06h)










Opróżnienie bufora nadajnika - Wpisanie bajtu danych do bufora nadajnika lub odczytanie rejestru identyfikacji przerwań IIR (przemieszczenie 02h)
W buforze odbiornika znajduje się nie odebrany bajt - Odczytanie rejestru buforowego odbiornika RBR (przemieszczenie 04h)
Błąd transmisji lub przerwanie połączenia - Odczytanie rejestru stanu transmisji LSR (przemieszczenie 05h)

Wykonanie stosownych czynności w stosunku do przerwania o wyższym priorytecie (tj. niższym numerze!) otwiera drogę ewentualnym zgłoszeniom o priorytecie niższym, które również muszą być obsłużone, aby układ UART mógł być źródłem kolejnych przerwań.

Rejestr formatu danych

Pod przemieszczeniem 03h zlokalizowany jest rejestr formatu danych LCR. Określa on format ramki oraz steruje dostępem do rejestru podzielnika generatora synchronizują-cego. Jego postać jest następująca:

bit 7; bit 6; bit 5; bit 4; bit 3; bit 2; bit 1; bit 0;

bit 7=Czwarta linia adresowa (DLAB):
0 - udostępnienie buforów nadajnika, odbiornika i rejestru konfiguracji 1RQ,
1 - udostępnienie rejestru podzielnika.
bit 6=1 - przerwanie połączenia (Break) przez wymuszenie stanu O na wyjściu SOUT.
bity 5-3=Tryb kontroli parzystości:
000- brak kontroli,
001 - nieparzysta (sumaryczna liczba jedynek pola danych i bitu parzystości jest nieparzysta),
011 - parzysta (sumaryczna liczba jedynek pola danych i bitu parzystości jest parzysta),
100 - tzw. kontrola typu "mark" (bit parzystości stale równy 1,
111 - tzw. kontrola typu "space" (bit parzystości zawsze równyO, niezależnie od danych).
bit 2=Liczba bitów stopu:
0 - 1 bit stopu,
1 - 2 bity stopu.





bity 1-0=Liczba bitów danych:
00 - 5 bitów danych,
01 - 6 bitów danych,
10 - 7 bitów danych,
11 - 8 bitów danych.

Ustawienie bitu 6 tego rejestru symuluje przerwanie połączenia. Wyjście SOUT przechodzi do niskiego poziomu
logicznego, a zatem na linii TxD pojawia się napięcie +12 V na skutek odwracającego działania wzmacniaczy linii.
Stan ten należy odróżnić od braku danych w rejestrze przesuwnym nadajnika, kiedy to wyjście SOUT znajduje się w
wysokim stanie logicznym (co odpowiada +5 V) i, stosownie do tego, zanegowane wyjście TxD ma poziom -12 V.

Ramka w formacie 5 bitów danych posiada automatycznie wydłużony o 50 % bit stopu.

Prędkość transmisji

Sygnał odniesienia pochodzący z rezonatora kwarcowego lub generatora dołączonego do wejść XTAL1 i XTAL2 ma
częstotliwość 1,8432 MHz. Przebieg ten podlega dwukrotnemu podziałowi: raz przez programowany dzielnik częstotliwości
i drugi raz przez stały współczynnik 16. Można też powiedzieć, że dzielnik programowany dokonuje podziału
częstotliwości 115 200 Hz, gdyż tyle uzyskujemy z podziału 1,8432 MHz przez 16. Efektywna prędkość transmisji może
być więc zawsze określona jako 115200 : podzielnik.
16-bitowy rejestr podzielnika (przemieszczenie 001 dla LSB i 01 dla MSB) dostępny jest wyłącznie przy ustawionym bicie
7 rejestru formatu danych LCR. Ponieważ najmniejszą akceptowaną przez ten rejestr wartością jest 1, wynika stąd
maksymalna prędkość transmisji UART równa 115 200 bodów.

Przykład:

;dla 4800 bodów mamy podzielnik 24 mov dx,2fbh adres portu LCR
in al,dx ;pobierz zawartość rejestru LCR portu COM2
or al,10000000b ;ustaw bit 7
out dx,al ;zapisz rejestr LCR
mov al,24 ;LSB = 24
mov dx,2f8h ;adres portu podzielnika (LSB)
out dx,al ;wpisz LSB podzielnika
mov al,O ;MSB = 0
inc dx DX <- ;adres portu podzielnika (MSB)
out dx,al ;wpisz MSB podzielnika
mov dx,2fbh ;adres portu LCR
in al,dx pobierz zawartość rejestru LCR portu COM2
and al,01111111b ;wyzeruj bit 7
out dx,al ;zapisz rejestr LCR

Sygnały sterujące
Rejestr wyjściowych sygnałów sterujących łącza RS-232C
Na stan linii RTS i DTR łącza mamy wpływ poprzez rejestr wyjściowych sygnałów sterujących RS-232C
(MCR - przemieszczenie 04h). Rejestr ten daje też możliwość swobodnej manipulacji stanem końcówek OUT1 i OUT2.
Jak wspomniano wcześniej, wyjście OUT2 służy sprzętowemu blokowaniu wszelkich sygnałów przerwań pochodzących
od UART.

Postać rejestru MCR jest następująca.

x; x; x; bit 4; bit 3; bit 2; bit 1; bit 0'
bity 7-5=Bez znaczenia.
bit 4=1 - połączenie wyjścia SOUT układu UART z wejściem SIN.
bit 3=1 - aktywowanie sygnału OUT2.
bit 2=1 - aktywowanie sygnału OUT1.
bit 1=1 - aktywowanie sygnału ~RTS.
bit 0=1 - aktywowanie sygnału -DTR.

Układ 8250/16450 posiada wbudowany mechanizm diagnostyczny, uruchamiany przez ustawienie bitu 4 powyższego
rejestru. Sygnały sterujące łącza RS-232C łączone są wówczas wewnątrz układu w następujący sposób:

RTS <-> CTS,
DTR <-> DSR,
OUT1 <-> RI,
OUT2 <-> DCD,
SOUT = 1 (wysoki stan logiczny),
SIN odłączone.

Ponadto wyjście rejestru przesuwnego nadajnika, które normalnie dołączone jest do wyjścia SOUT, kierowane jest na
wejście rejestru przesuwnego odbiornika. Ponieważ wejście SIN nie doprowadza w rym stanie żadnego sygnału
zewnętrznego, tryb ten umożliwia gruntowne przetestowanie układów logicznych UART. Należy pamiętać
, że przeprowadzona w ten sposób diagnostyka dotyczy samego układu UART i nie obejmuje wzmacniaczy linii, które
znacznie częściej narażone są na uszkodzenia z zewnątrzl.
technika ta jest określana w języku angielskim mianem interna! loopback testing.

W celach diagnostycznych można również połączyć odpowiednie końcówki gniazda interfejsu szeregowego (external
loopback testing), co pozwala na testowanie wzmacniaczy linii.

Warto jeszcze raz zwrócić uwagę, że poziom logiczny wyjściowych sygnałów sterujących, tj. -OUT1, -OUT2, -R.TS
i ~DTR jest odwracany, tzn. ustawiony bit rejestru wymusza zero logiczne na danym wyjściu układu scalonego.
Sygnały ~RTS i ~DTR przechodzą jednak przez odwracające fazę wzmacniacze linii (dla dopasowania poziomów
napięcia 5 V na 12 V) i zgodność poziomów logicznych w gnieździe łącza jest przywrócona.

Rejestr wejściowych sygnałów sterujących łącza RS-232C

Zawartość rejestru wejściowych sygnałów sterujących MSR (przemieszczenie 06h) odzwierciedla stan wejściowych linii
sterujących łącza.

Postać tego rejestru przedstawiono poniżej.

bit 7; bit 6; bit 5; bit 4; bit 3; bit 2; bit 1; bit 0;

bit 7 Sygnał DCD jest:
0 - nieaktywny,
1 - aktywny.
bito Sygnał RI jest:
0 - nieaktywny,
1 - aktywny.
bit 5=Sygnał DSR jest:
0 - nieaktywny,
1 - aktywny.
bit 4=Sygnał CTS jest:
0 - nieaktywny,
1 - aktywny.
bit 3=1 - stwierdzono zmianę poziomu sygnału DCD.
bit 2=1 - stwierdzono zmianę poziomu sygnału RI.
bit 1=1 - stwierdzono zmianę poziomu sygnału DSR.
bit 0=1 - stwierdzono zmianę poziomu sygnału CTS.

Mniej znacząca połowa tego rejestru (bity 3-0) zawiera informację o ewentualnej zmianie stanu danej linii od czasu
ostatniego odczytu rejestru. Wykonanie rozkazu in zawsze zeruje te bity. Wejściowe sygnały sterujące DCD, RI,
DSR i CTS podlegają inwersji na drodze od rejestru sterującego do końcówek układu UART.'W połączeniu z inwersyjnym
działaniem wzmacniaczy linii wysoki poziom logiczny wejścia ustawia stosowny bit rejestru. Bit wyzerowany oznacza
obecność na danej linii napięcia -12 V.

Rejestr stanu transmisji

Stan, w jakim znajdują się w danym momencie część odbiorcza i nadawcza układu UART można odczytać z rejestru stanu
transmisji LSR (przemieszczenie 05h). Jego postać przedstawiono poniżej.

0; bit 6; bit 5; bit 4; bit 3; bit 2; bit 1; bit 0;

bit 7=Zawsze 0.
bit 6=0 - w buforze odbiornika albo w rejestrze przesuwnym nadajnika znajdują się dane,
1 - bufor odbiornika i rejestr przesuwny nadajnika są puste.
bit 5=1 - rejestr przesuwny nadajnika jest pusty,
bit 4=1 - połączenie zostało przerwane (Break).
bit 3=1 - błąd protokołu (Franie Error - niezgodny format danych lub prędkość transmisji).
bit 2=1 - błąd parzystości (Parity Error}.
bit 1=1 - błąd przepełnienia bufora odbiornika (Overrun Error}.
bit 0=0 - bufor odbiornika pusty,
1 - odebrany bajt spoczywa w rejestrze buforowym odbiornika.

Opisany rejestr można wykorzystać podczas obsługi łącza szeregowego przez polling.

;obsługa łącza nie generującego przerwań
mov dx,2fdh ; rejestr LSR portu COM2
in al,dx ;odczytaj rejestr
test al,01h ;czy bit O ustawiony?
jz dalej ;nie - nic do odebrania
mov dx,2f8h ;adres bufor odbiornika
in al,dx ;pobierz bajt danych do AL
;.....obróbka bajtu
dalej: nic do zrobienia

Specyfika układu UART 16450

Układ 16450 dysponuje dodatkowym rejestrem zlokalizowanym pod przemieszczeniem 07h. Może on być wykorzystywany
jako dodatkowy bufor nadajnika lub odbiornika, jeżeli z jakichkolwiek względów nie chcemy do tego celu używać pamięci
operacyjnej. Stan tego rejestru nie wpływa w żaden sposób na pracę układu. Jego obecność jest jednocześnie gwarancją,
że układ nie jest typu 8250 i może być programowany do prędkości 1 15 200 bodów.

Wyszukiwarka

Podobne podstrony:
Rozdział 13
Rozdział 13 (tł Kath)
utk cw 3 2 lacze szeregowe teoria
15 Rozdzial 13
Wings of the wicked rozdział 13
rozdzial$ (13)
14 Rozdział 13
Siderek12 Tom I Część III Rozdział 13
ROZDZIAŁ 13 Nerwiakowłókniakowatość
15 Rozdzial 13
Frysztacki, konspekt z rozdziałów 13 16
rozdzial 13 etykietowanie energetyczne zrodel swiatla

więcej podobnych podstron