What Is I3C, and How Does It Compare to I2C?
Last updated 14 July 2026 · 7 min read
Direct Answer
I3C (MIPI's Improved Inter-Integrated Circuit protocol) is a two-wire serial bus designed as I2C's successor, sharing the same SDA/SCL physical pins but adding dynamic addressing (devices are assigned an address at bus initialisation using a unique Provisioned ID, rather than a fixed address set by hardware pins), In-Band Interrupts (a target signals the controller directly on the shared bus, without a dedicated interrupt line), and push-pull signalling during the data phase that lifts throughput to typically up to 12.5 MHz in Single Data Rate mode — several times I2C's common 400 kHz–1 MHz range — with optional High Data Rate modes going faster still. I3C is designed to let legacy I2C devices coexist on the same bus as I3C devices, which is what makes it a practical upgrade path for sensor-heavy designs rather than a clean-break replacement.
Detailed Explanation
I3C is a serial bus protocol developed by the MIPI Alliance, published as the publicly available I3C Basic Specification, positioned as I2C's successor for exactly the use case I2C has always served — connecting multiple sensors and low-speed peripherals to a controller over a shared two-wire bus — while addressing three of I2C's longest-standing limitations: fixed addressing, no built-in interrupt signalling, and a speed ceiling set by open-drain drive and pull-up resistor RC time constants. For I2C's own operation and pull-up requirements, see What Is I2C?
I3C reuses I2C's physical SDA/SCL pin pair and, during bus arbitration, its open-drain signalling — this is what makes backward compatibility with legacy I2C devices possible on the same bus, rather than requiring a parallel set of pins or a bus bridge.
I3C vs I2C: What Actually Changed
| I2C | I3C | |
|---|---|---|
| Addressing | Static — set by hardware address-select pins | Dynamic — assigned at bus init from a unique Provisioned ID |
| Interrupts | Requires a separate dedicated interrupt (GPIO) line | In-Band Interrupt (IBI) — signalled on SDA/SCL itself |
| Signalling | Open-drain throughout | Open-drain for arbitration, push-pull for SDR data phase |
| Typical top speed | 100 kHz–1 MHz (3.4 MHz High Speed Mode, rarely used) | Up to 12.5 MHz SDR; higher in HDR modes |
| Device discovery | None — addresses must be known in advance | Hot-Join lets a device join the bus and request an address at runtime |
| Legacy compatibility | N/A | Designed to coexist with legacy I2C devices on the same bus |
Dynamic Addressing and the Provisioned ID
I2C addresses are fixed by hardware — a pin strapped high or low selects between two or three possible addresses, which is why address collisions between identical parts on the same bus are a routine design constraint (see I2C's own address-collision guidance). I3C removes this constraint: every I3C device carries a 48-bit Provisioned ID (a globally unique identifier baked into the silicon, similar in spirit to a MAC address), and during bus initialisation the controller runs ENTDAA (Enter Dynamic Address Assignment), a Common Command Code that has every unassigned I3C device arbitrate for the bus using its Provisioned ID and receive a 7-bit dynamic address in response. Two identical I3C parts on the same bus resolve automatically, without an address-select pin or external multiplexer.
In-Band Interrupts (IBI)
I2C has no interrupt mechanism of its own — a sensor with a data-ready or threshold-crossing event needs a separate dedicated interrupt GPIO line back to the controller (see interrupts in embedded systems for how that line is typically handled in firmware), which consumes a pin per device and doesn't scale well on a bus with many sensors.
I3C's In-Band Interrupt lets a target signal the controller directly over SDA while the bus is idle: the target pulls SDA low during a defined interrupt-request window, and if multiple targets request simultaneously, they arbitrate using the same address-based arbitration mechanism the bus already uses, so the controller learns which specific device is requesting service as part of the same exchange — no separate interrupt line, and no ambiguity about which device to poll.
Common Command Codes and Hot-Join
I3C defines a set of Common Command Codes (CCC) — broadcast or direct commands the controller issues to configure bus behaviour, request dynamic addressing, or query device capabilities — that don't have an I2C equivalent. Hot-Join builds on this: a device that powers up or is physically connected after the bus has already been initialised can signal its presence and be assigned a dynamic address without requiring a full bus re-initialisation, useful for hot-pluggable sensor modules or expansion boards that weren't present when the controller first enumerated the bus.
Throughput: SDR and HDR Modes
I3C's baseline Single Data Rate (SDR) mode uses push-pull drive (rather than I2C's open-drain-only signalling) for the data phase of a transaction, which removes the pull-up resistor's RC-limited rise time as the speed bottleneck and allows clock rates up to 12.5 MHz per the I3C Basic Specification — roughly an order of magnitude above I2C's common 100 kHz–400 kHz range, though the exact achievable rate on a given board still depends on bus loading and trace length.
Beyond SDR, I3C defines optional High Data Rate (HDR) modes (including HDR-DDR, double-data-rate signalling) for applications needing still more throughput. Most sensor-hub use cases are well served by SDR alone; HDR modes matter more for higher-bandwidth applications closer to what a display or camera interface needs, where I3C is being evaluated as an alternative to dedicated high-speed interfaces.
Design Considerations
- Check I3C support per-part, not per-product-line. I3C adoption is genuine but uneven — verify each specific sensor or peripheral IC's I3C capability against its current datasheet rather than assuming an entire vendor family supports it.
- Plan the bus as mixed I2C/I3C during a transition period. Most real designs today combine I3C-capable parts with legacy I2C parts that have no I3C equivalent yet; the I3C controller's I2C-compatibility mode handles this, but confirm every legacy I2C device on the bus meets the timing requirements needed to coexist safely.
- In-Band Interrupts reduce GPIO pin count on sensor-dense boards. For a design with many interrupt-capable sensors, IBI can eliminate several dedicated interrupt lines that would otherwise each need to be routed and serviced individually — a genuine PCB layout and pin-budget benefit, not just a protocol curiosity.
- Confirm your MCU's I3C peripheral (or the lack of one) early. Not every MCU family has a native I3C peripheral yet; some designs implement I3C controller functionality by driving a high-speed I2C-capable peripheral in a compatible mode, which is more firmware effort than using dedicated I3C hardware. Zeus Design's embedded firmware team evaluates protocol and part selection — including I3C adoption tradeoffs — as part of new product hardware and firmware design.
Common Mistakes
- Assuming an "I3C-compatible" sensor works identically to its I2C mode with no other changes. Dynamic addressing, IBI, and CCC handling all need controller-side support in firmware; simply wiring the device to an I2C bus and addressing it at a fixed address ignores the features that justify choosing I3C in the first place.
- Mixing I3C and legacy I2C devices without checking spike-filter and timing compatibility. Some older I2C parts have fixed timing characteristics that don't tolerate the faster signalling I3C introduces between transactions; verify mixed-bus compatibility against the I3C Basic Specification's I2C-compatibility requirements rather than assuming any I2C device works unmodified on a mixed bus.
- Expecting the full 12.5 MHz SDR rate regardless of bus loading. Like I2C, I3C's achievable speed on a real board is still a function of bus capacitance, trace length, and device count — the push-pull data phase raises the ceiling substantially but doesn't eliminate physical bus loading as a constraint.
- Treating Hot-Join as eliminating the need for careful power-up sequencing. Hot-Join handles a device joining an already-initialised bus, but a device that's mid-boot or in an undefined electrical state when the controller first initialises the bus can still cause the same kind of bus contention issues I2C designs already have to guard against.
Frequently Asked Questions
- Can I3C and I2C devices really share the same physical bus?
- Yes, this is a deliberate design goal — an I3C controller can address both I3C targets and legacy I2C targets on the same SDA/SCL pair. There are two practical caveats: legacy I2C devices with a fixed 50 ns or longer spike filter, or that don't tolerate the higher-frequency signalling used between I3C transactions, may need to be excluded from the mixed bus or handled in a dedicated 'I2C-only' bus mode. And a mixed bus runs at the speed the slowest required device supports for the transactions that involve it, so the throughput benefit of I3C only fully materialises once most or all devices on the bus are I3C-capable.
- Does I3C need pull-up resistors like I2C does?
- Yes, but they matter less once the bus switches into push-pull mode. I3C uses open-drain signalling (identical to I2C, and requiring the same pull-up resistors) during bus arbitration and any I2C-compatibility transaction, then switches to push-pull drive for the data phase of an I3C SDR transaction, where the pull-up resistor's RC time constant is no longer the limiting factor on rise time. This push-pull data phase is the main reason I3C can run substantially faster than I2C's open-drain-limited speed grades.
- Is I3C actually available in mainstream sensor and MCU parts yet?
- Adoption is real but not yet universal. I3C is well established in mobile SoC sensor hubs (it was developed with mobile and IoT sensor integration specifically in mind) and is increasingly available in newer MEMS sensor and sensor-hub ICs, with several MCU vendors adding native I3C peripheral support in recent silicon generations. For a design where I3C-capable parts aren't available for every required function yet, the practical path is a mixed I3C/I2C bus — treat the availability of I3C support as a part-selection criterion to check per component, not an assumption to make about an entire product line.
References
Related Questions
What Is I2C (Inter-Integrated Circuit)?
I2C is a two-wire serial bus for addressing multiple peripherals over shared SDA/SCL lines. Learn how addressing, speed grades, and pull-up resistors work.
SPI vs I2C vs UART: Which Protocol Should You Use?
SPI suits high-speed transfers, I2C minimises pins for multi-device buses, and UART suits point-to-point links. Learn which to choose for your embedded design.
MCP23017 vs PCF8574: Which I2C GPIO Expander Should You Use?
MCP23017 vs PCF8574 I2C GPIO expanders compared: pin count, interrupt capability, output drive type, addressing, and which to choose for your design.
What Are Interrupts in Embedded Systems and How Do They Work?
Interrupts let a microcontroller respond to hardware events instantly without polling. Learn how ISRs, NVIC priority, and interrupt latency work.
What Is an External Real-Time Clock (RTC) IC, and When Do You Need One?
The DS3231 and PCF8563 are external RTC ICs that keep time on battery backup. Covers I2C registers, coin-cell circuits, and when you need one.
What Is 1-Wire?
1-Wire is a single-conductor serial bus addressing devices by a 64-bit ROM code. Learn its ROM structure, binary-search discovery algorithm, and power modes.
Related Forum Discussions
I2C bus completely dead after unplugging a sensor live — SDA stuck low, no NACK, nothing
We've got a shared I2C bus with four sensors on it (temperature, humidity, an IMU, and a current sense IC), all on the same bus off one MCU.
STM32F401 UART printing garbage after switching to 84 MHz PLL — same 115200 baud in CubeMX and PuTTY
Got a WeAct Black Pill (STM32F401CCU6) project that's been running happily on the default HSI clock at 16 MHz. Using USART1 on PA9/PA10 thro
SPI reads all returning 0xFF — logic analyser shows MISO activity, W25Q32 not responding to commands
Been staring at this one for a day and a half. I'm trying to read the JEDEC ID from a W25Q32JV SPI flash chip on a custom STM32L432 board. T
I2C bus scan finding nothing — NACK on every address despite pull-ups
Working through my first proper I2C project — hooking up a BME280 temp/humidity sensor to an ESP32 devkit. Wired SDA to GPIO21 and SCL to GP