Uživatelské nástroje

Nástroje pro tento web

Překlady této stránky?:

cs:i2c

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:

  • CP2112 - Implementován v MLABU.
  • MCP2221 - Podpora zřejmě až v novém kernelu 5.x.

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

5)
je potřeba si dat pozor aby na nekterych kanalech nebyla zařízení se stejnou adresou, v takovém případě dojde ke kolizi a k zablokování sběrnice. Následně je pak potřeba provést reset odpojením napájení nebo RESET pinem na I2CHUB modulu.
cs/i2c.txt · Poslední úprava: 2022/09/02 21:20 autor: kaklik