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.

Four signal traces stacked: CS at top, SCK below it, then MOSI and MISO. CS starts high (idle), drops low to begin the transaction, then SCK clocks out eight pulses while MOSI and MISO carry one byte of data each, then CS returns high.

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.