User Tools

Site Tools


en:i2c

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
Next revisionBoth sides next revision
en:i2c [2013/11/27 12:35] – created kakliken:i2c [2014/12/21 00:37] kaklik
Line 1: Line 1:
-====== I2C in MLAB system ======+FIXME **This page is not fully translated, yet. Please help completing the translation.**\\ //(remove this paragraph once the translation is finished)//
  
-===== Activating The I2C Port =====+====== I²C bus as an MLAB's component ======
  
 +[[http://en.wikipedia.org/wiki/I²C|I²C bus]], also called TWI is a popular electronic bus designed for low-speed communication between different peripherals. As an MLAB's component it is mostly used to ensure communication between microprocessor and sensors. I²C derivative [[http://en.wikipedia.org/wiki/System_Management_Bus|SMBus]] differs from it in that it contains timeouts' definitions and Packet Error Checking and therefor is, in sense, more robust than the original I²C. 
 +   
 +Thanks to an advancement in computer technologies [[en:arm|new possibilities]] arise allowing the use of the bus for direct communication between sensors and Linux systems. Furthermore, with the help of [[en:usbi2c|I²C adapter]] the bus can be connected to PC as well.  
  
-The I2C port needs to be enabled in kernel before you can use it. This can be achieved by +===== Linking of I²C devices =====
  
-  sudo modprobe i2c-dev  +Although the I²C bus was originally designed to link devices on small scales (within the dimensions of PCB), using certain techniques it is possible to enlarge its range to tens of meters (( [[http://cladlab.com/electronics/circuit-design/communication-protocols/i2c-protocol#gallery|I2C Transmission Distances And Buffer’s]] )). However, it must be noted that such approach may not be safe because over long wires a high voltage can be electrostaticilly and electormagnetically induced and can cause damage to connected devices. The exact distance over which it is safe to use the I²C bus depends on the surrounding environment and the required reliability of the system.    
-   +
-Then I²C bus interfaces can be listed by+
  
-  sudo i2cdetect -l+Linking of I²C devices within MLAB is implemented on several levels according to extent of a network. Locally (on scale of several meters), the modules are connected by MLAB cables and separated by [[en:i2chub]]. This module also solves the conversion between logic 3.3V and +5V.
  
-===== Checking For Connected Devices =====+Over more extensive distances the bus is linked through shielded signal cables ending in female connectors and connected to [[cs:uniserial]] module. This module also contains a basic surge protection and most importantly acts as a mechanical bridge between 'heavy external wiring' and fine internal linking of devices. 
  
-At the command prompt type one of these depending on whether you are using the I2C-X port:+In the case of extensive networks I²C is replaced by other physical layer (CAN, Ethernet) that interconnects individual I²C network segments.
  
-sudo i2cdetect -y X 
  
-The 7 bit I2C address of all found devices will be shown (ignoring the R/W bit, so I2C address 0000 0110 is displayed as hex 03). 
  
 +==== Pymlab package ====
 +
 +Pymlab represents a software package that enables a creation of network made of I²C devices and modules, which serve as routing points. It defines the structure of a network and addresses of individual nodes in a source file of a control program. Individual points in the network can than be accessed using simple python commands. 
    
-===== SMBus (System Management Bus) Functions ===== +The installation of the [[en:pymlab|pymlab]] packed can easily be done using following command: 
- +
-SMBus (System Management Bus) is a subset from the I2C protocol +
-When writing a driver for an I2C device try to use the SMBus commands only (if it possible). It makes  possible to use the device driver on both SMBus adapters and I2C adapters. +
- +
-Note address is the 7 bit address excluding the read / write bit (it will be shifted left 1 bit whne added to the read/write bit) +
- +
-long write_quick(int addr) +
- +
-Send only the read / write bit +
- +
- +
-long read_byte(int addr) +
- +
-Read a single byte from a device, without specifying a device register. +
- +
- +
-long write_byte(int addr,char val) +
- +
-Send a single byte to a device +
- +
- +
-long read_byte_data(int addr,char cmd) +
- +
-Read Byte Data transaction. +
- +
- +
-long write_byte_data(int addr,char cmd,char val) +
- +
-Write Byte Data transaction. +
- +
- +
-long read_word_data(int addr,char cmd) +
- +
-Read Word Data transaction. +
- +
- +
-long write_word_data(int addr,char cmd,int val) +
- +
-Write Word Data transaction. +
- +
- +
-long process_call(int addr,char cmd,int val) +
- +
-Process Call transaction. +
- +
- +
-long[] read_block_data(int addr,char cmd) +
- +
-Read Block Data transaction.     +
  
 +  sudo pip install pymlab
  
-write_block_data(int addr,char cmd,long vals[])+In case of having some older version of pymlab already installedit is enough to run:
  
-Write up to 32 bytes to a device.  This fucntion adds an initial byte indicating the length of the vals array before the valls array.  Use write_i2c_block_data instead!+  sudo pip install --upgrade pymlab
  
 +Both commands are equivalent and use the python package manager that contains [[https://pypi.python.org/pypi/pymlab/0.2|the pymlab]].
 +This procedure should also download other packages used by pymlab such as cython-hidapi (reffered only as hid module in python). However it does not install alelibusb, which must still be done manually using:
  
-long[] block_process_call(int addr,char cmd,long vals[])+  sudo apt-get install libudev-dev libusb-1.0-0-dev libhidapi-dev python-setuptools python-smbus cython 
  
-Block Process Call transaction.      
-I2C Access Functions 
  
 +===== Convertors to connect I²C to PC =====
  
-long[] read_i2c_block_data(int addr,char cmd)+Although I²C is quite popular bus suitable to connect different sensors over short distances, it is not usually found and readily available on regular computers with exception of [[http://www.paintyourdragon.com/?p=43|DCC leading out of free display port.]]
  
-Block Read transaction.+==== USB interface ====
  
 +Proprietary designs:
  
-write_i2c_block_data(int addr,char cmd,long vals[])+  * [[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]]
  
-Block Write transaction+These share a common problem with a quality of drivers. Furthermore, i2c-tiny-usb does not fully meet the I²C specification, completely fails to comply with USB physical layer specification and only has maximal communication speed of 50Kbps. MLAB replaces these constructions with [[en:i2c_avr_usb|I2C AVR USB]] device that is equivalent to i2c-tiny-usb design, but made of MLAB modules.  [[en:i2c-pic-usb| I²C to USB with PIC connector]] represent another, yet unfinished, alternative.
  
 +==== USB HID ====
  
-===== References =====+To connect without having to use drivers designed for specific hardware [[http://en.wikipedia.org/wiki/USB_human_interface_device_class|USB HID]] specification can be used. MLAB has only one module that complies with this particular specification - [[en:usbi2c|USBI2C01A]]. It can be operated using python or HIDAPI - see below.
  
-  * [[http://www.raspberry-projects.com/pi/programming-in-python/i2c-programming-in-python/using-the-i2c-interface-2|Using the I2C Interface]] 
-  * [[http://wiki.erazor-zone.de/wiki%3alinux%3apython%3asmbus%3adoc|python-smbus documentation]] 
en/i2c.txt · Last modified: 2014/12/21 10:42 (external edit)