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 kΩ és 10 kΩ 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:
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,1olvasá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 0x08 – 0x77 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 a400 kHz(„fast mód”) szinte minden érzékelőt lefed. Az1 MHzelé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.