Protocol decoder:i2c
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.
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.
Decoder
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 trace.sr -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