5. Norma I2C a SPI

Komunikace pomocí I2C či ještě jednoduššího SPI je mnohem méně náročná než zvládnutí ISO 7816. Za jednoduchost se však platí schopnostmi těchto karet. Dá se říci, že víceméně jde jen o paměťové karty, z nichž některé nabízejí ochranu svých dat pomocí několika úrovňového systému hesel. Komplexně pojaté výrobky, které disponují autonomním operačním systémem a nabízejí takové možnosti jako třeba SIM karty pro GSM bychom v této třídě karet hledali jen stěží. Ne snad že by níže popsané protokoly na něco takového nestačily, ale prostě platí nepsané pravidlo, že pokud má být nějaká karta určena pro náročnější aplikace, pak je navržena podle ISO 7816.

Protokol I2C

Přesnější název by měl spíš být sběrnice, neboť I2C (Inter Integrated Circuit bus) byla původně navržena jako jednoduchá sériová sběrnice pro spojování obvodů jednoduchých mikroprocesorových systémů firmy Philips. I2C se v podstatě skládá ze dvou signálů, označovaných jako SCL (hodiny) a SDA (data), které tvoří dvě sběrnice realizované jako výstupy s otevřeným kolektorem (OK). Jako OK je přitom realizován nejen datový vodič (SDA), ale i signál hodin (SCL). To umožňuje vytvářet sběrnice, na kterých je současně umístěno několik zařízení typu master.
Základní schéma sběrnice I2C
Jak už bylo naznačeno, základní přenos po této sběrnici je sériový s délkou slova osm bitů, přičemž jednotlivé bity jsou přenášeny v pořadí vyššínižší. Právě popsané údaje platí pro všechny klony této sběrnice a na rozdíl od ISO 7816 se nemohou během přenosu nijak měnit. Maximální hodinová frekvence se v současné době pohybuje kolem 400 kHz. Dále platí, že data na vodiči SDA musí být platná během jedničkové úrovně signálu SCL. Pokud se signál SDA mění během doby SCL = H, znamená to vyslání nějakého řídicího znaku. Tímto způsobem se I2C vyrovnává s absencí speciálních vodičů pro řídicí účely.
Abychom si mohli lépe popsat průběhy komunikace pomocí I2C, zavedeme si nejdříve abecedu sběrnicových primitiv, z nichž potom budeme skládat komplexnější přenosové posloupnosti. Probereme si nyní význam šesti takových primitiv a způsob jejich generování.
Základní I2C komunikace
Nyní se podívejme na klasické případy navázání spojení a přenos dat přes sběrnici I2C. K vlastnímu popisu přitom budeme používat abecedu základních primitiv, kterou jsme si zavedli. Inicializaci neboli navázání spojení zahajuje vždy řadič. Navázání spojení pak vypadá asi takto: F-S-Ds6-Ds5-...-Ds0-Ddir-A. Nejdříve je vyslán startovní symbol. Pak následuje osm datových bitů, které se dělí na sedm bitů adresy zařízení (Ds6 až Ds0, s jako selection) a jeden bit (Ddir) směru přenosu dalšího znaku. Hodnota L indikuje, že další oktet bude vysílat opět řadič, H znamená, že se očekávají data od "protějšího" zařízení. Připomínám, že zdrojem hodinových impulzů je v obou případech řadič. Pokud byla adresa správná, to znamená, že zařízení tohoto typu existuje a je ochotno s řadičem komunikovat, končí celá inicializační posloupnost zasláním kódu ACK. K adrese Ds6 až Ds0 je ještě vhodné poznamenat, že firma Philips provedla jistou standardizaci posloupnosti tím, že celý adresový prostor rozdělila na dvě podskupiny. První z nich adresuje jistý okruh zařízení podle typu a druhá potom vybírá z této množiny periferií jednu konkrétní podle její vlastní adresy. Dále existují vyhrazená čísla adres, která slouží pro broadcasting (Ds6...Ds0 = 0, v dalším znaku následuje kód operace), desetibitovou adresaci (první znak 1111 1xxx, druhý xxxx xxxDdir, kde x jsou bity adresy v pořadí vyšší-nižší).
Abeceda komunikačních primitiv pro I2CVýznam následujících bajtů, které jsou v rámci právě navázané komunikace přenášeny, už závisí plně na typu daného zařízení. To většinou přesně definuje význam a pořadí jednotlivých slov, které očekává od řadiče nebo naopak které řadiči zasílá. Z pohledu protokolu I2C už ale jde jen o zasílání dalších 8bitových sekvencí. Důležité je uvědomit si, že bit Ddir je vysílán pouze v prvním znaku – v dalších už je na tomto místě "normální" bit D0. To znamená, že ať už je význam dat zasílaných po sběrnici jakýkoliv, bude směr jejich toku stále stejný. V případě, že je třeba tento směr z nějakého důvodu změnit, norma pro I2C povoluje řadiči provést novou úvodní sekvenci, aniž by při tom zasílal kód STOP. Přenos jednoho slova od řadiče k zařízení a dvou slov opačným směrem by tedy měl vypadat zhruba takto: F-S1-Ds6-...-Ds0-Ddir (L) -A-D7-...-D0-A-S2-Ds6-...-Ds0-Ddir (H) -A-D7-...D0-A-D7-...-D0-A-P-F.
Nyní zjednodušíme zápis tak, že pod označením Dsel budeme uvažovat posloupnost primitiv Ds6 až Ds0 a výrazem Data analogicky sled D7 až D0.
Řízení sběrnice I2C
Do teď jsme vycházeli z předpokladu: pokud se na sběrnici I2C vyskytne více řadičů, které chtějí komunikovat nějak se dohodnou. Teď popíšu jak probíhá řízení těchto požadavků. Platí tato tři pravidla:
  1. V situaci s více řadiči musí platit, že hodiny všech řadičů jsou synchronizovány (konkrétně spádovou hranou SCL).
  2. Každý řadič zná momentální stav sběrnice a zahajuje pokus o navázání spojení, pouze není-li žádné spojení aktivní.
  3. Řadič během vysílání monitoruje stav SDA, a pokud tam nenajde úroveň, kterou on sám generuje, musí s vysíláním přestat a počkat na další uvolnění sběrnice. Zde je tedy výhodně využito vlastnosti sběrnic typu OK k vytvoření jednoduchého prioritního uspořádání, kde nejvyšší prioritu mají adresy s nejnižším číslem. Dodejme, že v případě několika žádostí o komunikaci s tímtéž zařízením vítězí ten, kdo požaduje přenos dat směrem od řadiče.
Dodejme ještě, že existuje poměrně široké spektrum jednočipových mikropočítačů, které mají rozhraní I2C přímo integrováno. Namátkou jsou to obvody 80C528, 552 a 752 od firmy Philips či MC68HC05E0 a MC68HC05T7 od firmy Motorola.

Sběrnice SPI

Popis alternativních norem byl zaměřen hlavně na I2C, proto bude popis tohoto rozhraní stručnější, neboť detailní popis by byl stejně dlouhý jako u I2C. Podrobnější informace jdou nalézt v literatuře fa. Motorola, která ji vytvořila a velmi podporuje ve své rodině jednočipových mikropočítačů řady HC05, HC11 a HC16.
Stručné schéma sběrnice SPI
Z obrázku lze vypozorovat, že sběrnice ISP je v podstatě spojení dvou vzájemně propojených posuvných registrů, které jsou taktovány společným hodinovým signálem. Jeho frekvence přitom může dosahovat až 1 MHz. Jako základní atomickou přenosovou operaci nad SPI přitom chápeme vzájemné překopírování obsahu propojených posuvných registrů. Je zřejmé, že tato operace bude vyžadovat celkem osm hodinových taktů. Při plném vytížení kanálu tak můžeme pomocí SPI provozovat duplexní přenos rychlostí až 1*10^6/8 bajtů za sekundu, což je poměrně solidní výkon. Mimo jiné je to také jeden z hlavních důvodů, proč se tato architektura vlastně používá.
 


<--<-^->-->



 



Semestrální projekt z Číslicových počítačů II.
Autoři: Lumír Návrat, Jakub Konštacký, Zdeněk Šmíd, Pavel Oplatek