I²C

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacji, wyszukiwania

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-Integrated 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.

Historia[edytuj | edytuj kod]

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:

  • dodanie trybu pracy z prędkością transmisji 400 kbps (Fast Mode)
  • rozszerzenie standardu o możliwość adresowania 10-bitowego

W 1998 roku opracowana została wersja 2.0:

  • dodanie trybu High Speed Mode, pozwalającego na prędkość transmisji 3,4 Mbps
  • Zwiększenie zakresu tolerancji napięcia w stanie wysokim: 2,3 – 5,5 V

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

Warstwa fizyczna[edytuj | edytuj kod]

I²C do transmisji wykorzystuje dwie linie: dwukierunkową SDA (linia danych, ang. Serial Data Line) i jednokierunkową (urządzenie master steruje tą linią) 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 transmisji 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.

Warstwa łącza danych[edytuj | edytuj kod]

I²C jest magistralą zorientowaną bajtowo, a więc bity grupowane są po 8. Dane są wysyłane w kolejności od najbardziej znaczącego bitu do najmniej znaczącego. 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 mastera do slave’a (zapis), podczas gdy wartość „1” kierunek przeciwny (odczyt). 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.

Zastosowania[edytuj | edytuj kod]

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:

  • Odczytywaniu zegarów czasu rzeczywistego (RTC) w komputerach i urządzeniach wbudowanych
  • Komunikacji z prostymi i wolnymi przetwornikami cyfrowo-analogowymi i analogowo-cyfrowymi
  • Odczycie czujników diagnostycznych w komputerze (prędkość obrotu wentylatorów, temperatury procesora i ważniejszych układów na płycie głównej)
  • Robotyce (czujniki przyspieszenia i odległości)
  • Komunikacja z czujnikami i elementami wykonawczymi w małych systemach wbudowanych
  • Dostępie do pamięci NVRAM komputera
  • Sterowanie diodami LED w urządzeniach przenośnych (np. komórkach)
  • Komunikacji pomiędzy układami w telewizorach i innym sprzęcie RTV (jest to pierwotne miejsce zastosowania magistrali I²C)

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

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

  • PCF8563/8583 – zegar, kalendarz, alarm, timer, dodatkowo może służyć jako RAM (ale do wykorzystania tylko 240B)
  • PCF8574 – pseudodwukierunkowy 8-bitowy ekspander
  • PCF8548, PCF8576, PCF8577 – sterowniki wyświetlaczy LCD
  • PCF8582 – pamięć EEPROM 256 bajtów i wiele większych pojemnościach
  • PCF8591 – 8-bitowy, 4-kanałowy przetwornik analogowo-cyfrowy i cyfrowo-analogowy
  • 24LC256 – pamięć EEPROM z interfejsem szeregowym (ang. Serial Electrically Erasable PROM) o organizacji 32K lokacji po 8bitów.

Biblioteki do obsługi I²C[edytuj | edytuj kod]

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 mikrokontrolery produkowane przez firmę Atmel i oparte na rdzeniu AVR mogą posłużyć się biblioteką Procyon AVRlib, która implementuje funkcje zarówno dla urządzeń typu slave, jak i master, w trybie przerwaniowym i nieprzerwaniowym.

Technologie pochodne[edytuj | edytuj kod]

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ń.

Alternatywne nazwy[edytuj | edytuj kod]

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

  • TWI (Two Wire Interface), stosowane w mikrokontrolerach firmy Atmel
  • IIC (Inter-Intergrated Circuit)
  • SCCB (Serial Camera Control) w produktach firmy OmniVision

Zobacz też[edytuj | edytuj kod]

Linki zewnętrzne[edytuj | edytuj kod]