I2C i SPI należą do najczęściej używanych interfejsów szeregowych w systemach wbudowanych. Oba służą do komunikacji między układami na jednej płytce, lecz różnią się liczbą przewodów, sposobem wybierania urządzeń, szybkością i obsługą transmisji.

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: Slave Select — linia wyboru urządzenia peryferyjnego, sterowana przez kontroler SPI.

MOSI: Master Out Slave In — dane wysyłane przez kontroler do urządzenia peryferyjnego.

SCLK: Serial Clock — sygnał zegarowy generowany przez kontroler SPI.

MISO: Master In Slave Out — 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 vs 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 wynikające z polaryzacji i fazy sygnału. Kontroler oraz urządzenie peryferyjne muszą pracować w tym samym trybie. 

Szybkość transmisji SPI może przekraczać 10 Mb/s, dlatego interfejs dobrze nadaje się do przesyłania większych ilości danych. Stosuje się go 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 potwierdza każdy z nich bitem ACK. Interfejs przewiduje trzy opisane tutaj tryby o różnych szybkościach transmisji. 

Bit ACK

Źródło: 

Wikimedia Commons 

Tryb standardowy osiąga maksymalnie 100 kb/s, szybki 400 kb/s, a high-speed 3,4 Mb/s. I2C jest więc 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 liniamiTryb push-pullTryb open-drain
Maks. prędkośćBrak jednej wartości granicznej; typowo 10 - 100 Mb/s100 kb/s w trybie standardowym, 400 kb/s w trybie szybkim, 3,4 Mb/s w trybie high-speed
Wiele kontrolerówNieTak
Linie sygnałowe4; kolejne urządzenia wymagają dodatkowych linii SS2
Liczba urządzeń peryferyjnychOgraniczona przede wszystkim liczbą pinów dostępnych na linie SS kontrolera SPIMaks. 112 przy adresowaniu 7-bitowym
Kontrola przepływuNieTak

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.

W porównaniu z szybkim SPI można uzyskać większą długość połączenia kosztem prędkości.

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ż niezależnie od liczby urządzeń wykorzystuje dwie wspólne linie. SPI wymaga co najmniej czterech sygnałów, a często także osobnej linii SS dla każdego urządzenia.

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.

UART vs I2C vs 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 

Zaokrąglanie

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.