3.21. Podstawy SPI

SPI (Serial Peripheral Interface) to synchroniczna magistrala szeregowa zaprojektowana do krótkich, szybkich połączeń między jednym kontrolerem a jednym lub większą liczbą urządzeń peryferyjnych na tej samej płytce. Jest to standardowy interfejs dla kart SD, wyświetlaczy, pamięci flash, przetworników ADC i DAC oraz szerokiej gamy sensorów.

Tam, gdzie UART nie miał współdzielonego zegara i odtwarzał taktowanie z samej linii danych, SPI prowadzi przewód zegara obok przewodów danych. Kontroler taktuje zegar z dowolną wybraną przez siebie częstotliwością, a każde inne urządzenie na magistrali próbkuje dane w synchronizacji z tym zegarem. Nie ma zgadywania szybkości transmisji (baud) ani narzutu na ramkowanie – tylko zbocza zegara i bity.

3.21.1. Cztery przewody

Magistrala SPI w trybie pełnego dupleksu ma cztery przewody:

  • SCK (zegar szeregowy). Sterowany przez kontroler. Każdy bit jest wtaktowywany do lub wytaktowywany z urządzenia na zboczu tego sygnału.

  • MOSI (wyjście kontrolera, wejście peryferium). Linia wyjściowa kontrolera; peryferium próbkuje z niej bity.

  • MISO (wejście kontrolera, wyjście peryferium). Linia wyjściowa peryferium; kontroler próbkuje z niej bity.

  • CS (chip select), czasami nazywana SS (peripheral select). Oddzielna linia dla każdego peryferium. Kontroler ściąga CS do stanu niskiego, aby rozpocząć transakcję, i z powrotem do stanu wysokiego, aby ją zakończyć; każde peryferium z dezaktywowanym CS całkowicie ignoruje magistralę i przestaje sterować swoim wyjściem MISO.

Cztery przebiegi sygnałów ułożone jeden nad drugim: CS na górze, SCK pod nim, następnie MOSI i MISO. CS zaczyna w stanie wysokim (spoczynek), opada do stanu niskiego, aby rozpocząć transakcję, następnie SCK wytaktowuje osiem impulsów, podczas gdy MOSI i MISO przenoszą po jednym bajcie danych każdy, po czym CS wraca do stanu wysokiego.

Jeden bajt SPI: CS przechodzi w stan niski, aby wybrać peryferium, SCK taktuje osiem bitów, a MOSI i MISO przesyłają po jednym bajcie każdy w przeciwnych kierunkach.

Każde zbocze zegara przemieszcza jeden bit w każdym kierunku w tym samym czasie. Pojedynczy impuls SCK jednocześnie wysyła jeden bit na MOSI i odbiera jeden bit na MISO – SPI jest pełnodupleksowe na poziomie przewodów. Oprogramowanie nie musi używać obu kierunków: transakcje tylko do zapisu i tylko do odczytu są powszechne, przy czym nieużywana linia jest albo ignorowana, albo utrzymywana w stanie wysokim.

3.21.2. Polaryzacja i faza zegara

Dwa bity konfiguracyjne decydują dokładnie o tym, które zbocze zegara przemieszcza dane:

  • Polaryzacja zegara (polarity, czasami CPOL) – stan spoczynkowy SCK. 0 oznacza, że zegar spoczywa w stanie niskim i przechodzi impulsem w stan wysoki; 1 oznacza, że zegar spoczywa w stanie wysokim i przechodzi impulsem w stan niski.

  • Faza zegara (phase, czasami CPHA) – które zbocze próbkuje dane. 0 próbkuje na pierwszym zboczu każdego impulsu zegarowego (zbocze wiodące); 1 próbkuje na drugim zboczu (zbocze opadające).

Razem dają one cztery tryby, umownie nazywane od Mode 0 do Mode 3. Mode 0 (polarity=0, phase=0) jest najczęstszy i stanowi bezpieczne ustawienie domyślne dla nieznanych urządzeń.

Kluczowa zasada brzmi, że oba końce muszą zgadzać się co do trybu. Niedopasowane tryby dają śmieciowe dane, nawet jeśli linie zegara i danych są poprawnie podłączone; jeśli urządzenie zwraca bezsensowne dane w pierwszej transakcji, tryb jest pierwszą rzeczą do sprawdzenia.

3.21.3. Wiele peryferiów

Kilka peryferiów może współdzielić te same linie SCK, MOSI i MISO, o ile każde z nich ma własną linię CS sterowaną przez kontroler:

  • Wszystkie peryferia widzą ten sam zegar i te same dane, ale każde obserwuje własne CS. Przy dezaktywowanym CS (stan wysoki) peryferium całkowicie ignoruje SCK i MOSI oraz pozostawia MISO w stanie wysokiej impedancji, aby nie rywalizować z innymi urządzeniami o linię.

  • Kontroler aktywuje dokładnie jedno CS na raz, przeprowadza transakcję i dezaktywuje CS, aby zwolnić magistralę.

Mikrokontroler z pojedynczym sprzętowym blokiem SPI może komunikować się z tyloma peryferiami, ile ma wolnych pinów GPIO do przeznaczenia na linie CS – na samej magistrali nie ma adresowania.

3.21.4. Mocne i słabe strony

Mocne i słabe strony SPI wynikają z jego konstrukcji:

  • Szybkie. Na krótkich ścieżkach z prostą translacją poziomów osiągalne są dziesiątki megaherców. Korzystają z tego czytniki kart SD i wyświetlacze SPI.

  • Proste na poziomie przewodów. Brak adresowania, brak potwierdzeń, brak specjalnych warunków start/stop – tylko bity na przewodach zsynchronizowane z zegarem.

  • Pinożerne. Trzy współdzielone linie plus jedno CS na peryferium. Płytka z pięcioma urządzeniami SPI używa ośmiu pinów (trzy + pięć).

  • Krótkozasięgowe. SPI zakłada czyste, szybkie zbocza, co oznacza krótkie ścieżki na tej samej płytce. Do dłuższych połączeń lepiej sprawdzi się I2C lub jedna z magistral ramkowanych.