Obsah
1. Externí sériové sběrnice SPI a I2C
2. Vlastnosti sběrnice SPI
3. Přednosti a zápory sběrnice SPI
4. Princip komunikace po sběrnici SPI
5. Komunikace s více uzly
6. Zřetězení uzlů na sběrnici SPI
7. Vlastnosti sběrnice I2C
8. Odkazy na Internetu
1. Externí sériové sběrnice SPI a I2C
Externí sériové sběrnice označované zkratkami SPI (Serial Peripheral Interface) a I2C (Inter-Integrated Circuit) v současnosti představují nedílnou součást mnoha digitálních zařízení, včetně osobních počítačů. Velká obliba těchto sběrnic spočívá ve snadnosti jejich implementace, a to jak po stránce hardwarové (použité integrované obvody), tak i programové. V tom nejjednodušším případě může přijímací stranu sběrnice SPI představovat běžný posuvný registr, tj. součástka dostupná i v původní řadě číslicových obvodů 7400. Obě dále popsané sběrnice umožňují komunikaci mezi dvěma či větším počtem připojených zařízení (uzlů), což je podstatný rozdíl například oproti již popsanému sériovému portu typu RS-232C, s jehož pomocí mohly komunikovat pouze dva uzly. I přenosová rychlost je pro mnoho účelů více než dostačující – SPI i I2C jsou vybaveny hodinovým signálem, přičemž jeho frekvence může v případě SPI dosahovat až 70 MHz (běžně 10 MHz) a v případě I2C v nejrychlejším módu 3,4 MHz. Právě přítomnost hodinového signálu rozvedeného do všech komunikujících uzlů odlišuje SPI a I2C od všech dříve popisovaných externích sběrnic.
Obrázek 1: Převaděč mezi universální sériovou sběrnicí (USB) a sběrnicí SPI. Pomocí tohoto či podobného přípravku je možné i z běžného osobního počítače ovládat mnoho existujících typů zařízení určených pro sběrnici SPI.
Z hlediska přenosu dat je pro prakticky všechny dříve popsané externí porty a sběrnice typické, že nemají vyvedený samostatný hodinový signál, který by sloužil k synchronizaci vysílaných a čtených bitů. Z tohoto důvodu se všechna data i řídicí příkazy po datových vodičích musí posílat asynchronně, většinou stejným způsobem, jako u dříve popsaného rozhraní RS-232C (někdy se mezi start a stop bit vkládá i delší sekvence bitů, ovšem to klade mnohem vyšší nároky na přesnost krystalů ve vysílači i přijímači). Další společnou vlastností všech dříve popisovaných externích portů a sběrnic je, že pro jednosměrný přenos dat či half duplex se používá minimum vodičů – jeden či dva signálové vodiče (two-wire) s možností přidání dalšího vodiče představujícího signálovou nulu. Veškeré řízení přenosu dat je tedy prováděno ryze programově, většinou na základě softwarového handshakingu. Výjimkou je sériový port RS-232C, u kterého je možné (a mnohá zařízení to dokonce přímo vyžadují) zapojit i další vodiče, po nichž se přenáší řídicí informace. Také u paralelního rozhraní Centronics je řízení prováděno na základě handshakingu, přičemž pro každý potvrzovací signál je vyčleněn zvláštní vodič.
Obrázek 2: Schéma zapojení převaděče, který byl zobrazen na prvním obrázku.
2. Vlastnosti sběrnice SPI
Sběrnice SPI (Serial Peripheral Interface) představuje jednu z forem sériových externích sběrnic sloužících pro vzájemné propojení dvou či více komunikujících uzlů, přičemž jeden uzel obvykle vystupuje v roli takzvaného řadiče sběrnice (master), ostatní uzly pracují v režimu slave. Uzel, který pracuje jako master, obsahuje generátor hodinového signálu, který je rozveden do všech ostatních uzlů, čímž je umožněn zcela synchronní (navíc ještě obousměrný) přenos dat. Hodinový signál je rozváděn vodičem označovaným symbolem SCK. Kromě vodiče s hodinovým signálem jsou uzly propojeny dvojicí vodičů označovaných většinou symboly MISO (Master In, Slave Out) a MOSI (Master Out, Slave In), pomocí nichž se obousměrně (full duplex) přenáší data. Posledním signálem, který se u této sběrnice používá, je signál SSEL (Slave Select), jenž slouží – jak již jeho název napovídá – k výběru některého uzlu pracujícího v režimu slave. V následujících kapitolách si ukážeme, jak a kdy se tento signál používá. Všechny čtyři signály – SCK, MISO, MOSI i SSEL, pro svoji funkci vyžadují pouze jednosměrné porty, což přispívá k jednoduché a především levné implementaci této sběrnice.
Obrázek 3: Textový LCD ovládaný přes sběrnici SPI. Textové LCD tohoto typu obsahují RAM paměť, ve které je uchováván zobrazený text, a některou z forem pamětí ROM (EPROM, EEROM, Flash) pro uložení znakové sady, tj. bitových map jednotlivých zobrazitelných znaků. Komunikační rozhraní bývá různé – může se jednat o některou z forem paralelního portu, sériového portu (UART) nebo právě sběrnici SPI.
Sběrnice SPI se kvůli své implementační jednoduchosti používá v mnoha různých systémech, například pro komunikaci s některými typy pamětí EEPROM (označovanými také jako „sériové“ paměti), textovými i grafickými LCD panely, A/D a D/A převodníky, hodinami reálného času (RTC) atd. Podpora pro SPI je zabudována také do mnoha mikrořadičů, zejména se to týká známé a populární řady mikrořadičů Motorola 68HC11, AVR a PIC16×xx (například se jedná o PIC16F873 a jeho varianty). Pro jednosměrnou komunikaci, při které se do uzlu pouze vysílají či naopak čtou data, však lze použít i pouhopouhý posuvný registr či sériově zapojenou sadu několika posuvných registrů, což je velmi jednoduchá a také levná metoda, jak pomocí mikrořadiče ovládat okolní zařízení (před mnoha lety jsme pomocí již zmíněného mikrořadiče Motorola 68HC11, dvou osmibitových posuvných sérioparalelních registrů a čtyř sedmisegmentových LED číslic vytvořili poměrně přesný digitální otáčkoměr pro Škodu 105 a 120, na vstupu SPI byly naopak zapojeny přepínače, které funkci otáčkoměru řídily).
Obrázek 4: Ovládací obvody sběrnice SPI jsou zabudovány do mnoha mikrořadičů (viz červeně zvýrazněný blok). Zde se jedná o mikrořadič, který kromě SPI mj. obsahuje i klasický USART, tj. synchronní a asynchronní sériový port.
3. Přednosti a zápory sběrnice SPI
Mezi největší přednost sběrnice SPI patří její značná jednoduchost a tím i snadnost implementace. Jednoduché je jak elektrické rozhraní sběrnice (jednosměrné piny kompatibilní s technologií TTL, čemuž dnes odpovídají i integrované obvody využívající technologii CMOS), tak i přenosový protokol. Ve své podstatě totiž není SPI nic jiného než několik externě propojených posuvných registrů, přičemž posun je řízen jednotným hodinovým signálem. Jednoduchost přenosového protokolu vyplývá i z toho, že data jsou přenášena obousměrně po samostatných vodičích, takže není nutné řešit přepínání mezi vysíláním a příjmem, jako tomu bylo u některých sběrnic používajících poloduplexní přenos dat, i u dále popsané sběrnice I2C. I přenosová rychlost je pro mnoho účelů dostatečně vysoká. Hodinová frekvence, z níž se odvozuje bitová rychlost (bitrate), se v běžných případech pohybuje v rozsahu 1 MHz až 10 MHz, při dodržení dostatečně malé kapacity spoje je však možné použít i poměrně vysokou frekvenci až 70 MHz, což odpovídá 140×106 obousměrně přeneseným bitům za sekundu.
Obrázek 5: Alternativní značení signálů u zařízení pracujícího v režimu master. Jedná se o signály SCK (Serial Clock), SDO (Serial Data Output), SDI (Serial Data Input) a CS (Chip Select), které odpovídají výše popsaným signálům SCK, MOSI, MISO a SSEL.
Mezi nevýhody sběrnice SPI patří především existence pouze jednoho zařízení, které může pracovat v režimu master. Existuje sice možnost použít zapojení označované multiple master, ale to již vyžaduje použití složitějšího přenosového protokolu, takže se vytrácí jednoduchost celého řešení. Pomocí SPI je také možné přenášet data pouze na kratší vzdálenosti, což je dáno jednak nutností synchronizace hodinového signálu s přenášenými daty (shodné zpoždění), tak i neexistencí signálu typu ACK (acknowledge), kterým by se potvrzoval příjem dat a dovoloval tak řídit rychlost přenosu dat v případě, že některé zařízení nedokáže data rychle zpracovat. Další nevýhodou je fakt, že u SPI je možné použít několik způsobů synchronizace dat hodinovým signálem – lze použít obě polarity hodin, synchronizovat na náběžnou či sestupnou hranu atd. Proto například mnoho mikrořadičů obsahuje konfigurační registry, pomocí nichž je možné zvolit, jakým způsobem se má hodinový signál generovat (master) či naopak interpretovat (slave). Poslední nevýhodou, která však kvůli komunikaci na menší vzdálenosti není tak patrná, je nutnost použít minimálně čtyři vodiče pro obousměrnou komunikaci – SCK, MISO, MOSI a GND (signálová zem). Alternativní způsob zapojení (MISO a MOSI spojené do jednoho vodiče SISO) se příliš často nepoužívá.
Obrázek 6: Alternativní značení signálů u zařízení pracujícího v režimu slave. Všimněte si, že při použití označení SDI a SDO může dojít ke zmatkům, protože pin SDI na zařízení typu master je připojen na pin SDO u zařízení typu slave a naopak. Proto je vhodnější používat spíše označení signálů (a jim příslušných pinů) MOSI a MISO.
4. Princip komunikace po sběrnici SPI
Na sedmém obrázku je nakreslen způsob propojení dvou uzlů (například mikrořadičů) pomocí sběrnice SPI. Oba uzly obsahují v tom nejjednodušším případě dva registry – datový záchytný registr Serial Input Buffer – SSPBUF a posuvný registr Shift Register – SSPSR. Do registru SSPSR je zapsán bajt (celá osmice bitů), který byl korektně přijat, ale ještě nebyl zpracován, tj. mikrořadič si jeho obsah nepřečetl. Tento registr tedy slouží jako jednoprvková fronta zabezpečující, že při korektní obsluze nedojde ke ztrátě dat. Posuvný registr SSPSR slouží současně k vysílání i příjmu jednoho bitu z celé osmice přenášených bitů – každý posun obsahu tohoto registru doprava znamená, že se vysunutý bit pošle na pin SDO (v případě uzlu typu master se jedná o vodič MOSI) a naopak logická hodnota přečtená na pinu SDI (MISO) je zapsána do nejnižšího bitu posuvného registru. Jeden z uzlů pracuje v režimu master, druhý v režimu slave. Vysílání i příjem jednoho bitu je tedy nedělitelná operace, která vždy proběhne ve stejný okamžik.
Obrázek 7: Princip propojení dvou zařízení pomocí rozhraní SPI. Zařízení nakreslené vlevo je nakonfigurováno do režimu master, zařízení vpravo do režimu slave. Hodinový signál je vždy generován zařízením typu master, data se přenáší obousměrně po dvojici vodičů SDO-SDI (MOSI) a SDI-SDO (MISO). Povšimněte si také, že nejdříve je vždy vyslán nejvyšší bit přenášeného bajtu, přičemž současně dochází k vysouvání vysílaného bitu a nasouvání bitu přijatého.
Uzel pracující v režimu master generuje hodinové impulsy, které jsou posílány po vodiči SCK. Pomocí hodinových pulsů je prováděna synchronizace vysílání i příjmu dat, tj. časy, ve kterých dochází ke změně posuvných registrů SSPSR. U většiny zařízení je možné nakonfigurovat polaritu hodin i to, zda se má posun provést při sestupné či vzestupné hraně hodinového signálu – důvod byl uveden v předchozí kapitole. Čtyři možné tvary hodinového signálu jsou zobrazeny na osmém obrázku. Konfiguračním bitem CKP je určena polarita hodinového signálu, tj. především jeho klidová úroveň (idle), která představuje stav, kdy se neprovádí vysílání dat. Naproti tomu konfigurační bit CKE určuje, zda se platná data, tj. doba, ve které dochází k posunu v posuvném registru, oznamují vzestupnou či sestupnou hranou hodinového signálu (pro CKP=1 je signál invertován a tím dochází i k otočení smyslu hrany). Povšimněte si, že k vysílání i příjmu dat dochází vždy až po ustálení obou datových vodičů (MISO i MOSI), tj. uprostřed bitového intervalu.
Obrázek 8: Čtyři možné způsoby synchronizace přenášených dat hodinovým signálem.
5. Komunikace s více uzly
Na sedmém obrázku byla ukázána ta nejjednodušší konfigurace sběrnice SPI, při které se data přenášela mezi dvojicí uzlů, přičemž každý uzel mohl data současně vysílat i přijímat. V praxi se však často stává, že je nutné propojit větší množství uzlů – může se například jednat o různá vstupní zařízení (teplotní čidla, světelné sondy, A/D převodníky) či naopak zařízení výstupní (LCD a LED). Pokud je nutné data přenášet bez většího zpoždění, a to i v případě, že některé ze zařízení nemusí pracovat, použije se zapojení naznačené na devátém obrázku. V tomto zapojení existuje jeden uzel pracující v režimu master. Ten generuje hodinový signál použitý při obousměrném přenosu dat. Kromě toho však také obsahuje piny označené CSx nebo SSELx, kterými se vybírá právě jeden z uzlů typu slave. V jeden okamžik může být vybrán vždy pouze jeden uzel typu slave, jinak by došlo ke kolizi na vodiči SDI (MISO) ve chvíli, kdy by více uzlů typu slave na tento vodič začalo vysílat data. Předností tohoto způsobu zapojení je prakticky okamžitý výběr uzlu, se kterým se má komunikovat, nevýhodou pak rostoucí počet vodičů CSx a tím pádem i výstupních pinů, které je nutné v uzlu typu master „obětovat“. Podobně jako u všech podobných výběrových signálů (CS, OE), je i zde použit invertovaný vstup, tj. zařízení se vybírá logickou nulou (úroveň L) a nikoli jedničkou (úroveň H).
Obrázek 9: Způsob komunikace s více zařízeními pomocí výběru uzlu signálem SSEL. Čím více existuje uzlů typu slave, tím větší množství pinů CSx je nutné použít. Vzhledem k tomu, že v danou chvíli může být vybrána jen jedna komunikující dvojice uzlů, lze mezi uzel typu master a ostatní uzly vložit demultiplexor pracující v režimu výběru „jedna z n“.
6. Zřetězení uzlů na sběrnici SPI
Existuje však i alternativní způsob zapojení uzlů na sběrnici SPI, který spočívá ve zřetězení všech připojených zařízení tak, jak je naznačeno na desátém obrázku. Všimněte si, že zatímco hodinový signál je rozveden paralelně do všech uzlů, datové vodiče tvoří kruh. Vzhledem k tomu, že každý uzel obsahuje uvnitř posuvný registr, je tímto zapojením vlastně vytvořen jeden dlouhý posuvný registr, přičemž každý uzel (zařízení) v danou chvíli „vidí“ pouze jednu osmici bitů. V případě, že by všechny uzly typu slave neměnily data, která přečtou, znamenalo by to, že osmice bitů vyslaná masterem by se vrátila zpět po 8×n hodinových pulsech, kde n je počet zřetězených uzlů. Při tomto způsobu zapojení je nutné na vyšší vrstvě vytvořit vhodný komunikační protokol. V případě schématu z desátého obrázku by například bylo možné v prvních dvou bitech z každého bajtu zaznamenat adresu zařízení (master=00, první slave=01 atd.), přičemž pouze tento bajt by mohlo dané zařízení měnit. Podoba samotného protokolu však může být i mnohem složitější, zde již záleží na konkrétních požadavcích.
Obrázek 10: Propojení zařízení do řetězu (daisy chain) vede ke snížení požadovaného počtu vodičů, ale také k prodloužení cesty (a tím i času) dat při jejich vysílání a příjmu. V případě, že jedno z připojených zařízení nebude funkční, celý řetězec se rozpadne.
7. Vlastnosti sběrnice I2C
Další sběrnicí, kterou si dnes a především v navazující části tohoto seriálu popíšeme, je sběrnice označovaná poněkud neobvykle symbolem I2C, což je zkratka z celého názvu Inter-Integrated Circuit. V určitých ohledech se jedná o sběrnici podobnou SPI (existence hodinového signálu, jediný uzel typu master), ovšem některé vlastnosti těchto sběrnic jsou odlišné. Zatímco u sběrnice SPI byl umožněn obousměrný přenos dat díky použití dvojice vodičů MISO a MOSI, je sběrnice I2C vybavena „pouze“ jedním datovým vodičem SDA, z čehož vyplývá, že se data přenáší poloduplexně. Také to znamená poněkud složitější interní strukturu všech připojených zařízení, protože příslušné piny musí být možné přepínat ze vstupního režimu na režim výstupní. Také zde není použit výběr zařízení typu slave pomocí zvláštních signálů, protože každému uzlu je přiřazena jednoznačná adresa – kromě elektrických charakteristik je totiž přesně stanoven i komunikační protokol, což je další rozdíl oproti výše popsané sběrnici SPI. Obecně je možné říci, že I2C je sice poněkud složitější, ale zato flexibilnější sběrnice, která se velmi často používá i pro komunikaci na delší vzdálenosti (řádově metry, viz například DDC u monitorů), než tomu je u sběrnice SPI. V navazující části seriálu si řekneme, jakým způsobem komunikace probíhá a jak se vlastně jednotlivá zařízení adresují.
Obrázek 11: Zapojení uzlů na sběrnici I2C.
8. Odkazy na Internetu
- SPI interface tutorial
http://www.best-microcontroller-projects.com/spi-interface.html - Serial Peripheral Interface Bus
http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus - EUSB to SPI bus Kit
http://www.eidusa.com/Electronics_Kits_EUSB_To_SPI_BUS.htm - SPI Block Guide V03.06, Freescale Semiconductor
http://www.freescale.com/files/microcontrollers/doc/ref_manual/S12SPIV3.pdf - What is SPI?
http://www.fpga4fun.com/SPI1.html - SPI – A simple implementation
http://www.fpga4fun.com/SPI2.html - Bit-banging
http://en.wikipedia.org/wiki/Bit-banging - Joint Test Action Group
http://en.wikipedia.org/wiki/JTAG - I2C
http://en.wikipedia.org/wiki/I2C - Display Data Channel
http://en.wikipedia.org/wiki/Display_Data_Channel - I2 Background
http://www.microport.tw/blognew.php?blog_no=7#theory - PIC16F87X, 28/40-pin 8-Bit CMOS FLASH Microcontrollers
Microchip Technology Inc.
http://www.microchip.com
Obrázek 12: Interní struktura rozhraní SPI u populárních mikrořadičů PIC16F87×. Nejdůležitějšími bloky je záchytný registr SSPBUF a posuvný registr SSPSR.