Krótko o transmisji szeregowej

W dzisiejszych czasach systemy sterowane mikrokontrolerami coraz bardziej się komplikują. Dlatego właśnie została opracowana magistrala, służąca do komunikacji między poszczególnymi mikrokontrolerami oraz okładami, którymi one sterują. W roku 1981 firma Philips opublikowała specyfikację magistrali stosowanej do tego typu połączeń międzyukładowych. Magistrala ta została nazwana magistralą I2C. Niewielka liczba zmian i zadowalające przyjęcie jej przez elektroników były zasługą przyjęcia dobrych założeń oraz wykonania. Nowa metoda komunikacji została szybko zaadoptowana do wielu typów układów.

Nie wszystkie interfejsy szeregowe równie dobrze spełniają funkcję wspólnej szyny, wykorzystywanej przy sterowaniu wewnętrznych urządzeń peryferyjnych. Łącze szeregowe, które występuje w mikrokontrolerach 8051 nadaje się doskonale do realizacji wieloprocesorowej komunikacji, nie ma jednak mechanizmów potrzebnych do łatwego przystosowania do roli interfejsu komunikacyjnego w układach peryferyjnych, które nie posiadają wbudowanej jednostki centralnej. Interfejsem szeregowym bardzo dobrze pracującym przy takich zastosowaniach jest szyna I2C.

Transmisja szeregowa, a transmisja równoległa

Systemy mikroprocesorowe budowane w oparciu o pojedyncze mikrokontrolery często potrzebują dołączania różnego rodzaju układów peryferyjnych, nie wymagających częstej komunikacji z jednostką centralną. Do układów tych należą:

  • Pamięć typu EEPROM, która zawiera początkowe ustawienia dla urządzenia, współczynniki, którymi należy skalibrować przyrząd pomiarowy itd.
  • Zegary czasu rzeczywistego.
  • Kontrolery klawiatury.
  • Sterowniki do wyświetlaczy LCD lub LED.
  • Układy analogowe o specjalnym przeznaczeniu i parametrach pracy, które mogą być zmieniane programowo. Do urządzeń tego typu należą na przykład filtr przestrajany cyfrowo czy syntezer częstotliwości.
  • Różnego rodzaju wzmacniacze.

Informacja nie jest często wymieniana pomiędzy układami wymienionymi powyżej, a mikrokontrolerem, dlatego staje się możliwe użycie interfejsu szeregowego do wzajemnej komunikacji. Informacje przesyłane interfejsem szeregowym wykorzystują niewielką liczbę linii sygnałowych. Możliwym jest dostęp pary mikrokontrolerów do tego samego zbioru urządzeń. Zalety interfejsu szeregowego, na tle interfejsu równoległego są wyszczególnione poniżej:

  • Gdy zastąpi się wszystkie wykorzystujące równoległy interfejs układy peryferyjne ich odpowiednikami korzystającymi z interfejsu szeregowego, to sumaryczna ilość wyprowadzeń niezbędnych do komunikacji znacząco się zmniejsza. Przykładowo w mikrokontrolerze 8051 firmy Intel można w ten sposób zaoszczędzić na portach P0 i P2, oraz na wyprowadzeniach sygnałów RD i WR. Porty te mogą być wykorzystywane w innych celach.
  • Zmniejszeniu liczby niezbędnych wyprowadzeń sprzyja zmniejszeniu rozmiarów całej konstrukcji (mniejsza ilość wzajemnych połączeń) oraz zmniejszeniu kosztów, a także nakładów pracy niezbędnych do wyprodukowania danego urządzenia,
  • Projekt płytki drukowanej znacznie się upraszcza, dzięki prowadzeniu jedynie dwóch, trzech linii sygnałowych, stanowi to pewien kontrast przy konieczności gęstego upakowania nieraz 16 linii w połączeniu równoległym. Jest to szczególnie wydajne rozwiązanie, jeśli wziąć pod uwagę wieloukładowe wykorzystywanie tej samej szyny interfejsu komunikacyjnego. Można w tani i łatwy sposób sprzęgać układy umieszczone w różnych płytkach, na przykład płytka wyświetlacza LCD. Małe złącza, nieraz w liczbie pojedynczej linii sygnałowej oraz brak stosowania buforów (małe prędkości transmisji nie są zbyt restrykcyjne wobec powstałych pojemności montażowych) sprzyjają niskiemu kosztowi wykonania systemów mikroprocesorowych.
  • Przy niewielkim dodatkowym nakładzie kosztów i pracy można wykorzystać szynę również w celach diagnostycznych, a mianowicie do uruchamiania i testowania urządzenia.

Założenia leżące u podstaw powstania interfejsu I2C

Dzięki podziałowi urządzeń dołączanych do szyny na urządzenia podrzędne i nadrzędne, możliwa jest tania i łatwa implementacja interfejsu I2C w peryferiach. Układem, który inicjalizuje transmisję po szynie, a także układem, który nieustannie generuje sygnał taktujący jest urządzenie nadrzędne. Urządzenie to adresuje odpowiednio podporządkowane sobie urządzenia, które po otrzymaniu ciągu informacji najpierw porównują sygnaturę adresu, aby rozpoznać, że są wywoływane przez system. Jeżeli adres się zgadza dalsza informacja jest pobierana bezpośrednio do wybranego urządzenia w takt generowanego przez urządzenie nadrzędne sygnału zegarowego, bez dodatkowych potwierdzeń ważności adresu w trakcie pojedynczej transmisji. Pozostałe niewywołanie urządzenia po stwierdzeniu niezgodności sygnatury adresowej ze swoją własną przechodzą w stan uśpienia, czekając na ponowne wysłanie sygnatury adresowej. Największą zaletą takiego rozwiązania jest konieczność posiadania jednostki centralnej zawiadującej całym systemem jedynie przez urządzenie nadrzędne, urządzenia podrzędne można zatem wykonać tanim kosztem jako automat o małej liczbie dozwolonych stanów. Interfejs I2C z punktu widzenia projektanta posiada wiele znaczących zalet, które wynikają w prostej linii ze sposobu funkcjonowania samej szyny. Najważniejszą spośród tych zalet jest fakt elastyczności podłączania urządzeń. Niezależnie gdzie wepniemy urządzenie peryferyjne sterowane szyną I2C, będzie ono sterowane zawsze w taki sam sposób. Możemy więc wielokrotnie wykorzystywać raz stworzone biblioteki, co znacznie skraca czas wymagany na opracowanie nowych systemów. Ułatwiono również opracowywanie różnych modeli tego samego urządzenia, właśnie ze względu możliwość dodania, usunięcia bądź zamiany na inne urządzenia podpiętego do istniejącej szyny I2C.

Interfejs szeregowy I2C charakteryzuje się następującymi cechami charakterystycznymi:

  • Tylko dwie linie sygnałowe uczestniczą w transmisji danych, są to linia danych - SDA oraz linia sygnału taktującego SCL.
  • Informację można przesyłać pomiędzy wieloma urządzeniami, które wykorzystują wspólną szynę.
  • Możliwe jest zarówno nadawanie jak i odbiór, jest to zasługa dwukierunkowości tego interfejsu.
  • Każdy układ podpięty do szyny posiada unikatowy w całym systemie adres, który umożliwia pewne zaadresowanie odpowiedniego urządzenia do odbioru bądź nadawania.
  • Do przysyłania danych jest wykorzystywany jeden lub większa ilość nadrzędnych układów, które sterują przesyłaniem danych w odpowiednich kierunkach.
  • Jeżeli następuje równoczesne rozpoczęcie nadawania przez wiele urządzeń nadrzędnych, niezbędne jest zainstalowanie odpowiedniego mechanizmu arbitrażu, który nie pozwoli na utratę, ani przekłamanie w przesyłanych danych.
  • Użycie transmisji synchronicznej, przy wykorzystaniu sygnału taktującego zapewnia komunikację międzyukładową z założonymi przez siebie prędkościami przesyłania informacji.
  • Transmisja o maksymalnej prędkości przesyłania danych szyną I2C wynosi 400 kbodów w szybkim trybie pracy, oraz 100kbodów w trybie pracy standardowej.
  • Układy, które posiadają interfejs I2C są z reguły wyposażone w odpowiednie układy filtracji zakłóceń (na przykład szpilki napięciowe powstałe na liniach SCL i SDA), co zauważalnie podnosi niezawodność pracy z wykorzystaniem tego interfejsu.
  • Liczbę układów jakie można podpiąć do szyny ogranicza jedynie maksymalna pojemność szyny, która wynosi 400pF.

Mikrokontrolery rodziny '51 oraz sterowniki szyny I2C

W mikrokontrolerach rodziny '51 można obecnie spotkać trzy główne odmiany sterowników szyny I2C. Najczęstszym układem z którym mamy do czynienia jest układ, pierwszy raz zastosowany w mikrokontrolerze C552. Również inne mikrokontrolery korzystają z tego sterownika, wraz z drobnymi modyfikacjami. Są to mikrokontrolery: CE558, CL410, CE559, CL580, C652, CL781, C654, CL782. W interfejsie I2C obsługiwana jest transmisja danych o rozmiarze jednego bajtu. Kolejnym rodzajem sterownika szyny I2C jest sterownik, który umożliwia sterowanie transmisją danych na bitowym poziomie. Można go znaleźć w takich mikrokontrolerach jak: C528 i C524. Innego typu interfejs bitowy I2C występuje również w mikrokontrolerach C752 i C751. Każdy z układów interfejsu I2C występujący w którymś z mikrokontrolerów rodziny '51 może pracować tak w trybie urządzeń podrzędnych, jak i nadrzędnych. Mikrokontrolery rodziny '51, które umożliwiają pracę interfejsu I2C w trybie szybkim to układy CE559 oraz CE558. Kilka z pozostałych mikrokontrolerów omawianej rodziny również teoretycznie pozwala na uzyskiwanie prędkości przekraczających 100kbodów, jednak producenci nie gwarantują poprawności transmisji przy takich szybkościach.

Przesyłanie danych po szynie I2C

Linie sygnałowe interfejsu I2C stanowią linie SCL oraz SDA. Są one liniami dwukierunkowymi, które przyłączamy do zasilania za pomocą rezystorów podciągających. Gdy szyna jest nieaktywna, czyli nie występuje transmisja, każda z linii znajduje się w stanie wysokim. Każdy z układów podłączonych do szyny I2C musi mieć stopnie końcowe, zarówno linii SCL jak i SDA, typu otwarty kolektor, który jest wykorzystywany przez układ będący arbitrażem transmisji danych na szynie. Biorąc pod uwagę możliwość dołączenia do interfejsu I2C układów wykonanych w niemal wszystkich stosowanych technologiach elektronicznych, na przykład CMOS, TTL, NMOS, poziomy napięć odpowiadające logicznej jedynce i logicznemu zeru nie są sztywno ustalone. Mogą być one zmieniane wedle uznania przez odpowiedni dobór wartości napięcia zasilającego do którego dołączane są rezystory podciągające zarówno linii SCL, jak i SDA. W czasie transmisji danych na jeden cykl zegara taktującego szynę SCL przypada jeden bit przesyłanych danych. Jeżeli stan na linii SCL jest wysoki, to stan występujący na linii SDA musi pozostać stabilny, zmianie może ulegać jedynie podczas stanu niskiego linii SCL. Wyjątek stanowią rozkazy startu i stopu, które są wysyłane przez układ nadrzędny. Wysyłając sygnał startu należy w trakcie trwania stanu wysokiego na linii SCL, wymusić na linii SDA opadające zbocze. Sygnał startu odpowiada za identyfikację początku transmisji danych. Gdy pojawi się ten sygnał szyna jest uznawana przez urządzenia zewnętrzne za zajętą do czasu w którym zostanie stwierdzony sygnał stopu, identyfikując sobą koniec bieżącej transmisji danych. Tak naprawdę szyna I2C jest uważana za zwolnioną po określonej chwili czasu upływającej od wykrycia sygnału stopu, czyli po wykryciu w trakcie stanu wysokiego linii SCL narastającego zbocza wymuszonego na linii SDA.

Wszystkie ramki danych przesyłane szyną I2C składają się z dokładnie 8 bitów, są one nadawane począwszy od najbardziej znaczącego bitu do bitu najmniej znaczącego. Liczba bajtów transmitowanej informacji jest nieograniczona. Wszystkie operacje przesłania bajtu należy kończyć bitem potwierdzenia. Impuls zegara taktującego, który jest związany z potwierdzającym bitem, generuje urządzenie nadrzędne. Układ nadający informacje powinien w czasie trwania bitu potwierdzenia oddać linię SDA, przez co może ona przyjąć stan wysoki, natomiast urządzenie odbierające podczas trwania tego wysokiego stanu linii SCL, wymusza na linii SDA stan niski. Jeżeli urządzenie podrzędne które jest aktualnie zaadresowane nie potrafi potwierdzać swojego adresu, pozostawia linię SDA w stanie wysokim. Wtedy urządzenie nadrzędne wysyła sygnał stopu tym samym przerywając transmisję. Podobna sytuacja będzie miała miejsce, gdy układ podrzędny potwierdzi adres, jednak nie będzie w stanie odebrać któregoś z kolejnych bajtów danych i wymusza od urządzenia nadrzędnego przerwanie transmisji. Podrzędny układ powinien wysyłać wtedy sygnał stwierdzający brak potwierdzenia, to jest powinien zostawić w stanie wysokim linię SDA na czas trwania potwierdzającego bitu. Odpowiadając urządzeniu nadrzędnemu wyśle sygnał stopu i transmisja danych się zakończy. Kiedy urządzenie nadrzędne odbiera dane, to wysyłanie bitu stwierdzającego brak potwierdzenia stanowi informację dla układu podrzędnego, który nadaje dane, że transmisja ostatniego bajtu danych właśnie się zakończyła. Urządzenie podrzędne zwalnia wtedy linię SDA, umożliwiając układowi nadrzędnemu wysyłanie sygnału stopu. W czasie, gdy urządzenie odbierające informacje nie jest w stanie z określonych powodów rozpocząć odbierania kolejnego bajtu, przeciąga ono stan niski na linii SCL, wymuszając tym sposobem w układzie, które nadaje przejście w stan oczekiwania. Po zwolnieniu przez urządzenie, które dane odbiera, linii SCL, nastąpi kontynuacja transmisji danych.