{{ :wiki:comm:i2c_logo.png|I²C logo}} ====== I²C ====== {{tag>busz i2c}} Az I²C (Inter-Integrated Circuit) egy [[hu:comm:start#multi-master|multi-master]], multi-slave, [[hu:comm:start#csomagkapcsolas|csomagkapcsolt]] szerial busz, melyet a Philips Semiconductor (ma NXP Semiconductors) feljesztett ki. Az I²C jellemzően kis távolságú, viszonylag alacsony sebességű IC és fedélzeti rendszerek közötti kommunikációra szokás alkalmazni. 2006. október 10 óta az I²C protokoll alkalmazásához már nem szükséges engedélyezési díjat fizetni, ez a felmentés azonban nem vonatkozik az NXP által kiosztott I²C slave címekre, azokért továbbra is fizetni kell. Több versenytárs, mint például a Siemens AG (később Infineon Technologies AG, jelenleg Intel mobilkommunikáció), az NEC, a Texas Instruments, az STMicroelectronics (korábban SGS-Thomson), a Motorola (később Freescale, most az NXP), a Nordic Semiconductor és az Intersil, az 1990-es évek közepe óta I²C kompatibilis termékeket dobott a piacra. Az 1995-ben az Intel által definiált SMBus az I²C részhalmaza, amely azonban kötöttebb szabályokat alkalmaz. Az SMBus egyik célja a robusztusság és az interoperabilitás előmozdítása volt, ennek megfelelően a modern I²C rendszerek jó pár eljárást átemeltek az SMBus-ból, néha támogatva mind az I²C, mind az SMBus-t. A busz maximális távolsága elvileg 7,6 m, de jellemzően 2-3 m-en szokás alkalmazni. ===== Az I²C verziói ===== * 1982-ben az eredeti 100 kHz-es I²C rendszert egyszerű belső buszrendszerként hozták létre az épületvezérlő elektronika számára, különböző Philips chipekkel. * 1992-ben az **1. verzió** 400 kHz gyors módot (**FM**) és 10 bites címzési módot adott hozzá az 1008 csomópontos kapacitás növeléséhez. Ez volt az első szabványosított változat. * 1998-ban a **2. verzió** hozzáadta a 3,4 MHz -es nagysebességű módot (**HS**) és kibővítette az energiatakarékossági követelményekkel. * 2000-ben a **2.1-es változat** tisztázta a 2. verziót, jelentős funkcionális változások nélkül. * 2007-ben a **3-as verzió** 1 MHz-es Fast-mode plus (**FM+**) (20 mA-es meghajtók használatával) és egy eszközazonosító mechanizmust adott a szabványhoz. * 2012-ben a **4-es verzió** az új USDA (adat) és az USCL (óra) vonalakhoz 5 MHz - es ultragyors módot (**UFM**) adott a szabványhoz, és egy pull-up ellenállás nélküli push-pull logikával hozzárendelt egy gyártói azonosító táblát. //Ez csak egy egyirányú busz.// * 2012-ben az **5. változat** kijavította a hibákat. * 2014-ben a **6. verzió** két grafikont korrigált. Ez az aktuális szabvány. ===== I²C technikai jellemzők ===== Az I²C az adatátvitelhez egy nyitott végű vezetékpárt használ, a soros adatvonalat (SDA) és a soros órajelet (SCL). A két vezetéket ellenállásokkal kell üzemi feszültségre húzni, a vezetékek jellemzően 5V, vagy 3,3V feszültséggel üzemelnek, de ettől eltérő feszültség-specifikáció sem kizárt. {{ :wiki:comm:i2c_diagram.png |}} A busz jellemzően 7 vagy 10 bites címzést alkalmaz, de esetenként a 16 bites megoldás is előfordul. Az átvitel jellemző sebességei: ^Mód ^Sebesség | |Alacsony sebességű üzemmód|10 kbit / sec| |szabványos üzemmód|100 kbit / sec| |gyors mód (FM) |400 kbit / sec| |gyors mód plusz (FM+) |1 Mbit / sec | |nagysebességű mód (HS) |3,4 Mbit / sec| ===== I²C a hardveres szinten ===== Minden I²C busz két jelből áll: SCL és SDA. Az SCL az órajel, az SDA az adatjel. Az órajelet mindig az aktuális busz-master generálja; egyes slave eszközök időnként alacsonyabb sebességre kényszeríthetik az órát. Ez az úgynevezett **clock stretching**, és a protokoll is tartalmazza ezt a funkciót. Ellentétben az UART vagy SPI kapcsolatokkal, az I²C buszvezérlők //"nyitott lefolyásúak"//, vagyis a jelvezetéket alacsonyra húzhatják, de magasra nem. Minden jelvezetéknek kell, hogy legyen egy felhúzó ellenállása arra az esetre, ha egyetlen eszköz sem használja azt, akkor a jelszint magas állapotba kerüljön //"magától"//. {{:wiki:comm:i2c_hw.png|I²C a hardveres szinten}} Az ökölszabály szerint a felhúzóellenállások mindig 4.7k-ok, de ez nem minden esetben válik be. Az I²C egy meglehetősen robusztus protokoll, de jellemzően csak rövid vezetékekkel (2-3m) használható. Hosszabb vezetékek esetén az alkalmazott ellenállások értékét érdemes csökkenteni. ==== Jelszintek ==== Az I²C jelszintjei jellemzően 5V, vagy 3,3V, amik, ha a [[hu:comm:comdict#ttl|TTL]] logikai szintjeik még összeegyeztethetőek, lehetővé teszik, hogy különböző jelszintű eszközöket is közvetlenül egy I²C hálózatba illesszünk. Ha a jelszintkülömbségek túl nagynak bizonyulnának, a kritikus részek közé **jelszintváltó**t kell beiktatni. ===== I²C forgalmazás ===== ==== Normál, 7 bites címzésű telegramváltás ==== {{:wiki:comm:i2c_7bit_telegram.png|I²C normál, 7 bites címzésű telegramváltás}} ^jel^lépés^leírás| |1|Start|Induláskor a master először az SDA-t, majd az SCL-t is alacsonyra húzza. Ez jelzés az összes hálózati résztvevő felé a forgalmazás indítására. Több jelenlevő master esetén az kommunikálhat, amelyik először húzza le az SDA-t. Összeakadás esetén a műveletet ismételni kell.| |2|Címkeret (A6..A0)|A 7 bites címzés esetén ez a tartalom megy ki először. Az [[hu:comm:comdict#msb|MSB]] az első bit.| |3|R/W|A nyolcadik bit azt jelzi, hogy olvasási vagy írási művelet következik. (1: olvasás, 0: írás)| |4|NACK / ACK|A 9. bit Ennél a bitnél a master a címzett egység "reakcióját" várja. Ha az megkapta a telegram eddigi tartalmát, a 9. óraimpulzus előtt le kell húznia az SDA vonalat. Ha ezt nem teszi meg, a master arra fog következtetni, hogy az egység nem érhető el, folytatja a forgalmazást más egységekkel.| |5|Adatkeret fogadása|Az adatkeret hossza a protokoll által nincs szabályozva. Sok esetben a slave-ek, ha nagyobb adatmennyiséget kell forgalmazniuk, az egymást követő telegramokban más-más regiszterek tartalmát küldik el.| |6|STOP|Először az SCL, majd az SDA is magas állapotba lesz "eresztve" a master oldaláról.| ==== 10 bites címzésű telegramváltás ==== {{:wiki:comm:i2c_10bit_telegram.png|I²C 10 bites címzésű telegramváltás}} ^jel^lépés^leírás| |1|Start|Megegyezik a 7 bites címzéssel; induláskor a master először az SDA-t, majd az SCL-t is alacsonyra húzza.| |2|1. Címkeret (b11110xyz)|Az első címkeret első 4 bitje "1". Az x lesz a cím 0. ([[hu:comm:comdict#msb|MSB]]) bitje, az y az 1. címbit, a z pedig az R/W bit (1: olvasás, 0: írás).| |3|2. Címkeret| Ebben a keretben a master kiadja a további címbiteket is.| |4|ACK|A 2. címkeret utolsó (ACK) bitpozíciójában kell reagálnia a slave-nek, csakúgy, mint a 7 bites változatban.| |5| | A további forgalmazás - a kompatibilitás okán - megegyezik a 7 bites változattal.| A 10 és 7 bites címzés egy hálózaton, egyidejűleg is bonyolódhat, mivel a 7 bites címzésben nem létezhet a vezető "11110" címsorozat. ==== Speciális funkciókra fenntartott címek ==== ^0000000 0|Általános hívás| ^0000000 1|Start bájt| ^0000001 X|CBUS címek| ^0000010 X|Különféle buszok számára fenntartott címek| ^0000011 X|Jövőbeli fejlesztésekre fenntartva| ^00001XX X|nagysebességű "master" kód| ^11110XX X|10 bites "slave" cím| ^11111XX X|Jövőbeli fejlesztésekre fenntartva| ==== Ismétlődő indulási feltételek ==== Néha fontos, hogy egy master sorozatban egyszerre több üzenetet is cserélhessen, anélkül, hogy a buszon lévő többi master belezavarna ebbe a forgalmazásba. Ilyenkor a kell a master-nek az "ismétlődő indulási feltételek"-et alkalmaznia. A megismételt indítás érdekében az SDA-nak magasnak kell lennie, míg az SCL alacsony. Ezután az SCL-nek magasba vált, majd az SDA újra alacsonyra kerül, miközben az SCL magas. ===== Példák az I²C alkalmazására ===== * [[hu:arduino:comm_example#arduino_i_c_kommunikacio|Arduino kommunikációs megoldások / példák]] * [[hu:esp:nodemcu_i2c|NodeMCU I²C kommunikáció]] ===== Források ===== https://learn.sparkfun.com/tutorials/i2c \\