Understanding I²C from an Embedded Linux Engineer’s Perspective

2026.05.30 | 조회 13 |
0
|

Most embedded engineers encounter I²C very early in their careers. A datasheet introduces two signals, SDA and SCL. A timing diagram shows a START condition, a STOP condition, and a sequence of bits moving across a bus. At first glance, the protocol appears almost trivial.

However, after working on a few real products, it becomes clear that I²C is far more important than its simple appearance suggests.

When a Linux board fails to detect a touchscreen, when a PMIC refuses to respond during boot, when an EEPROM returns corrupted data, or when a sensor suddenly disappears from the bus, engineers quickly realize that understanding I²C requires more than memorizing timing diagrams.

In modern embedded systems, I²C is not simply a communication protocol. It is often the backbone that connects dozens of supporting devices around the processor.

Understanding why it exists, how it works electrically, and how Linux interacts with it provides a much clearer picture than focusing only on waveforms.

첨부 이미지

Why Embedded Systems Needed a Bus Like I²C

A processor rarely works alone.

Even a relatively simple embedded product may contain multiple peripheral devices that provide essential functionality.

Typical examples include:

Device Type Typical Function
RTC Time keeping
EEPROM Configuration storage
PMIC Power management
Temperature Sensor Thermal monitoring
Touch Controller User input
GPIO Expander Additional I/O
Audio Codec Sound configuration
Light Sensor Ambient brightness detection

Without a shared communication bus, every one of these devices would require dedicated control lines and data paths.

As the number of peripherals increases, PCB routing becomes more complicated, connector sizes grow, and processor GPIO resources are quickly exhausted.

I²C was designed specifically to solve this problem.

Rather than creating separate connections for every device, multiple peripherals can share the same communication lines while remaining individually addressable.

This concept may seem obvious today, but it dramatically simplified hardware design when it was introduced and continues to provide advantages in modern products.


What Makes I²C Different from Other Interfaces

Engineers often compare I²C with UART and SPI because all three are widely used in embedded systems.

Although they serve similar purposes, their design philosophies are quite different.

Interface Clock Source Device Selection Typical Usage
UART No shared clock Point-to-point Console and serial communication
SPI Dedicated clock Separate chip select lines High-speed peripherals
I²C Shared clock bus Address-based Board-level peripherals

The most significant difference is addressing.

SPI often requires a dedicated chip-select signal for every peripheral.

I²C instead allows devices to share the same bus and be selected through software-defined addresses.

For a board containing many low-speed peripherals, this approach significantly reduces wiring complexity.


The Electrical Design Is the Real Secret

Many introductory explanations focus on protocol timing.

In reality, the electrical architecture of I²C is what makes the bus possible.

If multiple devices are connected to the same signal lines, why do they not drive conflicting voltages onto the bus?

The answer lies in open-drain signaling.

Instead of actively driving both logic high and logic low, an I²C device can only do two things:

  1. Pull the line low.
  2. Release the line.

A pull-up resistor connected to the power rail restores the signal to high level whenever no device is pulling it down.

This behavior allows multiple devices to safely share the same wires.

If any device drives a low level, the bus becomes low.

Only when all devices release the line does the signal return high.

This simple idea forms the foundation of several important I²C features, including acknowledgment, arbitration, and clock stretching.


Why Pull-Up Resistors Matter More Than Many Engineers Expect

One of the most common hardware mistakes involving I²C is improper pull-up resistor selection.

Because devices do not actively drive the bus high, pull-up resistors are mandatory.

Typical values are:

Bus Voltage Common Pull-Up Value
1.8V 2.2kΩ – 4.7kΩ
3.3V 4.7kΩ
5V 4.7kΩ – 10kΩ

Choosing values that are too large slows signal transitions.

Choosing values that are too small increases current consumption and may violate device specifications.

Many engineers spend hours debugging software only to discover that communication failures originate from hardware-level signal integrity problems.

Whenever an I²C bus behaves unpredictably, checking the pull-ups should be among the first troubleshooting steps.


Communication Begins with Addressing

One of the reasons I²C scales well is that every slave device has an address.

Instead of selecting a device through dedicated hardware signals, the master sends an address on the shared bus.

Only the device matching that address responds.

Typical addresses might look like this:

For Linux developers, this addressing model is visible everywhere.

Device Tree files, driver source code, and debugging tools all reference device addresses.

When a datasheet lists separate read and write addresses, engineers should remember that Linux generally uses the underlying 7-bit address rather than the full transmitted byte.

Understanding this distinction avoids many early debugging mistakes.


Why Register-Based Devices Dominate I²C

Most I²C peripherals expose internal registers.

These registers store configuration settings, measurement values, status flags, or control parameters.

As a result, many transactions follow a common pattern:

First, specify the register.

Then, read or write the associated data.

Conclusion

I²C appears simple on the surface, but its importance within embedded systems is difficult to overstate.

The protocol connects many of the devices responsible for sensing, power management, user interaction, configuration storage, and system monitoring.

For embedded Linux developers, understanding I²C means more than knowing START conditions and ACK bits. It involves understanding the electrical architecture, addressing model, Linux software framework, Device Tree integration, and practical debugging methods used in real products.

Once these pieces fit together, I²C becomes far easier to troubleshoot and significantly more useful as a development tool.

Whether working with RTCs, PMICs, EEPROMs, touch controllers, sensors, or industrial display systems, a solid understanding of I²C remains one of the most valuable skills an embedded engineer can have.

다가올 뉴스레터가 궁금하신가요?

지금 구독해서 새로운 레터를 받아보세요

✉️

이번 뉴스레터 어떠셨나요?

embedded 님에게 ☕️ 커피와 ✉️ 쪽지를 보내보세요!

댓글

의견을 남겨주세요

확인
의견이 있으신가요? 제일 먼저 댓글을 달아보세요 !

다른 뉴스레터

© 2026 embedded

Exploring Android/Linux SBCs, industrial TFT displays, and embedded design trends from Rocktech.

메일리 로고

도움말 오류 및 기능 관련 제보

서비스 이용 문의admin@team.maily.so 채팅으로 문의하기

메일리 사업자 정보

메일리 (대표자: 이한결) | 사업자번호: 717-47-00705 | 서울특별시 송파구 위례광장로 199, 5층 501-2-31호

이용약관 | 개인정보처리방침 | 정기결제 이용약관 | 라이선스