Protocol decoder:i2c

From sigrok
Jump to navigation Jump to search
Pd i2c example.png
Name Inter-Integrated Circuit
Description Two-wire, multi-master, serial bus
Status supported
License GPLv2+
Source code decoders/i2c
Input logic
Output i2c
Probes SCL, SDA
Optional probes
Options address_format

The i2c protocol decoder supports the Inter-Integrated Circuit (I²C) bidirectional, multi-master serial protocol.


The Inter-Integrated Circuit (I²C) bus is a bidirectional, multi-master bus using two signals (SCL = serial clock line, SDA = serial data line).

There can be many devices on the same bus. Each device can potentially be master or slave (and that can change during runtime). Both slave and master can potentially play the transmitter or receiver role (this can also change at runtime).

Possible maximum data rates:

  • Standard mode: 100 kbit/s
  • Fast mode: 400 kbit/s
  • Fast-mode Plus: 1 Mbit/s
  • High-speed mode: 3.4 Mbit/s

Basic protocol:

  • START condition: SDA = falling, SCL = high
  • Repeated START condition: same as START condition
  • Data bit sampling: SCL = rising
  • STOP condition: SDA = rising, SCL = high

All data bytes on SDA are exactly 8 bits long (transmitted MSB-first). Each byte has to be followed by a 9th ACK/NACK bit. If that bit is low, that indicates an ACK, if it's high that indicates a NACK.

After the first START condition, a master sends the device address of the slave it wants to talk to. Slave addresses are 7 bits long (MSB-first). After those 7 bits, a data direction bit is sent. If the bit is low that indicates a WRITE operation, if it's high that indicates a READ operation.

Later an optional 10bit slave addressing scheme was added.


You can show the available options with the --show command:

$ sigrok-cli -P i2c --show

EEVblog forum post showing how to use the i2c decoder, among other things (like reading the input from a CSV file, stacking decoders, binary output).

Another example of i2c decoder usage with sigrok-cli is:

$ sigrok-cli -i -P i2c:scl=D1:sda=D0:address_format=unshifted -A i2c=address-read:address-write:data-read:data-write
i2c-1: Write
i2c-1: Address write: A0
i2c-1: Data write: 01
i2c-1: Data write: 50
i2c-1: Read
i2c-1: Address read: A1
i2c-1: Data read: FF
i2c-1: Data read: 11
i2c-1: Data read: 22
i2c-1: Data read: 33
i2c-1: Data read: 44
i2c-1: Data read: 55