Uživatelské nástroje

Nástroje pro tento web


cs:i2c

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.


Předchozí verze
cs:i2c [2022/09/02 21:20] (aktuální) – [Použití I²C v systému Linux] kaklik
Řádek 1: Řádek 1:
 +====== Sběrnice I²C ve stavebnici MLAB ======
 +
 +[[http://cs.wikipedia.org/wiki/I%C2%B2C|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 [[http://cs.wikipedia.org/wiki/System_Management_Bus|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ž I2C(([[http://www.nxp.com/documents/user_manual/UM10204.pdf|Specifikace sběrnice I²C]])).
 +
 +Avšak díky[[cs:arm| 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 [[cs:usbi2c|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ů(( [[http://cladlab.com/electronics/circuit-design/communication-protocols/i2c-protocol#gallery|I2C Transmission Distances And Buffer’s]] )). (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 [[cs: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 [[cs: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 [[cs:pymlab|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 [[https://pypi.python.org/pypi/pymlab/0.2|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í. (([[http://www.paintyourdragon.com/?p=43|Kromě vyvedení DDC z volného portu pro display.]]))
 +
 +==== USB rozhraní ====
 +
 +Proprietární konstrukce jako: 
 +
 +  * [[http://www.robot-electronics.co.uk/acatalog/USB_I2C.html|USB-I2C  USB to I2C Communications Module]]
 +  * [[http://www.harbaum.org/till/i2c_tiny_usb/index.shtml|i2c-tiny-usb]]
 +  * [[http://www.headfuzz.co.uk/?q=usbtoi2c|OpenServo interface]]
 +
 +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 [[cs:i2c_avr_usb|I2C AVR USB]], což je ekvivalent konstrukce i2c-tiny-usb ale postavené modulů MLAB. Alternativou je také nedokončená konstrukce [[cs:i2c-pic-usb|Konvertor I²C na USB s PIC]].
 +
 +==== Linux kernel device ====
 +
 +V současné době existují dva obvody, které mají podporu v linuxovém kernelu: 
 +
 +  * [[cs:usbi2c|CP2112]] - Implementován v MLABU. 
 +  * [[https://www.microchip.com/wwwproducts/en/MCP2221|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 [[http://en.wikipedia.org/wiki/USB_human_interface_device_class|USB HID]]. V MLABu tuto specifikaci splňuje modul [[cs:usbi2c|USBI2C01A]], který lze ovládat například přes Python a HIDAPI. viz níže. 
 +
 +
 +
 +==== UART/RS232 na I2C ====
 +
 +NXP vyrábí [[http://www.nxp.com/products/interface_and_connectivity/bridges/uart_to_i2c_master_gpio_bridges/SC18IM700IPW.html|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ů [[cs:eth|ETH01A]] a [[cs:stm32f10xrxt|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 [[https://github.com/MLAB-project/i2c-tools| 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 [[https://github.com/MLAB-project/i2c-tools | 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// (([[https://i2c.wiki.kernel.org/index.php/Main_Page| Linux I²C Subsystem]])), přidáme jej proto do systému:
 +  sudo modprobe i2c-dev
 +
 +<WRAP tip>  
 +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  
 +</WRAP>
 +
 +
 +Pomocí programu  //i2cdetect// pak můžeme prohledat sběrnici I²C například na počítači [[cs:odroid-x2|Odroid-X2]], který má I²C vyvedené na GPIO konektor.
 +
 +  kaklik@radio-arm-0:~$ sudo i2cdetect -y 1
 +        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 ([[cs:mag|MAG01A]]) a 0x70 ([[cs:i2chub|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í [[cs: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 ((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.)) 
 +
 +=== Č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ů: 
 +
 +  * [[cs:usbi2c]]
 +  * [[cs:i2chub]]
 +  * [[cs:i2cspi]]
 +
 +Protože I²C není v principu [[http://cs.wikipedia.org/wiki/Plug-and-play|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 [[http://en.wikipedia.org/wiki/Dmesg|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 =====
 +
 +  * [[cs:usbi2c]]
 +  * [[cs:i2c-pic-usb|I2C-PIC-USB]] - Konvertor I²C na USB s PIC
 +  * [[cs:i2c_avr_usb|I2C-AVR-USB]] - Konvertor I²C na USB s AVR
 +  * [[cs:arm|Procesory architektury ARM ve stavebnici MLAB]]
 +  * [[cs:odroid-x2]]
 +  * [[cs:friendlyarm]]
 +  * [[cs:i2chub]]
 +  * [[cs:pymlab]]
 +  * [[cs:i2cspi]]