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.
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í.
-
START (S) Tento průběh je generován rovnou z klidového stavu sběrnice,
který je SDA = H, SCL = H. Nejdříve provedeme sestup signálu SDA na úroveň
L, a pak na tuto úroveň snížíme i signál SCL. Tím jsme úspěšně vygenerovali
řídící povel START. Podotýkám, že tímto příkazem se zahajuje komunikace
po sběrnici I2C a že jej smí provést pouze řadič sběrnice. Těch samozřejmě
může být více, takže případně mohou vznikat kolize.
-
STOP (P) Dalo by se říci, "inverzní" k události START a oznamuje
konec komunikační seance. Vzhledem k tomu, že během navázaného spojení
je klidový stav sběrnice SDA = x, SCL = L, můžeme generovat událost STOP
zhruba takto: Nejdříve zabezpečíme SDA = L, pak necháme signál SCL přejít
do úrovně H a nakonec i SDA nastavíme do stavu H. Tímto jsme nejen úspěšně
vykouzlili příkaz STOP, ale navíc jsme též uvedli celou sběrnici do základního
klidového stavu a umožnili tak dalším řadičům zahájit pokus o navázání
spojení. Stejně jako příkaz START i příkaz STOP smí generovat pouze řadič
sběrnice.
-
DATA (D) Odpovídá klasickému přenosu jednoho bitu dat a sem jsme
ji zahrnuli pouze pro úplnost abecedy. V zásadě platí, že platná data by
měla být na vodiči SDA v "rozumném" (záleží na katalogových údajích konkrétního
výrobku) předstihu před SCL = H. Stav vodiče SDA by potom měl zůstat nezměněn
až do přechodu signálu SCL zpět na úroveň L. Dále je vhodné mít na zřeteli,
že bez ohledu na směr přenosu dat je hodinový signál generován vždy řadičem
sběrnice. Není tedy od věci uvědomit si, že ačkoliv je nějaký obvod právě
zdrojem dat, nemusí být nutně zároveň zdrojem hodin.
-
ACK (A) V podstatě jde o přenos jednoho bitu s nulovou hodnotou.
Na rozdíl od datového přenosu příkaz ACK generuje vždy "protější" strana.
Tato událost znamená kladné potvrzení příjmu právě vyslaných dat. Ohledně
jeho generování platí, že počínaje vždy spádovou hranou osmého impulzu
na SCL (po přenosu posledního bitu daného znaku) je signál SDA plně v rukou
příjemce, který jej může (v případě, že hodlá provést potvrzení pomocí
ACK) začít udržovat na úrovni L. Opět je záhodno mít na zřeteli, kdo vlastně
"teď" generuje ACK a kdo hodiny.
-
HOLD (H) Je zajímavý tím, že není generován pomocí změny SDA, ale
SCL. V podstatě jde o to, že jakékoliv zařízení na sběrnici může podržením
signálu SCL v úrovni L pozastavit vysílání následujícího bitu. Pokud je
zdrojem hodin sám vysílající, je povinen po každém přechodu do stavu SCL
= H kontrolovat, zda mu tento stav "schválily" také ostatní obvody sběrnice
a eventuálně vyčkat tak dlouho, než tak učiní.
-
FREE (F) Zavedli také jen proto, aby byla naše abeceda úplná. Nejde
o žádný příkaz, ale o základní klidový stav sběrnice, který je definován
jako SDA = H, SCL = H.
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žší).
Vý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:
-
V situaci s více řadiči musí platit, že hodiny všech řadičů jsou synchronizovány
(konkrétně spádovou hranou SCL).
-
Každý řadič zná momentální stav sběrnice a zahajuje pokus o navázání spojení,
pouze není-li žádné spojení aktivní.
-
Ř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.
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