Apr 21

Protokol Komunikasi I2C (Inter IC Bus) atau TWI (Two Wire Interface)

Pendahuluan

I2C merupakan bus standar yang didesain oleh Philips pada awal tahun 1980an untuk memudahkan komunikasi antar komponen yang tersebar pada papan rangkaian. I2C merupakan singkatan dari Inter IC atau komunikasi antar IC, sering disebut juga IIC atau I2C. Pada awalnya, kecepatan komunikasi maksimumnya diset pada 100kbps karena pada awalnya kecepatan tinggi belum dibutuhkan pada transmisi data. Untuk yang membutuhkan kecepatan tinggi, ada mode 400kbps dan sejak 1998 ada mode kecepatan tinggi 3,4Mbps. I2C tidak hanya digunakan pada komponen yang terletak pada satu board, tetapi juga digunakan untuk mengkoneksikan komponen yang dihubungkan melalui kabel.

Kesederhanaan dan fleksibilitas merupakan ciri utama dari I2C, kedua hal tersebut membuat bus ini mampu menarik penggunaanya dalam berbagai aplikasi. Fitur-fitur signifikan dari bus ini adalah :

-        hanya 2 jalur/kabel yang dibutuhkan

-        tidak ada aturan baud rate yang ketat seperti pada RS232, di bus ini IC yang berperan sebagai master akan mengeluarkan bus clock

-        Hubungan master/slave berlaku antara komponen satu dengan yang lain, setiap perangkat yang terhubung dengan bus mempunyai alamat unik yang diset melalui software

-        IC yang berperan sebagai master mengontrol seluruh jalur komunikasi dengan mengatur clock dan menentukan siapa yang menggunakan jalur komunikasi. Jadi IC yang berperan sebagai slave tidak akan mengirim data kalau tidak diperintah oleh Master.

-        I2C merupakan bus yang mendukung multi-master yang mempunyai kemampuan arbitrasi dan pendeteksi tabrakan data.

Mekanisme Hubungan Antar Komponen

I2C hanya membutuhkan dua jalur/kabel yaitu SDA dan SCL. SCL/serial clock merupakan jalur clock, digunakan untuk mensinkronkan data transfer antara Master dan Slave dalam I2C bus. SDA/Serial Data merupakan jalur komunikasi data dua arah. SDA dan SCL dihubungkan ke seluruh komponen dalam bus  I2C. Selain kedua jalur/kabel masih ada jalur/kabel ketiga yaitu Ground/0 volt serta jalus Vcc/5v untuk menghidupkan perangkat/komponen. Baik SDA maupun SCL merupakan tipe open drain. Maksud dari open drain adalah chip bisa membuat outputnya berlogika 0, tapi tidak bisa membuat outputnya berlogika 1. Sehingga agar mampu memberikan output 1, diperlukan pull up resistor yang dihubungkan ke suplai 5v. Jadi kita harus memberikan resistor pull up pada jalur SDA dan SCL yang ujung satunya dihubungkan ke 5v. Kita hanya memerlukan 1 buah resistor per jalur untuk seluruh I2C bus, tidak perlu satu-persatu untuk tiap perangkat. Ilustrasinya adalah sebagai berikut:

Nilai dari resistor tidak begitu berpengaruh. Dari referensi di internet, didapat bahwa ada yang memakai resistor dengan nilai mulai 1k8 (18000 ohms) sampai 47k (47000 ohms), untuk penulis sendiri, berdasar pengalaman cenderung memilih nilai 4k7 (4700ohm). Pemilihan nilai lain pun tidak masalah, asal masih dalam range tersebut karena berdasar I2C bus specification yang dirilis oleh NXP pada 2001, pull up device tergantung pada bus loads. Jika bus load mencapai 200pF, maka pull up devicenya bisa berupa resistor, juka bus load antara 200-400pF (fast mode) maka pull up device bisa berupa sumber arus (max 3mA) atau switched resistor circuit (silahkan lihat gambar dibawah untuk referensi). Jika kita tidak memberikan pull up device (resistor/sumber arus) maka jalur SDA dan SCL akan selalu berlogika rendah, hampir 0 volt, dan I2C bus tidak akan bekerja.

 

Masters dan Slave

Perangkat/komponen dalam bus I2C akan berperan sebagai Master atau Slave. Master merupakan komponen/perangkat yang mengontrol jalur clock dan siapa yang berhak menggunakan jalur data. Slave adalah komponen/perangkat yang merespon pada perintah Master dan tidak bisa mengambil inisiatif komunikasi. Jadi hanya master saja yang bisa mengambil inisiatif transfer data dalam I2C bus. I2C bus mendukung multiple slave dalam satu bus dengan hanya 1 master. Pada teorinya, sistem ini mendukung multiple master, tapi tidak akan dibahas karena jarang digunakan. Pada sistem seperti robot, Master adalah kontrolernya (mikrokontroler/mikroprosesor) dan slave adalah modul sensor seperti SRF08, CMPS03 atau modul RTC DS1307. Baik master maupun slave bisa mentransfer data melalui I2C bus, tetapi transfer hanya dikontrol oleh master.

 

Protokol Fisik I2C

Ketika master (kontroler) ingin berkomunikasi dengan slave, master akan mulai mengirim start sequence pada bus I2C. Start sequence adalah salah satu dari dua sequence spesial pada bus I2C, sekuens spesial lainnya adalah stop. Start sequence dan stop sequence merupakan tahap spesial dimana merupakan kondisi dimana SDA (jalur data) boleh berubah ketika SCL (jalur clock) dalam kondisi high (1). Start sequence menandai awal dari transaksi data dengan perangkat slave. Stop sequence menandai akhir transaksi data dengan perangkat slave.

 

Data ditransfer dalam rangkaian/sequence 8bit. Bit dikirim lewat jalur SDA dimulai dengan MSB (Most Significant Bit). Jalur SCL kemudian dipulsakan high(1) kemudian low(0). Tanpa pull-up device, chip tidak bisa mengubah line ke kondisi high (1). Untuk setiap 8 bit yang ditransfer, perangkat penerima data mengirim balik bit acknowledge (ack), jadi pada kenyataanya ada 9 clock SCL untuk tiap transfer dari 8 bit data. Jika perangkat penerima mengirim balik sebuah low ACK bit (ACK=0) maka perangkat tersebut telah menrima data dan siap menerima data berikutnya. Jika perangkat penerima mengirim balik high ACK bit (ACK=1) berarti perangkat tersebut tidak bisa lagi menerima data selanjutnya, sehingga master harus mengakhiri transfer data dengan mengirim stop sequence.

 

Seberapa Cepat?

Kecepatan serial clock (SCL) untuk I2C mencapai 100KHz.  Untuk yang membutuhkan kecepatan tinggi, ada fast mode dimana clock bisa mencapai 400Khz dan sejak 1998 ada mode kecepatan tinggi dimana clock bisa mencapai 3,4MHz. Untuk aplikasi seperti robot dan modul embedded yang non vital biasanya clock yang digunakan masih dibawah 100KHz. Berdasarkan I2C Specification terbaru yang dikeluarkan NXP/Phillips, untuk transmisi data pada clock diatas 1Mhz dibutuhkan delay beberapa uS diantara setiap byte yang ditransfer.

.

Pengalamatan Perangkat pada Bus I2C

Teorinya, alamat perangkat pada bus I2C bisa dalam format 7bit maupun 10bit. Namun, pengalamatan 10bit jarang digunakan dan tidak akan dibahas dalam makalah ini. Modul yang umum digunakan biasanya menggunakan alamat 7bit. Ini berarti anda bisa menggunakan sampai 128 perangkat dalam satu bus I2C, karena alamat 7 bit adalah angka dari 0 sampai 127. Ketika kita mengirim alamat 7 bit, kita tetap akan mengirim data 8 bit sesuai format pengiriman data dalam bus I2C. Bit sisa digunakan untuk menginformasikan pada slave apakah master akan menulis atau membaca ke perangkat slave tersebut. Jika bit sisa tersebut bernilai 0 maka master akan menulis ke slave. Jika bit sisa tersebut bernilai 1 maka master akan membaca data dari slave. Tujuh bit alamat akan ditempatkan pada 7 bit pertama dari data 8 bit sehingga bit Read/Write (R/W) terletak di LSB (Least Significant Bit)

Peletakan 7 bit alamat pada 7 bit awal dari data 8 bit biasanya menjadi sumber kebingungan pemula dalam memahami mekanisme pengalamatan dalam I2C. Contohnya jika kita ingin menulis pada alamat 21, kita harus mengirim 42 yang berarti 21 digeser 1 bit ke depan. Maka dari itu lebih mudah bagi kita untuk mengumpamakan bus I2C memiliki alamat 8 bit dimana alamat genap untuk menulis dan ganjil untuk membaca dari perangkat tersebut. Contohnya adalah pada CMPS03, untuk menulis digunakan alamat 0xC0 ($C0) dan 0xC1 ($C1) untuk membaca data darinya. Jadi bit R/W hanya akan membuat alamatnya hanya berbeda genap dan ganjil.

 

Protokol Software pada Bus I2C

Pada software (pemrograman) misal lewat bascom, codevision, win avr, ada perintah-perintah khusus untuk protokol I2C. Yang pertama dilakukan adalah master akan mengirim start sequence. Start sequence akan membuat semua perangkat slave bersiap mendengar perintah yang datang dari master. Kemudian master akan mengirim alamat perangkat yang dituju. Slave yang cocok dengan address yang dikirim oleh master akan melanjutkan ke transmisi berikutnya. Slave selain yang alamatnya cocok akan mengabaikan transmisi dari mater dan menunggu sampai alamatnya cocok. Setelah mendapatkan slave yang alamatnya cocok, master sekarang harus mengirim lokasi internal dari nomor register pada slave yang akan dibaca atau ditulis oleh master. Kita dapat mengetahui nomor registernya pada datasheet perangkat/modul. Contohnya CMPS03 mempunyai 16 lokasi (0-15) dan SRF08 mempunyai 36.

Setelah mendapat slave yang alamatnya cocok dan alamat internal register yang dituju, maka master dapat mulai mengirim data per 8bit (1 byte). Jika slave sudah mengacknowledged (ACK=0) setelah pengiriman 1 byte data, maka master dapat mengirim 1 byte data selanjutnya dan proses akan berulang. Data secara otomatis akan ditempatkan pada internal register selanjutnya (tidak menumpuk data yang sudah terkirim) karena slave akan mengincrement alamat register internal setelah menerima 1 byte data. Ketika master sudah selesai menulis seluruh data ke slave, maka master akan mengirim stop sequence yang mengakhiri transaksi data.

Jadi untuk menulis ke perangkat slave, urutannya adalah:

  1. Mengirim start sequence
  2. Mengirim alamat I2C dari slave dengan bit R/W low (alamat genap)
  3. Mengirim alamat dari internal register yang ingin ditulisi data
  4. Mengirim byte data
  5. Jika data belum tertulis semua, setelah Slave mengirim ACK=0 maka byte data berikutnya dikirim
  6. Mengirim stop sequence

Untuk contohnya adalah mengirim data ke SRF08, untuk memulai pengukuran jarak kita harus mengirim perintah 0x51 ke register perintah di alamat 0x00. Sehingga urutannya:

  1. Mengirim start sequence
  2. Mengirim 0xE0 (alamat I2C dari SRF08 dengan bit R/W low)
  3. Mengirim 0x00 (alamat dari register perintah internal)
  4. Mengirim 0x51 (perintah untuk memulai pengukuran jarak SRF08)
  5. Mengirim stop sequence

Membaca dari Slave

Untuk membaca dari slave, prosesnya sedikit lebih rumit. Sebelum membaca dari perangkat slave, kita harus memberitahu alamat register internal mana yang ingin kita baca. Jadi proses pembacaan dari slave juga akan diawali dengan menulis ke slave dahulu. Jadi awalnya sama saja, kita mengirim start sequence, alamat I2C dari slave dengan bit R/W low dan alamat internal register yang kita tulisi. Kemudian kita mengirim kembali sebuah start sequence (restart), kembali mengirim alamat I2C, kali ini dengan bit terakhir=1 (bit read) dan alamat internal register yang ingin kita baca. Kemudian kita membaca byte data sebanyak yang kita inginkan sampai kita mengakhiri transmisi dengan stop sequence.

Jadi untuk membaca arah kompas dalam bentuk byte dari modul CMPS03 urutannya adalah:

  1. Mengirim start sequence
  2. Mengirim 0xC0 ( alamat I2C dari CMPS03 dengan bit R/W low atau menulis)
  3. Mengirim 0x01 ( alamat register internal dari arah kompas)
  4. Mengirim start sequence lagi
  5. Mengirim 0xC1 ( alamat I2C dari CMPS03 dengan bit R/W high atau baca)
  6. Membaca byte data dari CMPS03
  7. Mengirim stop sequence

Catatan Penggunaan I2C dalam Komunikasi Antar Mikroprosesor

Pembahasan di halaman-halaman sebelumnya merupakan konsep dari komunikasi I2C. Contoh-contoh diatas kebanyakan adalah komunikasi antara kontroler/processor dengan modul. Ketika master membaca dari slave, slave menempatkan data pada jalur SDA, tapi clock dikontrol oleh master. Bagaimana jika slave tidak siap mengirim data? Untuk perangkat seperti EEPROM, Sensor, dan LCD, ini tidak akan menjadi masalah. Apabila kita ingin menggunakan protokol I2C untuk komunikasi antar mikroprocessor, kita akan menemui satu kendala. Mikroprosesor pada slave perlu masuk ke interrupt service routine, menyimpan data di registernya, dan mencari tahu alamat mana yang ingin dibaca master. Ini bisa membutuhkan waktu selama beberapa uS, sedangkan master tidak akan peduli dan tetap mengirim pulsa clock ke jalur SCL dan slave tidak akan bisa merespon. Protokol I2C memiliki solusi untuk hal ini.

Solusinya adalah slave diperbolehkan untuk menahan SCL pada logika low (0). Ini disebut clock stretching. Ketika slave mendapat perintah read dari master, slave akan menahan SCL pada logika low. Mikroprosesor kemudian mencarikan data yang diminta, menempatkannya pada register transmisi data, dan melepas jalur clock sehingga membuat pull-up resistor membuat jalur clock berlogika tinggi. Dari sudut pandang master, master akan mengirim pulsa clock read dengan membuat SCL high dan kemudian mengecek apakah SCL tetap high atau berubah menjadi low. Jika low, berarti slave menahannya dengan kata lain slave belum siap mengirim data  ke master sehingga master harus menunggu sampai SCL menjadi high sebelum meneruskan ke pembacaan data. Port I2C pada kebanyakan mikroprosesor mampu melakukan hal ini secara otomatis. Sayangnya, seringkali pada pemrograman, pengguna melupakan perlunya clock strecthing pada komunikasi antar mikroprosesor/kontroler sehingga komunikasi tidak terlaksana dengan baik.

 

Referensi

Phillips Semiconductor, THE I2C-BUS SPECIFICATION VERSION 2.1 JANUARY 2000, republished by NXP

http://www.i2c-bus.org/

http://www.robot-electronics.co.uk/acatalog/I2C_Tutorial.html

 

10 comments

Skip to comment form

    • tegeNo Gravatar on April 22, 2011 at 15:34
    • Reply

    wah ajari prim aku yg beginian :)

    nais buat tambah pengetahuan

    1. wekekekek, bentar yo contoh programe nanti tak post….basicnya simple cuman write dan read

    • deptzNo Gravatar on April 26, 2011 at 01:27
    • Reply

    opo iki ndan? hahaha

    1. wekekekeke, tugas kuliah dipost buat ngisi blog :D

    • omayibNo Gravatar on April 27, 2011 at 07:40
    • Reply

    ki nggo opo prim? aku og ra donk-donk sih.. (#tepukJidad)

    1. iki nggo ngakses sensor dsb
      PKM-e dewe nganggo iki akeh mas :hammer

    2. hahaha, iki salah satu fungsine nggo moco sensor :D
      PKM-e dewe akeh nganggo iki lo :hammer:

    • andiNo Gravatar on May 25, 2011 at 09:08
    • Reply

    mas kirimin contoh program I2C ke email saya ya mas!

    1. maaf, saya pakainya BASCOM AVR, kalau anda pakai BASCOM AVR, anda akan dapat sample program I2C di dalamnya, yang harus anda lakukan adalah membaca datasheet sensor/periferal yang akan anda akses, setiap jenis memiliki alamatnya masing-masing :)

    • samNo Gravatar on August 5, 2012 at 06:14
    • Reply

    mas sdh pernah pake srf 08? share dong mas.

Leave a Reply

Your email address will not be published.

[+] kaskus emoticons nartzco

Get Adobe Flash player Plugin by wpburn.com wordpress themes