Reklama

SPI rozhraní

Úvod

Rozhraní SPI patří k těm nejjednodušším, se kterými se lze ve světě mikrokontrolerů setkat. A právě díky své jednoduchosti nachází široké uplatnění. Mít o něm povědomí patří k základní výbavě programátora embedded aplikací.

Tento článek se bude věnovat principům SPI komunikace. Slouží, jako základní kámen pro další navazující články o SPI na mikrokontrolérech Atmel a na STM32. SPI je zkratkou pro “Serial Peripheral Interface” a toto rozhraní slouží pro komunikaci mikrokontrolérů mezi sebou nebo s různými periferiemi. Mezi ně mohou patřit paměti, A/D a D/A převodníky, čidla různých veličin, displeje, drivery všeho druhu, SD karty a mnoho dalšího. Přenos po SPI bývá typicky duplexní (data se posílají oběma směry zároveň), ale v některých aplikacích může být simplexní (data se posílají pouze jedním směrem). Přenos je synchronní (používá hodiny “Clock”), takže může dosahovat slušných datových toků (STM32F429 až 45 Mbit/s, Atmega16A až 8 Mbit/s). Princip komunikace je jednoduchý a díky tomu je na většině mikrokontrolerů snadná i jeho implementace. Sběrnice je koncipována tak, aby na ní pracoval jeden Master a obecně vzato neomezené množství Slave obvodů. Všechny obvody sdílejí trojici linek. Hodiny (SCLK), které jsou generovány Masterem. Linku MOSI (Master Out Slave In) po níž se posílají data z Masteru do Slave a linku MISO (Master In Slave Out) po které se posílají data ze Slave obvodu do Master. Každý Slave má vlastní CS (Chip Select) linku (někdy také označovanou jako SS – Slave select), která slouží jako “adresovací”. Master tedy musí obsluhovat tolik CS linek kolik je na sběrnici připojeno Slave obvodů.

Obr. 1: Ukázka možného zapojení čtyř Slave obvodů na SPI sběrnici

Obr. 1: Ukázka možného zapojení čtyř Slave obvodů na SPI sběrnici

Na Obr. 1 je příklad zapojení čtyř Slave obvodů na sběrnici SPI. Slave 4 je atypický, protože nemá vývod MOSI. Není tedy schopen data přijímat a může pouze data odesílat. Takovou konfiguraci mají třeba některé A/D převodníky. Zbylé tři Slave obvody mají možnost duplexní komunikace (mají MOSI i MISO). Označování linek není jednotné, ale většinou bývá dobře čitelné. Hodiny (Clock) se označují například jako SCK, CLK nebo SCLK. Někdy mají obvody linky označené SDI, SI nebo DI (Device Input – vstup do obvodu) a SDO, SO nebo DO (Device Output – výstup z obvodu). Vzhledem k tomu, že k lince MISO je připojeno více Slave obvodů, tak musí Master zařídit, aby k ní v jednom okamžiku přistupoval pouze jeden obvod. K tomu slouží linky CS ovládané Masterem. Dokud má Slave vstup CS v log.1, tak je neaktivní a udržuje svůj MISO vývod ve stavu vysoké impedance (Hi-Z) a nijak neovlivňuje stav MISO linky. Jestliže je Slave aktivován (CS je v log. 0), tak nastaví svůj vývod MISO jako výstup a začne linku ovládat. Master pomocí CS linek vybírá, se kterým Slave obvodem chce komunikovat.

SPI – Fyzická vrstva

Jak “adresovat” Slave obvod už víme. Teď nám zbývá pochopit, jak dochází k přenosu dat. Jakmile Master pomocí CS pinu vybere některý Slave obvod, tak začne generovat hodiny na lince SCLK. S každým tiknutím hodin (tedy s každou periodou) se přenese jeden bit po lince MOSI (z Masteru do Slave) a zároveň jeden bit po lince MISO (ze Slave do Masteru). Počet datových bitů není obecně nijak specifikován. Běžně se používá 8 nebo 16. Zřídka se setkáte s 24 nebo 32 bity. Hodiny definují, ve kterém okamžiku má přijímač datovou linku (MOSI nebo MISO) číst. Může to být buďto se vzestupnou hranou nebo se sestupnou hranou SCLK. Žádná specifikace to pevně neurčuje. Také není pevně dáno jakou logickou hodnotu má mít SCLK linka v neutrálním stavu. Existují proto čtyři možnosti jak přenos může vypadat.

  • SCLK je v neutrálním stavu v log. 0 a data se čtou na vzestupnou hranu hodin (Režim 0)
  • SCLK je v neutrálním stavu v log. 0 a data se čtou na sestupnou hranu hodin (Režim 1)
  • SCLK je v neutrálním stavu v log. 1 a data se čtou na sestupnou hranu hodin (Režim 2)
  • SCLK je v neutrálním stavu v log. 1 a data se čtou na vzestupnou hranu hodin (Režim 3

Nejtypičtější je Režim 0 a Režim 3. Použitý režim se bude přirozeně odvíjet od možností Slave obvodu, zvláště pokud to bude integrovaný obvod s pevně daným režimem komunikace. V principu ale není problém mít na sběrnici obvody komunikující v různých režimech. Stejně tak není pevně dáno pořadí bitů ve zprávě, takže je možné vysílat nejprve LSB nebo MSB. Všechny čtyři varianty (Režim 0 až Režim 3) jsou na Obr. 2,3,4, a 5.

Obr. 2: Přenos 0b11001001 v Režimu 0 (data se čtou na vzestupnou hranu CLK)

Obr. 2: Přenos 0b11001001 v Režimu 0 (data se čtou na vzestupnou hranu CLK)

Obr. 3: Přenos 0b11001001 v Režimu 1 (data se čtou na sestupnou hranu CLK)

Obr. 3: Přenos 0b11001001 v Režimu 1 (data se čtou na sestupnou hranu CLK)

Obr. 4: Přenos 0b11001001 v Režimu 2 (data se čtou na sestupnou hranu CLK)

Obr. 4: Přenos 0b11001001 v Režimu 2 (data se čtou na sestupnou hranu CLK)

Obr. 5: Přenos 0b11001001 v Režimu 3 (data se čtou na vzestupnou hranu CLK)

Obr. 5: Přenos 0b11001001 v Režimu 3 (data se čtou na vzestupnou hranu CLK)
SPI – Řetězení Slave obvodů

Podívejte se například na běžný logický obvod 74HC595. Jedná se posuvný registr s pamětí (latch). Pomocí SPI rozhraní do něj zapíšete data (SCLK připojíte ke vstupu SHCP a MOSI k DS). A přivedením vzestupné hrany na vstup STCP se posledních osm nahraných bitů přenese do vnitřní paměti a nastaví se podle nich osm výstupů (Q0 až Q7). Obvod funguje jako “převodník” sériových dat na paralelní. Byte, který po sériové lince nahrajete do obvodu 74HC595 se paralelně objeví na jeho výstupech. Můžete si na výstupy dát LED diody nebo sadu relé, to už je na vás. Podstatné je to, že pomocí tří vývodů na mikrokontroléru jste schopni řídit osm logických stavů na výstupu. To už je samo o sobě dosti užitečné, ale osm výstupů vám nemusí stačit. Naštěstí je obvod řešen tak, že je sedmý (poslední) bit v posuvném registru vyveden na výstup Q7S. Takže, když do obvodu začnete nahrávat novou osmici bitů, tak z vývodu Q7S postupně odchází původní obsah posuvného registru. To ale znamená, že výstup prvního obvodu můžete připojit na vstup druhého obvodu a získáte tím šestnáctibitový posuvný registr. Namísto osmi bitů pak přirozeně vysíláte šestnáct. Takhle můžete obvody řetězit v podstatě do nekonečna. Pak nemáte problém ovládat libovolné množství výstupů jen za pomoci několika vodičů. Přirozeně, čím delší je řetěz obvodů 74HC595, tím déle do nich data nahráváte (což při rychlostech jednotek Mbit/s u většiny aplikací nečiní potíže). Anglicky se takovému řetězení říká “daisy-chain” a zapojení vidíte na Obr. 6. Všimněte si, že výstup (MISO) posledního Slave obvodu je přiveden zpět k Masteru. To není nutné, ale některé obvody umožňují odesílat touto cestou nějaké stavové informace. Kromě toho je takhle možné zjistit, zda není řetěz někde přerušený. Je potřeba si uvědomit, že ne každý obvod vybavený SPI rozhraním tuto konfiguraci umožňuje. Obecně je to spíše výjimka a umožňují ji typicky obvody, které nepotřebují vysílat data zpět do Masteru (tedy obvody u nichž bychom očekávali jednosměrnou komunikaci Master >> Slave). Informativní ukázku takové komunikace (16 bit) můžete vidět na Obr. 7.

Obr. 6: Řetězení třech Slave obvodů

Obr. 6: Řetězení třech Slave obvodů

Obr. 7: Na žlutém průběhu jsou vidět data přicházející do Slave obvodu, na modrém pak data, která z obvodu odcházejí. V okamžiku kdy obvod přijímá hodnotu 1218, opouští jej v předchozím kroku nahraná hodnota 1217.

Obr. 7: Na žlutém průběhu jsou vidět data přicházející do Slave obvodu, na modrém pak data, která z obvodu odcházejí. V okamžiku kdy obvod přijímá hodnotu 1218, opouští jej v předchozím kroku nahraná hodnota 1217.
SPI – Řetězení v praxi

Obvod 74HC595 (nebo jeho ekvivalenty) lze využívat pro jednoduché buzení sedmisegmentových displejů. Zvláště u dvojmístných a vícemístných, případně “dotmatrix” displejů. Obecně to ale není nejlepší metoda, protože multiplexované řízení displeje má velké proudové nároky. Obvody “595” ale obecně nesmí dodávat větší celkový proud jak 70 mA a to pro méně jasné displeje (zelené, žluté a některé červené) nemusí stačit. Tento limit se v konečném důsledku může také projevovat rozdílným jasem různých čísel. Přirozeně tyto problémy nastávají hlavně, pokud po displeji vyžadujeme větší jas (pro práci za denního osvětlení a podobně). Pro tyto účely ale existují vhodnější integrované obvody (a moduly s nimi). Klasický reprezentant je MAX7219, který umí řídit až osmimístný displej se společnou katodou nebo “dotmatrix displej” v rozměru 8×8 bodů. Zvláště u nich oceníte možnost obvody řetězit za sebe. Můžete pak skládat libovolné množství těchto displejů za sebe a jako celek je řídit pomocí tří linek (CLK, DIN, CS). Dalším zástupcem do rodiny SPI řízených driverů s možností řetězení je SCT2024 (a jeho ekvivalenty). Jedná se o relativně levný šestnáctibitový posuvný registr, jehož výstupy jsou proudové zdroje. Oproti MAX7219 se hodí k řízení displejů sestavených z jednociferných sedmisegmentových displejů (neprovádí totiž multiplexování jako MAX7219) nebo obecně jako budič led (třeba bargrafů). To už ale hodně odbočujeme od tématu. Řízení LED displejů se budu věnovat v samostatné kapitole.

 
 
Autor: Michal Dudka
 
 

[1] Wikipedia Three-state logic[online] citováno 2. prosince 2016. Dostupné na www: https://en.wikipedia.org/wiki/Three-state_logic
[2] 74HC595; 74HCT595 8-bit serial-in, serial or parallel-out shift register with output
latches; 3-state[online] citováno 2. prosince 2016. Dostupné na www: https://www.nxp.com/documents/data_sheet/74HC_HCT595.pdf
[3] MAXIM Serially Interfaced, 8-Digit LED Display Drivers[online] citováno 2. prosince 2016. Dostupné na www: https://www.sparkfun.com/datasheets/Components/General/COM-09622-MAX7219-MAX7221.pdf
[4]SCT2024 16-bit Serial-In/Parallel-Out Constant-Current LED Driver[online] citováno 2. prosince 2016. Dostupné na www: http://www.starchips.com.tw/pdf/datasheet/SCT2024V01_03.pdf
[5] Sériová rozhraní SPI, Microwire, I2C a CAN[online] citováno 2. prosince 2016. Dostupné na www: http://home.zcu.cz/~dudacek/NMS/Seriova_rozhrani.pdf
[6] Wikipedia Serial Peripheral Interface Bus[online] citováno 2. prosince 2016. Dostupné na www: https://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus
[7] Julian’s Logic: The 74HC595 Shift Register[online] citováno 2. prosice 2016. Dostupné na www: https://www.youtube.com/watch?v=G1SzTGZ2l1c
Následující a předchozí příspěvek v kategorii:

 
Následující: Výroba DPS fotocestou
Předchozí: I2C – Relativně jednoduše

 

Za případné chyby v textu, ve zdrojovém kódě, nebo ve schématickém zapojení se omlouváme.
AUTOŘI NEBEROU ŽÁDNOU ODPOVĚDNOST ZA PŘÍPADNÉ ÚJMY NA ZDRAVÍ ČI MAJETKU.