Czym różni się I2C od SPI i kiedy lepiej użyć którego?

Czym różni się I2C od SPI i kiedy lepiej użyć którego?
W projektach elektronicznych często natrafiamy na dwa popularne protokoły komunikacji szeregowej: I2C oraz SPI. Oba służą do wymiany danych między mikrokontrolerem masterem a urządzeniami peryferyjnymi slave’ami i są protokołami synchronicznymi wykorzystują sygnał zegarowy. Różnią się jednak pod wieloma względami budowy i działania każdy z nich ma swoje zalety i ograniczenia decydujące o przydatności w konkretnych zastosowaniach.
W poprzednich artykułach wyjaśnialiśmy, czym jest magistrala I2C „Inter-Integrated Circuit” oraz jak działa interfejs SPI „Serial Peripheral Interface”. Teraz skupimy się na porównaniu tych dwóch rozwiązań. Poniżej przedstawiamy najważniejsze różnice między I2C a SPI oraz wskazówki, kiedy lepiej użyć którego z nich w praktyce.
Najważniejsze różnice między I2C a SPI
- Liczba przewodów: I2C wykorzystuje tylko 2 linie sygnałowe: SDA dane i SCL zegara, niezależnie od liczby podłączonych urządzeń. SPI wymaga 4 linii dla jednego urządzenia MOSI, MISO, SCK, CS; z każdą kolejną kostką peryferyjną dochodzi dodatkowy pin CS Chip Select do wyboru układu. Oznacza to, że I2C jest pod tym względem prostsze okablować mniej połączeń, zaś SPI zajmuje więcej wyprowadzeń mikrokontrolera.
- Adresowanie i liczba urządzeń: W I2C każdemu urządzeniu slave przypisany jest unikalny adres 7 lub 10-bitowy, dzięki czemu wiele układów może współdzielić tę samą 2‑przewodową magistralę. Master wysyła adres docelowy na początku transmisji, aby wybrać odpowiednie urządzenie. W SPI nie ma adresów każdemu slave’owi odpowiada osobna linia CS sterowana przez mastera. Teoretycznie do I2C można podłączyć do 127 urządzeń adresy 7-bitowe, w praktyce około 112 po odliczeniu adresów zastrzeżonych. W SPI liczba obsługiwanych układów jest ograniczona głównie dostępną liczbą pinów na sygnały CS w mikrokontrolerze zwykle kilka na jednej magistrali, chyba że zastosujemy dodatkowe dekodery linii CS.
- Szybkość transmisji: SPI jest na ogół znacznie szybsze od I2C. Protokół SPI nie ma formalnego limitu częstotliwości w praktyce wiele mikrokontrolerów osiąga dziesiątki MHz np. 10–20 MHz a niektóre układy nawet więcej. Natomiast typowe prędkości I2C to 100 kHz Standard Mode lub 400 kHz Fast Mode w projektach hobbystycznych, ewentualnie do 3,4 MHz w trybie High Speed. SPI potrafi więc przesyłać dane wielokrotnie szybciej niż I2C co bywa istotne np. przy obsłudze wyświetlaczy graficznych lub szybkich przetworników ADC. Przykładowo, pełne odświeżenie małego ekranu OLED przez I2C 400 kHz może zająć ok. 40 ms, podczas gdy ten sam ekran sterowany SPI ≈8 MHz odświeży się w ~6 ms czyli kilka razy szybciej.
- Tryb komunikacji: SPI działa w trybie pełnego dupleksu posiada osobne linie do wysyłania MOSI i odbierania danych MISO, dzięki czemu może realizować obie transmisje jednocześnie. I2C jest półdupleksowy wszystkie urządzenia dzielą linię SDA, więc w danym momencie komunikacja odbywa się tylko w jednym kierunku master najpierw wysyła komendę, potem może otrzymać odpowiedź. W praktyce half-duplex I2C nie stanowi problemu przy odczytywaniu typowych czujników itp., ale full-duplex SPI bywa zaletą np. gdy urządzenie peryferyjne musi równocześnie zwracać dane podczas odbierania komendy.
- Potwierdzanie danych i niezawodność: Protokół I2C zapewnia kontrolę poprawności transmisji każdy bajt danych wysyłany przez mastera musi zostać potwierdzony bit ACK przez odbiornik. Brak ACK informuje mastera o niepowodzeniu, co umożliwia odpowiednią reakcję np. ponowną próbę. SPI nie posiada wbudowanego mechanizmu potwierdzeń master wysyła dane „w ciemno”, a ewentualną weryfikację poprawności trzeba zaimplementować samodzielnie np. poprzez sumy kontrolne lub protokół wyższego poziomu. Z drugiej strony brak narzutu ACK sprawia, że SPI osiąga większą efektywną przepustowość. Warto dodać, że I2C obsługuje tryb multi-master gdyby dwa urządzenia nadrzędne zaczęły nadawać jednocześnie, magistrala rozstrzygnie kolizję automatycznie arbitraż zatrzyma jedno z nadań. W SPI zazwyczaj występuje tylko jeden master, więc ten problem nie pojawia się.
- Zasięg i zakłócenia: Oba protokoły przeznaczone są do komunikacji na krótkim dystansie w obrębie jednej płytki PCB lub między bliskimi modułami. SPI z definicji ma ograniczony zasięg wysokie częstotliwości sygnałów i brak mechanizmów eliminacji zakłóceń sprawiają, że praktycznie nie stosuje się go do łączenia układów na większe odległości. I2C jest nieco bardziej odporne na zakłócenia i bywa używane do komunikacji między płytkami, ale tylko przy niewielkich prędkościach transmisji. Standardowo przewody I2C nie powinny przekraczać kilkudziesięciu centymetrów długości przy dłuższych połączeniach wymagane są specjalne konwertery lub zastosowanie innych protokołów np. CAN, RS-485.
- Zużycie energii: I2C, z racji używania rezystorów podciągających, może pobierać nieco więcej prądu podczas komunikacji niż SPI. Linie SDA/SCL są utrzymywane w stanie wysokim przez rezystory każde przesłanie stanu niskiego powoduje przepływ prądu do masy. SPI wykorzystuje wyjścia typu push-pull, które aktywnie wymuszają stan wysoki lub niski bez potrzeby rezystorów. W efekcie SPI uchodzi za bardziej energooszczędne w zastosowaniach bateryjnych. Różnice są jednak zwykle niewielkie w porównaniu do poboru energii przez same układy peryferyjne.
Kiedy wybrać SPI, a kiedy I2C?
- SPI – wybierz ten interfejs, gdy priorytetem jest wysoka szybkość transmisji lub obsługa urządzeń wymagających przesyłania dużych ilości danych w krótkim czasie np. wyświetlacze graficzne, szybkie przetworniki ADC, pamięci Flash. SPI sprawdzi się także, gdy mamy do podłączenia tylko kilka układów i możemy pozwolić sobie na przeznaczenie osobnych pinów CS dla każdego z nich. Ze względu na brak dodatkowego narzutu protokołu SPI bywa preferowane w aplikacjach wymagających minimalnych opóźnień i dużej niezawodności przesyłu danych.
- I2C – warto go użyć, gdy zależy nam na prostszym okablowaniu mniej linii sygnałowych lub planujemy podłączyć wiele różnych urządzeń do jednego mikrokontrolera jednocześnie. Magistrala I2C jest idealna w projektach z wieloma czujnikami o stosunkowo niewielkiej częstotliwości odczytu np. czujniki temperatury, ciśnienia, zegary RTC itp, gdzie szybkość nie jest kluczowa, a oszczędność pinów ma duże znaczenie. I2C sprawdza się również wtedy, gdy dany moduł lub podzespół występuje tylko w wersji z interfejsem I2C wiele popularnych sensorów i ekspanderów portów jest projektowanych właśnie pod I2C. Jeśli nasz mikrokontroler ma bardzo ograniczoną liczbę wyprowadzeń, wspólna magistrala I2C zamiast kilku osobnych linii SPI bywa wręcz jedynym rozwiązaniem umożliwiającym podłączenie wszystkich podzespołów.
Podsumowanie
O wyborze interfejsu często decydują wymagania projektu oraz dostępność urządzeń. Coraz częściej spotyka się układy wyposażone jednocześnie w wyprowadzenia I2C i SPI wtedy decyzję można podjąć w oparciu o powyższe kryteria. Warto znać oba protokoły i rozumieć ich specyfikę, aby móc optymalnie je wykorzystać. Nie można wskazać, że jeden z nich jest ogólnie lepszy od drugiego każdy sprawdza się lepiej w nieco innych zastosowaniach.

Wpisy powiązane z artykułem

Prezentowaną w artykule elektronikę znajdziesz oczywiście w naszym sklepie 👉 sklep.msalamon.pl 👈Zapraszamy również na nasze social media, gdzie na bieżąco informujemy o nowych produktach oraz o najciekawszych promocjach 😎👇