3.23. Základy I2C

I2C (Inter-Integrated Circuit, vyslovováno „I-na-druhou-C“ nebo „I-dva-C“) je dvouvodičová sériová sběrnice navržená pro krátkovzdálenostní propojení mezi čipy na téže desce. Svými prioritami stojí mezi SPI a UART: pomalejší než SPI, ale úspornější na piny, a adresovaná (více zařízení na týchž dvou vodičích) tam, kde SPI potřebuje samostatnou linku CS pro každé zařízení.

I2C je preferovanou sběrnicí pro senzory s nízkou přenosovou rychlostí – akcelerometry, teplotní senzory, senzory vlhkosti, magnetometry, hodiny reálného času, paměti EEPROM – kde úspora pinů a jednoduchost sběrnice znamenají více než čistá propustnost.

3.23.1. Dva vodiče, oba s otevřeným kolektorem (open-drain)

Sběrnice I2C má pouze dva signály:

  • SCL (sériové hodiny). Buzeno řadičem (po většinu času).

  • SDA (sériová data). Buzeno tím zařízením, které právě hovoří – řadičem během adresy a odchozích dat, periferií během čtení a ACK bitů.

Obě linky jsou typu open-drain: každé zařízení na sběrnici může linku stáhnout na zem, ale nikdy ji nebudí do high. Dva vytahovací rezistory na sběrnici (typicky 2.2 10 na napájecí větev) vytahují linky do high, když je nikdo nestahuje na low. Z toho vyplývá chování wired-OR – vyhrává každé zařízení, které linku stáhne na low, a stav high znamená jen „nikdo nehovoří“.

Interní vytahovací rezistory MCU na jeho pinech SCL a SDA obvykle nejsou dostatečně silné, aby samy fungovaly jako vytahovací rezistory sběrnice; obvykle jsou potřeba externí rezistory na sběrnici. Mnoho senzorových rozšiřujících desek je již obsahuje; před přidáním dalších zkontrolujte datasheet.

3.23.2. Transakce

Každá transakce I2C má stejný tvar:

Průběhy SCL a SDA. SDA klesá, zatímco SCL je high (START), poté SCL hodinuje byty na SDA -- 7bitový adresový byte s bitem čtení/zápisu a ACK, poté byte registru a ACK, poté datový byte a NACK, poté SDA stoupá, zatímco SCL je high (STOP).

Transakce I2C: START, 7bitová adresa + R/W, ACK, registr, ACK, data, NACK, STOP.

Výměna probíhá bit po bitu:

  • START. Řadič stáhne SDA na low, zatímco SCL je stále high. Tato neobvyklá hrana oznamuje každému zařízení na sběrnici, že se chystá transakce.

  • Adresa + R/W. Řadič vyhodinuje 7bitovou adresu periferie následovanou jedním bitem čtení/zápisu (0 pro zápis, 1 pro čtení).

  • ACK / NACK. Po každém bytu přijímač po dobu jednoho hodinového taktu budí SDA pro ACK (low) nebo NACK (high). U adresového bytu periferie potvrzuje (ACK), pokud rozpozná svou vlastní adresu; pokud žádné zařízení nepotvrdí, řadič vidí NACK a ví, že adresa na sběrnici není.

  • Datové byty. Po každém z nich následuje ACK od přijímače. Při zápisu periferie potvrzuje každý byte; při čtení řadič potvrzuje každý byte, kterého chce více, a poslední byte odmítne (NACK), čímž periferii sdělí, aby přestala.

  • STOP. Řadič uvolní SDA do high, zatímco SCL je high, čímž transakci ukončí.

Opakovaný start je druhý START vydaný bez mezitím vloženého STOPu – řadič přepne směr (adresa pro zápis, poté adresa pro čtení) na téže periferii, aniž by se vzdal sběrnice.

3.23.3. Adresování

7bitový adresní prostor pokrývá 0x080x77; hodnoty na koncích jsou vyhrazeny pro zvláštní účely. Adresu každého zařízení nastavuje návrhář čipu; mnoho součástek umožňuje změnit několik nízkých bitů na úrovni desky (připojením pinu na high nebo low), takže dva stejné senzory mohou být na téže sběrnici.

Pokud dvě zařízení sdílejí adresu, není možné hovořit s jedním z nich, aniž by druhé rušilo, proto před párováním součástek zkontrolujte datasheet. i2c.scan() (popsáno v I2C v kódu) projde adresní prostor a oznámí, které adresy odpovídají, což je standardní způsob, jak zjistit, co je na sběrnici.

3.23.4. Silné a slabé stránky

Silné a slabé stránky sběrnice určují její místo:

  • Dva piny pro mnoho zařízení. Jediná dvojice SCL/SDA může nést tucet senzorů. SPI by potřebovalo navíc pin CS na každé zařízení.

  • Standardní rychlosti. 100 kHz („standardní režim“) a 400 kHz („rychlý režim“) pokryjí téměř každý senzor. 1 MHz je dosažitelná, ale začíná klást vyšší nároky na kapacitu sběrnice a dimenzování vytahovacích rezistorů.

  • Pomalé oproti SPI. Cokoli, co přenáší více než několik set kilobitů za sekundu, vyžaduje raději SPI.

  • Konflikty adres. Dvě zařízení se stejnou adresou na jedné sběrnici jsou hardwarovou chybou, kterou protokol nedokáže obejít.