📘 TUTORIAL LENGKAP I²C (INTER-INTEGRATED CIRCUIT)

1️⃣ I²C Basics

Apa itu I²C?

I²C (Inter-Integrated Circuit) adalah protokol komunikasi serial sinkron dua kabel yang dikembangkan oleh:

📌 NXP Semiconductors
(sebelumnya oleh Philips Semiconductor)

Digunakan untuk komunikasi antar IC dalam satu board.

Karakteristik Utama I²C

Parameter I²C
Tipe Sinkron
Jalur 2 kabel
Topologi Multi-master, Multi-slave
Addressing 7-bit / 10-bit
Kecepatan 100 kHz – 5 MHz
Half/Full Duplex Half duplex

2️⃣ I²C Communication

 

🔹 1️ START CONDITION

📌 Pada gambar terlihat:

SCL = HIGH
SDA berubah dari HIGH → LOW

Ini disebut Start Condition (S)

Artinya:

Master mengambil alih bus dan memulai komunikasi.

⚠ Ciri khas Start Condition:

    • Terjadi saat SCL HIGH
    • SDA berubah HIGH → LOW

Ini memberi sinyal ke semua device bahwa komunikasi akan dimulai.

🔹 2️ 7-BIT ADDRESS

Setelah start, master mengirim:

Bit

Isi

7 bit pertama

Alamat Slave

1 bit terakhir

R/W bit

Contoh pada gambar:

1 1 0 0 1 0 0

Ini adalah alamat slave (7-bit).

🔹 3️ READ / WRITE BIT

Bit ke-8 adalah:

Nilai

Arti

0

Write ke slave

1

Read dari slave

Pada gambar:

    • R/W = 0 → berarti master ingin menulis ke slave

🔹 4️ ACKNOWLEDGE BIT (ACK)

Setelah 8 bit dikirim:

Slave harus merespon dengan:

ACK bit (bit ke-9)

Nilai

Arti

0

ACK (alamat diterima)

1

NACK (tidak diterima)

📌 Pada gambar terlihat bit ACK setelah address.

Jika tidak ada ACK:

    • Komunikasi dihentikan

🔹 5️ DATA BYTE

Setelah ACK address:

Master mengirim 8 bit data:

D7 D6 D5 D4 D3 D2 D1 D0

📌 Penting:
Data stabil saat SCL HIGH
Data berubah saat SCL LOW

Ini aturan fundamental I²C.

🔹 6️ ACK SETELAH DATA

Setelah 1 byte data:

Slave kembali mengirim ACK.

Proses ini bisa berulang untuk beberapa byte data:

Data → ACK → Data → ACK → …

🔹 7️ STOP CONDITION

Pada akhir komunikasi:

SCL = HIGH
SDA berubah dari LOW → HIGH

Ini disebut Stop Condition (P)

Artinya:
Bus dilepaskan → komunikasi selesai.

🔎 RANGKAIAN LENGKAP FRAME

Urutan lengkap berdasarkan gambar:

START

7-bit Address

R/W bit

ACK

Data Byte

ACK

STOP

📊 KARAKTERISTIK PENTING YANG TERLIHAT DI GAMBAR

Data hanya valid saat SCL HIGH

Perubahan data terjadi saat SCL LOW

1 byte = 8 clock pulse

Setiap byte diikuti 1 ACK bit

Timing Penting

Setiap bit membutuhkan:

  • 1 siklus clock SCL
  • Data disampling pada edge tertentu

Biasanya:

  • Data dibaca saat rising edge SCL

🏭 ANALISIS INDUSTRI

Dalam sistem Industrial IoT:

Misalnya sensor suhu I²C:

Alur:

START

0x48 (Address)

0 (Write)

ACK

Register Address

ACK

STOP

Lalu untuk read:

START

0x48

1 (Read)

ACK

Data

NACK

STOP

 

3️⃣ Example Frames

Contoh frame pengiriman data:

📘 PENJELASAN EXAMPLE FRAMES I²C

Gambar menampilkan 3 contoh komunikasi I²C, yaitu:

    1. Master menulis data ke slave

    2. Master membaca data dari slave

    3. Capture DSO (osiloskop digital) saat pengiriman data


🔹 1️⃣ I²C Master Writing Data (0x65) ke Slave (0x35)

📌 Informasi pada gambar:

    • Alamat slave = 0x35

    • Data dikirim = 0x65

    • Operasi = WRITE


🔎 Step-by-step Frame

① Start Condition

SCL = HIGH
SDA: HIGH → LOW

Menandakan komunikasi dimulai.


② 7-bit Slave Address

0x35 dalam biner (7-bit):

0x35 = 00110101

Karena 7-bit addressing, yang dikirim:

0110101

(MSB dikirim terlebih dahulu)


③ Write Bit (R/W = 0)

Bit ke-8 adalah:

0Write

Jadi 8 bit pertama yang dikirim master:

01101010

(7-bit address + write bit)


④ ACK Bit

Slave mengirim:

0 → ACK

Artinya alamat dikenali.


⑤ 8-bit Data (0x65)

Konversi:

0x65 = 01100101

Data dikirim MSB → LSB.


⑥ ACK Setelah Data

Slave kembali mengirim:

0 → ACK

Artinya data diterima.


⑦ Stop Condition

SCL HIGH
SDA: LOW → HIGH

Komunikasi selesai.


🔁 Ringkasan Frame 1

START
0110101 (address)
0 (write)
ACK
01100101 (data)
ACK
STOP

🔹 2️⃣ I²C Master Reading Data (0x66) dari Slave (0x08)

📌 Informasi:

    • Slave address = 0x08

    • Data dibaca = 0x66

    • Operasi = READ


🔎 Step-by-step

① Start Condition

Master memulai komunikasi.


② 7-bit Address (0x08)

Konversi:

0x08 = 0001000

③ Read Bit (R/W = 1)

Karena membaca:

1Read

8 bit pertama:

00010001

④ ACK dari Slave

Slave merespon:

0 → ACK

⑤ Data Dikirim Slave (0x66)

0x66 = 01100110

Pada mode read:

    • Slave mengirim data

    • Master mengontrol clock


⑥ ACK Setelah Data

Pada gambar terlihat ACK = 0

Biasanya:

    • Master kirim ACK jika ingin lanjut baca

    • Master kirim NACK jika selesai


⑦ Stop Condition

Bus dilepas.


🔁 Ringkasan Frame 2

START
0001000 (address)
1 (read)
ACK
01100110 (data dari slave)
ACK
STOP

🔹 3️⃣ DSO Output (Master kirim 0x7B ke Slave 0x33)

Ini adalah contoh capture osiloskop.


📌 Informasi:

    • Address = 0x33

    • Data = 0x7B

    • Operasi = Write


① Address 0x33

Konversi:

0x33 = 00110011

7-bit:

0110011

② Write Bit = 0

Maka 8 bit pertama:

01100110

③ Data 0x7B

Konversi:

0x7B = 01111011

④ ACK

Slave mengirim 0.


🔎 Kenapa disebut DSO Output?

Karena pada osiloskop:

    • Terlihat pulsa clock SCL

    • SDA berubah sesuai data

    • 9 clock pulse per byte (8 data + 1 ACK)


⚠ CATATAN PENTING (SESUAI GAMBAR)

1️⃣ Data dikirim MSB → LSB

Bit paling kiri dikirim lebih dulu.


2️⃣ Idle State = HIGH

Sebelum komunikasi:

SDA = HIGH
SCL = HIGH

Karena I²C menggunakan pull-up resistor.


📊 PERBEDAAN WRITE vs READ (DARI GAMBAR)

WRITE READ
Data dikirim master Data dikirim slave
R/W = 0 R/W = 1
ACK setelah data dari slave ACK setelah data dari master

🏭 ANALISIS INDUSTRI

Dalam sistem sensor suhu I²C:

Write Mode:

    • Pilih register sensor

Read Mode:

    • Ambil data suhu

Contoh alur nyata:

START
Address + Write
ACK
Register address
ACK
RESTART
Address + Read
ACK
Data
NACK
STOP

🧠 KESIMPULAN DARI KETIGA FRAME

    1. Setiap komunikasi diawali Start

    2. 7-bit address selalu dikirim dulu

    3. Bit ke-8 menentukan arah komunikasi

    4. Setiap byte selalu diikuti ACK

    5. 9 clock pulse per 1 byte transfer

    6. Stop mengakhiri komunikasi

4️⃣ Pull-up in I²C Communication

⚠ I²C membutuhkan resistor pull-up.

Kenapa?

Karena I²C menggunakan:

Open-drain / Open-collector output

Artinya:

    • Device hanya bisa menarik LOW
    • HIGH didapat dari resistor pull-up

Nilai umum:

    • 7kΩ
    • 10kΩ

Jika tidak ada pull-up:

    • SDA dan SCL akan floating
    • Komunikasi gagal

5️⃣ I²C Modes

Mode Speed
Standard Mode 100 kHz
Fast Mode 400 kHz
Fast Mode Plus 1 MHz
High Speed Mode 3.4 MHz
Ultra Fast Mode 5 MHz

Dalam Arduino Uno default:

  • 100 kHz

6️⃣ I²C Addressing (7-bit Address)

7-bit addressing memungkinkan:

2⁷ = 128 alamat

Namun beberapa alamat reserved:

  • 0x00
  • 0x7F

Contoh device:

  • OLED: 0x3C
  • RTC DS3231: 0x68
  • EEPROM: 0x50

7️⃣ I²C Clock Stretching

Clock stretching terjadi saat:

Slave belum siap → menahan SCL LOW

Master harus menunggu hingga slave release SCL.

Digunakan pada:

  • Sensor ADC
  • Device dengan proses internal lambat

8️⃣ I²C Voltage Level Mismatch

Masalah umum:

  • Master 5V
  • Slave 3.3V

Solusi:

  • Level shifter
  • Logic level converter

Tanpa level shifting:

  • Risiko kerusakan device

📘 PENJELASAN I²C VOLTAGE LEVEL MISMATCH

🔹 1️⃣ Apa Masalahnya?

Gambar menjelaskan kondisi:

MCU 3.3V ↔ Sensor 5V

Perbedaan tegangan ini disebut:

⚠ Voltage Level Mismatch

Contoh kasus:

    • Mikrokontroler 3.3V (ESP32, STM32, Raspberry Pi)

    • Sensor I²C 5V (beberapa modul lama)

Jika langsung dihubungkan:

❌ Logika HIGH bisa tidak dikenali
❌ Pin MCU bisa rusak (overvoltage)
❌ Komunikasi tidak stabil


🔹 2️⃣ Kenapa Bisa Berbahaya?

Karena I²C menggunakan:

✔ Open-drain / Open-collector
✔ Pull-up resistor ke VCC

Artinya:

Level HIGH pada SDA & SCL ditentukan oleh pull-up.

Jika pull-up terhubung ke 5V:

➡ Jalur SDA dan SCL akan naik ke 5V
➡ Masuk ke pin MCU 3.3V
➡ Bisa merusak input pin


🔹 3️⃣ Penjelasan Blok Diagram pada Gambar

Mari kita analisis bagian gambar.


🟦 Kiri: I²C Controller (MCU)

    • Menggunakan tegangan VCCA (misalnya 3.3V)

    • SDA dan SCL ditarik ke 3.3V melalui pull-up


🟨 Tengah: I²C Voltage Level Translator

Ini adalah:

✔ Bidirectional Level Shifter
✔ I²C Buffer dengan Voltage Translation

Fungsi:

    • Menerjemahkan level 3.3V ↔ 5V

    • Tetap mempertahankan sifat open-drain

    • Bisa komunikasi dua arah

Biasanya menggunakan:

    • MOSFET kecil (BSS138)

    • IC seperti PCA9306


🟩 Kanan: I²C Target (Sensor)

    • Menggunakan VCCB (misalnya 5V)

    • SDA dan SCL ditarik ke 5V melalui pull-up


🔹 4️⃣ Bagaimana Cara Kerjanya?

I²C adalah open-drain.

Device hanya bisa menarik LOW.

Ketika:

✔ Salah satu device menarik LOW
→ Level shifter meneruskan LOW ke sisi lain

Ketika:

✔ Tidak ada yang menarik LOW
→ Pull-up menentukan HIGH sesuai VCC masing-masing sisi

Jadi:

3.3V tetap 3.3V
5V tetap 5V

Tidak terjadi overvoltage.


🔹 5️⃣ Kenapa Harus Bidirectional?

Karena I²C bersifat dua arah:

    • Master bisa kirim data

    • Slave bisa kirim data (mode read)

    • ACK dikirim slave

Level shifter harus bisa:

✔ Transfer LOW dari kiri ke kanan
✔ Transfer LOW dari kanan ke kiri


🔹 6️⃣ Apa yang Terjadi Jika Tanpa Level Shifter?

Jika langsung hubungkan:

Kasus A:

Pull-up ke 5V

➡ SDA naik ke 5V
➡ Masuk ke pin MCU 3.3V
➡ Risiko rusak


Kasus B:

Pull-up ke 3.3V

➡ Sensor 5V mungkin tidak mengenali HIGH sebagai valid
➡ Komunikasi gagal


🔹 7️⃣ Analisis dari Sudut Industrial IoT

Dalam sistem Industrial IoT sering terjadi:

    • Gateway 3.3V

    • Sensor industri 5V

    • Modul eksternal beda tegangan

Jika tidak diperhatikan:

❌ Device mati
❌ Komunikasi intermittent
❌ Data corrupt
❌ Maintenance cost naik


🔹 8️⃣ Kapan Wajib Pakai Level Shifter?

Gunakan level shifter jika:

✔ Tegangan berbeda (3.3V ↔ 5V)
✔ Sensor tidak 5V tolerant
✔ Sistem industri 24 jam
✔ Lingkungan noise tinggi


🔹 9️⃣ Kapan Tidak Perlu?

Jika:

✔ Semua device 3.3V
✔ Semua device 5V
✔ Pin MCU 5V tolerant

Contoh:
Arduino Uno (5V) ↔ Sensor 5V
Tidak perlu level shifter.


🔹 🔟 Komponen Umum Level Shifter I²C

Beberapa IC populer:

    • PCA9306

    • TXS0108E

    • BSS138 MOSFET based module


📊 Ringkasan Teknis

Tanpa Level Shifter Dengan Level Shifter
Risiko rusak Aman
Logic error Stabil
Tidak recommended Direkomendasikan
Tidak scalable Industrial grade

🧠 Kesimpulan

Gambar menunjukkan solusi profesional untuk:

✔ Mencegah overvoltage
✔ Menjaga integritas sinyal
✔ Menjamin kompatibilitas tegangan
✔ Melindungi mikrokontroler

9️⃣ I²C Arbitration

Pada sistem multi-master:

Jika dua master kirim data bersamaan:

  • Master dengan logika LOW menang
  • Master lain berhenti

Ini disebut:

✔ Bus Arbitration

🔟 I²C in Micro-Controllers

Hampir semua mikrokontroler memiliki hardware I²C:

  • ATmega328P
  • STM32
  • ESP32
  • PIC
  • ARM Cortex

Biasanya disebut:

  • TWI (Two Wire Interface)
  • I2C Peripheral

1️⃣1️⃣ Writing I²C Driver (Master – Writing Data to Slave)

Langkah umum:

  1. Set START bit
  2. Kirim slave address
  3. Tunggu ACK
  4. Kirim data
  5. STOP

Pseudo code:

I2C_Start();
I2C_Write(Address << 1);
I2C_Write(Data);
I2C_Stop();

1️⃣2️⃣ I²C in Arduino Uno (ATmega328P)

Arduino Uno menggunakan:

📌 ATmega328P

Pin I²C Arduino Uno:

Pin Fungsi
A4 SDA
A5 SCL

Hardware I²C disebut:
TWI (Two Wire Interface)

1️⃣3️⃣ Arduino I²C (Wire Library) Functions

Library utama:

#include <Wire.h>

Fungsi penting:

Fungsi Keterangan
Wire.begin() Start I²C
Wire.begin(address) Start sebagai slave
Wire.beginTransmission(addr) Mulai kirim
Wire.write(data) Kirim data
Wire.endTransmission() Stop
Wire.requestFrom(addr, byte) Minta data
Wire.read() Baca data

1️⃣4️⃣ Example

Contoh: Master Kirim Data ke Slave

Program Master

#include <Wire.h>

void setup() {
Wire.begin();
}

void loop() {
Wire.beginTransmission(0x08);
Wire.write("BISA_IOTI");
Wire.endTransmission();
delay(1000);
}

Program Slave

#include <Wire.h>

void setup() {
Wire.begin(0x08);
Wire.onReceive(receiveEvent);
Serial.begin(9600);
}

void receiveEvent(int bytes) {
while (Wire.available()) {
char c = Wire.read();
Serial.print(c);
}
}

void loop() {}

🏭 APLIKASI INDUSTRI

I²C banyak digunakan untuk:

  • Sensor suhu
  • EEPROM
  • RTC
  • Display OLED
  • Internal board communication

Namun dalam sistem PLC industri:

  • I²C jarang digunakan untuk jarak jauh
  • Biasanya hanya internal board

📌 Kesimpulan

I²C adalah:

✔ Sederhana
✔ Hemat kabel
✔ Cocok komunikasi jarak dekat
✔ Mendukung banyak device

Namun:

✖ Tidak cocok jarak jauh
✖ Lebih lambat dari SPI

PRAKTIKUM KOMUNIKASI I²C MENGGUNAKAN ARDUINO UNO

Related Articles