|Type||Serial communication bus|
Sensor Working Group
|Data signal||Open-drain or Push/Pull|
|Width||2 wires [data + clock]|
I3C (also known as SenseWire) is a specification to enable communication between computer chips by defining the electrical connection between the chips and signaling patterns to be used. The standard defines the electrical connection between the chips to be a two wire, shared(multidrop), serial data bus, one wire (
SCL) being used as a clock to define the sampling times, the other wire (
SDA) being used as a data line whose voltage can be sampled. The standard defines a signalling protocol in which multiple chips can control communication and thereby act as the bus master.
The I3C specification takes its name from, uses the same electrical connections as, and allows some backward compatibility with, the I²C bus, a de facto standard for inter-chip communication, widely used for low-speed peripherals and sensors in computer systems. The I3C standard is designed to retain some backward compatibility with the I²C system, notably allowing designs where existing I²C devices can be connected to an I3C bus but still have the bus able to switch to a higher data rate for communication at higher speeds between compliant I3C devices. The I3C standard thereby combines the advantage of the simple, two wire I²C architecture with the higher communication speeds common to more complicated buses such as the Serial Peripheral Interface (SPI).
The I3C standard was developed as a collaborative effort between electronics and computer related companies under auspices of the Mobile Industry Processor Interface Alliance (MIPI Alliance). The I3C standard was first released to the public at the end of 2017, although access requires the disclosure of private information. Google and Intel have backed I3C as a sensor interface standard for Internet of things (IoT) devices.
Goals of the MIPI Sensor Working Group effort were first announced in November 2014 at the MEMS Executive Congress in Scottsdale AZ.
Electronic design automation tool vendors including Cadence, Synopsys and Silvaco have released controller IP blocks and associated verification software for the implementation of the I3C bus in new integrated circuit designs.
Prior to public release of the specification, a substantial amount of general information about it has been published in the form of slides from the 2016 MIPI DevCon. The goals for this interface were based on a survey of MIPI member organizations and MEMS Industry Group (MIG) members. The results of this survey have been made public.
The initial I3C design sought to improve over I²C in the following ways:
- Two-pin interface that is a superset of the I²C standard. Legacy I²C slave devices can be connected to the newer bus.
- Low-power and space efficient design intended for mobile devices (smartphones and IoT devices.)
- In-band interrupts over the serial bus rather than requiring separate pins. In I²C, interrupts from peripheral devices typically require an additional non-shared pin per package.
- Standard Data Rate (SDR) throughput between 10 and 12.5 Mbit/s using CMOS I/O levels.
- High Data Rate (HDR) modes permitting multiple bits per clock cycle. These support throughput comparable to SPI while requiring only a fraction of I²C Fast Mode power.
- A standardized set of common command codes
- Command queue support
- Error Detection and Recovery (parity check in SDR mode and 5bit CRC for HDR modes)
- Dynamic address assignment (DAA) for I3C slaves, while still supporting static addresses for I²C legacy devices
- I3C traffic is invisible for legacy I²C devices when equipped with I²C spike filters, achieved by SCl HIGH times of less than 50ns
- Hot-join (some devices on the bus may be powered on/off during operation)
- Multi-master operation with a well-defined protocol for hand-off between masters
I3C Basic Specification
After publishing making the I3C 1.0 standard publicly accessible, the organization subsequently published the I3C Basic specification, a subset intended to be implementable by non-member organizations under a RAND-Z licence. The basic version includes many of the protocol innovations in I3C 1.0, but lacks some of the potentially more difficult-to-implement ones such as the optional high data rate (HDR) modes like DDR. None the less the default SDR mode at up to 12.5 Mbit/s is a major speed/capacity improvement over I²C.
Published in December of 2019, this specification is only available to MIPI member.
I3C uses same two signal pins as I²C, referred to as SCL (serial clock) and SDA (serial data). The primary difference is that I²C operates them as open-drain outputs at all time, so its speed is limited by the resultant slow signal rise time. I3C uses open-drain mode when necessary for compatibility, but switches to push-pull outputs whenever possible, and includes protocol changes to make it possible more often than in I²C.
- SCL is a conventional digital clock signal, driven with a push-pull output by the current bus current master during data transfers. (Clock stretching, a rarely used I²C feature, is not supported.) In transactions involving I²C slave devices, this clock signal generally has a duty cycle, of approximately 50%, but when communicating with known I3C slaves, the bus master may switch to a higher frequency and/or alter the duty cycle so the SCL high period is limited to at most 40 ns.
- SDA carries the serial data stream, which may be driven by either master or slave, but is driven at a rate determined by the master's SCL signal. For compatibility with the I²C protocol, each transaction begins with SDA operating as an open-drain output, which limits the transmission speed. For messages addressed to an I3C slave, the SDA driver mode switches to push-pull after the first few bits in the transaction, allowing the clock to be further increased up to 12.5 MHz. This medium-speed feature is called standard data rate (SDR) mode.
Generally, SDA is changed just after the falling edge of SCL, and the resultant value is received on the following rising edge. When the master hands SDA over to the slave, it likewise does so on the falling edge of SCL. However, when the slave is handing back control of SDA to the master (e.g. after acknowledging its address before a write), it releases SDA on the rising edge of SCL, and the master is responsible for holding the received value for the duration of SCL high. (Because the master drives SCL, it will see the rising edge first, so there will be a brief period of overlap when both are driving SDA, but as they are both driving the same value, no bus contention occurs.)
All communications in I²C and I3C requires framing for synchronization. Within a frame, changes on the SDA line should always occur while SCL is in the low state, so that SDA can be considered stable on the low-to-high transition of SCL. Violations of this general rule are used for framing (at least in legacy and standard data rate modes).
Between data frames, the bus master holds SCL high, in effect stopping the clock, and SDA drivers are in a high-impedance state, permitting a pull-up resistor to float it to high. A high-to-low transition of SDA while SCL is high is known as a START symbol, and signals the beginning a new data frame. A low-to-high transition on SDA while SCL is high is the STOP symbol, ending a data frame.
A START without a preceding STOP, called a "repeated START", may be used to end one message and begin another within a single bus transaction.
In I²C, the START symbol is usually generated by a bus master, but in I3C, even slave devices may pull SDA low to indicate they want to start a frame. This is used to implement some advanced I3C features, such as in-band interrupts, multi-master support, and hot-joins. After the start, the bus master restarts the clock by driving SCL, and begins the bus arbitration process.
Like I²C, I3C uses 9 clock cycles to send each 8-bit byte. However, the 9th cycle is used differently. I²C uses the last cycle for an acknowledgement sent in the opposite direction to the first 8 bits. I3C operates the same way for the first (address) byte of each message, and for I²C-compatible messages, but when communicating with I3C slaves, message bytes after the first use the 9th bit is an odd parity bit on writes, and an end-of-data flag on reads.
Writes may be terminated only by the master.
Ether the master or the slave may terminate a read. The slave sets SDA low to indicate that no more data is available; the master responds by taking over SDA and generating a STOP or repeated START. To allow a read to continue, the slave drives SDA high while SCL is low before the 9th bit, but lets SDA float (open-drain) while SCL is high. The master may drive SDA low (a repeated START condition) at this time to abort the read.
At the start of a frame, several devices may contend for use of the bus, and the bus arbitration process serves to select which device obtains control of the SDA line. In both I²C and I3C, bus arbitration is done with the SDA line in open-drain mode, which allows devices transmitting a binary 0 (low) to override devices transmitting a binary 1. Contending devices monitor the SDA line while driving it in open-drain mode. Whenever a device detects a low condition (0 bit) on SDA while transmitting a high (1 bit), it has lost arbitration and must cease contending until the next transaction begins.
Each transaction begins with the target address, and the implementation gives priority to lower-numbered target addresses. The difference is that I²C has no limit on how long arbitration can last (in the rare but legal situation of several devices contending to send a message to the same device, the contention will not be detected until after the address byte). I3C, however, guarantees that arbitration will be complete no later than the end of the first byte. This allows push-pull drivers and faster clock rates to be used the great majority of the time.
This is done in several ways:
- I3C supports multiple masters, but they are not symmetrical; one is the current master and responsible for generating the clock. Other devices sending a message on the bus (in-band interrupts or secondary masters wishing use of the bus) must arbitrate using their own address before sending any other data. Thus, no two legal bus messages share the same first byte except if the master and another device are simultaneously communicating with each other.
- I3C, like I2C, allows multiple messages per transaction separated with "repeared START" symbols. Arbitration is per-transaction, so these subsequent messages are never subject to arbitration.
- Most I3C master transactions begin with the reserved address
0x7E(11111102). As this has a lower priority than any I3C device, once it has passed arbitration, the master knows that no other device is contending for the bus.
- As a special case, if I3C devices are assigned low addresses (I3C supports dynamic, master-controlled address assignment), then as soon as the
0x7Eaddress has won arbitration for enough leading bits to distinguish it from any assigned address, the master knows that arbitration is complete and it may switch to push-pull operation on SDA. If all assigned addresses are less than
0x40, this is after the first bit. If all addresses are less than
0x60, this is after the second bit, and so on.
- In the case described above wherein the current master begins a transaction with the address of a device which is itself contending for use of the bus, both will transmit their address bytes successfully. However, each will expect the other to acknowledge the address (by pulling SDA low) for the following acknowledge bit. Consequently, neither will, and both will observe the lack of acknowledgement. In this case, the message is not sent, but the master wins arbitration: it may send a repeated start, followed by a retry which will be successful.
Common command codes
A write addressed to the reserved address
0x7E is used to perform a number of special operations in I3C. All I3C devices must receive and interpret writes to this address in addition to their individual addresses.
First of all, a write consisting of just the address byte and no data bytes has no effect on I3C slaves, but may be used to simplify I3C arbitration. As described above, this prefix may speed up arbitration (if the master supports the optimization of switching to push-pull mid-byte), and it simplifies the master by avoiding a slightly tricky arbitration case.
If the write is followed by a data byte, the byte encodes a "common command code", a standardized I3C operation. Command codes
0–0x7F are broadcast commands addressed to all I3C slaves. They may be followed by additional, command-specific parameters. Command codes
0x80–0xFE are direct commands addressed to individual slaves. These are followed by a series of repeated STARTs and writes or reads to specific slaves.
While a direct command is in effect, per-slave writes or reads convey command-specific parameters. This operation is in lieu of slave's normal response to an I3C message. One direct command may be followed by multiple per-slave messages, each preceded by a repeated START. This special mode ends at the end of the transaction (STOP symbol) or the next message addressed to
Some command codes exist in both broadcast and direct forms. For example, the commands to enable or disable in-band interrupts may be sent to individual slaves or broadcast to all. Commands to get parameters from a slave (for example the GETHDRCAP command to ask a device which high-data-rate modes it supports) only exist in direct form.
On an I3C bus in its default (SDR) mode, four different classes of devices can be supported:
- I3C Main Master
- I3C Secondary Master
- I3C Slave
- I²C Slave (legacy devices)
High Data Rate (HDR) options
Each I3C bus transaction begins in SDR mode, but the I3C master may issue an "Enter HDR" CCC broadcast command which tells all I3C slaves that the transaction will continue in a specified HDR mode. I3C slaves which do not support HDR may then ignore bus traffic until they see a specific "HDR exit" sequence which informs them it is time to listen to the bus again. (The master knows which slaves support HDR so will never attempt to use HDR to communicate with a slave which does not support it.)
Some HDR modes are also compatible with I²C devices if the I²C devices have a 50 ns spike filter on the SCL line; that is, they will ignore a high level on the SCL line which lasts less than 50 ns. This is required by the I²C specification, but not universally implemented, and not all implementations ignore frequently repeated spikes, so I3C HDR compatibility must be verified. The compatible HDR modes use SCL pulses of at most 45 ns so that I²C devices will ignore them.
The HDR-DDR mode uses double data rate signalling with a 12.5 MHz clock to achieve a 25 Mbit/s raw data rate (20 Mbit/s effective). This requires changing the SDA line while SCK is high, a violation of the I²C protocol, but I²C devices will not see the brief high-going pulse on SCL and thus not notice the violation.
The HDR-TSP and HDR-TSL modes use one of three symbols as ternary digits (trits):
- A transition of both SDA and SCL (received within 12.8 ns of each other),
- A transition of SCL only, or
- A transition of SDA only.
Two bytes plus two parity bits (18 bits total) are broken into six 3-bit triplets, and each triplet is encoded as two trits. Sent at 25 Mtrit/s, this achieves a 33.3 Mbit/s effective data rate.
The trit pair consisting of two transitions of SDA only is not used to encode data, and is instead used for framing, to mark the end of an HDR sequence. Although this limits the maximum time between SCL transitions to three trit times, that exceeds the 50 ns limit for legacy I²C devices, so HDR-TSP (ternary symbol, pure) mode may only be used on a bus without legacy I²C devices.
To permit buses including I²C devices (with a spike filter), the HDR-TSL (ternary symbol, legacy) mode must be used. This maintains I²C compatibility by trit stuffing: after any rising edge on SCL, if the following trit is not 0, a 1 trit (transition on SCL only) is inserted by the sender, and ignored by the receiver. This ensures that SCL is never high for more than one trit time.
I²C features not supported in I3C
- Pull-up resistors are provided by the I3C master. External pull-up resistors are no longer needed.
- Clock Stretching – devices are expected to be fast enough to operate at bus speed. The I3C master is the sole clock source.
- I²C Extended (10-bit) Addresses. All devices on an I3C bus are addressed by a 7-bit address. Native I3C devices have a unique 48-bit address which is used only during dynamic address assignments.
- "MIPI I3C and I3C Basic". mipi.org.
- "MIPI Alliance opens access to its MIPI I3C Sensor Interface Specification".
- "MIPI Alliance releases MIPI I3C sensor-interface specification". www.evaluationengineering.com.
- "MIPI makes market push for I3C sensor interface". 14 December 2017.
- "VC Verification IP for MIPI I3C". www.synopsys.com.
- "MIPI I3C Family for Sensor and IoT Applications" (PDF). silvaco.com.
- "Lattice gives iCE40 more power, I/O and memory". 12 December 2016.
- "SDM845 Specs".
- "MIPI I3C". mipi.org.
- "LKML: Boris Brezillon: [PATCH v2 0/7] Add the I3C subsystem". lkml.org.
- "Renesas Introduces New I3C Bus Extension Products". 6 June 2020.
- Inc, MIPI Alliance. "MIPI I3C Sensor Sessions at MIPI DevCon2016". resources.mipi.org.
- MIPI Alliance (23 September 2016). "MIPI DevCon 2016: A Developer's Guide to MIPI I3C Implementation".
- MIPI Alliance (23 September 2016). "MIPI DevCon 2016: MIPI I3C High Data Rate Modes".
- Group, Ken Foust, Chair of the MIPI I3C Working Group and MIPI I3C Basic Ad Hoc Working. "MIPI Alliance Delivers New I3C Basic Specification". resources.mipi.org. Retrieved 2020-04-06.
- "8-Kbit serial I2C bus EEPROM data sheet" (PDF). STMicroelectronics. October 2017. p. 27. DocID 023924 Rev 6. Archived (PDF) from the original on 2019-10-18. Retrieved 19 November 2019.