3.21. Základy SPI

SPI (Serial Peripheral Interface) je synchronní sériová sběrnice navržená pro krátké, vysokorychlostní spoje mezi jedním řadičem a jedním nebo více periferními zařízeními na stejné desce. Je to standardní rozhraní pro SD karty, displeje, flash paměť, ADC a DAC a širokou škálu senzorů.

Zatímco UART neměl sdílené hodiny a obnovoval časování přímo z datové linky, SPI vede vedle datových vodičů i hodinový vodič. Řadič řídí hodiny libovolnou rychlostí, jakou si zvolí, a všechna ostatní zařízení na sběrnici vzorkují data v synchronizaci s těmito hodinami. Žádné odhadování přenosové rychlosti (baud rate) ani režie rámcování – jen hodinové hrany a bity.

3.21.1. Čtyři vodiče

Plně duplexní sběrnice SPI má čtyři vodiče:

  • SCK (sériové hodiny). Řízené řadičem. Každý bit je vyslán nebo přijat na hraně tohoto signálu.

  • MOSI (výstup řadiče, vstup periferie). Výstupní linka řadiče; periferie z ní vzorkuje bity.

  • MISO (vstup řadiče, výstup periferie). Výstupní linka periferie; řadič z ní vzorkuje bity.

  • CS (chip select), někdy nazývané SS (peripheral select). Samostatná linka pro každou periferii. Řadič stáhne CS na nízkou úroveň pro zahájení transakce a zpět na vysokou úroveň pro její ukončení; jakákoli periferie s deaktivovaným CS sběrnici zcela ignoruje a přestane řídit svůj výstup MISO.

Čtyři signálové stopy nad sebou: CS nahoře, SCK pod ním, pak MOSI a MISO. CS začíná vysoko (klidový stav), klesá nízko pro zahájení transakce, poté SCK vyšle osm impulzů, zatímco MOSI a MISO přenášejí po jednom bajtu dat každá, poté se CS vrací zpět na vysokou úroveň.

Jeden bajt SPI: CS jde na nízkou úroveň pro výběr periferie, SCK vyšle osm bitů a MOSI a MISO přenesou po jednom bajtu v opačných směrech.

Každá hodinová hrana přesune jeden bit v každém směru současně. Jediný impulz SCK zároveň odešle jeden bit na MOSI a přijme jeden bit na MISO – SPI je plně duplexní na úrovni vodičů. Software nemusí používat oba směry: transakce pouze pro zápis a pouze pro čtení jsou běžné, přičemž nepoužitá linka je buď ignorována, nebo udržována na vysoké úrovni.

3.21.2. Polarita a fáze hodin

Dva konfigurační bity přesně určují, která hodinová hrana přesouvá data:

  • Polarita hodin (polarity, někdy CPOL) – klidový stav SCK. 0 znamená, že hodiny jsou v klidu na nízké úrovni a pulzují na vysokou; 1 znamená, že hodiny jsou v klidu na vysoké úrovni a pulzují na nízkou.

  • Fáze hodin (phase, někdy CPHA) – která hrana vzorkuje data. 0 vzorkuje na první hraně každého hodinového impulzu (náběžná hrana); 1 vzorkuje na druhé hraně (sestupná hrana).

Společně tyto bity dávají čtyři režimy, obvykle nazývané Mode 0 až Mode 3. Mode 0 (polarity=0, phase=0) je nejběžnější a bezpečná výchozí volba pro neznámá zařízení.

Zásadní pravidlo je, že obě strany se musí shodnout na režimu. Neshodující se režimy dávají nesmyslná data, i když jsou hodinové a datové linky zapojeny správně; pokud zařízení vrací při první transakci nesmysly, režim je první věc, kterou je třeba zkontrolovat.

3.21.3. Více periferií

Několik periferií může sdílet stejné linky SCK, MOSI a MISO, pokud každá z nich má vlastní linku CS řízenou řadičem:

  • Všechny periferie vidí stejné hodiny a data, ale každá sleduje svou vlastní linku CS. S deaktivovaným CS (vysoká úroveň) periferie zcela ignoruje SCK a MOSI a ponechává MISO ve stavu vysoké impedance, aby nebojovala s ostatními zařízeními o linku.

  • Řadič aktivuje vždy přesně jedno CS, provede transakci a deaktivuje CS, čímž uvolní sběrnici.

Mikrokontrolér s jediným hardwarovým blokem SPI může komunikovat s tolika periferiemi, kolik má volných pinů GPIO k dispozici pro linky CS – na samotné sběrnici není žádné adresování.

3.21.4. Silné a slabé stránky

Silné i slabé stránky SPI plynou z jeho návrhu:

  • Rychlé. Na krátkých stopách s jednoduchým převodem úrovní lze dosáhnout desítek megahertzů. Čtečky SD karet a SPI displeje toho využívají.

  • Jednoduché na úrovni vodičů. Žádné adresování, žádná potvrzování, žádné speciální podmínky start/stop – jen bity na vodičích synchronizované s hodinami.

  • Náročné na piny. Tři sdílené linky plus jedno CS na periferii. Deska s pěti zařízeními SPI používá osm pinů (tři + pět).

  • Krátký dosah. SPI předpokládá čisté, rychlé hrany, což znamená krátké stopy na stejné desce. Pro delší spoje je vhodnější I2C nebo některá z rámcovaných sběrnic.