Programowanie

I²C

I²C

I²C – szeregowa, dwukierunkowa magistrala służąca do przesyłania danych w urządzeniach elektronicznych. Została opracowana przez firmę Philips na początku lat 80. Znana również pod akronimem IIC, którego angielskie rozwinięcie Inter-Intergrated Circuit oznacza "pośredniczący pomiędzy układami scalonymi". Standard I²C określa dwie najniższe warstwy modelu odniesienia OSI: warstwę fizyczną i warstwę łącza danych.

Spis treści

[edytuj] Historia

Standard został opracowany na początku lat 80. (określany obecnie jako tryb standardowy pracy) i cechowały go:

W 1992 roku została opracowana wersja 1.0 standardu, która wprowadzała następujące zmiany:

W 1998 roku opracowana została wersja 2.0:

W 2000 roku powstała wersja 2.1, wprowadzająca drobne zmiany.

[edytuj] Warstwa fizyczna

I²C do transmisji wykorzystuje dwie dwukierunkowe linie: SDA (linia danych, ang. Serial Data Line) i SCL (linia zegara, ang. Serial Clock Line). Obydwie linie są na stałe podciągnięte do źródła zasilania poprzez rezystory podciągające (ang. pull-up). I²C używa logiki dodatniej, a więc stan niski na magistrali odpowiada "0" logicznemu, natomiast stan wysoki "1" logicznej.

Przebieg czasowy sygnałów w magistrali I²C

Wszystkie nadajniki są typu otwarty kolektor lub otwarty dren, a więc na liniach występuje tzw. iloczyn na drucie ("1" jest recesywna, a "0" dominujące). Pozwala to na wykrywanie kolizji. Każde urządzenie nadając "1" jednocześnie sprawdza, czy na magistrali rzeczywiście pojawił się stan wysoki. Jeżeli tak nie jest, oznacza to, iż inne urządzenie nadaje w tym samym czasie i urządzenie zaprzestaje nadawania.

Podstawowa wersja I²C zakłada istnienie tylko jednego urządzenia, które może inicjować transmisję (master), ale dzięki istnieniu mechanizmu detekcji kolizji, możliwa jest praca w trybie multi-master. Ponieważ dane nadawane są w kolejności od najstarszego bitu do najmłodszego, w przypadku jednoczesnego nadawania, urządzenie nadające adres o wyższym numerze wycofa się pierwsze, co wynika z binarnego sposobu zapisywania liczb. Występuje tu zatem arbitraż ze stałym przydziałem priorytetów, określonym przez adres urządzenia typu slave. Urządzenia o niższych adresach mają wyższy priorytet od urządzeń o adresach wyższych.

Zmiana na linii danych podczas transmisji może następować jedynie, gdy linia zegara znajduje się w stanie niskim. Nie dotyczy to specjalnych sytuacji: bitu startu i bitu stopu. Bit startu ma miejsce, gdy linia danych zmienia swój stan z "1" na "0", podczas wysokiego stanu linii zegara, co ma miejsce w momencie rozpoczynania każdej trasmisji danych. Po zakończeniu transmisji generowany jest bit stopu, czyli przejście linii danych w stan wysoki przy wysokim stanie linii zegara.

Standard zakłada magistralowe połączenie urządzeń. Długość linii ograniczona jest jedynie jej maksymalną pojemnością, która wynosi 400 pF.

[edytuj] Warstwa łącza danych

I²C jest magistralą zorientowaną bajtowo, a więc bity grupowane są po 8. Po przesłaniu 8 bitów w jednym kierunku, przesyłany jest dodatkowy bit potwierdzenia odebrania danych ACK (lub NACK w przypadku braku potwierdzenia) w kierunku przeciwnym.

Pierwszym bajtem jest zawsze nadawany przez urządzenie master adres urządzenia slave, który oprócz 7 bitów właściwego adresu zawiera bit kierunku transmisji na najmłodszej pozycji. Wartość "0" tego bitu oznacza transmisję od slave'a do mastera, podczas gdy wartość "1" kierunek przeciwny. Po pierwszym bajcie przesyłane zostają dane.

Opracowany na początku lat 80. standard zakładał 7-bitową przestrzeń adresową, czyli możliwość zaadresowania do 128 urządzeń. W praktyce część adresów jest zarezerwowana, pozostawiając do dyspozycji 112 wartości. Jednym z zarezerwowanych adresów jest tzw. General call (adres 0), który powoduje wysłanie danych do wszystkich urządzeń podłączonych do magistrali.

Wersja 1.0 magistrali pozwala na adresowanie 10-bitowe. W takim przypadku pierwszy przesyłany bajt zawiera 5 z góry ustalonych bitów (11110) oraz dwa najstarsze bity adresu 10-bitowego, drugi bajt zawiera pozostałe 8 bitów adresu. Potem następuje normalna transmisja danych.

[edytuj] Zastosowania

I²C stosuje się w przypadkach, gdy prostota i niski koszt są ważniejsze od wysokich prędkości transmisji. Znalazło ono zastosowanie m.in. w:

[edytuj] Przykłady dostępnych układów

W sprzedaży dostępnych jest wiele bardzo tanich układów scalonych sterowanych poprzez I²C:

[edytuj] Biblioteki do obsługi I²C

W Linuksie obsługa I²C dla wybranych urządzeń jest częścią jądra. Informacje o tym, jak napisać aplikację korzystającą z tej magistrali można znaleźć w jego dokumentacji, w pliku nagłówkowym /usr/include/linux/i2c.h.

Osoby programujące mikrosterowniki produkowane przez firmę Atmel i oparte o rdzeń AVR mogą posłużyc się biblioteką Procyon AVRlib, która implementuje funkcje zarówno dla urządzeń typu slave, jak i master, w trybie przerwaniowym i nieprzerwaniowym.

[edytuj] Technologie pochodne

Na I²C oparte zostały inne standardy komunikacji:

Różnią się one stosowanymi napięciami i częstotliwościami, a także mogą stosować dodatkowe linie przerwań.

[edytuj] Alternatywne nazwy

Ponieważ I²C jest nazwą zastrzeżoną przez firmę Philips, inne firmy implementują kompatybilne standardy pod innymi nazwami:

[edytuj] Zobacz też

[edytuj] Linki zewnętrzne