Obsah
Sběrnice I²C ve stavebnici MLAB
Sběrnice I²C, nebo také TWI je velmi rozšířená elektronická sběrnice určená pro nízko rychlostní komunikaci mezi různými periferiemi. V případě stavebnice MLAB je to nejčastěji komunikace mezi mikroprocesorem a čidly. Existuje od ní také varianta SMBus, která je její podmnožinou. Avšak obsahuje i definici timeoutů a Packet Error Checking, proto je v jistém smyslu robustnější, než I2C1).
Avšak díky novým možnostem ve výpočetní technice lze sběrnici použít i pro komunikaci s čidly přímo z Linuxového systému. Navíc v případě použití některého adaptéru na I2C lze tuto sběrnici připojit i ke klasickému PC
Spojování I²C zařízení
I2C je sbernice původně určená k propojování zařízení na malé vzdálenosti. (Původně na rozměru plošných spojů). Avšak s použitím vhodných technik je možné její rozsah zvětšit na řádově desítky metrů2). (Použití na delší vzdálenosti nemusí být bezpečné, protože delší vodiče se může snadno indukovat elektrostaticky a elektromagnaticky vysoké napětí, které poškodí připojená zařízení) Přesná vzdálenost na kterou lze I2C používat je proto dána především prostředím ve kterém sběrnici používáme a také požadovanou spolehlivostí výsledného systému.
V MLABu je spojování I2C zařízení řešeno na několika úrovních podle zvoleného rozsahu sítě. Lokálně (v rozsahu několika metrů) jsou moduly spojovány přímo MLAB kablíky. A oddělovány modulem i2chub, tímto modulem je také řešen převod mezi logickými úrovněmi 3,3V a +5V.
Na rozsáhlejší vzdálenosti je sběrnice vedena stíněnými signálními kabely na koncích opatřenými dutinkami zapojenými do modulu uniserial. Tento modul obsahuje i velmi základní ochranu proti přepětí. Hlavně je ale přestupním mechanickým můstkem mezi „externí těžkou kabeláží“ a interním jemným zapojením přístrojů.
Pro rozsáhlé sítě je I²C nahrazeno jinou fyzickou vrstvou (CAN, Ethernet), která propojuje jednotlivé I2C síťové segmenty.
Programový balík Pymlab
Jde o softwarový balík, který umožňuje vytvářet síť z I²C zařízení a modulů, které slouží jako routovací body. Princip funkce spočívá v definování struktury sítě a adres jednotlivých nódů ve zdrojovém souboru ovládacího programu, pak lze ke všem bodům v síti přistupovat pomocí jednoduchých příkazů jazyka Python.
Instalaci samotného softwarového balíku pymlab pak provedeme snadno pomocí:
sudo pip install pymlab
V případě, že již nějakou starší verzi pymlab máme nainstalovanou, tak stačí spustit:
sudo pip install --upgrade pymlab
Oba příkazy jsou rovnocenné a využívají python balíčkovací systém ve kterém je pymlab zařazen.
Tím by se měly stáhnout i balíky se kterými pymlab pracuje, jako je například cython-hidapi v pythonu označovaný pouze jako modul hid. Nenainstaluje se alelibusb. To stále musíme provést ručně pomocí:
sudo apt-get install libudev-dev libusb-1.0-0-dev libhidapi-dev python-setuptools python-smbus cython
Konvertory pro připojení I²C k PC
I²C je velmi rozšířená sběrnice vhodná pro připojování nejrůznějších čidel na krátké vzdálenosti. Avšak není obvyklé, aby byla vyvedena na běžných počítačích a dostupná tak k přímému použití. 3)
USB rozhraní
Proprietární konstrukce jako:
Mají společný problém s kvalitou driverů. Navíc i2c-tiny-usb nesplňuje úplně I²C specifikaci a už vůbec ne USB physical layer specifikaci a jeho nejvyšší komunikační rychlost je 50 Kbps. Nicméně v MLABu jsou tyto konstrukce nahrazeny zařízením I2C AVR USB, což je ekvivalent konstrukce i2c-tiny-usb ale postavené modulů MLAB. Alternativou je také nedokončená konstrukce Konvertor I²C na USB s PIC.
Linux kernel device
V současné době existují dva obvody, které mají podporu v linuxovém kernelu:
USB HID
Pro připojení bez nutnosti použití driverů určených pro specifický hadrware je možné použít specifikaci USB HID. V MLABu tuto specifikaci splňuje modul USBI2C01A, který lze ovládat například přes Python a HIDAPI. viz níže.
UART/RS232 na I2C
NXP vyrábí konvertor UART na I²C SC18IM700IPW. Tento obvod by mohl být základem pro konstrukci dalšího konverzního modulu.
Ethernet na I2C
Pomocí modulů ETH01A a STM32F10xRxT01A, lze zkonstruovat konvertor Ethernet - I²C. A ten následně ovládat softwarovým balíkem Pymlab. Viz Python níže.
Použití I²C v systému Linux
Pro Ubuntu existuje balík nástrojů pro práci se sběrnicí I²C. Nainstalujeme jej přes:
sudo apt-get install i2c-tools
V případě, že ve zvolené aplikaci potřebujeme i instrukce write_i2c_block a read_i2c_block, tak je potřeba nainstalovat upravenou verzi i2c-tools.
Nyní již můžeme vypsat dostupné I²C sběrnice v systému:
$ sudo i2cdetect -l i2c-0 i2c i915 gmbus ssc I2C adapter i2c-1 i2c i915 gmbus vga I2C adapter i2c-2 i2c i915 gmbus panel I2C adapter i2c-3 i2c i915 gmbus dpc I2C adapter i2c-4 i2c i915 gmbus dpb I2C adapter i2c-5 i2c i915 gmbus dpd I2C adapter i2c-6 i2c i2c-tiny-usb at bus 001 device 030 I2C adapter
Může se všák stát, ze jádro nemá instalovaný modul i2c-dev 4), přidáme jej proto do systému:
sudo modprobe i2c-dev
Příkaz modprobe přidá modul pouze do běžící instance jádra. Po rebootu nám tento modul pravděpodobně bude chybět. Pokud nechceme modprobe používat i po následujícím startu počítače, tak do souboru /etc/modules přidáme řádek:
i2c-dev
Pomocí programu i2cdetect pak můžeme prohledat sběrnici I²C například na počítači Odroid-X2, který má I²C vyvedené na GPIO konektor.
kaklik@radio-arm-0:~$ sudo i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: UU -- -- -- -- -- -- -- -- -- -- -- -- -- 1e -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: 70 -- -- -- -- -- -- -- kaklik@radio-arm-0:~$
Vidíme, že kromě systémového zařízení s adresou 0x10 máme na sběrnici připojená ještě dvě zařízení 0x1e (MAG01A) a 0x70 (I2CHUB02A).
Komunikace s I²C zařízeními
Pro ovládání sběrnice mohou být využity buď systémová rozhraní v jádře operačního systému.
A nebo servisní utility z balíku i2c-tools, přes které lze sběrnici přímo ovládat:
$ apropos i2c i2cdetect (8) - detect I2C chips i2cdump (8) - examine I2C registers i2cget (8) - read from I2C/SMBus chip registers i2cset (8) - set I2C registers
Zápis
Zápis provedeme příkazem i2cset. Ukážeme zde příklad nastavení i2chub, protože jde o trochu specifický IO s jedním registrem, který se neadresuje. Data se proto zapisují přímo:
~$ sudo i2cset -y -r 1 0x70 0xff Value 0xff written, readback matched
Tímto provedeme aktivaci všech I2C kanálů na I2CHubu 5)
Čtení
Čtení z I2Chub se provádí opět atypicky, neboť se neadresuje datový registr:
:~$ sudo i2cget -y 1 0x70 0xff
Použití modulů jádra
Některá I²C zařízení mají přímo ovladače v linuxovém jádře. Je tak možné k těmto zařízením přistupovat přímo prostřednictvím souborového systému. V případě MLABu se to týká těchto modulů:
Protože I²C není v principu plug-and-play sběrnice, tak je třeba o každém připojeném zařízení kernelu explicitně říct. Obecný postup takového přihlášení připojeného hardwaru probíhá přes příkaz:
echo název_driveru i2c_adresa > /sys/bus/i2c/devices/i2c-X/new_device
Tím dojde k převzetí kontroly nad I²C zařízením jádrem Linuxu. Ve výpisu i2cdetect můžeme takový stav vidět označený jako UU. Podrobnosti o provedení a úspěšnosti inicializace můžeme pak obvykle najít v dmesg.
Ostatní operační systémy
V jiných operačních systémech, jako Windows či MAC OS, kde nemůžeme nebo nechceme využít podporu I²C rozhraní v jádře, můžeme použít pro ovládaní I2C prostředí jazyka Python, který je multiplatformní a běží na všech známých OS.
Související stránky
- I2C-PIC-USB - Konvertor I²C na USB s PIC
- I2C-AVR-USB - Konvertor I²C na USB s AVR