📘 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:
-
-
Master menulis data ke slave
-
Master membaca data dari slave
-
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):
Karena 7-bit addressing, yang dikirim:
(MSB dikirim terlebih dahulu)
③ Write Bit (R/W = 0)
Bit ke-8 adalah:
Jadi 8 bit pertama yang dikirim master:
(7-bit address + write bit)
④ ACK Bit
Slave mengirim:
Artinya alamat dikenali.
⑤ 8-bit Data (0x65)
Konversi:
Data dikirim MSB → LSB.
⑥ ACK Setelah Data
Slave kembali mengirim:
Artinya data diterima.
⑦ Stop Condition
SCL HIGH
SDA: LOW → HIGH
Komunikasi selesai.
🔁 Ringkasan Frame 1
🔹 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:
③ Read Bit (R/W = 1)
Karena membaca:
8 bit pertama:
④ ACK dari Slave
Slave merespon:
⑤ Data Dikirim Slave (0x66)
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
🔹 3️⃣ DSO Output (Master kirim 0x7B ke Slave 0x33)
Ini adalah contoh capture osiloskop.
📌 Informasi:
-
-
Address = 0x33
-
Data = 0x7B
-
Operasi = Write
-
① Address 0x33
Konversi:
7-bit:
② Write Bit = 0
Maka 8 bit pertama:
③ Data 0x7B
Konversi:
④ 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:
🧠 KESIMPULAN DARI KETIGA FRAME
-
-
Setiap komunikasi diawali Start
-
7-bit address selalu dikirim dulu
-
Bit ke-8 menentukan arah komunikasi
-
Setiap byte selalu diikuti ACK
-
9 clock pulse per 1 byte transfer
-
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:
- Set START bit
- Kirim slave address
- Tunggu ACK
- Kirim data
- 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








