I²C
Z Wikipedii
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:
- prędkość transmisji 100 kbps
- 7-bitowa przestrzeń adresowa
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.
[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.
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:
- 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)
- 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)
[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:
- PCF8563/8583 – zegar, kalendarz, alarm, timer, dodatkowo może służyć jako RAM
- PCF8574 – pseudodwukierunkowy 8-bitowy ekspander
- 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
[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:
- VESA Display Data Channel, czyli standard komunikacji karty graficznej z urządzeniami wyświetlającymi
- ACCESS.bus, czyli opracowana przez firmę Philips magistrala o właściwościach podobnych do USB
- SMBus
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:
- TWI (Two Wire Interface), stosowane w mikrosterownikach firmy Atmel