I2C is a popular serial communication protocol, with I3C being an improved version. Embedded systems use this new protocol for achieving significantly higher data throughput and features that are more advanced than what I2C offers. Designers and engineers can use I3C for improving the functioning and performance of their designs while adding more features such as in-band interrupts, hot-join, and high data rate modes. With I3C being backward compatible, it can communicate with legacy targets using the present I2C protocol.
There are some major differences between I3C and I2C. While I2C works on bus speeds of 100 kHz, 400 kHz, or 1 MHz, I3C operates with bus speeds up to 12.5 MHz. The increase is due to I3C using push-pull outputs, which switch between push-pull drivers and open-drain outputs depending on the state of the bus. I3C uses open-drain driving during arbitration or initial addressing where multiple targets are controlling the line at the same time. I3C uses the push-pull driver for unidirectional communication, and no other device is expected to communicate simultaneously.
The voltage range of operation of I2C is between 3.3 and 5 VDC, and I3C operates with supply voltages of 1.2, 1.8, and 3.3 VDC, with the possibility of other voltages in between. Unlike 12C, I3C does not require external pull-up resistors, as the main controller on the bus provides these.
I2C uses static 7-bit and 10-bit addressing of target devices. On the other hand, I3C makes use of dynamic 7-bit addressing, where the active controller designates each target with an unambiguous address to prevent collisions with addressing. In contrast, I2C requires the designer to keep track of the current addresses to prevent assigning the same address to two or more devices. I3C assigns addresses dynamically during bus initialization.
I2C has no mechanism for a target to tell the controller that data is ready unless it uses an extra IO line. However, devices in I3C can signal an interrupt by using the serial data and serial clock lines, thereby making the protocol truly two-wire. I3C also uses this in-band signaling for implementing hot-join functionality. This allows new devices to join once the initial address assignment is over.
I2C allows multi-controller buses. Here, although multiple devices can operate as controllers, only one of them can actively communicate at a time. On the other hand, I3C can have only one active controller, while other capable devices can request to become active controllers on the bus. This device can then become the secondary controller. If the secondary controller is no longer acting as an active controller, it starts functioning as an I3C target.
I3C is backward compatible with I2C. However, for successful communication, the targets in the I2C protocol must have a 7-bit address, and must not use clock stretching. The new protocol suggests the I2C targets contain 50ns filters on their inputs. By meeting these requirements, I2C targets become compatible with the I3C bus. On the other hand, a few I3C devices may also operate as I2C targets, until they have been assigned a dynamic address. When working in the I2C mode, the I3C devices have static communication addresses.