What it is

I2C (Inter-Integrated Circuit) is a synchronous, open-drain serial communication protocol using two bidirectional lines: SCL (serial clock) and SDA (serial data). It operates at low speed (standard mode 100 kHz, fast mode 400 kHz, fast-mode+ 1 MHz) and is pulled high to a single supply voltage via passive pull-up resistors, typically 4.7 kΩ on both lines.

Each I2C device has a unique 7-bit address (or 10-bit extended). The master device (usually a microcontroller, SMC, or firmware chip) controls SCL and initiates data transfer. Slave devices respond when their address is called. If a line is held low (stuck), the entire bus hangs—this is the most common failure mode on consumer electronics.

I2C is used extensively for real-time clocks (RTC), temperature sensors, power management ICs (ISL6264, ISL9239), fuel gauge chips, EEPROM programming, and EC/SMC firmware updates. On modern MacBook and iPhone boards, I2C carries critical calibration data and sensor measurements.

In practice

When a device won't boot or shows intermittent power issues, I2C bus faults are prime suspects. A stuck SDA or SCL line indicates a shorted or damaged slave device, failed pull-up, or a dead short to GND.

Testing procedure: With the board powered off, probe SCL and SDA to GND with a multimeter in diode mode. Each should read approximately 0.4–0.6V (diode forward drop of the pull-up network). A reading of 0V indicates a hard short. If SDA stays low after power cycling, disconnect the main controller IC and retest—if the line releases, the master is driving it low (firmware/SMC hang).

Common faults: Corroded or lifted pads on pull-up resistors; shorted capacitors on the bus lines; failed slave ICs holding the bus; missing or incorrect pull-up values (too high causes timing issues, too low draws excessive current). On boards with multiple I2C buses (I2C0, I2C1), isolate each by powering off slave domains independently.

Signal integrity degrades over distance and with added capacitance. Inspect the PCB routing for cross-talk, insufficient trace impedance, or missing series termination near connectors. In repair, re-flowing a bus slave IC or replacing pull-up resistors often restores communication.

Measurement Expected (powered off) Expected (powered on, idle) Fault indicator
SCL to GND (diode mode) 0.4–0.6V 1.5–3.3V (bus high) 0V (short); open circuit (no pull-up)
SDA to GND (diode mode) 0.4–0.6V 1.5–3.3V (bus high) 0V (stuck low/shorted slave)
Pull-up resistor value 4.7 kΩ typical >10 kΩ (weak pull); open circuit (missing)
Bus voltage (rails) Tied to 3.3V or 5V Steady supply Drooping or missing (power sequencing failure)
Capacitance on lines <200 pF typical >400 pF (timing violations, noise)
Critical: Never force a stuck I2C bus line with a logic analyzer probe current. Use an oscilloscope with high impedance (×10 probe) to avoid loading the bus. A stuck line often means a slave IC is defective and holding it—continued power cycles can cause further damage. Identify and isolate the failing device before continued troubleshooting.

Advanced diagnostics

Scope testing: Capture clock and data waveforms during boot. Valid I2C shows clean, symmetrical square waves on SCL with SDA transitioning during low periods of SCL. Asymmetrical rise times, runt pulses, or SDA held low during entire clock cycle indicate bus contention or a failing pull-up.

Slave isolation: If the bus is stuck, power off non-essential peripheral rails (e.g., PP3V3_S3) one at a time while monitoring SDA/SCL. When the line releases, you've isolated the guilty device. Replace it or reflow the chip.

Protocol analysis: Decode bus traffic with a logic analyzer (e.g., Saleae) to verify addresses, read/write operations, and ACK/NACK sequences. Missing ACKs after address broadcast indicate a dead slave IC. Repeated START conditions without STOP suggest firmware hangs.