I2C warto wybrać, gdy najważniejsza jest oszczędność pinów: wiele adresowanych urządzeń korzysta ze wspólnych linii SDA i SCL. SPI zwykle zapewnia większą szybkość i pełny dupleks, ale wymaga linii SCLK, MOSI, MISO oraz osobnej linii CS dla każdego urządzenia. Wybór zależy także od pojemności magistrali I2C, jakości trasowania SPI i parametrów obsługiwanych przez podłączone układy.

Dobór interfejsu wpływa na liczbę zajętych pinów mikrokontrolera, złożoność trasowania oraz osiągalną przepustowość.

Poniższe porównanie wyjaśnia zasady działania obu magistral i ułatwia wybór rozwiązania odpowiedniego do konkretnego projektu.

Najpierw przyjrzyjmy się sposobowi przesyłania danych przez SPI i I2C.

Co to jest protokół SPI?

W latach osiemdziesiątych XX wieku firma Motorola opracowała protokół SPI, aby umożliwić komunikację między ówczesnymi mikrokontrolerami a innymi urządzeniami peryferyjnymi, takimi jak pamięć EEPROM.

EEPROM

Źródło: 

Wikimedia Commons

SPI wykorzystuje cztery podstawowe linie sygnałowe, nie licząc zasilania i masy:

SS (oznaczana też CS): linia wyboru urządzenia peryferyjnego, sterowana przez kontroler SPI.

MOSI: dane wysyłane przez kontroler do urządzenia peryferyjnego.

SCLK: sygnał zegarowy generowany przez kontroler SPI.

MISO: dane wysyłane przez urządzenie peryferyjne do kontrolera.

Linie te zapewniają dwukierunkową, synchroniczną komunikację między kontrolerem SPI a wybranym urządzeniem peryferyjnym.

Interfejs protokołu SPI

Typowa magistrala SPI ma jeden kontroler i wiele urządzeń peryferyjnych. Każde z nich zwykle wymaga osobnej linii SS, dlatego praktycznym ograniczeniem ich liczby jest liczba dostępnych pinów. Poniżej pokazano trzy osobne linie SS sterujące trzema urządzeniami.

Interfejs protokołu SPI z wieloma urządzeniami podległymi

Aby rozpocząć transmisję, kontroler ustawia właściwą linię SS w stan niski. Następnie generuje na SCLK przebieg zegarowy o ustalonej częstotliwości.

Dane mogą jednocześnie płynąć linią MOSI od kontrolera i linią MISO do kontrolera, dzięki czemu SPI obsługuje pełny dupleks. W danej chwili aktywne jest zwykle tylko jedno urządzenie peryferyjne.

Co to jest I2C?

Alternatywnie, w 1982 roku firma Philips Semiconductors (obecnie NXP Semiconductors) opracowała pierwszy protokół I2C w celu usystematyzowania komunikacji między układami na jednej płytce drukowanej.

W przeciwieństwie do SPI interfejs I2C potrzebuje tylko dwóch linii komunikacyjnych, nie licząc zasilania i masy:

SDA: szeregowa linia danych.

SCL: szeregowa linia zegarowa.

Do jednej magistrali można podłączyć wiele kontrolerów i urządzeń peryferyjnych, z uwzględnieniem przestrzeni adresowej oraz pojemności przewodów. Linie SCL i SDA pracują w konfiguracji open-drain, dlatego wymagają rezystorów podciągających, które przy braku aktywnego nadajnika utrzymują stan wysoki.

Interfejs protokołu I2C

Konstrukcja open-drain umożliwia pracę wielu kontrolerów na tej samej magistrali. Jeżeli dwa rozpoczną transmisję jednocześnie, mechanizm arbitrażu pozwoli jednemu kontynuować, a drugiemu nakaże przerwanie nadawania.

Podczas arbitrażu kontrolery monitorują SDA. Jeśli urządzenie nadaje stan wysoki, lecz odczytuje niski, uznaje, że utraciło arbitraż i zwalnia magistralę.

Kontroler rozpoczyna komunikację warunkiem START: linia SDA przechodzi w stan niski, gdy SCL pozostaje w stanie wysokim. 

Następnie kontroler wysyła 7-bitowy adres odbiorcy oraz bit odczytu (1) lub zapisu (0). Urządzenie o zgodnym 7-bitowym adresie potwierdza odbiór, ustawiając SDA w stan niski podczas taktu ACK.

Różnice między I2C a SPI

SPI i I2C są prostymi interfejsami przeznaczonymi głównie do komunikacji między układami na niewielkiej odległości. Nie pełnią tej samej roli co magistrale systemowe i interfejsy komunikacyjne takie jak SATA, Ethernet czy USB. 

Ich zasady działania różnią się jednak na tyle, że każdy z nich lepiej sprawdza się w innych zastosowaniach.

Złącze USB

Źródło: 

Wikimedia Commons 

SPI obsługuje cztery tryby zegara (0–3), określone przez polaryzację CPOL i fazę CPHA. Kontroler oraz urządzenie peryferyjne muszą pracować w tym samym trybie; niezgodność może powodować błędny odczyt danych.

SPI nie ma jednej znormalizowanej maksymalnej szybkości. Typowo zegar pracuje z częstotliwością wielu MHz, a w wydajniejszych układach — dziesiątek MHz; dopuszczalną wartość ustala się wg noty katalogowej najwolniejszego urządzenia oraz długości i jakości ścieżek. Dokładne wartości zależą od producenta i wersji układu — sprawdź kartę katalogową. SPI stosuje się między innymi z wyświetlaczami LCD i akcelerometrami o dużej częstotliwości aktualizacji.

LCD

Źródło: 

Flickr

W I2C dane są przesyłane bajtami, a odbiorca sygnalizuje ich odbiór bitem ACK. Poniżej zestawiono cztery tryby o różnych szybkościach transmisji.

Bit ACK

Źródło: 

Wikimedia Commons 

Według specyfikacji I2C NXP UM10204 maksymalne szybkości wynoszą: 100 kbit/s w trybie Standard-mode, 400 kbit/s w Fast-mode, 1 Mbit/s w Fast-mode Plus i 3,4 Mbit/s w High-speed. Nie każdy układ obsługuje wszystkie te tryby — zweryfikuj obsługę wg noty katalogowej. I2C jest zazwyczaj wolniejszy od SPI, lecz dobrze sprawdza się w komunikacji z czujnikami temperatury i przetwornikami analogowo-cyfrowymi.

Czujniki temperatury

Źródło: 

Wikimedia Commons 

Porównanie protokołów I2C i SPI

W poniższej tabeli przedstawiono istotne różnice między protokołami I2C i SPI:

CechaSPII2C
Sterowanie liniamiPush-pullOpen-drain z rezystorami podciągającymi
SzybkośćZależna od urządzeń i ścieżek; dopuszczalny zegar wg noty katalogowejWg NXP UM10204: Standard-mode 100 kbit/s, Fast-mode 400 kbit/s, Fast-mode Plus 1 Mbit/s, High-speed 3,4 Mbit/s
KontroleryTypowo jedenMożliwych wiele na wspólnej magistrali
Linie sygnałowe4 dla jednego urządzenia; każde dodatkowe wymaga kolejnej linii CS2 wspólne: SDA i SCL
Wybór urządzeniaOsobna linia CS, bez adresowaniaAdres 7-bitowy: 128 adresów, w tym 16 zarezerwowanych, czyli około 112 użytecznych
Ograniczenie liczby urządzeńDostępne linie CS i parametry połączeńDostępne adresy oraz pojemność magistrali
Potwierdzenie ACKBrak w samym interfejsieTak

I2C: pojemność magistrali i czas narastania

Rezystor podciągający musi naładować pojemność magistrali, zanim linia osiągnie stan wysoki. Dlatego samo ustawienie szybkości w kontrolerze nie wystarcza: trzeba sprawdzić czas narastania SDA i SCL. Poniższe granice pochodzą ze specyfikacji I2C NXP UM10204, a nie z pomiarów konkretnej płytki.

Tryb I2CMaksymalna szybkość wg specyfikacjiMaksymalne CbMaksymalny czas narastania tr
Standard-mode100 kbit/s400 pF1000 ns
Fast-mode400 kbit/s400 pF300 ns

Dla zbocza od 30% do 70% napięcia czas narastania można oszacować ze wzoru tr ≈ 0,8473 · Rp · Cb, gdzie Rp jest rezystancją podciągającą, a Cb pojemnością magistrali. Przy Rp w Ω i Cb w F wynik otrzymujemy w sekundach. Zasady działania tych elementów opisuje artykuł o rezystorach podciągających.

Przykład obliczeniowy: dla Rp = 2,2 kΩ i Cb = 100 pF otrzymujemy tr ≈ 0,8473 · 2200 Ω · 100 · 10−12 F ≈ 186 ns. Tabela zawiera obliczenia zaokrąglone do pełnych nanosekund; nie są to wyniki własnych pomiarów.

Rptr przy 50 pFtr przy 100 pFtr przy 200 pFtr przy 400 pF
2,2 kΩ93 ns186 ns373 ns746 ns
4,7 kΩ199 ns398 ns796 ns1593 ns
10 kΩ424 ns847 ns1695 ns—

Kreska oznacza brak obliczenia w zestawieniu. Przy 100 pF rezystor 2,2 kΩ daje 186 ns, czyli spełnia limit 300 ns dla Fast-mode. Rezystor 4,7 kΩ daje 398 ns i spełnia jedynie limit 1000 ns dla Standard-mode. Przy 400 pF i 4,7 kΩ wynik 1593 ns przekracza nawet ten limit. Sama zgodność pojemności z granicą 400 pF nie gwarantuje więc poprawnej transmisji.

Jak dobrać rezystor podciągający I2C?

Mniejszy Rp przyspiesza narastanie, ale zwiększa prąd, który wyjście musi odprowadzić w stanie niskim. Dla warunku ze specyfikacji: prąd 3 mA przy VOL ≤ 0,4 V, dolna granica wynosi Rp(min) = (VDD − 0,4 V) / 3 mA. Zdolność konkretnego wyjścia do spełnienia tego warunku sprawdź wg noty katalogowej; dokładne parametry zależą od producenta i wersji układu.

VDDObliczenie Rp(min)Wynik przybliżony
3,3 V(3,3 V − 0,4 V) / 3 mA0,97 kΩ
5 V(5 V − 0,4 V) / 3 mA1,53 kΩ

Rezystor musi jednocześnie spełniać ograniczenie prądowe i zapewniać wymagany czas narastania. Zbyt duża rezystancja opóźnia osiągnięcie stanu wysokiego, a zbyt mała może uniemożliwić utrzymanie poprawnego stanu niskiego przez wyjście. Jeśli tych wymagań nie da się pogodzić, ogranicz pojemność magistrali lub wybierz wolniejszy tryb, zamiast dowolnie zmniejszać Rp.

Trasowanie I2C i SPI na PCB

  • I2C: prowadź magistralę krótko i kontroluj pojemność wynikającą z długości ścieżek oraz liczby urządzeń. Kolejny moduł, np. adapter I2C, wymaga ponownego sprawdzenia obciążenia, nawet jeśli nadal dostępny jest adres.
  • SPI: prowadź SCLK możliwie krótko. Unikaj długich równoległych odcinków obok linii o szybkich zboczach, ponieważ sprzężenia mogą zakłócać transmisję. Przy dłuższych ścieżkach rozważ rezystor szeregowy przy nadajniku; jego wartości nie należy dobierać wyłącznie na podstawie częstotliwości zegara.
  • Poziomy logiczne: urządzenia pracujące przy różnych napięciach wymagają odpowiedniej translacji. Zgodny protokół nie oznacza zgodności elektrycznej wejść i wyjść.

Podczas weryfikacji I2C należy sprawdzić czas przejścia od 30% do 70% napięcia i porównać go z limitem wybranego trybu. W SPI należy szukać zakłóceń zboczy SCLK oraz sprawdzić zgodność CPOL/CPHA. Jest to opis sposobu kontroli, nie wynik pomiarów wykonanych dla tego artykułu.

Protokoły SPI i I2C - zalety i wady

SPI 

Plusy

SPI może pracować z niewielkim poborem energii.

Obsługuje szybką komunikację w pełnym dupleksie.

Wady

Różne warianty i wymagania urządzeń mogą powodować problemy ze zgodnością.

Obsługa wielu urządzeń peryferyjnych zwykle wymaga dodatkowych linii wyboru.

Interfejs jest przeznaczony do komunikacji na krótkich odległościach; prowadzenie go między płytkami wymaga szczególnej dbałości o integralność sygnału.

I2C 

Zalety

Wiele urządzeń może korzystać z tych samych dwóch linii magistrali.

Możliwa jest komunikacja między płytkami, zwykle przy ograniczonej szybkości i długości połączenia.

Przy właściwym doborze rezystorów podciągających magistrala może pracować stabilnie w typowych warunkach.

Zmniejszenie szybkości I2C zwiększa dopuszczalny czas narastania, ale nie usuwa ograniczenia pojemności magistrali.

Mniejsza liczba przewodów upraszcza trasowanie i może obniżyć koszt.

Wady

Szybkość transmisji jest zwykle mniejsza niż w SPI.

Rezystory podciągające powodują pobór prądu, gdy linia znajduje się w stanie niskim.

Urządzenie, które nie zwolni linii, może zablokować całą magistralę I2C.

Czynniki, które należy wziąć pod uwagę przy wyborze między SPI a I2C

Przy wyborze interfejsu liczy się nie tylko koszt. Trzeba uwzględnić liczbę dostępnych pinów, pobór energii, szybkość i układ płytki.

Ograniczona liczba pinów

Gdy mikrokontroler ma niewiele wolnych pinów, I2C bywa korzystniejsze, ponieważ urządzenia wykorzystują dwie wspólne linie. W omawianym połączeniu SPI potrzebne są trzy wspólne sygnały — SCLK, MOSI i MISO — oraz osobna linia CS dla każdego urządzenia, czyli łącznie cztery linie dla jednego urządzenia peryferyjnego.

Zasilanie

W urządzeniu bateryjnym trzeba przeanalizować częstotliwość transmisji, wartości rezystorów podciągających i czas aktywności linii. Rzeczywisty pobór energii zależy od całego układu, nie tylko od nazwy interfejsu.

Szybkość

Jeżeli urządzenie przesyła duże porcje danych lub wymaga krótkiego czasu reakcji, SPI zazwyczaj oferuje większą przepustowość. I2C wystarcza do wolniejszych czujników i układów konfiguracyjnych.

Rozmiar płytki drukowanej

Na małej płytce dwie wspólne linie I2C mogą uprościć trasowanie. W SPI większa liczba ścieżek zajmuje więcej miejsca, choć sam interfejs jest prostszy logicznie.

Wybór między SPI a I2C

Poniższe zestawienie podsumowuje kryteria wyboru obu interfejsów:

CechaSPII2C
SzybkośćDobry wybór, gdy projekt wymaga dużej szybkości transmisji.Odpowiedni do urządzeń przesyłających niewielkie ilości danych.
Rozmiar płytki drukowanejWymaga większej liczby ścieżek, zwłaszcza przy wielu urządzeniach.Dwie wspólne linie ułatwiają trasowanie na małej płytce.
Ograniczona liczba pinówSprawdza się, gdy dostępne są dodatkowe piny wyboru urządzeń.Oszczędza piny dzięki wspólnej, adresowanej magistrali.
ZasilanieMoże zapewniać mały pobór energii, zależnie od częstotliwości pracy.Pobór zależy między innymi od rezystorów podciągających i aktywności linii.

Zrozumienie protokołu UART

UART to sprzętowy blok w układzie scalonym lub mikrokontrolerze, który realizuje asynchroniczną komunikację szeregową między urządzeniami systemu wbudowanego. 

Typowe połączenie UART jest bezpośrednim łączem między nadajnikiem jednego urządzenia a odbiornikiem drugiego.

Porównanie UART, I2C i SPI

W przeciwieństwie do synchronicznych interfejsów SPI i I2C, UART nie przesyła osobnej linii zegarowej i nie wykorzystuje relacji kontroler–urządzenie peryferyjne. Dwa bloki UART wysyłają oraz odbierają dane przez linie Tx i Rx: Tx jednego urządzenia łączy się z Rx drugiego.

Interfejs protokołu UART 

Podsumowanie wyboru interfejsu

SPI i I2C odpowiadają na różne potrzeby. Niektóre układy scalone obsługują oba interfejsy, dzięki czemu projektant może wybrać wariant najlepiej pasujący do płytki i oprogramowania.

SPI jest zwykle lepsze w projektach wymagających szybkiego transferu danych i pełnego dupleksu. I2C warto wybrać wtedy, gdy priorytetem jest mała liczba pinów i podłączenie wielu adresowanych urządzeń do wspólnej magistrali.

Ostateczną decyzję należy oprzeć na kartach katalogowych urządzeń, wymaganej przepustowości, długości połączeń i dostępnych zasobach mikrokontrolera.