2020-01-29 18:19:51 +03:00
================
The I2C Protocol
================
2019-07-26 15:51:16 +03:00
2020-01-29 18:19:29 +03:00
This document describes the I2C protocol. Or will, when it is finished :-)
2005-04-17 02:20:36 +04:00
Key to symbols
==============
2019-07-26 15:51:16 +03:00
=============== =============================================================
2020-01-29 18:19:34 +03:00
S Start condition
P Stop condition
Rd/Wr (1 bit) Read/Write bit. Rd equals 1, Wr equals 0.
2020-01-29 18:19:35 +03:00
A, NA (1 bit) Acknowledge (ACK) and Not Acknowledge (NACK) bit
2020-01-29 18:19:34 +03:00
Addr (7 bits) I2C 7 bit address. Note that this can be expanded as usual to
2005-04-17 02:20:36 +04:00
get a 10 bit I2C address.
2020-01-29 18:19:34 +03:00
Comm (8 bits) Command byte, a data byte which often selects a register on
2005-04-17 02:20:36 +04:00
the device.
2020-01-29 18:19:34 +03:00
Data (8 bits) A plain data byte. Sometimes, I write DataLow, DataHigh
2005-04-17 02:20:36 +04:00
for 16 bit data.
2020-01-29 18:19:34 +03:00
Count (8 bits) A data byte containing the length of a block operation.
2005-04-17 02:20:36 +04:00
2020-01-29 18:19:34 +03:00
[..] Data sent by I2C device, as opposed to data sent by the
2019-07-26 15:51:16 +03:00
host adapter.
=============== =============================================================
2005-04-17 02:20:36 +04:00
Simple send transaction
2019-07-26 15:51:16 +03:00
=======================
2005-04-17 02:20:36 +04:00
2020-01-29 18:19:32 +03:00
This corresponds to i2c_master_send()::
2005-04-17 02:20:36 +04:00
S Addr Wr [A] Data [A] Data [A] ... [A] Data [A] P
Simple receive transaction
2019-07-26 15:51:16 +03:00
==========================
2005-04-17 02:20:36 +04:00
2020-01-29 18:19:32 +03:00
This corresponds to i2c_master_recv()::
2005-04-17 02:20:36 +04:00
S Addr Rd [A] [Data] A [Data] A ... A [Data] NA P
Combined transactions
2019-07-26 15:51:16 +03:00
=====================
2005-04-17 02:20:36 +04:00
2020-01-29 18:19:32 +03:00
This corresponds to i2c_transfer().
2005-04-17 02:20:36 +04:00
2020-01-29 18:19:33 +03:00
They are just like the above transactions, but instead of a stop
condition P a start condition S is sent and the transaction continues.
An example of a byte read, followed by a byte write::
2005-04-17 02:20:36 +04:00
S Addr Rd [A] [Data] NA S Addr Wr [A] Data [A] P
Modified transactions
=====================
2014-04-06 15:37:38 +04:00
The following modifications to the I2C protocol can also be generated by
2020-01-29 18:19:29 +03:00
setting these flags for I2C messages. With the exception of I2C_M_NOSTART, they
2014-04-06 15:37:38 +04:00
are usually only needed to work around device issues:
2005-04-17 02:20:36 +04:00
2014-04-06 15:37:38 +04:00
I2C_M_IGNORE_NAK:
Normally message is interrupted immediately if there is [NA] from the
client. Setting this flag treats any [NA] as [A], and all of
message is sent.
These messages may still fail to SCL lo->hi timeout.
I2C_M_NO_RD_ACK:
In a read message, master A/NA bit is skipped.
I2C_M_NOSTART:
2005-04-17 02:20:36 +04:00
In a combined transaction, no 'S Addr Wr/Rd [A]' is generated at some
point. For example, setting I2C_M_NOSTART on the second partial message
2019-07-26 15:51:16 +03:00
generates something like::
2005-04-17 02:20:36 +04:00
S Addr Rd [A] [Data] NA Data [A] P
2019-07-26 15:51:16 +03:00
2005-04-17 02:20:36 +04:00
If you set the I2C_M_NOSTART variable for the first partial message,
2020-01-29 18:19:33 +03:00
we do not generate Addr, but we do generate the start condition S.
This will probably confuse all other clients on your bus, so don't
try this.
2005-04-17 02:20:36 +04:00
2012-05-30 12:55:34 +04:00
This is often used to gather transmits from multiple data buffers in
system memory into something that appears as a single transfer to the
I2C device but may also be used between direction changes by some
rare devices.
2014-04-06 15:37:38 +04:00
I2C_M_REV_DIR_ADDR:
2005-04-17 02:20:36 +04:00
This toggles the Rd/Wr flag. That is, if you want to do a write, but
need to emit an Rd instead of a Wr, or vice versa, you set this
2019-07-26 15:51:16 +03:00
flag. For example::
2005-04-17 02:20:36 +04:00
S Addr Rd [A] Data [A] Data [A] ... [A] Data [A] P
2014-04-06 15:37:38 +04:00
I2C_M_STOP:
Force a stop condition (P) after the message. Some I2C related protocols
like SCCB require that. Normally, you really don't want to get interrupted
between the messages of one transfer.