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.

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 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.