Elektronika i elektrotechnika

Interfejs I2C – zasada działania, przewody, adresowanie i zastosowanie

Spis treści
Interfejs I2C – zasada działania, przewody, adresowanie i zastosowanie

Interfejs I2C to prosta, dwuprzewodowa magistrala szeregowa, która umożliwia komunikację mikrokontrolera z wieloma układami cyfrowymi za pomocą zaledwie dwóch linii sygnałowych. Jest powszechnie wykorzystywana do obsługi czujników, pamięci, wyświetlaczy, zegarów czasu rzeczywistego i innych urządzeń peryferyjnych.

Dzięki adresowaniu urządzeń oraz jasno określonym zasadom transmisji I2C stał się jednym z najpopularniejszych standardów komunikacyjnych w systemach wbudowanych.

Czym jest I2C?

I2C, czyli Inter-Integrated Circuit, to magistrala komunikacyjna zaprojektowana przez firmę Philips z myślą o wymianie danych między układami znajdującymi się na jednej płytce drukowanej. W odróżnieniu od interfejsów równoległych przesyła informacje szeregowo, bit po bicie, dzięki czemu upraszcza połączenia i ogranicza liczbę potrzebnych ścieżek.

Standard określa zarówno warstwę elektryczną, obejmującą sposób sterowania liniami, jak i warstwę protokołu, która definiuje format transmisji, adresowanie oraz sygnały sterujące.

Najważniejsze cechy interfejsu I2C to:

  • Dwie linie sygnałowe – SDA odpowiada za przesyłanie danych, a SCL za sygnał zegarowy;
  • Adresowanie urządzeń – standard obsługuje adresy 7- i 10-bitowe, dzięki czemu wiele układów może współdzielić jedną magistralę;
  • Określone role urządzeń – kontroler inicjuje komunikację, a urządzenie docelowe odpowiada na wywołanie;
  • Obsługa wielu kontrolerów – mechanizm arbitrażu pozwala rozstrzygać konflikty podczas jednoczesnej próby nadawania.

Przewody i warstwa elektryczna

Linie SDA i SCL

Magistrala I2C wykorzystuje dwie dwukierunkowe linie sygnałowe: SDA i SCL.

SDA, czyli szeregowa linia danych, służy do przesyłania adresów, danych i informacji sterujących. SCL, czyli szeregowa linia zegarowa, wyznacza rytm transmisji i synchronizuje urządzenia.

Obie linie pracują w trybie otwartego kolektora lub otwartego drenu. Oznacza to, że podłączone układy mogą aktywnie ściągać je do masy, ale nie wymuszają bezpośrednio stanu wysokiego. Za uzyskanie logicznej „1” odpowiadają rezystory podciągające.

Logiczne „0” jest wysyłane przez ściągnięcie linii do masy, natomiast logiczna „1” pojawia się po jej zwolnieniu. Takie rozwiązanie umożliwia bezpieczne współdzielenie magistrali przez wiele urządzeń.

Rezystory podciągające

Do prawidłowego działania magistrali potrzebne są rezystory podciągające na liniach SDA i SCL. Łączą one obie linie z napięciem odpowiadającym poziomom logicznym systemu. Bez rezystorów linie mogłyby pozostawać w stanie nieokreślonym, co prowadziłoby do niestabilnej komunikacji lub całkowitego braku transmisji.

Rezystancję należy dobrać z uwzględnieniem pojemności magistrali, długości połączeń, liczby urządzeń, napięcia oraz wymaganej szybkości narastania sygnału. W prostych układach często stosuje się rezystory o wartości kilku kiloomów, jednak optymalna wartość powinna wynikać z parametrów konkretnego projektu.

Zasilanie i masa

Oprócz linii SDA i SCL urządzenia wymagają zasilania oraz wspólnej masy GND. Magistrala może pracować między innymi z napięciem 3,3 V lub 5 V, zależnie od zastosowanych układów.

Wszystkie urządzenia muszą korzystać ze wspólnej referencji potencjału i obsługiwać zgodne poziomy logiczne. W przeciwnym razie stany na liniach SDA i SCL mogą być interpretowane nieprawidłowo, a zbyt wysokie napięcie może uszkodzić część komponentów.

Zasada działania protokołu I2C

Kontroler i urządzenie docelowe

Na magistrali znajduje się co najmniej jeden kontroler, tradycyjnie określany jako master. Inicjuje on transmisję, generuje sygnał zegarowy i wysyła adres urządzenia docelowego, tradycyjnie nazywanego slave, z którym chce się komunikować.

Każde urządzenie docelowe ma przypisany adres 7- lub 10-bitowy. Kontroler może dzięki temu wywołać konkretny układ bez konieczności stosowania osobnej linii wyboru dla każdego urządzenia.

W prostych systemach rolę jedynego kontrolera pełni zazwyczaj mikrokontroler. Standard dopuszcza jednak obecność wielu kontrolerów korzystających ze wspólnej magistrali.

Sygnały START i STOP

Każda transmisja I2C rozpoczyna się sygnałem START i kończy sygnałem STOP.

START oznacza przejście linii SDA ze stanu wysokiego do niskiego przy jednocześnie wysokim stanie linii SCL. Wszystkie urządzenia rozpoznają wówczas początek transmisji i rozpoczynają nasłuchiwanie adresu.

STOP oznacza przejście linii SDA ze stanu niskiego do wysokiego przy wysokim stanie SCL. Sygnał ten informuje o zakończeniu komunikacji i zwolnieniu magistrali.

Format bajtu i kolejność bitów

Dane są przesyłane w postaci 8-bitowych bajtów. Każdy bajt jest nadawany od najbardziej znaczącego bitu MSB do najmniej znaczącego bitu LSB.

Po przesłaniu ośmiu bitów następuje dziewiąty cykl zegara przeznaczony na potwierdzenie. Odbiornik wysyła ACK, ściągając linię SDA do stanu niskiego. Sygnał NACK, czyli pozostawienie linii w stanie wysokim, może oznaczać brak gotowości do odbioru, nierozpoznanie adresu albo zakończenie odczytu.

Ramka adresowa i bit R/W

Po sygnale START kontroler wysyła adres urządzenia oraz bit określający kierunek transmisji. W najczęściej stosowanym adresowaniu 7-bitowym pierwszych siedem bitów reprezentuje adres, a ostatni bit pełni funkcję R/W.

Wartość R/W = 0 oznacza zapis do urządzenia, natomiast R/W = 1 oznacza odczyt. Wszystkie urządzenia porównują odebrany adres z własnym, ale tylko właściwy układ odpowiada sygnałem ACK.

Zapis danych

Typowa sekwencja zapisu przebiega w następujący sposób:

  1. kontroler generuje sygnał START;
  2. wysyła adres urządzenia z bitem R/W ustawionym na 0;
  3. oczekuje na potwierdzenie ACK;
  4. przesyła adres wewnętrznego rejestru i kolejne bajty danych, odbierając potwierdzenie po każdym bajcie;
  5. kończy transmisję sygnałem STOP.

Odczyt danych

Typowa sekwencja odczytu wygląda następująco:

  1. kontroler generuje sygnał START;
  2. wysyła adres urządzenia z bitem R/W ustawionym na 1;
  3. odbiera kolejne bajty danych i potwierdza je sygnałem ACK;
  4. po ostatnim bajcie wysyła NACK, a następnie sygnał STOP.

W praktyce często stosuje się połączoną sekwencję zapisu i odczytu z powtórzonym sygnałem START. Kontroler najpierw wskazuje adres rejestru, a następnie rozpoczyna odczyt bez zwalniania magistrali.

Adresowanie w I2C

Adresy 7- i 10-bitowe

Najczęściej stosowane jest adresowanie 7-bitowe, które zapewnia 128 możliwych wartości, choć część z nich pozostaje zarezerwowana. Rozszerzone adresowanie 10-bitowe udostępnia 1024 wartości, ale jest spotykane znacznie rzadziej.

Adresy urządzeń zapisuje się zwykle w notacji szesnastkowej, na przykład 0x76. Wiele układów pozwala zmieniać najmłodsze bity adresu za pomocą pinów konfiguracyjnych, takich jak A0 i A1. Dzięki temu do jednej magistrali można podłączyć kilka identycznych urządzeń, o ile producent przewidział odpowiedni zakres adresów.

Adresy zarezerwowane

Część przestrzeni adresowej jest przeznaczona do zastosowań specjalnych. Obejmuje ona między innymi adres wywołania ogólnego oraz wartości wykorzystywane podczas adresowania 10-bitowego.

Urządzenie reaguje na wywołanie ogólne tylko wtedy, gdy obsługuje tę funkcję i zostało odpowiednio skonfigurowane. Przed wyborem adresu należy zawsze sprawdzić dokumentację układu oraz specyfikację magistrali.

Konflikty adresów

Jeżeli dwa urządzenia mają ten sam adres, kontroler nie może ich niezależnie wywoływać. Problem pojawia się szczególnie wtedy, gdy producent nie przewidział możliwości sprzętowej ani programowej zmiany adresu.

Konflikt można rozwiązać na kilka sposobów:

  • Zmiana konfiguracji adresu – wykorzystanie pinów adresowych lub odpowiednich rejestrów urządzenia;
  • Zastosowanie multipleksera I2C – rozdzielenie urządzeń na niezależnie wybierane kanały;
  • Użycie dodatkowej magistrali – podłączenie jednego z urządzeń do drugiego kontrolera I2C;
  • Zmiana interfejsu – wykorzystanie SPI, UART lub innego obsługiwanego standardu.

Wiele kontrolerów i arbitraż

I2C pozwala podłączyć do jednej magistrali więcej niż jeden kontroler, na przykład dwa mikrokontrolery. Aby zapobiegać kolizjom, standard wykorzystuje mechanizm arbitrażu.

Każdy kontroler monitoruje stan linii SDA podczas nadawania. Jeżeli próbuje wysłać logiczną „1”, ale odczytuje logiczne „0”, przegrywa arbitraż, przerywa nadawanie i czeka na zwolnienie magistrali.

Arbitraż wykorzystuje właściwości linii z otwartym drenem i pozwala rozstrzygać konflikty bez uszkadzania poprawnie przesyłanej wiadomości.

Typowe prędkości transmisji

Standard I2C definiuje kilka trybów różniących się maksymalną częstotliwością zegara SCL:

Tryb Maksymalna częstotliwość SCL Typowe zastosowanie
Standard-mode 100 kHz proste czujniki, pamięci i urządzenia peryferyjne
Fast-mode 400 kHz większość współczesnych systemów wbudowanych
Fast-mode Plus 1 MHz szybsza transmisja przy odpowiedniej instalacji
High-speed mode 3,4 MHz specjalistyczne układy spełniające dodatkowe wymagania

W typowych projektach najczęściej wykorzystuje się częstotliwość 100 kHz lub 400 kHz. Ostateczna prędkość musi być obsługiwana przez wszystkie urządzenia podłączone do magistrali.

Projektowanie fizyczne magistrali I2C

Długość przewodów i pojemność

I2C zaprojektowano przede wszystkim do komunikacji między układami znajdującymi się na jednej płytce drukowanej. Magistrala najlepiej działa więc przy krótkich połączeniach i niewielkiej pojemności elektrycznej.

Pojemność rośnie wraz z długością przewodów, liczbą urządzeń i liczbą złączy. Powoduje to wydłużenie czasu narastania sygnałów, co ogranicza maksymalną częstotliwość zegara.

Przy dłuższych przewodach lub dużej liczbie urządzeń warto obniżyć częstotliwość SCL, ograniczyć pojemność połączeń i prawidłowo dobrać rezystory podciągające.

Poziomy napięć i konwersja

I2C nie narzuca jednego napięcia pracy. Magistrala może działać między innymi przy 3,3 V lub 5 V, pod warunkiem że wszystkie urządzenia obsługują zastosowane poziomy logiczne.

Jeżeli wspólna magistrala łączy układy pracujące z różnymi napięciami, należy zastosować dwukierunkowy konwerter poziomów przystosowany do linii z otwartym drenem. Pozwala to zapewnić poprawną transmisję i chroni urządzenia niskonapięciowe przed uszkodzeniem.

Typowe problemy

Najczęstsze źródła problemów z magistralą I2C to:

  • Zbyt duża pojemność – długie przewody, liczne urządzenia lub niekorzystne prowadzenie ścieżek spowalniają narastanie sygnałów;
  • Nieprawidłowe rezystory podciągające – brak rezystorów albo źle dobrana wartość uniemożliwiają uzyskanie poprawnych poziomów logicznych;
  • Niezgodne napięcia – bezpośrednie połączenie układów o różnych poziomach logicznych może powodować błędy lub uszkodzenia;
  • Konflikt adresów – dwa urządzenia odpowiadające pod tym samym adresem nie mogą być niezależnie obsługiwane;
  • Błędna konfiguracja – nieprawidłowy adres, częstotliwość, kierunek transmisji lub kolejność operacji prowadzą do braku odpowiedzi;
  • Zablokowana magistrala – urządzenie może pozostawić linię SDA w stanie niskim, na przykład po przerwaniu transmisji.

Typowe objawy to brak sygnału ACK, losowe błędy transmisji, nieprawidłowe dane oraz zatrzymywanie się magistrali. Diagnostykę warto rozpocząć od sprawdzenia napięć, rezystorów podciągających, adresów urządzeń i przebiegów SDA oraz SCL za pomocą analizatora logicznego lub oscyloskopu.

Zastosowania interfejsu I2C

I2C jest powszechnie wykorzystywany w elektronice użytkowej, komputerach, automatyce i systemach wbudowanych. Do najważniejszych zastosowań należą:

  • Peryferia mikrokontrolerów – wyświetlacze, klawiatury, ekspandery portów oraz przetworniki ADC i DAC;
  • Zegary czasu rzeczywistego – moduły RTC przechowujące i udostępniające aktualną datę oraz godzinę;
  • Pamięci nieulotne – układy EEPROM i FRAM przeznaczone do zapisywania konfiguracji oraz danych kalibracyjnych;
  • Czujniki i moduły pomiarowe – termometry, barometry, akcelerometry, żyroskopy, magnetometry i kompletne moduły IMU;
  • Komputery i elektronika użytkowa – monitorowanie temperatury, prędkości wentylatorów i innych parametrów diagnostycznych;
  • Robotyka – komunikacja z czujnikami odległości, modułami orientacji i układami sterującymi;
  • Systemy IoT – współpraca mikrokontrolerów i minikomputerów z czujnikami środowiskowymi oraz modułami wejścia i wyjścia;
  • Sterowniki LED – regulacja jasności, wybór trybów pracy i obsługa efektów świetlnych.

I2C w mikrokontrolerach i Raspberry Pi

Współczesne mikrokontrolery, między innymi z rodzin AVR, ARM Cortex-M i ESP, zazwyczaj mają sprzętowe kontrolery I2C. Odpowiadają one za generowanie zegara, wysyłanie sygnałów START i STOP oraz realizację transmisji.

Popularne platformy udostępniają gotowe biblioteki upraszczające obsługę magistrali. W środowisku Arduino jest to między innymi biblioteka Wire, natomiast na Raspberry Pi można korzystać z narzędzi systemowych i bibliotek Pythona, takich jak smbus.

Programista zwykle wskazuje adres urządzenia, numer rejestru oraz dane przeznaczone do zapisu lub odczytu, a warstwa sprzętowa i biblioteka obsługują szczegóły protokołu. Obejmują one generowanie sygnałów sterujących, potwierdzenia ACK, powtórzony START i wykrywanie części błędów.

Dlaczego warto stosować I2C?

Najważniejsze zalety magistrali I2C to:

  • Niewielka liczba połączeń – niezależnie od liczby urządzeń magistrala korzysta z dwóch wspólnych linii sygnałowych;
  • Adresowanie wielu układów – urządzenia nie wymagają osobnych linii wyboru;
  • Szeroka dostępność komponentów – I2C obsługują liczne czujniki, pamięci, ekspandery portów, wyświetlacze i sterowniki LED;
  • Potwierdzanie transmisji – sygnały ACK i NACK pomagają kontrolować przebieg komunikacji;
  • Obsługa wielu kontrolerów – mechanizm arbitrażu umożliwia współdzielenie magistrali przez więcej niż jeden układ sterujący;
  • Prosta obsługa programowa – popularne platformy oferują gotowe sterowniki i biblioteki.

Do ograniczeń należą niższa prędkość w porównaniu ze SPI, zależność jakości transmisji od pojemności magistrali oraz ograniczona odporność na zakłócenia przy długich przewodach. W typowych systemach wbudowanych prostota połączeń, adresowanie urządzeń i szeroka dostępność kompatybilnych układów sprawiają jednak, że I2C pozostaje wyjątkowo praktycznym rozwiązaniem.