I2C is two wires, open-drain, and deceptively simple — timing violations cause silent failures.
Open-drain: SDA and SCL pulled high, devices pull low. Pull-up resistor sizing matters.
START/STOP conditions, ACK/NACK, 7-bit or 10-bit addressing.
Clock stretching and multi-controller arbitration require explicit controller support and timeout policy.
Simplest serial protocol — illustrates timing contracts between RTL, board, and firmware.
The controller, because it is receiving the final byte and intentionally ends the read.