az Inter-Integrated Circuit (I2C) busz egy chip-szintű soros kommunikációs mechanizmus, amely működik több mint két vezetéket. Egyes fejlesztők kimondják a busz nevét eye-two-see, mások szem-négyzet-see, de mindkettő ugyanarra utal. Által kidolgozott Philips a korai 1980-as években, I2C állapították meg, hogy egységesíteni kommunikációs között a társaság a chips, de azóta vált egy de facto szabvány által támogatott sok mikrokontroller eszközök Arduino lapok, hogy a Raspberry Pi pedig, természetesen, a koboldok.,

A fizikai busz

I2C magában foglalja a két vezetéket. Az egyik I2C vonal továbbítja az adatokat, a másik az órajeleket, amelyek szinkronizálják az eszközök közötti beszélgetést. Az adatsor neve “SDA”, az óravonal “SCL”.

általában mind az SDA, mind az SCL egy 3,3 vagy 5 V-os tápvezetékhez csatlakozik egyetlen “felhúzó” ellenálláson keresztül, mindegyik vonalon egyet. Erre azért van szükség, mert az eszközök SDA és SCL csatlakozásai “nyitott lefolyó” vonalak: a vonalon lévő feszültséget 0V-ra vagy “alacsonyra” kényszeríthetik, de nem emelhetik 3,3 V-ra vagy “magas” – ra., Magas és alacsony az 1s és 0s elektromos reprezentációi, amelyek a digitális információ alapvető elemei. E két ellenállás hozzáadása-és a busznak csak kettőre van szüksége, függetlenül attól, hogy hány eszköz csatlakozik hozzá — biztosítja, hogy a feszültség rövidzárlat nélkül 3, 3 V-ra emelkedjen.

I2C ragaszkodik ahhoz, eszközök nyitott csatorna vonalak érdekében alkatrész -, hogy károsítaná magas áramlatok képes áramlását, amikor a két készülék megpróbálja jel egyszerre.

a legtöbb esetben elvárják, hogy ezeket az ellenállásokat saját maga adja hozzá, de néhány eszköz, általában azok, amelyek 3-on működnek.,3V, tartalmazza azokat annak érdekében, hogy kompatibilis eszközök ellátó 5V. ne feledje, hogy csak akkor kell egy pár pull-up ellenállások buszonként, így szükség lehet eltávolítani pull-up ellenállás csatlakozik más eszközök a buszon. Bár az imp saját belső húzó ellenállásokkal rendelkezik, ezek túl gyengék ahhoz, hogy hasznosak legyenek az I2C számára, ezért automatikusan le vannak tiltva, amikor a csapok úgy vannak beállítva, hogy kezeljék az I2C jeleket.

vezérlők és perifériák

az I2C busz az eszközöket “vezérlők” – re és “perifériákra” osztja., Egyszerre csak egy eszköz küldhet időzítőimpulzusokat az SCL vonalon, és ezt választotta a vezérlőnek. Az összes többi szinkronizálja időzítését a vezérlővel, így perifériáknak tekintik. A vezérlő-jellemzően az imp-és perifériái-mind képesek adatokat továbbítani és fogadni, de csak a vezérlő tudja megmondani a perifériának, hogy mikor kell továbbítani az adatokat.

címzés

annak érdekében, hogy az egyik I2C eszköz egy-egy alapon kommunikáljon a másikkal, mindkét eszköznek egyedileg azonosíthatónak kell lennie. Ez az identitás az eszköz I2C címe., Az I2C címek általában 7 bites számok,így a busz akár 127 eszközt is tartalmazhat. A bájt nyolc bitből áll; az extra bit annak jelzésére szolgál, hogy a vezérlő elküldi — e a jelet a perifériára — “írás” — vagy a másik irányba – “olvasás”. Ez a nyolcadik bit valójában bit nulla a cím byte küldött ki a buszra. A 7 bites cím bitekben kerül elhelyezésre a cím bájtja közül egy-hét.

ennek a formátumnak megfelelően az imp API I2C-címeket vesz 8 bites értékként., Az eszközszolgáltatók általában 7 bites számként adják meg termékeik címét, ezért a címet hét bitről nyolcra kell konvertálni. Ez az érték a mókus << operátorral érhető el, amely egy szám egyedi bitértékeit balra mozgatja. Ez a folyamat egyenértékű a kettővel való szorzással. A kód, ez a folyamat így néz ki:

local sevenBitAddress = 0x39;local eightBitAddress = sevenBitAddress << 1;

mókus automatikusan beállítja bit nulla a megfelelő I2C-meghatározott érték: 0 egy írási művelet, 1 egy olvasási., Most már készen áll arra, hogy az imp egyik i2c módszerét használja adatok írására a buszra:

i2c.write(eightBitAddress, dataInStringForm);

annak a készüléknek a 7 bites címét, amellyel az imp-t kommunikálni szeretné, az összetevő gyártója biztosítja, és szerepel az eszköz adatlapján. Lehet, hogy nem rögzített, hanem egy sor cím közül választja ki az eszközök másik csapjára alkalmazott feszültség szerint., Például egy TAOS TSL2561 fényérzékelőnek három lehetséges címe van: 0x29, 0x49 vagy 0x39, attól függően, hogy az ADDR pin-je 0V, 3.3 V vagy “lebegő” a kettő között. Azt mondjuk, hogy az érték lebeg, mert nem aktívan választották ki egy adott feszültségen történő működésre; bármi lehet 0-tól 3, 3 V-ig.

jelző

az I2C busz vezérlője egy periféria 7 bites címét használja annak a komponensnek a azonosítására, amellyel beszélni akar., Valójában a jelzés ennél bonyolultabb, de szerencsére az összes részletet az imp kezeli, így a címet csak 8 bites értékként kell megadnia.

Ha a perifériára ír, akkor az íráshoz szükséges adatokat is meg kell adnia, amely gyakran magában foglalja a regiszterértékeket, amelyek utasítják a perifériát, hogy mit kell tennie az adatokkal. Az imp API dokumentációja ezekre a regiszterekre “alcímként” utal:

i2c.write(eightBitAddress, dataString);

write() karakterláncformájú adatokat igényel. Következésképpen előfordulhat, hogy a más típusú változókban tárolt értéket karakterlánc formává kell konvertálnia.,

Az eszközről származó információk olvasásához szükség lehet egy parancsra, amely megmondja az eszköznek, hogy mely adatokat kell letölteni. Mondom, az imp olvasni az adatokat az I2C busz is jár, amely a harmadik paraméter, a byte-ok száma azt várja, hogy megkapja:

i2c.read(eightBitAddress, controlDataString, numberOfBytesToRead);

Mögött ezek a műveletek az I2C elektromos jeleket alkalmazott, hogy az SDA vonalat szinkronban a timing impulzusok alkalmazása a SCL vonal. Írás a busz jár a Start marker: csepegtető SDA 0V, míg SCL 3.3 V. változik az SDA feszültség, amikor az SCL feszültsége magas meghatározza start and stop markerek., Ha az SDA feszültség nem változik, miközben az SCL magas, az I2C eszközök tudják, hogy az adatok, nem pedig a jelölők kerülnek elküldésre.

az SDA most magasra vagy alacsonyra megy, hogy elküldje a cím byte minden egyes bitjét: a 7 bites eszközcímet, amelyet az olvasási/írási bit követ. A bájt bitek küldött ki balra-legtöbb bit — a “legjelentősebb bit” – első, SDA megy magas, ha a bit értéke 1 vagy alacsony, ha nulla. A cél periféria most húzza SDA alacsony jel nyugtázás kézhezvételét az adatok, majd ki megy nyolc bit vezérlő információ vagy adat, majd több adat, ha szükséges., Az SDA-n egy impulzusos ” ack ” nyugtázási szünet van minden elküldött nyolc bit között, a kilencedik SCL impulzusra időzítve. Ha a periféria így nem ismeri el a nyugtát, a vezérlő érzékeli, hogy az SDA magas maradt, és hibát jelez.,

Ha az áramlás a perifériás, hogy az adatkezelő, az utóbbi ugyancsak elismeri, kézhezvételétől számított nyolc bit húz SDA alacsony a kilencedik SCL pulzus, kivéve, ha ez az utolsó byte egy tétel, amely esetben az adatkezelő nem húzza SDA alacsony — ez teszi a ‘nak’ jel, vagy nem visszaigazolást’ — annak érdekében, hogy a perifériás tudom, hogy befejezte.

ha végeztünk, az SDA magas lesz, mint egy stop marker.,


Az átvitel kezdetét az SDA magasról alacsony feszültségre történő leesése jelzi (a bal oldali téglalap),
álljon meg a hátramenettel (a jobb téglalap). Az SCL-nek magasnak kell lennie, ha ez megtörténik

időzítés

az I2C kommunikáció szabványos órajele másodpercenként 100KHz-100 000 SCL impulzus. Lehetséges, hogy gyorsabban megy, akár 400 kHz-ig. Előfordulhat, hogy egyes eszközök nem tudják támogatni ezt a sebességet; ellenőrizze az imp-hez csatlakozni kívánt eszközt kísérő adatlapot., Sok lassú eszköz azonban az “óra nyújtásának” nevezett technikát használja, hogy a gyorsabb eszközöket a sebességükre kényszerítse. Az imp támogatja azokat az eszközöket, amelyek ezt a technikát használják. Lényegében alacsonyan tartják az SCL-t, miközben lekérik azokat az adatokat, amelyeket el akarnak küldeni az imp-nek. Az imp ezt észleli, felszabadítja az SCL sort, majd megvárja, amíg az SCL ismét magasra emelkedik, mielőtt folytatná.

előfordulhat azonban, hogy Önnek kell csökkentenie az I2C sebességet, ha a beállításának elektromos jellemzői lelassítják a 0V és 3,3 V közötti átmenet sebességét, amelyet “emelkedési időnek” neveznek., Ezt gyakran hosszú vezetékek okozzák, amelyek növelik az áramkör kapacitását. Annak érdekében, hogy az eszközök sikeresen észlelhessék az egyes bitek átvitelét, a busznak lassabban kell futnia. Az adatok sérülése vagy váratlan eredmények azok a nyomok, amelyekre figyelni kell. Csökkentse az I2C busz sebességét, amíg az adatok sikeresen el nem olvasódnak.

az imp API jelenleg négy előre meghatározott óraértéket biztosít: 10, 50 100 és 400 kHz., Ezek által kiválasztott halad egy állandó, hogy az I2C konfigurációs módszer paraméterként:

i2c.configure(speedConstant);

ha az érték speedConstant az egyik

  • CLOCK_SPEED_10_KHZ
  • CLOCK_SPEED_50_KHz
  • CLOCK_SPEED_100_KHZ
  • CLOCK_SPEED_400_KHZ

Beállítása Egy imp Az I2C

Az i2c objektumot, például sornyi kódot, a fenti nem biztosított közvetlenül az imp, de az ön által választott, amely szerint a választott imp van csapok, akkor használja az I2C kommunikációt., Az imp minden típusának több I2C buszja van, amelyek az induláskor rendelkezésre állnak. Nézze meg a pin mux típusát imp használ, hogy melyik I2C objektumok állnak az Ön számára. Itt feltételezzük, hogy imp001-et használ. Az imp001 két I2C busza az 1-es és a 2-es pins, illetve a 8-as és a 9-es pins, illetve az imp indításakor a hardverobjektum i2c12 és i2c89 tulajdonságaként lett besorolva. Az 1.és 8. csapokat az SCL, a 2. és a 9. csapokat az SDA-hoz rendelik.,

Ez közhely, hogy a referencia a választás egy globális változó:

i2c <- hardware.i2c12;i2c.configure(CLOCK_SPEED_100_KHZ);

a Példa Kód

A következő kód működik, a TAOS TSL2561 látható, infravörös fény érzékelő, a 3,3 V-os készülék, amely I2C kommunikálni a fogadó mikrokontroller. A chip adatlapja letölthető az Adafruit weboldaláról. Az Adafruit eladja a chipet egy alacsony költségű kitörési táblán, amely magában foglalja a megfelelő húzó ellenállásokat a tápkábelen, a VCC-n. Ez azt jelenti, hogy készen áll arra, hogy közvetlenül csatlakozzon az imp I2C csapjaihoz.,


Adafruit ‘ s TSL2561 breakout board

Megjegyzés A cikk írása után az Adafruit frissítette a TSL2561 érzékelő tábláját. Az új verzió az aktuális kóddal működik.

itt van a kód, az ügynök számára, majd az eszköz:

mi a kód

az ügynökkód válaszol egy bejövő HTTP kérésre, értesítve az eszközt, hogy olvasást igényel. Az egyszerűség kedvéért az olvasás egyszerűen megjelenik a naplóban.

az eszköz kódja beolvassa az érzékelőt, és kiszámítja a lux értéket a TSL2561 adatlapon megadott matematika szerint., A program első része konstansokat állít fel a TSL2561 kulcsregisztereihez és beállításaihoz, beleértve annak I2C címbeállításait is. Más állandókat használnak a fényesség konverziós folyamatában.
Kábelezés az imp

a program kiindulási pont, a kód álneve egyik imp az I2C pin kódot beállítani, mint egy globális változó, beállítja a busz sebesség hogy 100kHz majd eltolja a TSL2561 az I2C cím egy kicsit balra, így mindig készen áll, hogy az imp I2C funkciók. Ezután beállítja az érzékelőt., Csak annak ellenőrzése érdekében, hogy ez működött-e, elolvastuk a vezérlőregisztert: a visszatérési értéknek 3-nak kell lennie, ha a TSL2561 éppen elindult, vagy 51-nek, ha az eszköz már be van kapcsolva.

ezután a kód beállítja az érzékelő ADC felbontását a TSL2561 időzítési regiszterén keresztül, majd magasra állítja a jelerősséget.

végül elmondjuk az imp-nek, hogyan reagáljon a "sense" értesítésekre az ügynöktől. Ez egy olyan funkciót hív meg, amely beolvassa a TSL2561 két fényérzékelőjét, amelyek digitális értékeit a chip négy 8 bites ADC regiszterében tárolják., Az első kettő 16 bites kombinált optikai és infravörös leolvasást, a második pár 16 bites infravörös értéket ad. A readsensoradc0() és readSensorAdc1 () függvények az egyes regiszterértékeket 16 bites számokká alakítják át úgy, hogy a legjelentősebb bájtot megszorozzák 256-tal, és hozzáadják a legkevésbé jelentős bájt értékét. A szorzást úgy végezzük, hogy a nyolc bites szám bitjei nyolc helyet hagytak a mókus << operátor.,

a kód ezután mindkét leolvasást egy harmadik függvényre adja, hogy kiszámítsa a végső fényerőt, a ” lux ” értéket.

további olvasás

  • I2C hibák — az I2C hibakeresése olvasási és írási problémák

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük