Czym jest SPI i jak działa? Praktyczne wprowadzenie dla początkujących

Czym jest SPI i jak działa? Praktyczne wprowadzenie dla początkujących
Serial Peripheral Interface (SPI) to jeden z najpopularniejszych interfejsów komunikacyjnych stosowanych w elektronice, szczególnie w systemach wbudowanych. Stanowi on szeregową magistralę komunikacyjną typu master-slave, co oznacza, że jedno urządzenie na przykład mikrokontroler pełniący rolę mastera kontroluje pracę jednego lub kilku urządzeń peryferyjnych – slave. SPI został opracowany przez firmę Motorola w latach 80., a dziś jest de facto standardem krótkodystansowej komunikacji między układami scalonymi na wspólnej płytce. W praktyce każdy hobbysta spotkał się z nim przy okazji projektów z Arduino czy Raspberry Pi – wiele modułów, takich jak wyświetlacze czy pamięci, korzysta z SPI do szybkiej wymiany danych.
Czym jest SPI?
SPI czyli szeregowy interfejs peryferyjny to prosty, synchroniczny protokół komunikacji, w którym dane przesyłane są bit po bicie w formie szeregu impulsów zegarowych. W przeciwieństwie do komunikacji równoległej gdzie wiele bitów przesyła się jednocześnie kilkoma liniami, SPI wykorzystuje podejście szeregowe informacje przekazywane są jednym bitem na raz, co upraszcza połączenia i pozwala osiągać wysokie częstotliwości taktowania. Master na przykład mikrokontroler generuje sygnał zegarowy i zarządza przebiegiem transmisji, a urządzenie slave odbiera dane lub odpowiada własnymi danymi w ściśle zsynchronizowany sposób.
SPI wyróżnia się tym, że jest pełnodupleksowy oznacza to, że transmisja może odbywać się w obu kierunkach jednocześnie. W każdej jednostce czasu (na każdy impuls zegara) master może wysłać bit danych do slave’a i równocześnie odebrać bit danych od slave’a. Taka jednoczesna dwukierunkowa komunikacja odróżnia SPI od wielu innych interfejsów jak np. I²C, który jest half-duplex i działa trochę wolniej. Co ważne, SPI nie narzuca skomplikowanego protokołu z adresowaniem czy potwierdzaniem ack, wszystko sprowadza się do prostego przesyłania bajtów danych. Dzięki temu jest bardzo szybki i prosty w implementacji sprzętowej, ale wymaga więcej linii sygnałowych niż np. wspomniany I²C.

podstawowe sygnały SPI
Typowa magistrala SPI składa się maksymalnie z czterech linii sygnałowych, z których każda pełni określoną funkcję:
- MOSI Master Out, Slave In – linia danych wychodzących z urządzenia głównego mastera do urządzenia podrzędnego slave. To tędy master wysyła polecenia lub dane do peryferium.
- MISO Master In, Slave Out – linia danych wychodzących ze slave’a do mastera. Służy do odbierania informacji zwrotnych lub odczytywanych danych z urządzenia peryferyjnego. Jeśli urządzenie peryferyjne nie musi nic przesyłać do mastera, linia MISO bywa nieużywana.
- SCK zwany też SCLK od Serial Clock – linia zegarowa. Master generuje sygnał zegarowy na tej linii i synchronizuje w ten sposób transfer bitów danych na liniach MOSI/MISO. Każde zbocze narastające lub opadające – w zależności od trybu SPI zegara wyznacza moment odczytu lub zmiany bitu danych.
- CS Chip Select, nazywany również SS Slave Select – linia wyboru układu podrzędnego. Służy do aktywowania konkretnego urządzenia slave, z którym master chce się komunikować w danej chwili. Linia CS jest aktywna najczęściej w stanie niskim logiczne – oznacza to, że aby „włączyć” dany moduł do komunikacji, master musi ściągnąć przypisany mu sygnał CS do stanu niskiego. Każdy slave podłączony do magistrali SPI zwykle ma własną linię CS.
W praktyce po stronie mastera znajdziemy więc wyprowadzenia MOSI, MISO, SCK oraz kilka wyjść CS po jednym na każde urządzenie peryferyjne. Po stronie każdego z urządzeń slave znajdziemy odpowiednio piny: wejściowy dla MOSI odbiera dane od mastera, wyjściowy dla MISO wysyła dane do mastera oraz wejście SCK odbiera sygnał zegara i wejście CS aktywowane przez master. Warto wspomnieć, że spotyka się różne oznaczenia tych sygnałów – np. MOSI bywa nazywane SDI Serial Data In z punktu widzenia slave’a, MISO jako SDO Serial Data Out, a linia CS czasem opisana jest jako CE Chip Enable lub SS. Zawsze jednak chodzi o ten sam zestaw połączeń.
Jak działa transmisja SPI?
Gdy master i slave są połączone powyższymi liniami, komunikacja przebiega według prostego schematu. Master wybiera urządzenie, z którym chce rozmawiać, ustawiając odpowiednią linię CS w stan niski pozostałe linie CS pozostają wtedy w stanie wysokim, dezaktywując inne podłączone układy. Następnie master generuje serię impulsów zegarowych na linii SCK i jednocześnie wystawia kolejne bity danych na linii MOSI – na każdy impuls zegara przypada dokładnie jeden bit. Po stronie slave’a pobranie bitu z MOSI synchronizuje się z określonym zboczem sygnału zegarowego. Równocześnie jeśli jest taka potrzeba slave może wysyłać własne dane zwrotne na linii MISO – master odczytuje je bit po bicie przy taktowaniu tym samym zegarem. W ciągu 8 impulsów zegara przesyłany jest zwykle 1 bajt danych 8 kolejnych bitów, choć protokół SPI pozwala też na inne długości słowa niektóre urządzenia używają np. 16-bitowych pakietów itp.
Po przesłaniu żądanej liczby bajtów master może zakończyć transmisję poprzez ustawienie linii CS z powrotem w stan wysoki co odznacza układ slave i powoduje, że przestaje on reagować na sygnały MOSI/MISO. Gdy linia CS danego urządzenia jest w stanie wysokim, powinno ono ignorować wejściowy sygnał MOSI oraz odłączać swój sygnał MISO wejść w stan wysokiej impedancji, aby nie zakłócać komunikacji z innymi układami korzystającymi z tej samej magistrali. Ten mechanizm pozwala podłączyć wiele urządzeń do wspólnych linii SPI bez konfliktów – tylko aktywny w danym momencie slave nadaje na linii MISO, pozostałe są „niemal niewidoczne” dla systemu.

Warto zaznaczyć, że master i slave muszą być zaprogramowane na ten sam tryb SPI, co obejmuje ustawienia fazy i polaryzacji sygnału zegara tzw. parametry CPOL i CPHA określające, przy którym zboczu zegara następuje odczyt danych i czy linia zegara spoczywa w stanie wysokim czy niskim. Większość popularnych układów wykorzystuje domyślnie tryb SPI mode 0 lub mode 1, więc zwykle początkujący nie muszą zagłębiać się od razu w szczegóły tych ustawień – ważne jest jednak, aby w dokumentacji sprawdzić, jaki tryb obsługuje dane urządzenie i skonfigurować odpowiednio interfejs w mikrokontrolerze. Na szczęście, gotowe biblioteki (np. w Arduino) zazwyczaj domyślnie ustawiają właściwy tryb dla znanych modułów.
SPI z jednym masterem i wieloma urządzeniami (magistrala)
W typowej konfiguracji wielourządzeniowej mamy jeden master (np. mikrokontroler) i kilka urządzeń slave podłączonych równolegle do tych samych linii MOSI, MISO i SCK. Każde z tych urządzeń ma dedykowaną linię CS idącą od mastera. W efekcie master „widzi” wszystkie moduły jednocześnie na magistrali, ale komunikuje się z nimi pojedynczo, aktywując ich linie CS tylko w razie potrzeby. Taki układ połączeń przypomina gałęzie: sygnały danych i zegara rozchodzą się do wszystkich układów, a linie CS działają jak niezależne włączniki dla każdej gałęzi.
Wyobraźmy sobie, że mamy np. jednocześnie podłączony wyświetlacz OLED, czujnik temperatury i moduł pamięci Flash – wszystkie korzystające z SPI. Mikrokontroler (master) współdzieli z nimi linie MOSI/MISO/SCK, ale do każdego modułu prowadzi osobny przewód CS. Gdy chcemy wysłać komendę do wyświetlacza, aktywujemy tylko CS wyświetlacza, wysyłamy dane MOSI (zegarem SCK), a wyświetlacz odbiera je i reaguje. W tym czasie czujnik i pamięć ignorują komunikację (ich CS pozostają nieaktywne). Następnie możemy odznaczyć wyświetlacz (CS = HIGH) i np. odpytać czujnik – wtedy ustawiamy jego CS = LOW i rozpoczynamy transmisję do/z czujnika, a inne urządzenia są chwilowo wyłączone z magistrali. Taka sekwencyjna obsługa wielu urządzeń sprawia, że nawet przy wielu modułach podłączonych do jednego SPI, komunikacja pozostaje uporządkowana.
Oczywiście liczba urządzeń slave jest praktycznie ograniczona liczbą dostępnych linii CS u mastera. W mikrokontrolerach mamy zazwyczaj kilka wyjść cyfrowych do dyspozycji, co oznacza, że na jednej magistrali SPI możemy obsłużyć np. 3–4 urządzenia wprost. Jeśli potrzeba ich więcej, czasem stosuje się dodatkowe dekodery lub ekspandery linii CS, ale przy bardzo rozbudowanych systemach wygodniej jest użyć kilku osobnych interfejsów SPI lub innych protokołów.
Daisy chain czyli połączenie łańcuchowe: Warto wspomnieć, że istnieje alternatywny sposób podłączania wielu urządzeń SPI – tzw. kaskadowanie, gdzie urządzenia łączy się szeregowo, a nie równolegle. W układzie daisy chain wyjście danych MISO pierwszego slave’a łączy się z wejściem MOSI drugiego slave’a, jego wyjście z wejściem kolejnego itd., tworząc swoisty łańcuch. Master komunikuje się ze wszystkimi naraz poprzez jedną wspólną linię CS, przesyłając ciągły strumień bitów przez kolejne urządzenia. Taka architektura bywa stosowana np. w niektórych sterownikach diod LED lub układach przesuwających rejestry, gdzie urządzenia są zaprojektowane do pracy „jeden za drugim”. Dla początkujących jednak konfiguracja daisy chain może być trudniejsza do zrozumienia – w większości typowych projektów hobbystycznych używa się po prostu oddzielnych linii CS dla każdego modułu.

Zastosowania SPI w praktyce
Interfejs SPI jest wykorzystywany w niezliczonej liczbie urządzeń peryferyjnych. Jego zalety – prosta budowa i bardzo duża szybkość transmisji – sprawiają, że producenci elektroniki chętnie sięgają po SPI tam, gdzie potrzeba sprawnie przesyłać dane między układami. Poniżej kilka typowych zastosowań SPI wraz z przykładami:
- Wyświetlacze graficzne – Wiele modułów wyświetlaczy używanych z Arduino komunikuje się właśnie przez SPI. Przykładem może być monochromatyczny mini wyświetlacz OLED 0,96″ 128×64 px, oparty na popularnym kontrolerze SSD1306. Taki ekranik przez SPI może w ciągu milisekund otrzymywać dane do wyświetlenia obrazy, tekst z mikrokontrolera. Również kolorowe wyświetlacze TFT o większej rozdzielczości często korzystają z SPI – np. moduły z kontrolerami ILI9341, ST7735, ST7789 i inne. Dla majsterkowiczów ciekawym przykładem jest wyświetlacz TFT 2,4″ 240×320 px z panelem dotykowym i czytnikiem kart SD. W takim module interfejs SPI obsługuje zarówno wyświetlanie grafiki na ekranie, jak i odczyt dotyku kontroler XPT2046 na SPI oraz komunikację z kartą pamięci SD! Dzięki temu jednym mikrokontrolerem można sterować złożonym układem graficznym przy użyciu zaledwie kilku pinów i z dużą prędkością.
- Pamięci nieulotne i karty pamięci – SPI świetnie nadaje się do szybkiego przesyłania bloków danych, dlatego niemal standardem są zewnętrzne pamięci Flash na SPI. Przykładem jest moduł pamięci Flash W25Q128 16 Mb, który po SPI pozwala mikrokontrolerowi zapisywać i odczytywać duże ilości danych np. bitmapy do wyświetlacza, logi, konfiguracje z szybkością sięgającą dziesiątek MHz. Podobnie karty SD/microSD mogą pracować w trybie SPI – wiele projektów Arduino korzysta z czytników kart microSD podłączonych właśnie poprzez SPI do zapisu danych np. logowanie pomiarów na kartę. Również pamięci EEPROM w niektórych modułach np. 25LC256 używają SPI do komunikacji.
- Czujniki i przetworniki danych – Wysoka szybkość i niski narzut protokołu sprawiają, że SPI jest popularny w zaawansowanych czujnikach cyfrowych. Przykładowo, wiele akcelerometrów i żyroskopów oferuje interfejs SPI, dzięki czemu można zczytywać pomiary z wysoką częstotliwością ważne np. w projektach dronów czy stabilizacji obrazu. Podobnie precyzyjne przetworniki analogowo-cyfrowe (ADC) i cyfrowo-analogowe (DAC) często komunikują się przez SPI np. układ ADS1115 4-kanałowy ADC przesyła odczyty analogowe do mikrokontrolera właśnie za pomocą magistrali SPI. Inny przykład to czujniki ciśnienia czy temperatury wymagające szybkiej komunikacji – np. popularny barometr BMP280 może pracować zarówno na I²C, jak i na SPI dając opcję większej szybkości odczytu. Generalnie, SPI znajdziemy w czujnikach, gdzie liczy się szybki dostęp do danych lub duża ilość przesyłanych informacji.
- Moduły komunikacyjne – Wiele modułów radiowych i komunikacyjnych korzysta z interfejsu SPI do konfiguracji i przesyłania danych. Klasycznym przykładem jest moduł łączności bezprzewodowej nRF24L01+, który do sparowania z Arduino wymaga podłączenia do pinów SPI. Również moduły Ethernet wykorzystują SPI do przesyłania danych sieciowych do mikrokontrolera. Dzięki temu możemy dodawać łączność bezprzewodową, Bluetooth, RFID itp. do naszych projektów, komunikując się z tymi układami bardzo sprawnie właśnie poprzez kilka linii SPI.
- Sterowniki i ekspandery – Niektóre układy rozszerzające możliwości mikrokontrolera również bazują na SPI. Przykładowo ekspandery portów I/O dodające więcej wejść/wyjść cyfrowych albo rejestry przesuwne jak słynny 74HC595 używany do sterowania większą liczbą diod LED działają właściwie jak uproszczone urządzenia SPI – odbierają ciąg bitów na wejściu synchronizowany zegarem. Również sterowniki do taśm LED adresowalnych czy matryc LED np. MAX7219 dla matryc 8×8 korzystają z protokołu podobnego do SPI. Dla majsterkowiczów oznacza to, że sterowanie wieloma diodami, wyświetlaczami 7-segmentowymi, klawiaturami itp. staje się łatwe dzięki wykorzystaniu dostępnych gotowych układów na SPI – wystarczy kilka linii i można znacząco rozbudować projekt.
Jak widać, zastosowania SPI są bardzo szerokie – od prostych czujników po zaawansowane wyświetlacze czy układy pamięci. Dlatego opanowanie podstaw teg
Podsumowanie i zachęta do eksperymentów
Interfejs SPI to fundament komunikacji w elektronice cyfrowej – szybki, prosty i uniwersalny. Dla początkujących majsterkowiczów stanowi świetny wstęp do zrozumienia, jak mikrokontrolery wymieniają dane z otaczającymi je układami. W tym artykule przyjrzeliśmy się zasadzie działania SPI, omówiliśmy rolę podstawowych sygnałów MOSI, MISO, SCK, CS oraz zobaczyliśmy, w jak wielu urządzeniach znajduje on zastosowanie – od wyświetlaczy OLED i TFT, przez pamięci Flash, po rozmaite czujniki i moduły komunikacyjne.
Na koniec warto podkreślić, że najlepszym sposobem nauki SPI jest praktyka. Zachęcamy do samodzielnego eksperymentowania: podłączania nowych modułów do swoich Arduino/ESP i obserwowania, jak przebiega komunikacja SPI w rzeczywistości. Możesz zacząć od prostych projektów – np. wyświetlenia czegoś na ekranie OLED czy odczytu wartości z czujnika na SPI – a następnie stopniowo zwiększać stopień skomplikowania, dodając kolejne urządzenia do magistrali. Dokumentacje i biblioteki wiele z nich dostępnych w ramach ekosystemu Arduino z pewnością ułatwią start.
Poznawaj dalej interfejs SPI i nie bój się zadawać pytań oraz szukać nowych wyzwań. Być może następnym krokiem będzie zgłębienie bardziej zaawansowanych tematów, jak tryby Dual/Quad SPI wykorzystujące dodatkowe linie dla jeszcze szybszej transmisji czy analiza sygnałów na oscyloskopie. Niezależnie od obranego kierunku – każda nowa umiejętność w zakresie komunikacji SPI zaprocentuje w Twoich przyszłych projektach. Powodzenia w odkrywaniu możliwości, jakie daje Serial Peripheral Interface, i miłego majsterkowania!
Czym jest i2c i jak działa?
Jeśli już wiesz, jak działa SPI, może zainteresować Cię również interfejs I2C – do komunikacji między wieloma urządzeniami wykorzystuje on tylko dwie linie: dane (SDA) i zegar (SCL), dzięki czemu pozwala łatwo podłączać wiele czujników czy wyświetlaczy do jednego mikrokontrolera. I2C jest wolniejszy od SPI, ale oszczędza piny i świetnie sprawdza się w projektach, gdzie liczy się prostota połączeń.
FAQ:
Czym jest SPI i jak działa? Praktyczne wprowadzenie dla początkujących
1. Co to jest SPI?
SPI (Serial Peripheral Interface) to szybki, synchroniczny interfejs komunikacyjny typu master-slave, wykorzystywany do wymiany danych między mikrokontrolerem (master) a urządzeniami peryferyjnymi (slave), takimi jak czujniki, pamięci czy wyświetlacze. SPI umożliwia pełnodupleksową transmisję, czyli jednoczesne wysyłanie i odbieranie danych w obu kierunkach.
2. Jakie są podstawowe sygnały SPI i do czego służą?
SPI wykorzystuje zazwyczaj cztery linie sygnałowe:
- MOSI (Master Out, Slave In): dane z mastera do slave’a
- MISO (Master In, Slave Out): dane ze slave’a do mastera
- SCK/SCLK (Serial Clock): sygnał zegarowy generowany przez mastera, synchronizuje przesył danych
- CS/SS (Chip Select/Slave Select): aktywuje wybrane urządzenie slave do komunikacji
3. Jak przebiega transmisja danych przez SPI?
- Master wybiera urządzenie slave, ustawiając jego linię CS w stan niski.
- Generuje sygnał zegarowy na linii SCK.
- Na każdą zmianę stanu zegara master wysyła bit na MOSI, a slave może równocześnie przesłać bit na MISO.
- Po zakończeniu transmisji master ustawia CS w stan wysoki, dezaktywując slave’a.
4. Czym różni się SPI od innych interfejsów, np. I²C?
- SPI jest szybszy i prostszy w implementacji sprzętowej, ale wymaga więcej linii sygnałowych.
- SPI umożliwia pełny dupleks (jednoczesna transmisja w obu kierunkach), podczas gdy I²C jest half-duplex.
- W SPI każdy slave zazwyczaj ma własną linię CS, a w I²C urządzenia są adresowane przez magistralę.
5. Ile urządzeń można podłączyć do jednej magistrali SPI?
Liczba urządzeń slave jest ograniczona liczbą dostępnych linii CS w masterze. Typowo można obsłużyć kilka urządzeń, ale przy większej liczbie stosuje się ekspandery lub dekodery CS. Możliwe jest także połączenie urządzeń w tzw. daisy chain (łańcuchowo), choć jest to rzadziej spotykane w prostych projektach.
6. Jakie są typowe zastosowania SPI?
- Wyświetlacze graficzne (OLED, TFT)
- Pamięci nieulotne (Flash, EEPROM), karty SD
- Czujniki cyfrowe (akcelerometry, żyroskopy, barometry)
- Przetworniki ADC/DAC
- Moduły komunikacyjne (np. nRF24L01+, Ethernet)
- Ekspandery portów, rejestry przesuwne, sterowniki LED
7. Jakie są zalety i wady SPI?
Zalety:
- Bardzo wysoka prędkość transmisji (do kilkudziesięciu MHz)
- Prosta implementacja sprzętowa
- Pełny dupleks
Wady:
- Wymaga więcej linii sygnałowych niż np. I²C
- Ograniczona liczba urządzeń slave bez dodatkowych układów.
8. Na co zwrócić uwagę przy konfiguracji SPI?
Master i slave muszą być ustawione na ten sam tryb pracy SPI (mode 0–3), określający polaryzację i fazę zegara (CPOL, CPHA). Szczegóły należy sprawdzić w dokumentacji urządzeń i poprawnie skonfigurować interfejs w mikrokontrolerze.
9. Jak zacząć korzystać ze SPI w praktyce?
- Wybierz mikrokontroler i moduł peryferyjny obsługujący SPI.
- Połącz odpowiednie linie: MOSI, MISO, SCK, CS.
- Skorzystaj z gotowych bibliotek (np. Arduino SPI), aby rozpocząć komunikację.
- Testuj proste projekty, np. wyświetlanie tekstu na ekranie OLED lub odczyt z czujnika.
10. Czy SPI jest trudny do opanowania dla początkujących?
SPI jest jednym z najprostszych i najbardziej intuicyjnych interfejsów komunikacyjnych, szczególnie dzięki dużej liczbie dostępnych przykładów i bibliotek. Najlepszym sposobem nauki jest praktyka i eksperymentowanie z różnymi modułam

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 😎👇