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)
- Start Condition: Master ściąga linię SDA w dół, podczas gdy SCL jest jeszcze wysoko. To sygnał dla wszystkich: "Cisza, zaczynamy!".
- 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).
- 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.
- Data Bytes: Następuje wymiana danych (bajt po bajcie). Po każdym bajcie odbiorca musi potwierdzić odbiór sygnałem ACK.
- 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)?
- 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
0x4Ana0x4B). - 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).