Interfejs komunikacyjny I2C
20 października 2023 r.
W świecie systemów wbudowanych i elektroniki niezbędna jest sprawna komunikacja między komponentami. Spośród wielu dostępnych obecnie protokołów komunikacyjnych, I2C (Inter-Integrated Circuit) wyróżnia się jako popularny wybór wielu inżynierów i programistów ze względu na swoją prostotę, elastyczność i niskie zużycie energii.
W tym artykule:
Co to jest I2C?
Inter-Integrated Circuit, w skrócie I²C (wymawiane jako „I-squared-C” lub „I-two-C”), to powszechnie stosowany protokół komunikacji szeregowej charakteryzujący się konstrukcją magistrali szeregowej typu multi-master, multi-slave, single-ended, która nadaje się do komunikacji na krótkich odległościach. Unikalną cechą I2C jest wykorzystanie tylko dwóch przewodów do komunikacji, SDA (Serial Data) i SCL (Serial Clock), co upraszcza połączenia i pozwala zaoszczędzić miejsce.
Chociaż oficjalna nazwa to „I²C”, wymawiana jako „eye-squared-see”, dla uproszczenia będziemy nazywać ją „I2C”. Symbol ² to indeks górny 2, co oznacza, że litera I jest pomnożona przez siebie dwa razy. Jest to nawiązanie do dwóch przewodów używanych do komunikacji.
Funkcje I2C:
- I2C to szeregowy, synchroniczny protokół komunikacji danych.
- Do komunikacji wykorzystuje tylko dwa przewody – szeregowy transfer danych i zegar szeregowy.
- Obsługuje wiele urządzeń nadrzędnych i wiele urządzeń podrzędnych w tej samej magistrali.
- Transmisja półdupleksowa — komunikacja między urządzeniem nadrzędnym a podrzędnym może odbywać się w obu kierunkach, ale nie jednocześnie.
- Rozciąganie zegara — urządzenie podrzędne może utrzymać linię zegara, aby zapewnić więcej czasu na przetwarzanie danych.
- Arbitraż – w przypadku, gdy dwa urządzenia nadające rozpoczną transmisję w tym samym czasie, I2C posiada wbudowaną metodę decydującą, które z nich będzie kontynuować transmisję, a które będzie czekać, zapewniając integralność danych.
- 7-bitowy system adresowania, ale może również obsługiwać adresy 10-bitowe.
- Obsługuje różne prędkości — standardowa specyfikacja I2C definiuje cztery klasy prędkości: tryb standardowy (100 kb/s), tryb szybki (400 kb/s), tryb szybki Plus (1 Mb/s) oraz tryb wysokiej prędkości (3,4 Mb/s).
Dowiedz się więcej:Komunikacja szeregowa a komunikacja równoległa
Jak działa I2C?
I2C to dwuprzewodowa magistrala szeregowa wykorzystująca dwie dwukierunkowe linie typu open-drain, SDA i SCL, które są ustawione w stanie wysokim.
- SDA (szeregowa linia danych): Ta linia przenosi dane.
- SCL (Serial Clock Line): Ta linia zapewnia synchronizację.
Urządzenia w magistrali I2C mogą pełnić rolę urządzenia nadrzędnego lub podrzędnego:
- Master (kontroler): Inicjuje i kontroluje transfer danych w magistrali.
- Slave (urządzenie peryferyjne): odpowiada na polecenia urządzenia nadrzędnego.
Terminy „master” i „slave” były historycznie używane do opisania ról urządzeń w magistrali I2C, ale w wielu kontekstach zostały one zastąpione głównie terminami „kontroler” i „urządzenie peryferyjne”.
Proces komunikacji danych I2C
- Stan bezczynności magistrali (magistrala wolna):
- Przed rozpoczęciem komunikacji zarówno SDA (szeregowa linia danych), jak i SCL (szeregowa linia zegara) pozostają w stanie wysokim, co oznacza, że magistrala jest w stanie spoczynku.
- Warunek startowy:
- Zainicjowane przez urządzenie nadrzędne, warunek startowy występuje, gdy linia SDA przechodzi ze stanu wysokiego do niskiego, podczas gdy linia SCL jest w stanie wysokim. Sygnalizuje to wszystkim urządzeniom podrzędnym, że komunikacja ma się rozpocząć.
- Wysyłanie adresu:
- Urządzenie nadrzędne wysyła 7-bitowy adres do urządzenia podrzędnego, z którym chce się połączyć. Po nim następuje 8. bit, bit odczytu/zapisu (R/W), który wskazuje kierunek operacji:
0do pisania i1do przeczytania. - Ta połączona sekwencja 8-bitowa nazywana jest ramką adresu.
- W szczególnym przypadku adresów 10-bitowych urządzenie nadające wysyła 2 bajty. Pierwszy bajt zaczyna się od 11110, po czym następują bity 9 i 8 adresu 10-bitowego, a następnie bit R/W. Drugi bajt zawiera bity 7-0 adresu 10-bitowego.
- Urządzenie nadrzędne wysyła 7-bitowy adres do urządzenia podrzędnego, z którym chce się połączyć. Po nim następuje 8. bit, bit odczytu/zapisu (R/W), który wskazuje kierunek operacji:
- Bit potwierdzenia (ACK):
- Po wysłaniu adresu i bitów R/W urządzenie nadrzędne zwalnia linię SDA. Adresowane urządzenie podrzędne obniża poziom linii SDA (bit potwierdzenia), aby potwierdzić, że pomyślnie odebrało adres i jest gotowe do komunikacji.
- Transfer danych:
- W przypadku operacji zapisu urządzenie nadrzędne wysyła bajt danych do urządzenia podrzędnego. Urządzenie podrzędne potwierdza odbiór, obniżając poziom linii SDA na jeden impuls zegara.
- W przypadku operacji odczytu urządzenie podrzędne wysyła bajt danych do urządzenia nadrzędnego. Urządzenie nadrzędne potwierdza odbiór, ale po ostatnim bajcie podczas operacji odczytu zwalnia linię SDA (NACK lub brak potwierdzenia), sygnalizując urządzeniu podrzędnemu, aby zaprzestało wysyłania danych.
- Warunek zatrzymania:
- Aby zakończyć sesję komunikacyjną, urządzenie nadrzędne generuje stan zatrzymania, przechodząc z linii SDA z poziomu niskiego do wysokiego, podczas gdy linia SCL jest na poziomie wysokim. Po stanie zatrzymania magistrala powraca do stanu spoczynku.
- Master może również wygenerować powtarzalny warunek startowy, aby zachować kontrolę nad magistralą dla kolejnej operacji odczytu lub zapisu. Jest to często stosowane w bardziej złożonych operacjach, takich jak zmiana kierunku danych bez zwalniania magistrali.
Dowiedz się więcej:Co to jest szybkość transmisji
Obsługa wielu urządzeń podrzędnych
Jeśli istnieje wiele urządzeń podrzędnych, urządzenie nadrzędne komunikuje się z każdym z nich, używając ich unikalnych adresów. Tylko urządzenie podrzędne o pasującym adresie odpowiada i komunikuje się, podczas gdy pozostałe ignorują komunikaty.
Rozciąganie zegara
Niewolnik może przytrzymać linię SCL (proces znany jako rozciąganie zegara), jeśli potrzebuje więcej czasu na przetworzenie instrukcji lub pobranie danych. Mistrz musi poczekać, aż linia SCL zostanie zwolniona, aby kontynuować.
Arbitraż magistrali (dla wielu masterów)
Arbitraż to proces określania, które urządzenie nadrzędne przejmuje kontrolę nad magistralą, gdy wiele urządzeń nadrzędnych próbuje nawiązać komunikację jednocześnie lub w krótkim odstępie czasu. I2C obsługuje wiele urządzeń nadrzędnych, co oznacza, że więcej niż jedno urządzenie nadrzędne może próbować kontrolować magistralę w danym momencie bez uszkadzania komunikatu.
Procedura arbitrażowa I2C:
- Gdy master rozpoczyna transmisję, zakłada, że ma kontrolę nad magistralą.
- Podczas wysyłania bitów adresu i danych sprawdza linię SDA po zapisaniu każdego bitu. Jeśli zapisuje
0i odczytuje1, wie, że kontrolę przejął inny mistrz i wycofuje się, tracąc w ten sposób arbitraż. - Urządzenie nadrzędne, które przegrało arbitraż, natychmiast przerywa transmisję i czeka, aż linia SCL (Serial Clock) osiągnie stan HIGH, wskazujący koniec bieżącego transferu, zanim spróbuje ponownie.
Dzięki wydajnemu transferowi danych przy użyciu tylko dwóch przewodów, I2C stało się popularnym interfejsem komunikacji szeregowej dla systemów wymagających niezawodnej i ekonomicznej komunikacji.
Więcej informacji:Przykładowy kod do implementacji I2C na wyświetlaczu LCD 16x2 COG
Zalety I2C:
- Prostota: Wymaga tylko dwóch przewodów, niezależnie od liczby podłączonych urządzeń.
- Elastyczność: Obsługuje wiele urządzeń głównych i podrzędnych.
- Efektywność energetyczna: urządzenia peryferyjne I2C mogą być wyłączane, gdy nie są używane, bez wpływu na magistralę.
- Wbudowane adresowanie: Każde urządzenie w magistrali ma unikalny adres.
- Szerokie wsparcie: Wiele mikrokontrolerów i urządzeń peryferyjnych ma wbudowane interfejsy sprzętowe I2C, co ułatwia integrację.
- Elastyczne tryby prędkości: I2C obsługuje kilka trybów prędkości.
Wady I2C:
- Ograniczenia prędkości: Zazwyczaj wolniejsze niż inne protokoły, takie jak SPI.
- Ograniczenia odległości: I2C jest przeznaczony do krótkich odległości. W przypadku większych odległości integralność sygnału i zakłócenia mogą stać się problematyczne.
- Złożoność dużych sieci: wraz z dodawaniem kolejnych urządzeń adresowanie może stać się skomplikowane.
- Brak sprawdzania błędów: Brak wbudowanego mechanizmu sprawdzania błędów.
- Single-ended: Brak sygnałów różnicowych, co może poprawić odporność na zakłócenia.
I2C a inne protokoły komunikacji szeregowej
Wybierając protokół komunikacji szeregowej do swojego projektu, należy wziąć pod uwagę konkretne potrzeby danej aplikacji. Chociaż popularnym wyborem jest protokół I2C, dostępne są również inne protokoły, takie jak SPI, RS-232, CAN i UART. Każdy protokół ma swoje zalety i wady, dlatego przed podjęciem decyzji należy rozważyć wszystkie za i przeciw.
I2C a SPI (szeregowy interfejs peryferyjny):
- Przewody: SPI wymaga większej liczby przewodów: SCLK (zegar szeregowy), MOSI (wyjście master, wejście slave), MISO (wejście master, wyjście slave) oraz unikalny przewód SS (wybór slave) dla każdego urządzenia. Natomiast I2C wymaga jedynie przewodów SDA i SCL.
- Szybkość: SPI może być szybszy niż I2C, ponieważ nie ma fazy adresowej w transmisji danych.
- Elastyczność: Podczas gdy I2C obsługuje natywnie konfigurację multi-master, SPI tego nie robi.
I2C a UART (uniwersalny asynchroniczny odbiornik-nadajnik):
- Złożoność protokołu: UART jest prostszy, ponieważ obejmuje tylko dwa urządzenia komunikujące się ze sobą za pomocą dwóch linii (TX i RX). I2C może łączyć wiele urządzeń za pomocą tylko dwóch linii.
- Synchronizacja: UART jest asynchroniczny (bez linii zegara), natomiast I2C jest synchroniczny (wymaga linii zegara).
I2C a CAN (Controller Area Network):
- Przykład zastosowania: CAN jest przeznaczony dla pojazdów i systemów przemysłowych, w których niezawodność w warunkach zakłóceń ma kluczowe znaczenie. I2C jest bardziej przeznaczony do komunikacji między układami scalonymi na pokładzie na krótkich odległościach.
- Niezawodność: CAN posiada wbudowane mechanizmy sprawdzania i korekcji błędów, podczas gdy I2C ich nie posiada.
I2C kontra RS232:
- RS232 wykorzystuje 3 przewody i obsługuje tylko dwa urządzenia (jeden nadajnik i jeden odbiornik), podczas gdy I2C obsługuje kilka urządzeń przy użyciu tylko 2 przewodów.
- RS-232 nadaje się do komunikacji na duże odległości.
| Protokół | Liczba przewodów | Prędkość | Złożoność | Zużycie energii | Typowe zastosowania |
|---|---|---|---|---|---|
| I2C | 2 | Powolny | Średni | Niski | Systemy wbudowane, czujniki, wyświetlacze, elementy wykonawcze, urządzenia peryferyjne. |
| SPI | 4 | Szybko | Średni | Średni | Szybka komunikacja, układy pamięci. |
| UART | 2 | Powolny | Niski | Niski | Komunikacja asynchroniczna, komunikacja szeregowa na duże odległości. |
| CAN | 2 | Szybko | Średni | Średni | Zastosowania motoryzacyjne i przemysłowe. |
| RS-232 | 3 | Powolny | Średni | Średni | Komputery, drukarki, modemy. |
Wniosek
I2C to niezbędny protokół komunikacyjny, który od dziesięcioleci sprawdza się w świecie elektroniki. Jego prostota w połączeniu z możliwością podłączenia wielu urządzeń za pomocą zaledwie dwóch linii sprawia, że jest on popularnym wyborem w wielu zastosowaniach. Jednak, podobnie jak każdy protokół, ma on swoje ograniczenia i nie jest idealny we wszystkich scenariuszach. Projektując system, należy ocenić konkretne potrzeby aplikacji i wybrać protokół komunikacyjny, który najlepiej odpowiada tym potrzebom.