3.23. I2C alapok

Az I2C (Inter-Integrated Circuit, kiejtve „I-négyzet-C” vagy „I-kettő-C”) egy kétvezetékes soros busz, amelyet ugyanazon a panelen lévő chipek közötti rövid távú kapcsolatokra terveztek. Prioritásban az SPI és az UART között helyezkedik el: lassabb az SPI-nél, de takarékosabb a lábakkal, és címezhető (több eszköz ugyanazon a két vezetéken), ahol az SPI eszközönként egy dedikált CS-vonalat igényel.

Az I2C a választott busz az alacsony adatsebességű érzékelőkhöz – gyorsulásmérők, hőmérséklet-érzékelők, páratartalom-érzékelők, magnetométerek, valós idejű órák, EEPROM-ok –, ahol a lábak és a buszbonyolultság csökkentése fontosabb, mint a nyers átviteli teljesítmény.

3.23.1. Két vezeték, mindkettő open-drain

Egy I2C buszon mindössze két jel van:

  • SCL (soros óra). A vezérlő hajtja (legtöbbször).

  • SDA (soros adat). Az hajtja, amelyik eszköz éppen beszél – a vezérlő a cím és a kimenő adat alatt, a periféria az olvasások és az ACK-bitek alatt.

Mindkét vonal open-drain: a buszon lévő minden eszköz a földre húzhatja a vonalat, de soha nem hajtja magasra. Két felhúzó ellenállás a buszon (jellemzően 2.2 és 10 között a tápsínhez) magasra húzza a vonalakat, amikor senki sem húzza őket alacsonyra. A wired-OR viselkedés ebből adódik – bármelyik eszköz, amely alacsonyra húzza a vonalat, nyer, a magas állapot pedig csak annyit jelent, hogy „senki sem beszél”.

Az MCU belső felhúzásai az SCL és SDA lábain általában nem elég erősek ahhoz, hogy önmagukban buszfelhúzásként működjenek; a buszon rendszerint külső ellenállások szükségesek. Sok érzékelő-kivezetőpanel már tartalmazza őket; nézd meg az adatlapot, mielőtt továbbiakat adnál hozzá.

3.23.2. A tranzakció

Minden I2C tranzakció ugyanazt a formát követi:

SCL és SDA jelvonalak. Az SDA leesik, amíg az SCL magas (START), majd az SCL bitenként ütemezi a bájtokat az SDA-n -- egy 7 bites címbájt egy olvasás/írás bittel és egy ACK-val, majd egy regiszterbájt és egy ACK, majd egy adatbájt és egy NACK, majd az SDA felemelkedik, amíg az SCL magas (STOP).

Egy I2C tranzakció: START, 7 bites cím + R/W, ACK, regiszter, ACK, adat, NACK, STOP.

A csere bitenként bontakozik ki:

  • START. A vezérlő alacsonyra húzza az SDA-t, amíg az SCL még magas. Ez a szokatlan él jelzi a buszon lévő minden eszköznek, hogy egy tranzakció kezdődik.

  • Cím + R/W. A vezérlő kiütemez egy 7 bites perifériacímet, amelyet egy olvasás/írás bit követ (0 íráshoz, 1 olvasáshoz).

  • ACK / NACK. Minden bájt után a vevő egy órajelnyi időre meghajtja az SDA-t, hogy ACK-zzon (alacsony) vagy NACK-zzon (magas). A címbájtnál a periféria nyugtáz, ha felismeri a saját címét; ha egyetlen eszköz sem nyugtáz, a vezérlő NACK-ot lát, és tudja, hogy a cím nincs a buszon.

  • Adatbájtok. Mindegyiket a vevő egy ACK-ja követi. Íráskor a periféria minden bájtot nyugtáz; olvasáskor a vezérlő nyugtázza minden bájtot, amelyből többet akar, és NACK-ozza az utolsó bájtot, hogy szólhasson a perifériának, hogy hagyja abba.

  • STOP. A vezérlő magasra engedi az SDA-t, amíg az SCL magas, ezzel befejezve a tranzakciót.

Az ismételt start egy második START, amelyet közbeiktatott STOP nélkül adnak ki – a vezérlő ugyanazon a periférián vált irányt (íráscím, majd olvasáscím) anélkül, hogy elengedné a buszt.

3.23.3. Címzés

A 7 bites címtér a 0x080x77 tartományt fedi le; a végeken lévő értékek speciális célokra vannak fenntartva. Minden eszköz címét a chip tervezője állítja be; sok alkatrésznél néhány alsó bit panelszinten megváltoztatható (egy láb magasra vagy alacsonyra kötésével), így két azonos érzékelő ülhet ugyanazon a buszon.

Ha két eszköz osztozik egy címen, akkor nincs mód az egyikkel beszélni anélkül, hogy a másik ne zavarna, ezért nézd meg az adatlapot, mielőtt alkatrészeket párosítanál. Az i2c.scan() (a I2C kódban ismerteti) végigjárja a címteret, és jelenti, mely címek válaszolnak, ami a szabványos módja annak, hogy kiderítsd, mi van a buszon.

3.23.4. Erősségek és gyengeségek

A busz erősségei és gyengeségei jelölik ki a helyét:

  • Két láb sok eszközhöz. Egyetlen SCL/SDA pár egy tucat érzékelőt is elbír. Az SPI-nek eszközönként egy plusz CS-lábra lenne szüksége.

  • Szabványos sebességek. A 100 kHz („standard mód”) és a 400 kHz („fast mód”) szinte minden érzékelőt lefed. Az 1 MHz elérhető, de már nagyobb igényeket támaszt a buszkapacitással és a felhúzások méretezésével szemben.

  • Lassú az SPI-hez képest. Bármi, ami másodpercenként néhány száz kilobitnél többet mozgat, inkább SPI-t kíván.

  • Címütközések. Két azonos című eszköz egy buszon olyan hardverhiba, amelyet a protokoll nem tud megkerülni.