Hlavní navigace

Komunikace po sériové sběrnici I2C

8. 1. 2009
Doba čtení: 11 minut

Sdílet

V dnešní části seriálu o architekturách počítačů si popíšeme, jakým způsobem spolu mohou komunikovat zařízení připojená na sériovou sběrnici I²C (Inter-Integrated Circuit). S touto sběrnicí se můžeme setkat i v běžných osobních počítačích; jednou ze známých implementací je kanál DDC.

Obsah

1. Komunikace po sériové sběrnici I2C
2. Řízení sběrnice zařízením typu master
3. Adresování uzlů připojených na sběrnici
4. Použití sedmibitové adresy
5. Použití desetibitové adresy
6. Vysílání dat zařízením slave adresovaným deseti bity
7. Standardní přenosové rychlosti
8. Odkazy na Internetu

1. Komunikace po sériové sběrnici I2C

V předchozí části tohoto seriálu byla popsána sběrnice SPI, včetně vysvětlení způsobu řízení komunikace mezi jednotlivými zařízeními (uzly), jež jsou na tuto sběrnici připojeny. Princip sběrnice SPI je založen na obousměrném plně duplexním přenosu dat, který je řízený hodinovým signálem vysílaným uzlem typu master (v režimu multi-master je možné uzel typu master vybrat). Sběrnice I2C sice také používá společný hodinový signál (data se tedy přenáší synchronně), ovšem komunikace je pouze poloduplexní – v jeden okamžik může existovat pouze jedno vysílající zařízení a libovolný počet zařízení (většinou však jen jedno), která data přijímají. U sběrnice I2C také není použit výběr zařízení typu slave pomocí zvláštních signálů (CS), protože každému uzlu může být přiřazena jednoznačná adresa – kromě elektrických charakteristik je totiž ve specifikaci přesně stanoven i základní komunikační protokol, což je další – a to dosti podstatný – 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ší sériovou externí sběrnicí, 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.

pc4401

Obrázek 1: 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.

Na druhém obrázku je zobrazen princip propojení několika uzlů pomocí sběrnice I2C. Sběrnice je tvořena dvojicí signálových vodičů; z tohoto důvodu se můžeme v dokumentaci setkat i s označením TWI (Two Wire Serial Interface), které používají například někteří výrobci mikrořadičů (Atmel). První signálový vodič slouží pro obousměrný přenos dat (SDA – serial data), druhým vodičem pak zařízení typu master posílá všem ostatním zařízením hodinové signály (SCK – serial clock). V praxi je navíc nutné k této dvojici vodičů přidat i společnou signálovou zem (GND – ground). Ani to však ještě pro úspěšnou komunikaci nestačí, protože je navíc nutné oba signálové vodiče, tj. jak SDA, tak i SCK, připojit přes pull-up rezistory o odporu cca 1,5 kΩ na napájecí napětí. Důvod je jednoduchý – ve chvíli, kdy jsou všechny uzly nečinné (mohou být klidně i odpojeny od sběrnice), zvedají tyto dva rezistory napětí na obou signálových vodičích na úroveň logické jedničky, což je normou stanovený klidový stav. Sběrnice může v tomto stavu zůstat po libovolně dlouhou dobu – některé mikrořadiče dokonce mohou přejít do režimu „spánku“ (nízké spotřeby, snížení vyzařování) s tím, že při zahájení komunikace se automaticky aktivují.

pc4402

Obrázek 2: Zapojení uzlů na sběrnici I2C. Jedno z připojených zařízení pracuje v režimu „master“, ostatní zařízení pak v režimu „slave“. Do režimu „master“ se většinou konfiguruje mikrořadič či mikroprocesor, který sbírá data z ostatních zařízení (A/D převodníky, teplotní senzory), popřípadě tato zařízení řídí (LED či LCD panely, regulované větráčky, hodiny reálného času). Kromě datového vodiče SDA a vodiče SCL přenášejícího hodinový signál je nutné všechna zařízení propojit společnou signálovou zemí – GND.

2. Řízení sběrnice zařízením typu master

Veškeré řízení sběrnice má na starosti zařízení nakonfigurované do režimu master. V jednu chvíli může jako master pracovat pouze jediné zařízení, čímž je zaručeno, že na sběrnici nebude docházet ke kolizím; navíc je veškerá komunikace deterministická (při správné konfiguraci lze zaručit dobu odezvy). Ostatní uzly, které pracují v režimu slave, nemohou sběrnici řídit a dokonce ani nemají možnost samy zažádat o vysílání či příjem dat. V těch případech, kdy není čas komunikace určen deterministicky (například na základě společného časovače), ale nutnost komunikace záleží spíše na externích událostech (teplotní či kouřové čidlo, detektor pohybu atd.), je možné zvolit několik variant řešení. Nejjednodušší variantou jsou neustálé dotazy na stav zařízení (čidla), tj. takzvaný polling. Mikrořadič se například může po každém přerušení od svého interního časovače dotázat na stav všech zařízení připojených na sběrnici a adekvátně podle toho zareagovat, například roztočit větráček na chladiči, spustit alarm atd. Druhá možnost poněkud samotnou sběrnici I2C obchází – zařízení může pomocí externího přerušovacího signálu (tj. dalšího vodiče) mikrořadič informovat o tom, že je nutné zahájit komunikaci. Existuje ještě třetí možnost – režim multi-master, ten však nemusí být vždy podporován.

Vlastní zahájení komunikace zařízením nakonfigurovaným do režimu master je poměrně jednoduché. V klidovém stavu, kdy nejsou přenášena žádná data, jsou na obou signálových vodičích, tj. jak SDA, tak i SCL, napěťové úrovně logické jedničky. I kdyby se všechny uzly odpojily (přešly například do stavu vysoké impedance na vstupu), tak je úroveň logické jedničky zaručena díky zapojení dvou pull-up rezistorů mezi signálové vodiče a napájecí napětí. Komunikaci vždy zahajuje master a to tak, že sníží úroveň na datovém vodiči SDA na logickou nulu, zatímco SCL si po určitou dobu udržuje stav logické jedničky (tato doba je závislá na zvolené přenosové rychlosti). Tento stav, který se označuje termínem start bit, rozpoznávají všechny uzly připojené na sběrnici. Ihned po vyslání start bitu začne master vysílat adresu uzlu, se kterým si přeje komunikovat (sedmibitová či speciálně kódovaná desetibitová adresa) a také bit, jehož stavem se určuje, zda má komunikující uzel data vysílat či naopak přijímat. Způsob adresování je popsán v navazujících kapitolách. Každý bit (ať už je na sběrnici zapisován jakýmkoli zařízením) musí mít ustálenou hodnotu ve chvíli, kdy hodinový signál přejde ze stavu logické nuly do stavu logické jedničky (náběžná hrana).

pc4403

Obrázek 3: Zahájení přenosu dat – vyslání start bitu uzlem, který pracuje v režimu master.

3. Adresování uzlů připojených na sběrnici

Každému zařízení (nakonfigurovanému do módu slave) připojenému na sběrnici I2C může být přidělena unikátní celočíselná adresa, aby bylo možné jednoznačně určit uzel, se kterým má zařízení typu master komunikovat. U sběrnic I2C, pomocí kterých je propojeno menší množství komunikujících zařízení (uzlů), se používá sedmibitová adresa přenášená v jednom bajtu, přičemž poslední přenesený bit, tj. ten s nejnižší váhou, má význam přepínače mezi módem čtení a zápisu dat – R/W. Pomocí sedmibitové adresy lze teoreticky rozlišit až 27=128 různých zařízení, prakticky je však toto číslo zmenšeno o několik rezervovaných adres (general call addresses), jejichž význam si vysvětlíme v následujících odstavcích. Existují však i rozlehlejší sítě s větším množstvím komunikujících zařízení, u kterých by sedmibitová adresa nemusela postačovat pro rozlišení všech připojených uzlů (situace s omezeným adresovým prostorem se ještě zhoršuje v tom, že zdaleka ne u všech připojených zařízení lze jejich adresu libovolně zvolit – mnoho výrobců například přenastavuje adresu zařízení napevno či umožňuje výběr pouze několika adres).

pc4404

Obrázek 4: Komunikace probíhající na sběrnici I2C, při níž je pomocí sedmi bitů vybráno jedno ze zařízení, které pracuje v režimu slave. Po sedmi bitech adresy je navíc přenesen jeden bit, kterým je určeno, zda bude zařízení typu „master“ data posílat či naopak přijímat. Každá osmice bitů (bajt, znak) je potvrzována, přenesení osmi bitů je tedy provedeno za devět hodinových cyklů (devátý cyklus slouží k přenesení potvrzovacího bitu – ACK).

V těchto případech lze využít odlišnou konfiguraci sběrnice I2C, při které je možné každému zařízení nastavit desetibitovou adresu a rozlišit tak maximálně 210=1024 adres. Z tohoto již poměrně velkého adresového rozsahu je opět část adres rezervovaná pro účely vysílání příkazů na všechna slave zařízení (obdoba broadcastu známého například z Ethernetu). Adresu na sběrnici opět vysílá uzel nakonfigurovaný do režimu master, data samozřejmě může vysílat i libovolný vybraný uzel pracující v módu masterslave. Nepatrnou nevýhodou adresování deseti bity je potřeba přenosu adresy ve dvou bytech, což může v některých případech znamenat neefektivní využití přenosového pásma, zejména tehdy, když se po navázání spojení přenáší pouze malé množství údajů. Některé čipy také nejsou uzpůsobeny pro tento režim adresování; týká se to zejména starších teplotních čidel, měřidel otáček, „sériových“ pamětí apod. Ve čtvrté kapitole si ukážeme průběh signálů při adresování zařízení sedmibitovou adresou, v kapitole páté pak způsob adresování zařízení deseti bity.

4. Použití sedmibitové adresy

Průběh komunikace při adresování uzlů pomocí sedmibitové adresy je zobrazen na pátém obrázku. Komunikace je zahájena, jak jsme si již řekli v předchozí kapitole, takzvaným start bitem, tj. přechodem signálu SDA z klidového stavu představovaného úrovněmi logické jedničky na datovém i hodinovém vodiči na úroveň logické nuly. Ihned po start bitu je možné zahájit přenos adresy. Zařízení master vyšle na sběrnici všech sedm bitů adresy, přičemž vždy při náběžné hraně hodinového signálu je již logická hodnota adresního bitu ustálena, takže ji mohou přečíst všechna zařízení typu slave. Poslední bit – osmý – určuje, zda se mají data z cílového zařízení vysílat, či naopak zda má toto zařízení data přijímat (logická úroveň 0 značí čtení, jednička pak zápis). Po přenosu všech osmi bitů (sedm bitů adresy + osmý bit s určením směru přenosu dat) provede každý uzel slave porovnání přijaté adresy se svoji vlastní adresou. Vybraný uzel (jen on) totiž musí potvrdit, že se na sběrnici skutečně nachází. Potvrzení (bit ACK – acknowledge) se v devátém cyklu hodin pošle zpět na zařízení typu master. Příjem logické nuly značí, že adresovaný uzel skutečně existuje a je možné s ním zahájit komunikaci, logická jednička naopak může znamenat, že uzel s danou adresou buď neexistuje, nebo je z nějakého důvodu odpojen či prostě není z různých příčin připraven komunikovat.

pc4405

Obrázek 5: Průběh komunikace při adresování uzlů pomocí sedmibitové adresy.

5. Použití desetibitové adresy

Ve třetí kapitole jsme si řekli, že uzly připojené na sběrnici I2C mohou být nakonfigurovány tak, že budou přijímat desetibitovou adresu. Ta se již posílá poněkud složitějším způsobem, přičemž se využívají rezervované adresy, o nichž jsme se zmiňovali taktéž ve třetí kapitole. V původním sedmibitovém adresovém rozsahu mají totiž některé adresy speciální význam. Především se jedná o adresu s binární hodnotou , která může být použita pro broadcast, tj. vysílání dat do všech zařízení připojených na sběrnici. Další rezervované adresy mají binární hodnotu odpovídající vzoru 1111×xx. Právě některé z těchto adres jsou využity při přenosu desetibitové adresy. Deset bitů adresy se v tomto případě přenáší ve dvou bajtech, a to tak, že v prvním bajtu jsou uloženy dva nejvyšší bity adresy, která má tvar 11110??0, kde ?? značí hodnotu devátého a desátého bitu adresy. Všimněte si, že poslední bit musí být vždy nastaven na úroveň logické nuly, protože zařízení slave by mělo přijmout i druhý bajt adresy (příslušné uzly slave se tedy nastaví do režimu čtení). Druhý přenesený bajt obsahuje dolních osm bitů adresy. Po přenosu tohoto bajtu již může master začít s posíláním dat na vybraný uzel slave, přičemž tento uzel potvrzuje příjem každého datového bajtu stejným způsobem, jako příjem adresy – v devátém taktu hodin hodnotou ACK.

pc4406

Obrázek 6: Průběh komunikace při adresování uzlů pomocí desetibitové adresy (příjem dat zařízením typu slave).

6. Vysílání dat zařízením slave adresovaným deseti bity

Výběr uzlu typu slave pomocí desetibitové adresy, který byl popsán v předchozí kapitole, je možné použít pouze pro případ, že se data budou vysílat z masteru směrem na slave. Je tomu tak proto, že bit určující směr toku dat je nastaven na logickou nulu, čímž je umožněn jak přenos druhého bajtu adresy, tak i vlastní zápis dat na slave ihned po výběru uzlu. Jak však vypadá komunikace v případě, že se sice má na všechny slave poslat desetibitová adresa, ale poté se mají data přenášet od vybraného slave směrem k masteru? Vzhledem k tomu, že celý druhý bajt adresy je určen pro přenos adresních bitů, není již možné směr přenosu přímo změnit (chybí nám k tomu nejnižší bit určující mód čtení či zápisu). Proto je zapotřebí použít takzvaný opakovaný start, jehož průběh je ukázán na sedmém obrázku. Z grafu je patrné, že se nejprve přenese desetibitová adresa naprosto stejným způsobem, jaký jsme si popsali v předchozí kapitole. Důležité je, že zařízení slave si celých deset bitů adresy zapamatuje. Poté je přenesen nový start bit po němž následuje znovu přenos prvního bajtu adresy, tentokrát však již s negovanou hodnotou posledního bitu. Vzhledem k tomu, že slave si zapamatoval původní adresu, není již nutné znovu přenášet spodních osm bitů adresy a může se ihned zahájit transfer dat.

pc4407

Obrázek 7: Průběh komunikace při adresování uzlů pomocí desetibitové adresy (vysílání dat zařízením typu slave po jeho výběru).

CS24_early

7. Standardní přenosové rychlosti

Specifikace sběrnice I2C stanovuje i několik standardních přenosových rychlostí, které pokrývají většinu praktických aplikací (pro ovládání větráčku zajisté není zapotřebí použít megabitovou sběrnici, to by kladlo zbytečně velké požadavky jak na komunikující uzly, tak i na elektrické provedení sběrnice). Mnoho současných čipů dokáže komunikovat rychlostí 10 kbps, 100 kbps a 400 kbps, poslední dvě standardní rychlosti nejsou (prozatím) ve větší míře podporovány. V dále uvedené tabulce jsou uvedeny rychlosti přenosu odvozené přímo z frekvence hodinového signálu, přičemž jsou do těchto hodnot započítány i potvrzovací bity. Vzhledem k tomu, že osm datových bitů se přenáší minimálně v devíti hodinových cyklech (poslední cyklus je rezervovaný pro potvrzovací signál ACK), je reálná přenosová rychlost užitečných dat poněkud nižší:

Přenosová rychlost Označení
10 kbps low speed mode
100 kbps standard mode
400 kbps fast mode
1 Mbps fast mode +
3,4 Mbps high speed mode

8. Odkazy na Internetu

  1. SPI interface tutorial
    http://www.best-microcontroller-projects.com/…terface.html
  2. Serial Peripheral Interface Bus
    http://en.wikipedia.org/…nterface_Bus
  3. EUSB to SPI bus Kit
    http://www.eidusa.com/…_SPI_BUS.htm
  4. SPI Block Guide V03.06, Freescale Semiconductor
     http://www.freescale.com/…S12SPIV3.pdf
  5. What is SPI?
    http://www.fpga4fun.com/SPI1.html
  6. SPI – A simple implementation
    http://www.fpga4fun.com/SPI2.html
  7. Bit-banging
    http://en.wikipedia.org/…/Bit-banging
  8. Joint Test Action Group
    http://en.wikipedia.org/wiki/JTAG
  9. I2C
    http://en.wikipedia.org/wiki/I2C
  10. Display Data Channel
    http://en.wikipedia.org/…Data_Channel
  11. I2 Background
    http://www.microport.tw/blognew.php?…
  12. PIC16F87X, 28/40-pin 8-Bit CMOS FLASH Microcontrollers
    Microchip Technology Inc.
     http://www.microchip.com

Byl pro vás článek přínosný?

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.