sběrnice mezi integrovanými obvody (I2C) je sériový komunikační mechanismus na úrovni čipů, který pracuje pouze na dvou vodičích. Někteří vývojáři vyslovují název autobusu eye-two-see, jiní eye-squared-see, ale oba odkazují na stejnou věc. Vymyslel Philips v brzy 1980, I2C byla založena na standardizaci komunikace mezi společností čipy, ale to se od té doby stal de facto standard podporovaný mnoha mikrokontrolér zařízení z Arduino desky k Raspberry Pi, a, samozřejmě, imps.,

fyzická sběrnice

I2C sama o sobě obsahuje dva vodiče. Jedna linka I2C přenáší data, druhá hodinové signály, které synchronizují konverzaci mezi zařízeními. Datový řádek se nazývá „SDA“, hodinová čára „SCL“.

typicky jsou oba SDA a SCL připojeny k napájecímu vedení 3.3 nebo 5V prostřednictvím jediného „pull-up“ rezistoru, jeden na každém řádku. To je nezbytné, protože zařízení SDA a SCL připojení jsou otevřené kanalizace lines: mohou síla napětí na lince na 0V, nebo „nízké“, ale nemůže zvednout to na 3.3 V, nebo „vysoká“., Vysoké a nízké jsou elektrické reprezentace 1s a 0s, které jsou základními složkami digitálních informací. Přidání těchto dvou rezistorů — a autobus potřebuje pouze dva, bez ohledu na to, kolik zařízení jsou připojena k němu — zajišťuje napětí stoupá zpět na 3,3 V, bez zkratu.

I2C trvá na tom zařízení mají otevřít vypouštěcí linky, aby zajistily žádné složkou-poškozuje vysoké proudy jsou schopny tok až dvě zařízení vyzkoušet a signál současně.

ve většině případů se očekává, že tyto rezistory přidáte sami, ale některá zařízení, obvykle ta, která pracují na 3.,3V, patří nimi, aby byly kompatibilní s zařízení se dodává 5V. Pamatujte si, že budete potřebovat pouze pár pull-up rezistory na autobus, takže to může být nutné odstranit pull-up rezistory připojené k ostatním zařízením na sběrnici. Když imp má vnitřní pull-up rezistory jeho vlastní, ty jsou příliš slabé na to, být užitečné pro I2C a tak jsou automaticky zakázána, když jeho piny jsou nastaveny na rukojeť I2C signály.

řadiče a periferie

sběrnice I2C odděluje zařízení od „řadičů“ a „periferií“., Pouze jedno zařízení může vyslat časovací impulsy na linii SCL najednou, a to je ten, který byl vybrán jako řadič. Všichni ostatní synchronizují své časování s ovladačem a jsou tedy považováni za periferie. Řadič-typicky imp-a jeho periferie mohou přenášet a přijímat data, ale pouze řadič může říct periferii, kdy přenášet data zpět.

adresování

aby jedno I2C zařízení komunikovalo s druhým na jednom základě, musí být obě zařízení jednoznačně identifikovatelná. Tato identita je I2C adresa zařízení., I2C adresy jsou obvykle 7-bitová čísla,takže sběrnice může obsahovat až 127 zařízení ve všech. Byte se skládá z osmi bitů; další bit se používá k označení, zda signál je odeslána do řadiče periferních — „zápis“ — nebo v opačném směru — „číst“. Tento osmý bit je ve skutečnosti bit nula v adresním bajtu vyslaném na sběrnici. 7bitová adresa je umístěna v bitech jeden až sedm adresního bajtu.

v souladu s tímto formátem má IMP API adresy I2C jako 8bitovou hodnotu., Dodavatelé zařízení obvykle dávají adresy svých produktů jako 7bitové číslo,takže je nutné převést adresu ze sedmi bitů na osm. To je dosaženo pomocí operátora Squirrel ‚ s <<, který posouvá jednotlivé bitové hodnoty čísla doleva. Tento proces je ekvivalentem násobení dvěma. V kódu, tento proces vypadá takto:

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

Veverka automaticky nastaví bit nuly na správnou I2C-definovaná hodnota: 0 pro operace zápisu, 1 pro čtení., Nyní jste připraveni použít jednu z imp je i2c metod zápisu dat na sběrnici:

i2c.write(eightBitAddress, dataInStringForm);

7-bitová adresa zařízení, na které chcete, aby vaše imp komunikovat s bude dodáván výrobcem komponentů pro výrobce a jsou uvedeny na zařízení datového listu. Nemusí být pevná, ale vybrána z řady adres podle napětí aplikovaného na jiný z kolíků zařízení., Například, TAOS TSL2561 světelný senzor má tři možné adresy: 0x29 0x49 nebo 0x39, v závislosti na tom, zda jeho ADDR pin je stanovena na 0V, 3.3 V nebo „plovoucí“ mezi oběma. Říkáme, že hodnota je plovoucí, protože nebyla aktivně vybrána pro provoz na určitém napětí; mohlo by to být něco od 0 do 3,3 V včetně.

signalizace

řadič sběrnice I2C používá 7bitovou adresu periferie k identifikaci komponenty, se kterou chce mluvit., Ve skutečnosti je signalizace složitější, ale naštěstí všechny podrobnosti zpracovává imp, takže adresu musíte zadat pouze jako 8bitovou hodnotu.

Pokud píšete do periferních, budete také muset poskytnout údaje psát, což často zahrnuje hodnoty registrů, které pokyn periferní, co dělat s daty. Dokumentace IMP API označuje tyto registry jako „sub-adresy“:

i2c.write(eightBitAddress, dataString);

write() vyžaduje data ve tvaru řetězce. V důsledku toho budete možná muset převést hodnotu uloženou v jiných typech proměnných do řetězce.,

Čtení informací ze zařízení může vyžadovat příkaz říct zařízení, které data načíst. Říká imp pro čtení dat z I2C sběrnice také zahrnuje poskytování třetí parametr je počet bajtů, které očekáváte příjem:

i2c.read(eightBitAddress, controlDataString, numberOfBytesToRead);

Za tyto operace jsou na I2C je na elektrické signály, aplikované na SDA linky synchronizované s načasování pulsů uplatňována k SCL-line. Zápis do sběrnice zahrnuje počáteční značku: pokles SDA na 0V, zatímco SCL je 3.3 V.změna napětí SDA, když je napětí SCL vysoké, definuje značky startu a zastavení., Pokud se napětí SDA nezmění, když je SCL vysoké, zařízení I2C vědí, že data jsou odesílána spíše než značky.

SDA nyní jde vysoko nebo nízko vyslat každý bit adresy byte: 7-Bit adresa zařízení následuje čtení/zápis bit. Bity byte jsou rozesílány vlevo-většina bitů — „nejvýznamnější bit“ – nejprve, SDA bude vysoká, pokud je hodnota bitů 1 nebo nízká, pokud je nulová. Cílové periferní bude teď tahat SDA nízká, aby se signál potvrzení o přijetí dat, a pak se jde osm bitů řídící informace nebo data, následuje další údaje, pokud je to nutné., Na SDA je jedna pulzní “ ACK “ potvrzovací pauza mezi každých osm odeslaných bitů, načasováno na devátý SCL puls. Pokud periferní zařízení tímto způsobem neuzná příjem, regulátor zjistí, že SDA zůstala vysoká a signalizuje chybu.,

Když se toky dat z periferního do regulátoru, druhý rovněž uznává přijetí osm bitů tahem SDA nízká devátého impulsu SCL, pokud to je poslední bajt dávky, v takovém případě správce nepodává SDA nízká — to dělá ‚nak‘ signál, nebo ne potvrzení‘ — aby bylo možné nechat periferní vím, že to má hotové.

Když jsme hotovi, SDA jde vysoko jako stop marker.,


začátek přenosu je indikován SDA klesá z Vysokého na Nízké napětí (obdélník vlevo),
zastavte se na zadní (vpravo obdélník). SCL musí být vysoká, pokud k tomu dojde

načasování

standardní rychlost hodin pro komunikaci I2C je 100kHz-100 000 SCL impulsů za sekundu. Je možné jet rychleji, až 400kHz. Některá zařízení nemusí být schopna tuto rychlost podporovat; zkontrolujte datový list, který doprovází zařízení, které chcete připojit k imp., Mnoho pomalých zařízení však používá techniku zvanou „protahování hodin“, aby přinutilo rychlejší zařízení pracovat na jejich rychlosti. Imp podporuje zařízení, která využívají tuto techniku. V podstatě drží SCL nízko, zatímco načítají data, která chcete poslat imp. Imp to detekuje, uvolní SCL linku a čeká, až SCL znovu stoupne, než bude pokračovat.

Nicméně, možná budete muset snížit rychlost I2C sami, pokud elektrické vlastnosti set-up zpomalit rychlost přechodu mezi 0V a 3,3 V, nazývá je „náběhový čas“., To je často způsobeno dlouhými dráty, které zvyšují kapacitu obvodu. Aby zařízení mohla úspěšně detekovat přenos každého bitu, musí sběrnice běžet pomaleji. Poškození dat nebo neočekávané výsledky jsou vodítka, na která byste měli dávat pozor. Snižte rychlost sběrnice I2C, dokud nebudou data úspěšně přečtena.

IMP API v současné době poskytuje čtyři předdefinované hodnoty hodin: 10, 50 100 a 400kHz., Oni jsou vybíráni na základě absolvování konstanta I2C konfigurace metodě jako parametr:

i2c.configure(speedConstant);

je-li hodnota speedConstant je jedním z

  • CLOCK_SPEED_10_KHZ
  • CLOCK_SPEED_50_KHz
  • CLOCK_SPEED_100_KHZ
  • CLOCK_SPEED_400_KHZ

Nastavení integrované námořní politiky Pro I2C

I2c objekt v příkladu řádků kódu uvedeného výše není stanovena přímo imp, ale zvolil si podle kterého zvolené imp kolíky, které budete používat pro I2C komunikaci., Každý typ imp má více autobusů I2C, všechny jsou k dispozici při startu. Podívejte se na pin mux pro typ imp, který používáte, abyste zjistili, které objekty I2C jsou vám k dispozici. Předpokládáme, že používáte imp001. Imp001 je dva I2C autobusy jsou na kolíky 1 a 2, a kolíky 8 a 9, respektive instanced jako vlastnosti i2c12 a i2c89 hardwarového objektu při spuštění imp. Kolíky 1 a 8 jsou přiřazeny SCL, 2 a 9 SDA.,

je běžné, aby referenční vašeho výběru s globální proměnnou:

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

Příklad Kódu

následující kód funguje s TAOS TSL2561 viditelné a infračervené světelné čidlo, 3.3 V zařízení, které používá I2C pro komunikaci s hostitelským mikrokontrolérem. Datový list čipu si můžete stáhnout z webových stránek Adafruit. Adafruit prodává čip na nízkonákladové breakout desce, která obsahuje vhodné pull-up rezistory na power pin, VCC. To znamená, že je připraven k připojení přímo k IMP I2C kolíky.,


Adafruit je TSL2561 breakout board

Poznámka: tento článek byl napsán, Adafruit aktualizováno jeho TSL2561 senzor rady. Nová verze pracuje s aktuálním kódem.

zde je Kód pro agenta a poté zařízení:

Co kód dělá

kód agenta reaguje na příchozí požadavek HTTP oznámením zařízení, že vyžaduje čtení. Pro jednoduchost je čtení jednoduše zobrazeno v protokolu.

kód zařízení přečte snímač a vypočítá hodnotu lux podle matematiky stanovené v datovém listu TSL2561., První část programu nastavuje konstanty pro klíčové registry a nastavení TSL2561, včetně možností adresy I2C. Další konstanty se používají v procesu přeměny svítivosti.


Kabelový imp

Při spuštění programu bod, kód aliasy jeden z imp je I2C pin nastavit jako globální proměnná, nastavuje rychlost sběrnice až 100 khz a pak se posune TSL2561 je I2C adresu jeden bit doleva, takže je připraven k použití s imp I2C funkcí. To pak nastaví snímač., Jen zkontrolovat to funguje, čteme kontroly registr: návratová hodnota by měla být 3, pokud TSL2561 právě začala, nebo 51-li přístroj již zapnutý.

kód dále Nastavuje rozlišení ADC snímače prostřednictvím registru časování TSL2561 a poté nastaví zisk signálu na vysokou hodnotu.

nakonec sdělíme imp, jak reagovat na oznámení "sense" od agenta. To volá funkci, která čte dva světelné senzory TSL2561, digitální hodnoty, pro které jsou uloženy ve čtyřech 8bitových registrech ADC čipu., První dva dávají 16bitové kombinované optické a infračervené čtení, druhý pár 16bitovou IR-pouze hodnotu. Funkce readSensorAdc0() a readSensorAdc1() převést jednotlivé hodnoty registrů do 16-bit čísla vynásobením nejvíce významný byte 256 a přidávání hodnoty nejméně významný byte. Množení se provádí pomocí posunutí osm-bit číslo bitů doleva osm míst s Veverka je << operátor.,

kód pak poskytuje obě tyto hodnoty třetí funkci pro výpočet konečné svítivosti, hodnoty „lux“.

další čtení

  • I2C chyby-jak ladit I2C číst a psát problémy

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *