Przejdź do treści

I2C (Inter-Integrated Circuit)

I2C (często nazywane też TWI – Two Wire Interface) to absolutny król, jeśli chodzi o podłączanie małych czujników, zegarów czasu rzeczywistego (RTC) czy ekranów OLED do mikrokontrolera. Został zaprojektowany przez firmę Philips w latach 80., aby uprościć elektronikę wewnątrz telewizorów.

Podczas gdy SPI stawia na maksymalną prędkość i pożera piny, I2C idzie w drugą stronę: stawia na minimalizm przewodów kosztem prędkości.

Najważniejsze cechy w pigułce

  • Synchroniczny - posiada linię zegarową (SCL).
  • Szeregowy - dane lecą bit po bicie.
  • Half-Duplex - w danym momencie można albo tylko wysyłać, albo tylko odbierać (ruch na wspólnej linii danych jest wahadłowy).
  • Magistrala (Bus) - pozwala na podłączenie wielu urządzeń do tych samych dwóch przewodów.
  • Architektura Master-Slave (obecnie: Controller-Target) - jedno urządzenie steruje zegarem i rozpoczyna każdą rozmowę.

🔌 Tylko 2 linie (i sekrety podłączenia)

Wszystkie urządzenia w sieci I2C łączymy równolegle do dokładnie tych samych dwóch przewodów:

  • SDA (Serial Data) - linia, po której biegają dane w obie strony.
  • SCL (Serial Clock) - linia zegarowa, którą steruje Master.

Rezystory Podciągające (Pull-up Resistors) – Bez nich to nie zadziała!

To najczęstszy błąd początkujących. Linie SDA i SCL działają w konfiguracji tzw. otwartego drenu (open-drain). Oznacza to, że urządzenia potrafią tylko "ściągnąć" linię do masy (stan LOW), ale nie potrafią same z siebie podnieść jej do stanu HIGH.

Aby na liniach panował stan wysoki, musisz fizycznie podłączyć rezystory (zazwyczaj od 4.7 kΩ do 10 kΩ) pomiędzy linie SDA/SCL a zasilanie VCC (np. 3.3V lub 5V). Wiele gotowych modułów (np. sensorów) ma już te rezystory wlutowane na płytce, ale zawsze warto to sprawdzić!


🆔 Adresowanie, czyli jak Master wybiera rozmówcę?

W SPI do wyboru urządzenia służył osobny fizyczny przewód (CS). W I2C wszystko dzieje się programowo za pomocą adresów. Każde urządzenie typu Slave ma fabrycznie przypisany unikalny adres (zazwyczaj 7-bitowy, co teoretycznie pozwala na podpięcie do 127 urządzeń do jednej pary przewodów).

Jak wygląda komunikacja? (Ramka I2C)

  1. Start Condition: Master ściąga linię SDA w dół, podczas gdy SCL jest jeszcze wysoko. To sygnał dla wszystkich: "Cisza, zaczynamy!".
  2. Address Byte: Master wysyła 7-bitowy adres urządzenia, z którym chce pogadać + 1 dodatkowy bit (R/W), mówiący o tym, czy chce dane czytać (1), czy zapisać (0).
  3. ACK / NACK: Wszystkie urządzenia słuchają. To, które rozpozna swój adres, ściąga linię SDA do masy (wysyła impuls ACK – Acknowledge), mówiąc: "Jestem, słucham!". Jeśli nikt nie odpowie, Master widzi NACK i wie, że coś jest nie tak.
  4. Data Bytes: Następuje wymiana danych (bajt po bajcie). Po każdym bajcie odbiorca musi potwierdzić odbiór sygnałem ACK.
  5. Stop Condition: Po skończonej pracy Master puszcza linie, wracają one do stanu HIGH. Magistrala jest wolna.

🏎️ Prędkości transmisji

I2C nie jest Demonem Prędkości (w porównaniu do SPI), ale do większości czujników w zupełności wystarcza. Standardowe tryby to:

  • Standard Mode: do 100 kbps (kilobitów na sekundę)
  • Fast Mode: do 400 kbps (najczęściej używany)
  • Fast Mode Plus: do 1 Mbps
  • High-Speed Mode: do 3.4 Mbps (rzadko spotykany i trudny w implementacji)

🪓 Częsty problem: Konflikt Adresów

Co zrobić, jeśli chcesz podłączyć do jednego mikrokontrolera trzy identyczne czujniki temperatury, a każdy z nich ma na sztywno wbity przez producenta ten sam adres (np. 0x4A)?

  1. Zworki ADDR na płytce: Dobrze zaprojektowane moduły mają specjalne pady do polutowania (oznaczone jako ADDR, ADR lub A0, A1). Pozwalają one zmienić ostatnie bity adresu (np. przełączyć z 0x4A na 0x4B).
  2. Multiplekser I2C (np. TCA9548A): Specjalny chip, który działa jak zwrotnica kolejowa. Podłączasz go do mikrokontrolera, a on tworzy kilka niezależnych, przełączanych programowo pod-magistral I2C.

✅ Zalety i ❌ Wady

Zalety: * Oszczędność pinów: Tylko 2 piny GPIO niezależnie od tego, czy masz podpięty 1 czujnik, czy 10. * Potwierdzenie odbioru (ACK): Sprzętowo wiesz, czy urządzenie żyje i czy odebrało dane. * Popularność: Setki tysięcy gotowych układów i bibliotek (np. w środowisku Arduino).

Wady: * Skomplikowany protokół: Narzut bitów adresowych i potwierdzeń ACK sprawia, że faktyczny transfer danych jest wolniejszy niż czysty zegar. * Prędkość: Znacznie wolniejszy od SPI (nie nadaje się do przesyłania wideo czy szybkich kart pamięci). * Problematyczne rezystory: Zła wartość rezystorów pull-up przy dłuższych przewodach potrafi całkowicie położyć komunikację (zaokrągla zbocza sygnałów). * Zasięg: Podobnie jak SPI, jest to standard wewnątrz-płytkowy (do kilkudziesięciu centymetrów).