Enabling The I2C Port
The I2C port needs to be enabled in Rasbian before it can be used. See here.
Checking For Connected Devices
At the command prompt type one of these depending on whether you are using the I2C0 or I2C1 port:
sudo i2cdetect -y 0
//or
sudo i2cdetect -y 1
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).
SMBus (System Management Bus) Functions
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 if possible (if the device uses only that subset of the I2C protocol) as it makes it 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 when 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.
write_block_data(int addr,char cmd,long vals[])
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!
long[] block_process_call(int addr,char cmd,long vals[])
Block Process Call transaction.
I2C Access Functions
long[] read_i2c_block_data(int addr,char cmd)
Block Read transaction.
write_i2c_block_data(int addr,char cmd,long vals[])
Block Write transaction.
Code Example
#!/usr/bin/python
import smbus
bus = smbus.SMBus(1) # 0 = /dev/i2c-0 (port I2C0), 1 = /dev/i2c-1 (port I2C1)
DEVICE_ADDRESS = 0x15 #7 bit address (will be left shifted to add the read write bit)
DEVICE_REG_MODE1 = 0x00
DEVICE_REG_LEDOUT0 = 0x1d
#Write a single register
bus.write_byte_data(DEVICE_ADDRESS, DEVICE_REG_MODE1, 0x80)
#Write an array of registers
ledout_values = [0xff, 0xff, 0xff, 0xff, 0xff, 0xff]
bus.write_i2c_block_data(DEVICE_ADDRESS, DEVICE_REG_LEDOUT0, ledout_values)
#Write multiple bytes without creating an array
bus.write_block_data(DEVICE_ADDRESS, 0x01, [0x11, 0x23, 0x34, 0x14])
4 years ago
long[] read_i2c_block_data(int addr,char cmd)
should be:
long[] read_i2c_block_data(int addr, int length)
4 years ago
Is it posible to set Raspberry pi 3 B as I2C slave? I find some information how to set it but i do’t understend how it works ((
7 years ago
As it stands, smbus is only compatible with up to python 2.7
8 years ago
So the methods you’re using are predefined within the smbus class we imported?
also, what are the DEVICE_REG_MODE1 and DEVICE_REG_LEDOUT0 used for?
I’m trying to use the Pi as a Master to communicate with a 18F4550 MicroChip being the slave to display data via an LCD connected to the MicroChip, so could you kindly explain based on that? Thank you!
9 years ago
Is there a way to read a block of data, lets say 8 byte, without specifying a register or command?
9 years ago
sam did you find a way ?
9 years ago
I think the problem lies with the path to the library within the IDE you are using. With python, if something works on the command line, and fails in an IDE, generally it’s an IDE related issue. I personally gave up on IDEs after suffering for years. I use an editor and then run python at the command line.
10 years ago
Is there a way to read 4 bytes from a device, without specifying a device register?
Thanks!
10 years ago
I’m using write_i2c_block_data and I’m getting an error:
NameError: name ‘ledout_values’ is not defined
Has anyone actually tried the example code as written with success?
10 years ago
Hi, an other newbee here, I have the i2c installed as above but it only works from the command line. When I try the python it say’s ‘ImportError: No module named smbus’.
Is this a permission problem? How do I fix it?
10 years ago
apt-get install i2c-tools python-smbus.
10 years ago
Thanks Parag, the system replied that i2c-tools is already the newest version. i2c-tools set to manually installed. python-smbus is already the newest version. 0 updated, 0 newly installed, 0 to remove and 179 not updated.
Found an other site which says that i2c smbus does not work on python3 so, I tried it on python 2.7 and it worked!
10 years ago
sure!
let me check the link?
I have problem import smbus on python 2.7..
and i try
sudo i2cdetect -y 1
just new line nothing info
any suggestions?
10 years ago
i get 2 lines with uu on them when i run i2cdetect im new to this and learning as i go (very slowly) could any ont tell me what they represent
4 years ago
It means that address is currently being used, which in the docs for i2cdetect means it’s “highly likely” that a chip exists at that address. you can run >man i2cdetect to read about it
10 years ago
Did you install the library?
Try:
sudo apt-get install python-smbus
4 years ago
Very good but idle 3 cant’t find smbus when importing but idle 2.6 can. Upgrade as of 18 May 2014. Any ideas?
4 years ago
Is there any way to get a notification or to poll / select for when data is available?