Lompat ke isi

I2C-bus

Dari Wikipedia bahasa Indonesia, ensiklopedia bebas
I2C
Type Komunikasi serial bus
Production history
Designer Philips Semiconductors
(sekarang NXP Semiconductors)
Designed 1980; 46 tahun lalu (1980)[1]
Data
Data signal Kolektor-terbuka atau penguras-terbuka
Width 1-bit (SDA) dengan jam terpisah (SCL)
Bitrate 0.1, 0.4, 1.0, 3.4 atau 5,0 Mbit/s tergantung pada mode
Protocol Serial, half-duplex
Pinout
SDA Pin Data
SCL Pin Jam

I2C (Inter-Integrated Circuit; diucapkan sebagai"eye-squared-see" atau "eye-two-see"), secara alternatif dikenal sebagai I2C dan IIC, adalah sinkron, multi-master/multi-slave, ujung-tunggal, komunikasi serial bus yang diciptakan pada tahun 1980 oleh Philips Semiconductors (sekarang NXP Semiconductors).[1] Ini banyak digunakan untuk memasang sirkuit terintegrasi (IC) periferal berkecepatan lebih rendah ke prosesor dan mikrokontroler dalam komunikasi intra-papan jarak pendek.

Dalam Paten Eropa EP0051332B1 Ad P.M.M. Moelands dan Herman Schutte disebutkan sebagai penemu bus I2C. Keduanya bekerja pada tahun 1980 sebagai insinyur pengembangan di laboratorium aplikasi pusat CAB Philips di Eindhoven di mana bus I2C dikembangkan sebagai "Sistem bus dua-kabel yang terdiri dari kabel jam dan kabel data untuk menghubungkan sejumlah stasiun". Paten AS diberikan dengan nomor US 4689740A . Nama pengembangan internal bus pada awalnya adalah COMIC, yang kemudian diubah menjadi I2C. Paten tersebut dialihkan oleh kedua pria tersebut ke Koninklijke Philips NV.

Bus I2C dapat ditemukan dalam berbagai aplikasi elektronik di mana kesederhanaan dan biaya produksi yang rendah lebih penting daripada kecepatan. Komponen dan sistem PC yang melibatkan I2C meliputi deteksi keberadaan serial (SPD) EEPROM pada modul memori dalam-baris ganda (DIMM) dan Data Identifikasi Tampilan Diperluas (EDID) untuk monitor melalui konektor VGA, DVI, dan HDMI. Aplikasi I2C yang umum termasuk membaca monitor perangkat keras, sensor, jam waktu nyata, mengendalikan aktuator, mengakses DAC dan ADC berkecepatan rendah, mengendalikan layar LCD atau OLED sederhana, mengubah pengaturan tampilan komputer (misalnya, lampu latar, kontras, rona, keseimbangan warna) melalui Display Data Channel, dan mengubah volume pengeras suara.

Kekuatan khusus I2C adalah kemampuan mikrokontroler untuk mengendalikan jaringan chip perangkat hanya dengan dua pin I/O tujuan umum. Banyak teknologi bus lain yang digunakan dalam aplikasi serupa, seperti Bus Antarmuka Periferal Serial (SPI), memerlukan lebih banyak pin dan sinyal untuk menghubungkan banyak perangkat.

System Management Bus (SMBus), yang didefinisikan oleh Intel dan Duracell pada tahun 1994, adalah subset dari I2C, mendefinisikan penggunaan yang lebih ketat. Salah satu tujuan SMBus adalah untuk meningkatkan kekokohan dan interoperabilitas. Karenanya, sistem I2C modern menggabungkan beberapa kebijakan dan aturan dari SMBus, terkadang mendukung I2C dan SMBus, hanya memerlukan konfigurasi ulang minimal baik melalui perintah atau penggunaan pin output. Manajemen sistem untuk sistem PC menggunakan SMBus yang pinnya dialokasikan di konektor PCI dan PCI Express konvensional.

Microchip MCP23008 8-bit I2C I/O expander dalam paket DIP-18[2]

Terminologi

[sunting | sunting sumber]

Paten dan spesifikasi I2C menggunakan istilah master/slave antara tahun 1980 dan 2021.[1][3] Pada tahun 2021, revisi 7 dari spesifikasi I2C mengubah istilah menjadi controller/target (pengontrol/target).[3][4] Definisi teknis perangkat tersebut, dan peran mereka pada bus I2C, tetap tidak berubah.[4]

Contoh skema dengan satu pengontrol (sebuah mikrokontroler), tiga node target (sebuah ADC, sebuah DAC, dan sebuah mikrokontroler), dan resistor pull-up Rp

I2C hanya menggunakan dua sinyal: jalur data serial (SDA) dan jalur jam serial (SCL). Keduanya adalah dua arah dan ditarik tinggi (pulled up) dengan resistor.[3] Tegangan khas yang digunakan adalah +5 V atau +3.3 V, meskipun sistem dengan tegangan lain diperbolehkan.

Desain referensi I2C memiliki ruang alamat 7-bit, dengan ekstensi 10-bit yang jarang digunakan.[5] Kecepatan bus I2C yang umum adalah mode standar 100 kbit/s dan mode cepat 400 kbit/s. Ada juga mode kecepatan rendah 10 kbit/s, tetapi frekuensi jam yang sangat rendah juga diperbolehkan. Revisi I2C selanjutnya dapat menampung lebih banyak node dan berjalan pada kecepatan yang lebih cepat (mode cepat 400 kbit/s, mode cepat plus 1 Mbit/s, mode kecepatan tinggi 3.4 Mbit/s, dan mode ultra-cepat 5 Mbit/s). Kecepatan ini lebih banyak digunakan pada sistem tertanam daripada pada PC.

Perhatikan bahwa laju bit dikutip untuk transfer antara pengontrol (master) dan target (slave) tanpa peregangan jam (clock stretching) atau overhead perangkat keras lainnya. Overhead protokol mencakup alamat target dan mungkin alamat register di dalam perangkat target, serta bit ACK/NACK per-byte. Dengan demikian, laju transfer data pengguna yang sebenarnya lebih rendah daripada yang disiratkan oleh laju bit puncak itu sendiri. Misalnya, jika setiap interaksi dengan target secara tidak efisien hanya memungkinkan 1 byte data untuk ditransfer, laju data akan kurang dari setengah laju bit puncak.

Jumlah node yang dapat ada pada bus I2C tertentu dibatasi oleh ruang alamat dan juga oleh total kapasitansi bus sebesar 400 pF, yang membatasi jarak komunikasi praktis hingga beberapa meter. Impedansi yang relatif tinggi dan kekebalan kebisingan yang rendah memerlukan potensial ground yang umum, yang sekali lagi membatasi penggunaan praktis untuk komunikasi di dalam papan PC yang sama atau sistem papan kecil.

Mode I2C
Mode[3] Kecepatan
maksimum
Kapasitansi
maksimum
Penggerak (Drive) Arah
Mode standar (Sm) 100 kbit/s 400 pF Penguras terbuka* Dua arah
Mode cepat (Fm) 400 kbit/s 400 pF Penguras terbuka* Dua arah
Mode cepat plus (Fm+) 1 Mbit/s 550 pF Penguras terbuka* Dua arah
Mode kecepatan tinggi (Hs) 1.7 Mbit/s 400 pF Penguras terbuka* Dua arah
Mode kecepatan tinggi (Hs) 3.4 Mbit/s 100 pF Penguras terbuka* Dua arah
Mode ultra-cepat (UFm) 5 Mbit/s ? Tarik-dorong Satu arah

Desain referensi

[sunting | sunting sumber]

Desain referensi yang disebutkan di atas adalah bus dengan jam (SCL) dan jalur data (SDA) dengan pengalamatan 7-bit. Bus memiliki dua peran untuk node, yaitu pengontrol (master) atau target (slave):

  • Node pengontrol (master): Node yang menghasilkan jam dan memulai komunikasi dengan target (slave).
  • Node target (slave): Node yang menerima jam dan merespons ketika dialamatkan oleh pengontrol (master).

Bus adalah bus multi-pengontrol, yang berarti sejumlah node pengontrol dapat hadir. Selain itu, peran pengontrol dan target dapat diubah antara pesan (setelah STOP dikirim).

Mungkin ada empat mode operasi potensial untuk perangkat bus tertentu, meskipun sebagian besar perangkat hanya menggunakan satu peran dan dua modenya:

  • Transmisi pengontrol (master): Node pengontrol mengirim data ke target (slave).
  • Penerimaan pengontrol (master): Node pengontrol menerima data dari target (slave).
  • Transmisi target (slave): Node target mengirim data ke pengontrol (master).
  • Penerimaan target (slave): Node target menerima data dari pengontrol (master).

Selain bit data 0 dan 1, bus I2C memungkinkan sinyal START dan STOP khusus, yang bertindak sebagai pembatas pesan dan berbeda dari bit data. (Ini berbeda dengan bit mulai dan bit henti yang digunakan dalam komunikasi serial asinkron, yang dibedakan dari bit data hanya berdasarkan waktunya.)

Pengontrol awalnya berada dalam mode transmisi pengontrol dengan mengirimkan START diikuti oleh alamat 7-bit dari target yang ingin dikomunikasikan, yang akhirnya diikuti oleh satu bit yang menunjukkan apakah ia ingin menulis (0) ke atau membaca (1) dari target.

Jika target ada di bus, maka ia akan merespons dengan bit ACK (aktif rendah untuk diakui) untuk alamat tersebut. Pengontrol kemudian melanjutkan dalam mode transmisi atau penerimaan (sesuai dengan bit baca/tulis yang dikirimnya), dan target melanjutkan dalam mode komplementer (penerimaan atau transmisi, masing-masing).

Alamat dan byte data dikirimkan bit paling signifikan terlebih dahulu. Kondisi mulai ditunjukkan oleh transisi tinggi-ke-rendah SDA saat SCL tinggi; kondisi berhenti ditunjukkan oleh transisi rendah-ke-tinggi SDA saat SCL tinggi. Semua transisi SDA lainnya terjadi saat SCL rendah.

Jika pengontrol ingin menulis ke target, maka ia berulang kali mengirim byte dengan target mengirimkan bit ACK. (Dalam situasi ini, pengontrol berada dalam mode transmisi pengontrol, dan target berada dalam mode penerimaan target.)

Jika pengontrol ingin membaca dari target, maka ia berulang kali menerima byte dari target, pengontrol mengirimkan bit ACK setelah setiap byte kecuali yang terakhir. (Dalam situasi ini, pengontrol berada dalam mode penerimaan pengontrol, dan target berada dalam mode transmisi target.)

Sebuah transaksi I2C dapat terdiri dari beberapa pesan. Pengontrol mengakhiri pesan dengan kondisi STOP jika ini adalah akhir dari transaksi atau ia dapat mengirim kondisi START lain untuk mempertahankan kendali bus untuk pesan lain (transaksi "format gabungan").

Protokol pesan

[sunting | sunting sumber]

I2C mendefinisikan jenis transaksi dasar, yang masing-masing dimulai dengan START dan diakhiri dengan STOP:

  • Pesan tunggal di mana pengontrol (master) menulis data ke target (slave).
  • Pesan tunggal di mana pengontrol (master) membaca data dari target (slave).
  • Format gabungan, di mana pengontrol (master) mengeluarkan setidaknya dua pembacaan atau penulisan ke satu atau lebih target (slave).

Dalam transaksi gabungan, setiap pembacaan atau penulisan dimulai dengan START dan alamat target. Kondisi START setelah yang pertama juga disebut bit START berulang. START berulang tidak didahului oleh kondisi STOP, yang merupakan cara target mengetahui bahwa pesan berikutnya adalah bagian dari transaksi yang sama.

Target tertentu hanya akan menanggapi pesan tertentu, sebagaimana ditentukan dalam dokumentasi produknya.

Sistem I2C murni mendukung struktur pesan arbitrer. SMBus dibatasi pada sembilan struktur tersebut, seperti read word N dan write word N, yang melibatkan satu target. PMBus memperluas SMBus dengan protokol Group, yang memungkinkan beberapa transaksi SMBus tersebut dikirim dalam satu pesan gabungan. STOP yang mengakhiri menunjukkan kapan tindakan yang dikelompokkan tersebut harus berlaku. Misalnya, satu operasi PMBus dapat mengkonfigurasi ulang tiga catu daya (menggunakan tiga alamat target I2C yang berbeda), dan konfigurasi baru mereka akan berlaku pada saat yang sama: ketika mereka menerima STOP tersebut.

Dengan hanya beberapa pengecualian, baik I2C maupun SMBus tidak mendefinisikan semantik pesan, seperti arti byte data dalam pesan. Semantik pesan dengan demikian spesifik produk. Pengecualian tersebut termasuk pesan yang dialamatkan ke alamat panggilan umum I2C (0x00) atau ke Alamat Respons Peringatan SMBus; dan pesan yang terlibat dalam Protokol Resolusi Alamat (ARP) SMBus untuk alokasi dan manajemen alamat dinamis.

Dalam praktiknya, sebagian besar target mengadopsi model kontrol permintaan-respons, di mana satu atau lebih byte yang mengikuti perintah tulis diperlakukan sebagai perintah atau alamat. Byte-byte tersebut menentukan bagaimana byte yang ditulis selanjutnya diperlakukan atau bagaimana target merespons pada pembacaan berikutnya. Sebagian besar operasi SMBus melibatkan perintah satu byte.

Contoh pengiriman pesan: 24C32 EEPROM

[sunting | sunting sumber]
STMicroelectronics M24C08-BN6: EEPROM serial dengan bus I2C[6]

Salah satu contoh spesifik adalah EEPROM tipe 24C32, yang menggunakan dua byte permintaan yang disebut Address High dan Address Low. (Karenanya, EEPROM ini tidak dapat digunakan oleh host SMBus murni, yang hanya mendukung perintah atau alamat satu byte.) Byte-byte ini digunakan untuk mengalamatkan byte di dalam ruang alamat EEPROM 32 kbit (atau 4 kB). Pengalamatan dua byte yang sama juga digunakan oleh EEPROM yang lebih besar, seperti 24C512 yang menyimpan 512 kbit (atau 64 kB). Menulis data ke dan membaca dari EEPROM ini menggunakan protokol sederhana: alamat ditulis, dan kemudian data ditransfer hingga akhir pesan. Bagian transfer data dari protokol dapat menyebabkan masalah pada SMBus, karena byte data tidak didahului oleh hitungan, dan lebih dari 32 byte dapat ditransfer sekaligus. EEPROM I2C yang lebih kecil dari 32 kbit, seperti 2 kbit 24C02, sering digunakan pada SMBus dengan transfer data satu byte yang tidak efisien untuk mengatasi masalah ini.

Satu pesan tunggal menulis ke EEPROM. Setelah START, pengontrol mengirimkan alamat bus chip dengan bit arah dibersihkan (tulis), kemudian mengirimkan alamat dua byte data di dalam EEPROM dan kemudian mengirimkan byte data untuk ditulis dimulai pada alamat tersebut, diikuti oleh STOP. Saat menulis beberapa byte, semua byte harus berada di halaman 32 byte yang sama. Sementara sibuk menyimpan byte-byte tersebut ke memori, EEPROM tidak akan menanggapi permintaan I2C lebih lanjut. (Itu adalah ketidakcocokan lain dengan SMBus: perangkat SMBus harus selalu menanggapi alamat bus mereka.)

Untuk mulai membaca pada alamat tertentu di EEPROM, digunakan pesan gabungan. Setelah START, pengontrol pertama-tama menulis alamat bus chip tersebut dengan bit arah dibersihkan (tulis) dan kemudian dua byte alamat data EEPROM. Kemudian mengirimkan START (berulang) dan alamat bus EEPROM dengan bit arah diatur (baca). EEPROM kemudian akan merespons dengan byte data dimulai pada alamat data EEPROM yang ditentukan — pesan gabungan: pertama tulis, lalu baca. Pengontrol mengeluarkan ACK setelah setiap byte baca kecuali byte terakhir, dan kemudian mengeluarkan STOP. EEPROM menambah alamat setelah setiap byte data ditransfer; pembacaan multi-byte dapat mengambil seluruh konten EEPROM menggunakan satu pesan gabungan.

Lapisan fisik

[sunting | sunting sumber]
Bus I2C: Rp adalah resistor pull-up, Rs adalah resistor seri opsional.[3]

Pada lapisan fisik, kedua jalur SCL dan SDA adalah desain bus penguras-terbuka (MOSFET) atau kolektor-terbuka (BJT), sehingga resistor pull-up diperlukan untuk setiap jalur. Logika "0" dikeluarkan dengan menarik jalur ke ground, dan logika "1" dikeluarkan dengan membiarkan jalur mengambang (output impedansi tinggi) sehingga resistor pull-up menariknya tinggi. Sebuah jalur tidak pernah secara aktif didorong tinggi. Pengkabelan ini memungkinkan banyak node untuk terhubung ke bus tanpa korsleting dari persaingan sinyal. Sistem berkecepatan tinggi (dan beberapa lainnya) dapat menggunakan sumber arus alih-alih resistor untuk menarik tinggi hanya SCL atau SCL dan SDA, untuk mengakomodasi kapasitansi bus yang lebih tinggi dan memungkinkan waktu naik yang lebih cepat.

Konsekuensi penting dari hal ini adalah bahwa banyak node dapat menggerakkan jalur secara bersamaan. Jika salah satu node menggerakkan jalur rendah, jalur akan menjadi rendah. Node yang mencoba mengirimkan logika satu (yaitu membiarkan jalur mengambang tinggi) dapat mendeteksi ini dan menyimpulkan bahwa node lain aktif pada saat yang sama.

Ketika digunakan pada SCL, ini disebut peregangan jam (clock stretching) dan merupakan mekanisme kontrol aliran untuk target. Ketika digunakan pada SDA, ini disebut arbitrasi dan memastikan bahwa hanya ada satu pemancar pada satu waktu.

Saat diam, kedua jalur berada pada level tinggi. Untuk memulai transaksi, SDA ditarik rendah saat SCL tetap tinggi. Adalah ilegal[3]:14 untuk mengirimkan penanda berhenti dengan melepaskan SDA untuk mengambang tinggi lagi (meskipun "pesan batal" seperti itu biasanya tidak berbahaya), jadi langkah selanjutnya adalah menarik SCL rendah.

Kecuali untuk sinyal mulai dan berhenti, jalur SDA hanya berubah saat jam rendah; mengirimkan bit data terdiri dari memberi pulsa pada jalur jam tinggi sambil menahan jalur data stabil pada level yang diinginkan.

Sementara SCL rendah, pemancar (awalnya pengontrol) mengatur SDA ke nilai yang diinginkan dan (setelah penundaan kecil untuk membiarkan nilai menyebar) membiarkan SCL mengambang tinggi. Pengontrol kemudian menunggu SCL benar-benar menjadi tinggi; ini akan tertunda oleh waktu naik sinyal SCL yang terbatas ( konstanta waktu RC dari resistor pull-up dan kapasitansi parasit bus) dan dapat tertunda lebih lanjut oleh peregangan jam target.

Setelah SCL tinggi, pengontrol menunggu waktu minimum (4 μs untuk I2C kecepatan standar) untuk memastikan bahwa penerima telah melihat bit tersebut, kemudian menariknya rendah lagi. Ini menyelesaikan transmisi satu bit.

Setelah setiap 8 bit data dalam satu arah, bit "pengakuan" ditransmisikan ke arah lain. Pemancar dan penerima bertukar peran untuk satu bit, dan penerima asli mengirimkan satu bit "0" (ACK) kembali. Jika pemancar melihat bit "1" (NACK), ia mengetahui bahwa:

  • (Jika pengontrol mengirim ke target) Target tidak dapat menerima data. Tidak ada target seperti itu, perintah tidak dipahami, atau tidak dapat menerima data lagi.
  • (Jika target mengirim ke pengontrol) Pengontrol ingin transfer berhenti setelah byte data ini.

Hanya jalur SDA yang berubah arah selama bit pengakuan; SCL selalu dikendalikan oleh pengontrol.

Setelah bit pengakuan, jalur jam rendah dan pengontrol dapat melakukan salah satu dari tiga hal:

  • Mulai mentransfer byte data lain: pemancar mengatur SDA, dan pengontrol memberi pulsa SCL tinggi.
  • Kirim "Stop": Atur SDA rendah, biarkan SCL menjadi tinggi, lalu biarkan SDA menjadi tinggi. Ini melepaskan bus I2C.
  • Kirim "Repeated start": Atur SDA tinggi, biarkan SCL menjadi tinggi, lalu tarik SDA rendah lagi. Ini memulai pesan bus I2C baru tanpa melepaskan bus.

Peregangan jam menggunakan SCL

[sunting | sunting sumber]

Salah satu fitur yang lebih penting dari protokol I2C adalah peregangan jam. Perangkat target yang dialamatkan dapat menahan jalur jam (SCL) rendah setelah menerima (atau mengirim) byte, menunjukkan bahwa ia belum siap untuk memproses lebih banyak data. Pengontrol yang berkomunikasi dengan target mungkin tidak menyelesaikan transmisi bit saat ini, tetapi harus menunggu sampai jalur jam benar-benar menjadi tinggi. Jika target meregangkan jam, jalur jam akan tetap rendah (karena koneksinya adalah penguras-terbuka). Hal yang sama berlaku jika pengontrol kedua, yang lebih lambat, mencoba menggerakkan jam pada saat yang sama. (Jika ada lebih dari satu pengontrol, semua kecuali satu biasanya akan kehilangan arbitrase.)

Pengontrol harus menunggu sampai ia mengamati jalur jam menjadi tinggi, dan waktu minimal tambahan (4 μs untuk I2C 100 kbit/s standar) sebelum menarik jam rendah lagi.

Meskipun pengontrol juga dapat menahan jalur SCL rendah selama yang diinginkannya (ini tidak diizinkan sejak Revisi 6 dari protokol – subbagian 3.1.1), istilah "peregangan jam" biasanya hanya digunakan ketika target melakukannya. Meskipun secara teori setiap pulsa jam dapat diregangkan, umumnya interval sebelum atau sesudah bit pengakuan yang digunakan. Misalnya, jika target adalah mikrokontroler, antarmuka I2C-nya dapat meregangkan jam setelah setiap byte, hingga perangkat lunak memutuskan apakah akan mengirim pengakuan positif atau NACK.

Peregangan jam adalah satu-satunya saat di I2C di mana target menggerakkan SCL. Banyak target tidak perlu meregangkan jam dan dengan demikian memperlakukan SCL sebagai input murni tanpa sirkuit untuk menggerakkannya. Beberapa pengontrol, seperti yang ditemukan di dalam ASIC kustom mungkin tidak mendukung peregangan jam; seringkali perangkat ini akan dilabeli sebagai "antarmuka dua-kabel" dan bukan I2C.

Untuk memaksimalkan throughput bus, SMBus membatasi seberapa jauh jam dapat diregangkan. Host dan target yang mematuhi batas-batas tersebut tidak dapat memblokir akses ke bus selama lebih dari waktu singkat, yang bukan jaminan yang dibuat oleh sistem I2C murni.

Arbitrase menggunakan SDA

[sunting | sunting sumber]

Setiap pengontrol memantau bus untuk bit mulai dan berhenti dan tidak memulai pesan saat pengontrol lain menjaga bus sibuk. Namun, dua pengontrol dapat memulai transmisi pada waktu yang hampir bersamaan; dalam hal ini, arbitrase terjadi. Mode transmisi target juga dapat diarbitrasi, ketika pengontrol mengalamatkan banyak target, tetapi ini kurang umum. Berbeda dengan protokol (seperti Ethernet) yang menggunakan penundaan pengulangan acak sebelum mengeluarkan percobaan ulang, I2C memiliki kebijakan arbitrase deterministik. Setiap pemancar memeriksa level jalur data (SDA) dan membandingkannya dengan level yang diharapkannya; jika tidak cocok, pemancar itu telah kehilangan arbitrase dan keluar dari interaksi protokol ini.

Jika satu pemancar mengatur SDA ke 1 (tidak menggerakkan sinyal) dan pemancar kedua mengaturnya ke 0 (tarik ke ground), hasilnya adalah jalur menjadi rendah. Pemancar pertama kemudian mengamati bahwa level jalur berbeda dari yang diharapkan dan menyimpulkan bahwa node lain sedang mengirim. Node pertama yang melihat perbedaan seperti itu adalah node yang kalah arbitrase: ia berhenti menggerakkan SDA. Jika itu adalah pengontrol, ia juga berhenti menggerakkan SCL dan menunggu STOP; kemudian ia dapat mencoba mengeluarkan kembali seluruh pesannya. Sementara itu, node lain belum melihat perbedaan antara level yang diharapkan dan aktual pada SDA dan oleh karena itu melanjutkan transmisi. Ia dapat melakukannya tanpa masalah karena sejauh ini sinyalnya persis seperti yang diharapkannya; tidak ada pemancar lain yang mengganggu pesannya.

Jika kedua pengontrol mengirim pesan ke dua target yang berbeda, yang mengirim alamat target yang lebih rendah selalu "memenangkan" arbitrase pada tahap alamat. Karena kedua pengontrol dapat mengirim pesan ke alamat target yang sama, dan alamat terkadang merujuk ke banyak target, arbitrase terkadang harus berlanjut ke tahap data.

Arbitrase terjadi sangat jarang, tetapi diperlukan untuk dukungan multi-pengontrol yang tepat. Seperti halnya peregangan jam, tidak semua perangkat mendukung arbitrase. Mereka yang mendukung, umumnya melabeli diri mereka sebagai mendukung komunikasi "multi-pengontrol".

Satu kasus yang harus ditangani dengan hati-hati dalam implementasi I2C multi-pengontrol adalah kasus di mana pengontrol berbicara satu sama lain. Satu pengontrol dapat kehilangan arbitrase ke pesan masuk, dan harus mengubah perannya dari pengontrol menjadi target pada waktunya untuk mengakui alamatnya sendiri.

Dalam kasus yang sangat jarang terjadi di mana dua pengontrol secara bersamaan mengirim pesan yang identik, keduanya akan menganggap komunikasi berhasil, tetapi target hanya akan melihat satu pesan. Untuk alasan ini, ketika target dapat diakses oleh banyak pengontrol, setiap perintah yang dikenali oleh target harus idempotent atau harus dijamin tidak pernah dikeluarkan oleh dua pengontrol pada saat yang sama. (Misalnya, perintah yang dikeluarkan oleh hanya satu pengontrol tidak perlu idempotent, juga tidak perlu bagi perintah tertentu untuk menjadi idempotent ketika beberapa mekanisme pengecualian bersama memastikan bahwa hanya satu pengontrol yang dapat menyebabkan perintah itu dikeluarkan pada waktu tertentu.)

Arbitrase dalam SMBus

[sunting | sunting sumber]

Sementara I2C hanya melakukan arbitrase antara pengontrol, SMBus menggunakan arbitrase dalam tiga konteks tambahan, di mana banyak target merespons pengontrol, dan satu berhasil mengirimkan pesannya.

  • Meskipun secara konseptual merupakan bus pengontrol tunggal, perangkat target yang mendukung "protokol pemberitahuan host" bertindak sebagai pengontrol untuk melakukan pemberitahuan. Ia merebut bus dan menulis pesan 3-byte ke alamat "SMBus Host" yang dicadangkan (0x08), meneruskan alamatnya dan dua byte data. Ketika dua target mencoba memberi tahu host pada saat yang sama, salah satunya akan kalah arbitrase dan perlu mencoba lagi.
  • Sistem pemberitahuan target alternatif menggunakan sinyal SMBALERT# yang terpisah untuk meminta perhatian. Dalam hal ini, host melakukan pembacaan 1-byte dari "Alamat Respons Peringatan SMBus" yang dicadangkan (0x0C), yang merupakan semacam alamat siaran. Semua target yang memberi peringatan merespons dengan byte data yang berisi alamat mereka sendiri. Ketika target berhasil mengirimkan alamatnya sendiri (memenangkan arbitrase melawan yang lain) ia berhenti menaikkan interupsi itu. Dalam kasus ini dan kasus sebelumnya, arbitrase memastikan bahwa pesan satu target akan diterima, dan yang lain akan tahu bahwa mereka harus mencoba lagi.
  • SMBus juga mendukung "protokol resolusi alamat", di mana perangkat mengembalikan "Pengidentifikasi Perangkat Unik" (UDID) 16-byte. Banyak perangkat dapat merespons; yang dengan UDID terendah akan memenangkan arbitrase dan dikenali.

Arbitrase dalam PMBus

[sunting | sunting sumber]

PMBus versi 1.3 memperluas protokol respons peringatan SMBus dalam protokol "zone read" (baca zona)-nya.[7] Target dapat dikelompokkan ke dalam "zona", dan semua target dalam zona dapat dialamatkan untuk merespons, dengan respons mereka ditutupi (menghilangkan informasi yang tidak diinginkan), dibalik (sehingga informasi yang diinginkan dikirim sebagai bit 0, yang memenangkan arbitrase), atau diurutkan ulang (sehingga informasi yang paling signifikan dikirim terlebih dahulu). Arbitrase memastikan bahwa respons dengan prioritas tertinggi adalah yang pertama dikembalikan ke pengontrol.

PMBus mencadangkan alamat I2C 0x28 dan 0x37 untuk masing-masing pembacaan zona dan penulisan zona.

Perbedaan antar mode

[sunting | sunting sumber]

Ada beberapa mode operasi yang mungkin untuk komunikasi I2C. Semua kompatibel karena mode standar 100 kbit/s selalu dapat digunakan, tetapi menggabungkan perangkat dengan kemampuan berbeda pada bus yang sama dapat menyebabkan masalah, sebagai berikut:

  • Mode cepat sangat kompatibel dan hanya memperketat beberapa parameter waktu untuk mencapai kecepatan 400 kbit/s. Mode cepat didukung secara luas oleh perangkat target I2C, sehingga pengontrol dapat menggunakannya selama mengetahui bahwa kapasitansi bus dan kekuatan pull-up memungkinkannya.
  • Mode cepat plus mencapai hingga 1 Mbit/s menggunakan driver yang lebih kuat (20 mA) dan pull-up untuk mencapai waktu naik dan turun yang lebih cepat. Kompatibilitas dengan perangkat mode standar dan mode cepat (dengan kemampuan pull-down 3 mA) dapat dicapai jika ada cara untuk mengurangi kekuatan pull-up saat berbicara dengan mereka.
  • Mode kecepatan tinggi (3.4 Mbit/s) kompatibel dengan perangkat I2C normal pada bus yang sama, tetapi memerlukan pengontrol memiliki pull-up aktif pada jalur jam yang diaktifkan selama transfer kecepatan tinggi. Bit data pertama ditransfer dengan tepi jam naik penguras terbuka normal, yang dapat diregangkan. Untuk tujuh bit data yang tersisa, dan ACK, pengontrol menggerakkan jam tinggi pada waktu yang tepat dan target tidak boleh meregangkannya. Semua transfer kecepatan tinggi didahului oleh "kode pengontrol" satu byte pada kecepatan cepat atau standar. Kode ini melayani tiga tujuan:
    1. ia memberi tahu perangkat target kecepatan tinggi untuk beralih ke aturan waktu kecepatan tinggi,
    2. ia memastikan bahwa perangkat kecepatan cepat atau normal tidak akan mencoba berpartisipasi dalam transfer (karena tidak cocok dengan alamat mereka), dan
    3. karena ia mengidentifikasi pengontrol (ada delapan kode pengontrol, dan setiap pengontrol harus menggunakan yang berbeda), ia memastikan bahwa arbitrase selesai sebelum bagian kecepatan tinggi dari transfer, sehingga bagian kecepatan tinggi tidak perlu memperhitungkan kemampuan itu.
  • Mode ultra-cepat pada dasarnya adalah subset I2C hanya-tulis, yang tidak kompatibel dengan mode lain kecuali karena mudah untuk menambahkan dukungan untuk itu ke desain perangkat keras antarmuka I2C yang ada. Hanya satu pengontrol yang diizinkan, dan secara aktif menggerakkan jalur data setiap saat untuk mencapai laju transfer 5 Mbit/s. Peregangan jam, arbitrase, transfer baca, dan pengakuan semuanya dihilangkan. Ini terutama ditujukan untuk layar LED animasi di mana kesalahan transmisi hanya akan menyebabkan glitch visual singkat yang tidak penting. Kemiripan dengan mode bus I2C lainnya terbatas pada:
    • kondisi mulai dan berhenti digunakan untuk membatasi transfer,
    • pengalamatan I2C memungkinkan banyak perangkat target untuk berbagi bus tanpa sinyal pilih target gaya bus SPI, dan
    • pulsa jam kesembilan dikirim per byte yang ditransmisikan menandai posisi bit pengakuan yang tidak digunakan.

Beberapa vendor menyediakan Mode Turbo yang disebut non-standar dengan kecepatan hingga 1.4 Mbit/s.

Dalam semua mode, frekuensi jam dikendalikan oleh pengontrol, dan bus yang lebih panjang dari normal dapat dioperasikan pada kecepatan yang lebih lambat dari nominal dengan underclocking.

Interkoneksi sirkuit

[sunting | sunting sumber]
Papan ADC 16-bit dengan antarmuka I2C

I2C populer untuk menghubungkan sirkuit periferal ke sistem prototipe, seperti Arduino dan Raspberry Pi. I2C tidak menggunakan konektor standar, tetapi, perancang papan telah membuat berbagai skema pengkabelan untuk interkoneksi I2C. Untuk meminimalkan kemungkinan kerusakan akibat mencolokkan header 0,1 inci ke belakang, beberapa pengembang telah menyarankan untuk menggunakan koneksi sinyal dan daya bergantian dari skema pengkabelan berikut: (GND, SCL, VCC, SDA) atau (VCC, SDA, GND, SCL).[8]

Sebagian besar aplikasi menggunakan I2C seperti yang dirancang awalnya—IC periferal yang langsung disambungkan ke prosesor pada papan sirkuit tercetak yang sama, dan oleh karena itu melalui jarak yang relatif pendek kurang dari 1 kaki (30 cm), tanpa konektor. Namun menggunakan driver diferensial, versi I2C alternatif dapat berkomunikasi hingga 20 meter (mungkin lebih dari 100 meter) melalui CAT5 atau kabel lainnya.[9][10]

Beberapa konektor standar membawa sinyal I2C. Misalnya, UEXT, iPack 10-pin,[11] dan konektor 6P6C Lego Mindstorms NXT membawa I2C.[12][13][14][15] Setiap HDMI dan sebagian besar konektor DVI dan VGA membawa data DDC2 melalui I2C. Selain itu, konektor 8P8C dan kabel CAT5 yang biasanya digunakan untuk lapisan fisik Ethernet terkadang dapat digunakan untuk membawa sinyal I2C berkode diferensial[16] atau sinyal I2C ujung-tunggal yang ditingkatkan.[17]

Penyanggaan dan pemultipleksan

[sunting | sunting sumber]

Ketika ada banyak perangkat I2C dalam suatu sistem, mungkin ada kebutuhan untuk menyertakan penyangga bus atau pemultiplekser untuk membagi segmen bus yang besar menjadi yang lebih kecil. Hal ini mungkin diperlukan untuk menjaga kapasitansi segmen bus di bawah nilai yang diizinkan atau untuk memungkinkan banyak perangkat dengan alamat yang sama dipisahkan oleh pemultiplekser. Banyak jenis pemultiplekser dan penyangga ada dan semua harus memperhitungkan fakta bahwa jalur I2C ditentukan untuk menjadi dua arah. Pemultiplekser dapat diimplementasikan dengan sakelar analog, yang dapat mengikat satu segmen ke segmen lainnya. Sakelar analog mempertahankan sifat dua arah jalur tetapi tidak mengisolasi kapasitansi satu segmen dari yang lain atau menyediakan kemampuan penyanggaan.

Penyangga dapat digunakan untuk mengisolasi kapasitansi pada satu segmen dari yang lain dan/atau memungkinkan I2C dikirim melalui kabel atau jejak yang lebih panjang. Penyangga untuk jalur dua arah seperti I2C harus menggunakan salah satu dari beberapa skema untuk mencegah penguncian (latch-up). I2C adalah penguras terbuka, sehingga penyangga harus menggerakkan rendah di satu sisi ketika mereka melihat rendah di sisi lain. Salah satu metode untuk mencegah penguncian adalah dengan penyangga yang memiliki tingkat input dan output yang dipilih dengan cermat sedemikian rupa sehingga tingkat output drivernya lebih tinggi dari ambang inputnya, mencegahnya memicu dirinya sendiri. Misalnya, penyangga mungkin memiliki ambang input 0,4 V untuk mendeteksi rendah, tetapi tingkat rendah output 0,5 V. Metode ini mengharuskan semua perangkat lain di bus memiliki ambang batas yang kompatibel dan seringkali berarti bahwa beberapa penyangga yang mengimplementasikan skema ini tidak dapat ditempatkan secara seri satu sama lain.

Secara bergantian, jenis penyangga lain ada yang mengimplementasikan penguat arus atau melacak status (yaitu, sisi mana yang menggerakkan bus rendah) untuk mencegah penguncian. Metode status biasanya berarti bahwa pulsa yang tidak disengaja dibuat selama serah terima ketika satu sisi menggerakkan bus rendah, kemudian sisi lain menggerakkannya rendah, kemudian sisi pertama melepaskan (ini umum selama pengakuan I2C).

Berbagi SCL di antara banyak bus

[sunting | sunting sumber]

Ketika memiliki satu pengontrol, dimungkinkan untuk memiliki beberapa bus I2C berbagi jalur SCL yang sama.[18][19] Paket pada setiap bus dikirim satu demi satu atau pada saat yang sama. Ini dimungkinkan, karena komunikasi pada setiap bus dapat dibagi lagi dalam periode pendek bergantian dengan SCL tinggi diikuti oleh periode pendek dengan SCL rendah. Dan jam dapat diregangkan, jika satu bus membutuhkan lebih banyak waktu dalam satu keadaan.

Keuntungannya adalah menggunakan perangkat target dengan alamat yang sama pada saat yang sama dan menghemat koneksi atau throughput yang lebih cepat dengan menggunakan beberapa jalur data pada saat yang sama.

Tabel status jalur

[sunting | sunting sumber]

Tabel-tabel ini menunjukkan berbagai status atom dan operasi bit yang mungkin terjadi selama pesan I2C.

Status jalur
Tipe Bus tidak aktif

(N)

Mulai

(S)

Diam

(i)

Berhenti

(P)

Peregangan Jam

(CS)

Catatan Bebas untuk mengklaim arbitrase Klaim bus (pengontrol) Bus diklaim (pengontrol) Pembebasan bus (pengontrol) Dijeda oleh target
SDA Pullup pasif Tepi jatuh (pengontrol) Ditahan rendah (pengontrol) Tepi naik (pengontrol) Tidak peduli
SCL Pullup pasif Pullup pasif Pullup pasif Pullup pasif Ditahan rendah (target)
Status jalur
Tipe Mengirim satu bit data (1) (0)

(SDA diatur/dicontoh setelah SCL untuk menghindari deteksi status palsu)

Balasan penerima dengan bit ACK

(Byte diterima dari pengirim)

Balasan penerima dengan bit NACK

(Byte tidak diterima dari pengirim)

Pengaturan Bit (Bs) Siap untuk contoh (Bx) Pengaturan Bit (Bs) ACK (A) Pengaturan Bit (Bs) NACK (A')
Catatan Pengirim mengatur bit (pengontrol/target) Penerima mengambil contoh bit (pengontrol/target) Pemancar pengirim hi-Z Pengirim melihat SDA rendah Pemancar pengirim hi-Z Pengirim melihat SDA tinggi
SDA Mengatur bit (setelah SCL jatuh) Mengambil bit (setelah SCL naik) Ditahan rendah oleh penerima (setelah SCL jatuh) Didorong tinggi (atau tinggi pasif) oleh penerima (setelah SCL jatuh)
SCL Tepi jatuh (pengontrol) Tepi naik (pengontrol) Tepi jatuh (pengontrol) Tepi naik (pengontrol) Tepi jatuh (pengontrol) Tepi naik (pengontrol)
Status jalur (mulai berulang)
Tipe Mempersiapkan sinyal (Sr) setelah ACK/NACK Mulai berulang (Sr)
Catatan Mulai di sini dari ACK Menghindari status berhenti (P) Mulai di sini dari NACK Sama seperti sinyal mulai (S)
SDA Ditahan rendah untuk ACK Tepi naik Tinggi pasif Tinggi pasif Tepi jatuh (pengontrol)
SCL Tepi jatuh (pengontrol) Ditahan rendah Tepi naik (pengontrol) Tinggi pasif Pullup pasif

Struktur pengalamatan

[sunting | sunting sumber]

Pengalamatan 7-bit

[sunting | sunting sumber]
Bidang: S Bidang alamat I2C R/W' A Urutan pesan I2C... P
Tipe Mulai Byte 1 ACK Byte X, dll.

Sisa dari pesan baca atau tulis

berada di sini

Berhenti
Posisi bit dalam byte X 7 6 5 4 3 2 1 0
Pos alamat 7-bit 7 6 5 4 3 2 1
Catatan MSB LSB 1 = Baca
0 = Tulis

Pengalamatan 10-bit

[sunting | sunting sumber]
Bidang: S Indikator mode 10-bit Alamat atas R/W' A Bidang alamat bawah A Urutan pesan I2C P
Tipe Mulai Byte 1 ACK Byte 2 ACK Byte X dll.

Sisa dari pesan baca atau tulis

berada di sini

Berhenti
Posisi bit dalam byte X 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
Nilai bit 1 1 1 1 0 X X X X X X X X X X X
Pos alamat 10-bit 10 9 8 7 6 5 4 3 2 1
Catatan Menunjukkan mode 10-bit MSB 1 = Baca LSB
0 = Tulis

Alamat yang dicadangkan dalam ruang alamat 7-bit

[sunting | sunting sumber]

Dua kelompok masing-masing 8 alamat dicadangkan untuk fungsi-fungsi khusus:

  • Dari: 0000 000 hingga 0000 111
  • Dari: 1111 000 hingga 1111 111
Indeks
alamat
dicadangkan
Byte 8-bit Deskripsi
Alamat 7-bit Nilai R/W
MSB
(4-bit)
LSB
(3-bit)
1-bit
1 0000 000 0 Panggilan umum
2 0000 000 1 Byte mulai
3 0000 001 X Alamat CBUS
4 0000 010 X Dicadangkan untuk format bus yang berbeda
5 0000 011 X Dicadangkan untuk tujuan di masa mendatang
6 0000 1XX X Kode pengontrol mode-HS
7 1111 1XX 1 ID perangkat
8 1111 0XX X Pengalamatan target (slave) 10-bit

Selain itu, 112 alamat yang tersisa ditetapkan untuk kelas perangkat tertentu, dan beberapa di antaranya dicadangkan lebih lanjut oleh standar terkait atau penggunaan umum.

SMBus mencadangkan beberapa alamat tambahan. Secara khusus, 0001 000 dicadangkan untuk host SMBus, yang dapat digunakan oleh perangkat berkemampuan pengontrol, 0001 100 adalah "alamat respons peringatan SMBus" yang dipolling oleh host setelah interupsi di luar pita, dan 1100 001 adalah alamat default yang awalnya digunakan oleh perangkat yang mampu melakukan penetapan alamat dinamis.=== Alamat yang tidak dicadangkan dalam ruang alamat 7-bit ===

MSB (4-bit)Penggunaan umum[20][21][22][23][24]
0001Penerima digital, SMBus
0010Dekoder saluran video TV, IPMB
0011codec AV
0100Encoder video, expander GPIO
0101ACCESS.bus, PMBus
0110VESA DDC, PMBus
0111Pengontrol tampilan
1000Pemrosesan sinyal TV, pemrosesan audio, SMBus
1001Pengalihan AV, ADC dan DAC, IPMB, SMBus
1010Memori penyimpanan, jam waktu nyata
1011Prosesor AV
1100PLL dan tuner, modulator dan demodulator, SMBus
1101Prosesor dan dekoder AV, penguat daya audio, SMBus
1110Konverter ruang warna AV

Meskipun MSB 1111 dicadangkan untuk ID Perangkat dan pengalamatan target (slave) 10-bit, ia juga digunakan oleh perangkat tergantung tampilan VESA DDC seperti perangkat penunjuk.[23]

Format transaksi

[sunting | sunting sumber]

Sebuah transaksi I2C terdiri dari satu atau lebih pesan. Setiap pesan dimulai dengan simbol mulai, dan transaksi berakhir dengan simbol berhenti. Simbol mulai setelah yang pertama, yang memulai pesan tetapi bukan transaksi, disebut sebagai simbol mulai berulang.

Setiap pesan adalah bacaan atau penulisan. Transaksi yang terdiri dari satu pesan disebut transaksi baca atau tulis. Transaksi yang terdiri dari beberapa pesan disebut transaksi gabungan. Bentuk yang paling umum dari yang terakhir adalah pesan tulis yang menyediakan informasi alamat intra-perangkat, diikuti oleh pesan baca.

Banyak perangkat I2C tidak membedakan antara transaksi gabungan dan pesan yang sama yang dikirim sebagai transaksi terpisah, tetapi tidak semua. Protokol ID perangkat memerlukan satu transaksi; target dilarang merespons jika mereka mengamati simbol berhenti. Mode konfigurasi, kalibrasi, atau uji mandiri yang menyebabkan target merespons secara tidak biasa juga seringkali secara otomatis diakhiri pada akhir transaksi.

Diagram waktu

[sunting | sunting sumber]
Urutan transfer data
Urutan transfer data
  1. Transfer data dimulai dengan kondisi mulai (S) yang disinyalir oleh SDA ditarik rendah sementara SCL tetap tinggi.
  2. SCL ditarik rendah, dan SDA mengatur level bit data pertama sambil menjaga SCL rendah (selama waktu bilah biru).
  3. Data diambil contohnya (diterima) ketika SCL naik untuk bit pertama (B1). Agar bit valid, SDA tidak boleh berubah antara tepi naik SCL dan tepi jatuh berikutnya (seluruh waktu bilah hijau).
  4. Proses ini berulang, SDA bertransisi saat SCL rendah, dan data dibaca saat SCL tinggi (B2 hingga Bn).
  5. Bit terakhir diikuti oleh pulsa jam, di mana SDA ditarik rendah sebagai persiapan untuk bit berhenti.
  6. Kondisi berhenti (P) disinyalir ketika SCL naik, diikuti oleh SDA naik.

Untuk menghindari deteksi penanda palsu, ada penundaan minimum antara tepi jatuh SCL dan perubahan SDA, dan antara perubahan SDA dan tepi naik SCL. Waktu penundaan minimum tergantung pada laju transfer data yang digunakan. Perhatikan bahwa pesan I2C yang berisi n bit data (termasuk pengakuan) berisi n + 1 pulsa jam.

Desain Perangkat Lunak

[sunting | sunting sumber]

I2C cocok untuk desain perangkat lunak "driver bus". Perangkat lunak untuk perangkat yang terpasang ditulis untuk memanggil "driver bus" yang menangani perangkat keras I2C tingkat rendah yang sebenarnya. Ini memungkinkan kode driver untuk perangkat yang terpasang untuk porting dengan mudah ke perangkat keras lain, termasuk desain bit-banging.

Dukungan sistem operasi

[sunting | sunting sumber]
  • Di AmigaOS seseorang dapat menggunakan komponen i2c.resource[25] untuk AmigaOS 4.x dan MorphOS 3.x atau pustaka bersama i2c.library oleh Wilhelm Noeker untuk sistem yang lebih lama.
  • Pengembang Arduino dapat menggunakan pustaka "Wire".
  • Pengembang CircuitPython dan MicroPython dapat menggunakan kelas busio.I2C atau machine.I2C masing-masing.
  • Maximite mendukung komunikasi I2C secara asli sebagai bagian dari MMBasic-nya.
  • PICAXE menggunakan perintah i2c dan hi2c.
  • eCos mendukung I2C untuk beberapa arsitektur perangkat keras.
  • ChibiOS/RT mendukung I2C untuk beberapa arsitektur perangkat keras.
  • FreeBSD, NetBSD dan OpenBSD juga menyediakan kerangka kerja I2C, dengan dukungan untuk sejumlah pengontrol dan sensor umum.
    • Sejak OpenBSD 3.9 (dirilis 1 Mei 2006; 19 tahun lalu), subsistem i2c_scan pusat menyelidiki semua chip sensor yang mungkin sekaligus selama boot, menggunakan skema pembobotan ad hoc dan fungsi caching lokal untuk membaca nilai register dari target I2C;[26] ini memungkinkan untuk menyelidiki sensor pada perangkat keras i386/amd64 siap pakai komersial tujuan umum selama boot tanpa konfigurasi apa pun oleh pengguna atau penundaan penyelidikan yang nyata; prosedur pencocokan driver individu kemudian hanya perlu mengandalkan "nama-ramah" berbasis string untuk pencocokan;[27] sebagai hasilnya, sebagian besar driver sensor I2C secara otomatis diaktifkan secara default dalam arsitektur yang berlaku tanpa efek buruk pada stabilitas; sensor individu, baik I2C maupun lainnya, diekspor ke userland melalui kerangka kerja sysctl hw.sensors. Hingga Maret 2019, OpenBSD memiliki lebih dari dua lusin driver perangkat pada I2C yang mengekspor semacam sensor melalui kerangka kerja hw.sensors, dan mayoritas driver ini sepenuhnya diaktifkan secara default dalam kernel i386/amd64 GENERIC OpenBSD.
    • Di NetBSD, lebih dari dua lusinperangkat target I2C ada yang menampilkan sensor pemantauan perangkat keras, yang dapat diakses melalui kerangka kerja sysmon envsys sebagai daftar properti. Pada perangkat keras tujuan umum, setiap driver harus melakukan penyelidikannya sendiri, oleh karena itu semua driver untuk target I2C dinonaktifkan secara default di NetBSD dalam build i386/amd64 GENERIC.
  • Di Linux, I2C ditangani dengan driver perangkat untuk perangkat tertentu, dan driver lain untuk adaptor I2C (atau SMBus) tempat ia terhubung. Ratusan driver tersebut adalah bagian dari rilis kernel Linux saat ini.
  • Di Mac OS X, ada sekitar dua lusin ekstensi kernel I2C yang berkomunikasi dengan sensor untuk membaca tegangan, arus, suhu, gerakan, dan status fisik lainnya.
  • Di Microsoft Windows, I2C diimplementasikan oleh driver perangkat masing-masing dari sebagian besar perangkat keras yang tersedia di industri. Untuk perangkat HID tertanam/SoC HID, Windows 8 dan yang lebih baru memiliki driver bus I²C terintegrasi.[28]
  • Di Windows CE, I2C diimplementasikan oleh driver perangkat masing-masing dari sebagian besar perangkat keras yang tersedia di industri.
  • Unison OS, RTOS POSIX untuk IoT, mendukung I2C untuk beberapa arsitektur perangkat keras MCU dan MPU.
  • Di RISC OS, I2C disediakan dengan antarmuka I2C generik dari pengontrol IO dan didukung dari sistem modul OS
  • Di Sinclair QDOS dan Minerva QL sistem operasi I2C didukung oleh serangkaian ekstensi yang disediakan oleh TF Services.
  • Di Zephyr OS, I2C didukung melalui API driver perangkat i2c.[29] API ini menyediakan antarmuka generik untuk berkomunikasi dengan perangkat I2C, memungkinkan berbagai macam perangkat I2C untuk didukung.

Alat pengembangan

[sunting | sunting sumber]

Saat mengembangkan atau memecahkan masalah sistem menggunakan I2C, visibilitas pada tingkat sinyal perangkat keras dapat menjadi penting.

Adaptor host

[sunting | sunting sumber]

Ada sejumlah solusi perangkat keras adaptor host I2C untuk membuat koneksi pengontrol atau target I2C ke komputer host, menjalankan Linux, Mac atau Windows. Sebagian besar opsi adalah adaptor USB-ke-I2C. Tidak semuanya memerlukan driver atau API berpemilik.

Penganalisis protokol

[sunting | sunting sumber]

Penganalisis protokol I2C adalah alat yang mengambil contoh bus I2C dan mendekode sinyal listrik untuk memberikan tampilan tingkat yang lebih tinggi dari data yang ditransmisikan pada bus.

Penganalisis logika

[sunting | sunting sumber]

Saat mengembangkan dan/atau memecahkan masalah bus I2C, pemeriksaan sinyal perangkat keras bisa sangat penting. Penganalisis logika adalah alat yang mengumpulkan, menganalisis, mendekode, dan menyimpan sinyal, sehingga orang dapat melihat bentuk gelombang kecepatan tinggi sesuai keinginan mereka. Penganalisis logika menampilkan stempel waktu dari setiap perubahan level sinyal, yang dapat membantu menemukan masalah protokol. Sebagian besar penganalisis logika memiliki kemampuan untuk mendekode sinyal bus menjadi data protokol tingkat tinggi dan menampilkan data ASCII.

Sistem kabel populer

[sunting | sunting sumber]

Pada berbagai modul siap pakai, ada beberapa konektor dan pinout utama:[30]

  • Qwiic: diperkenalkan oleh Sparkfun pada tahun 2017, menggunakan konektor JST SH 1.0mm 4-pin[31]
    • pinout: GND, Vcc (3.3V), SDA, SCL
  • STEMMA QT: diperkenalkan oleh Adafruit pada tahun 2018, tidak selalu[32] kompatibel dengan Qwiic, karena memungkinkan rentang tegangan yang lebih luas (3V–5V); ukuran papan perangkat distandarisasi
    • pinout: GND, Vcc (3V–5V), SDA, SCL
  • STEMMA: oleh Adafruit, menggunakan konektor JST PH 2.0mm 4-pin (konektor 3-pin dimaksudkan untuk penggunaan analog/PWM)[33]
    • pinout: GND, Vcc (3V–5V), SDA, SCL
  • Grove: oleh Seeed Studio, menggunakan konektor berpemilik 2.0mm 4-pin, dikenal sebagai seri A2005, atau 1125S-4P[34]
    • pinout: GND, Vcc (3.3/5V), SDA, SCL
  • Gravity: oleh DFRobot menggunakan konektor JST PH 2.0mm 4-pin, konektor yang sama dengan STEMMA tetapi dengan penggunaan pin yang berbeda[35]
    • pinout: SDA, SCL, GND, Vcc (3.3/5V)
  • nodeLynk Interface: menggunakan konektor Molex SL 70553 series 2.54mm 4-pin
    • pinout: SCL, SDA, Vcc (5V), GND
  • Breakout Garden: oleh Pimoroni menggunakan konektor tepi 2.54mm 5-pin pada papan sirkuit setebal 1.6mm; pinout kompatibel dengan header Raspberry Pi
    • pinout: Vcc (2V hingga 6V), SDA, SCL, tidak digunakan/interupsi, GND
  • UEXT: oleh Olimex adalah konektor header berpenutup 5x2 2.54mm, mengimplementasikan bersama I2C, SPI, dan UART
  • Pmod Interface: oleh Digilent, konektor header satu baris 2.54mm 6-pin, digunakan untuk I2C, SPI, atau UART; seringkali pada papan FPGA
    • pinout ("tipe 6", varian I2C): tidak digunakan/GPIO/interupsi dari slave ke master, tidak digunakan/GPIO/reset, SCL, SDA, GND, Vcc (3.3V)

Keterbatasan

[sunting | sunting sumber]

Penetapan alamat target adalah kelemahan I2C. Tujuh bit terlalu sedikit untuk mencegah tabrakan alamat di antara ribuan perangkat yang tersedia. Apa yang mengurangi masalah tabrakan alamat antara vendor yang berbeda dan juga memungkinkan untuk terhubung ke beberapa perangkat identik adalah bahwa produsen mendedikasikan pin yang dapat digunakan untuk mengatur alamat target ke salah satu dari beberapa opsi alamat per perangkat. Dua atau tiga pin adalah tipikal, dan dengan banyak perangkat, ada tiga atau lebih opsi pengkabelan per pin alamat.[36][37][38]

Alamat I2C 10-bit belum[kapan?] banyak digunakan, dan banyak sistem operasi host tidak mendukungnya.[39] Skema "ARP" SMBus yang kompleks untuk menetapkan alamat secara dinamis juga belum digunakan (selain untuk kartu PCI dengan kehadiran SMBus, yang diwajibkan).

Konfigurasi bus otomatis adalah masalah terkait. Alamat tertentu dapat digunakan oleh sejumlah perangkat yang tidak kompatibel dengan protokol yang berbeda dalam berbagai sistem, dan hampir tidak ada jenis perangkat yang dapat dideteksi saat runtime. Misalnya, 0x51 dapat digunakan oleh EEPROM 24LC02 atau 24C32 EEPROM, dengan pengalamatan yang tidak kompatibel; atau oleh RTC PCF8563, yang tidak dapat dibedakan secara andal dari keduanya (tanpa mengubah status perangkat, yang mungkin tidak diizinkan). Satu-satunya mekanisme konfigurasi andal yang tersedia untuk host melibatkan mekanisme di luar pita seperti tabel yang disediakan oleh firmware sistem, yang mencantumkan perangkat yang tersedia. Sekali lagi, masalah ini sebagian dapat diatasi oleh ARP dalam sistem SMBus, terutama ketika pengidentifikasi vendor dan produk digunakan; tetapi itu belum benar-benar populer. Versi Revisi 3 dari spesifikasi I2C menambahkan mekanisme ID perangkat.

I2C mendukung rentang kecepatan yang terbatas. Host yang mendukung kecepatan multi-megabit jarang. Dukungan untuk kecepatan Fm+ 1 Mbit/s lebih luas, karena elektroniknya adalah varian sederhana dari apa yang digunakan pada kecepatan yang lebih rendah. Banyak perangkat tidak mendukung kecepatan 400 kbit/s (sebagian karena SMBus belum mendukungnya). Node I2C yang diimplementasikan dalam perangkat lunak (alih-alih perangkat keras khusus) bahkan mungkin tidak mendukung kecepatan 100 kbit/s; sehingga seluruh rentang yang ditentukan dalam spesifikasi jarang dapat digunakan. Semua perangkat harus setidaknya sebagian mendukung kecepatan tertinggi yang digunakan atau mereka dapat secara keliru mendeteksi alamat perangkat mereka.

Perangkat diizinkan untuk meregangkan siklus jam agar sesuai dengan kebutuhan khusus mereka, yang dapat mengurangi bandwidth yang dibutuhkan oleh perangkat yang lebih cepat dan meningkatkan latensi saat berbicara dengan alamat perangkat lain. Kapasitansi bus juga membatasi kecepatan transfer, terutama ketika sumber arus tidak digunakan untuk mengurangi waktu naik sinyal.

Karena I2C adalah bus bersama, ada potensi bagi perangkat mana pun untuk mengalami kegagalan dan menggantung seluruh bus. Misalnya, jika ada perangkat yang menahan jalur SDA atau SCL rendah, itu mencegah pengontrol mengirim perintah START atau STOP untuk mengatur ulang bus.[40] Jadi umum bagi desain untuk menyertakan sinyal reset yang menyediakan metode eksternal untuk mereset perangkat bus. Namun banyak perangkat tidak memiliki pin reset khusus, memaksa perancang untuk memasang sirkuit untuk memungkinkan perangkat dihidupkan-ulang (power-cycled) jika perlu direset.

Karena keterbatasan ini (manajemen alamat, konfigurasi bus, potensi kegagalan, kecepatan), hanya sedikit segmen bus I2C yang memiliki bahkan selusin perangkat. Sebaliknya, umum bagi sistem untuk memiliki beberapa segmen yang lebih kecil. Salah satunya mungkin didedikasikan untuk digunakan dengan perangkat kecepatan tinggi, untuk manajemen daya latensi rendah. Yang lain mungkin digunakan untuk mengontrol beberapa perangkat di mana latensi dan throughput bukanlah masalah penting; segmen lain mungkin hanya digunakan untuk membaca chip EEPROM yang menjelaskan kartu tambahan (seperti standar SPD yang digunakan dengan stik DRAM).

Pada sistem berdaya sangat rendah, resistor pull-up dapat menggunakan lebih banyak daya daripada seluruh sisa desain digabungkan. Pada ini, resistor sering ditenagai oleh sumber tegangan yang dapat dialihkan, seperti DIO dari mikrokontroler. Pull-up juga membatasi kecepatan bus dan memiliki biaya tambahan kecil. Oleh karena itu, beberapa perancang beralih ke bus serial lain yang tidak memerlukan pull-up, seperti I3C atau SPI.

Teknologi turunan

[sunting | sunting sumber]

I2C adalah dasar untuk ACCESS.bus, antarmuka Display Data Channel (DDC) VESA, System Management Bus (SMBus), Power Management Bus (PMBus) dan Intelligent Platform Management Bus (IPMB, salah satu protokol IPMI). Varian-varian ini memiliki perbedaan dalam rentang tegangan dan frekuensi jam, dan mungkin memiliki jalur permintaan interupsi.

Sistem ketersediaan tinggi (AdvancedTCA, MicroTCA) menggunakan I2C redundan 2 arah untuk manajemen rak. Kemampuan I2C multi-pengontrol adalah persyaratan dalam sistem ini.

TWI (Two-Wire Interface) atau TWSI (Two-Wire Serial Interface) pada dasarnya adalah bus yang sama yang diimplementasikan pada berbagai prosesor system-on-chip dari Atmel dan vendor lainnya.[41] Vendor menggunakan nama TWI, meskipun I2C bukanlah merek dagang terdaftar per 2014-11-07.[42] Perlindungan merek dagang hanya ada untuk logo masing-masing (lihat sudut kanan atas), dan paten pada I2C sekarang telah kedaluwarsa.[butuh rujukan] Menurut Microchip Technology, TWI dan I2C memiliki beberapa perbedaan. Salah satunya adalah bahwa TWI tidak mendukung byte START.[43]

Dalam beberapa kasus, penggunaan istilah "antarmuka dua-kabel" menunjukkan implementasi spesifikasi I2C yang tidak lengkap. Tidak mendukung arbitrase atau peregangan jam adalah satu batasan umum, yang masih berguna untuk satu pengontrol yang berkomunikasi dengan target sederhana yang tidak pernah meregangkan jam.

Standar antarmuka sensor MIPI I3C (I3C) adalah pengembangan dari I2C, yang sedang dikembangkan pada tahun 2017.[44]

Riwayat rilis spesifikasi I2C
Tahun Versi Catatan Referensi
1980 Paten Pada tahun 1980, "Philips Nv" mengajukan paten di Belanda. Pada tahun 1981, "U.S. Phillips Corp" mengajukan paten di A.S. kemudian dialihkan pada tahun 1987 sebagai Paten A.S. 4.689.740. [1][45][46]
1982 Asli Sistem I2C 100 kbit/s dibuat sebagai sistem bus internal sederhana untuk membangun elektronik kontrol dengan berbagai chip Philips.
1992 1 Menambahkan Fast-mode (Fm) 400 kbit/s dan mode pengalamatan 10-bit untuk meningkatkan kapasitas menjadi 1008 node. Ini adalah versi standar pertama.
1998 2 Menambahkan High-speed mode (Hs) 3.4 Mbit/s dengan persyaratan hemat daya untuk tegangan dan arus listrik. [47]
2000 2.1 Versi 2 yang diperjelas, tanpa perubahan fungsional yang signifikan. [48]
2007 3 Menambahkan Fast-mode plus (Fm+) 1 Mbit/s (menggunakan driver 20 mA), dan mekanisme ID perangkat. [49]
2012 4 Menambahkan Ultra Fast-mode (UFm) 5 Mbit/s untuk jalur USDA (data) dan USCL (jam) baru menggunakan logika tarik-dorong tanpa resistor pull-up,
dan menambahkan tabel ID pabrikan yang ditetapkan. Ini hanyalah bus satu arah.
[50]
2012 5 Memperbaiki kesalahan. [51]
2014 6 Memperbaiki dua grafik. [52]
2021 7 Mengubah istilah "master/slave" menjadi "controller/target" agar selaras dengan spesifikasi I3C bus.
Memperbarui Tabel 5 ID pabrikan yang ditetapkan. Menambahkan Bagian 9 ikhtisar bus I3C. Ini adalah standar saat ini.
[3]

Lihat juga

[sunting | sunting sumber]

Referensi

[sunting | sunting sumber]
  1. 1 2 3 4 NL Patent 8005976A, "Two-Wire Bus-System Comprising A Clock Wire And A Data Wire For Interconnecting A Number Of Stations", diberikan kepada Philips Electronics Nv
  2. "MCP23008". Microchip. May 26, 2021. Diarsipkan dari versi aslinya tanggal May 26, 2021.
  3. 1 2 3 4 5 6 7 "I2C-bus specification Rev 7" (PDF). NXP Semiconductors. October 1, 2021. Diarsipkan dari asli (PDF) tanggal October 6, 2022.
  4. 1 2 "What is an I3C 'Controller' Device, and why was the I3C 'Master' Device renamed?". MIPI Alliance. Introduction to MIPI I3C. Diakses tanggal April 27, 2025.
  5. "7-bit, 8-bit, and 10-bit I2C Slave Addressing". Total Phase. Diarsipkan dari versi aslinya tanggal 2013-06-01. Diakses tanggal 2018-04-29.
  6. "8-Kbit serial I2C bus EEPROM (PDF)" (PDF). STMicroelectronics. October 2017. Diarsipkan (PDF) dari versi aslinya tanggal 2019-10-18. Diakses tanggal 19 November 2019.
  7. Using The ZONE_READ And ZONE_WRITE Protocols (PDF) (Application Note). Revision 1.0.1. System Management Interface Forum. 2016-01-07. AN001. Diarsipkan (PDF) dari versi aslinya tanggal 2017-09-22.
  8. "Is there any definitive I2C pin-out guidance out there? Not looking for a "STANDARD"". StackExchange.
  9. NXP Application note AN11075: Driving I2C-bus signals over twisted pair cables with PCA9605 (PDF), 2017-08-16, diarsipkan dari asli (PDF) tanggal 2017-08-16
  10. Vasquez, Joshua (2017-08-16), Taking the leap off board: An introduction to I2C over long wires, diarsipkan dari asli tanggal 2017-08-16
  11. iPack Stackable Board Format, 2017-08-19, diarsipkan dari asli tanggal 2017-08-19
  12. Ferrari, Mario; Ferrari, Giulio (2018-04-29). Building Robots with LEGO Mindstorms NXT. Syngress. hlm. 63–64. ISBN 9780080554334. Diarsipkan dari asli tanggal 2018-04-29.
  13. Gasperi, Michael; Hurbain, Philippe (2010), "Chapter 13: I2C Bus Communication", Extreme NXT: Extending the LEGO MINDSTORMS NXT to the Next Level, ISBN 9781430224549
  14. Philo. "NXT connector plug" Diarsipkan 2017-08-20 di Wayback Machine.
  15. Sivan Toledo. "I2C Interfacing Part 1: Adding Digital I/O Ports" Diarsipkan 2017-08-12 di Wayback Machine.. 2006
  16. "Sending I2C reliabily over Cat5 cables" Diarsipkan 2017-08-18 di Wayback Machine.
  17. "I2C Bus Connectors & Cables" Diarsipkan 2017-08-18 di Wayback Machine.
  18. "Multiple I2C buses · Testato/SoftwareWire Wiki". GitHub.
  19. "Sharing I2C bus | Microchip".
  20. "I2C Address Allocation Table" (PDF) (Selection Guide). Philips Semiconductors. 1999-08-24. Diarsipkan dari asli (PDF) tanggal 2017-10-16. Diakses tanggal 2017-10-01.
  21. Data Handbook IC12: I2C Peripherals, Philips ordering code 9397 750 00306
  22. "System Management Bus (SMBus) Specification" (PDF). Version 3.0. System Management Interface Forum. 2014-12-20. hlm. 81–82. Diarsipkan (PDF) dari versi aslinya tanggal 2016-01-29. Diakses tanggal 2017-12-01.
  23. 1 2 "VESA Display Data Channel Command Interface (DDC/CI) Standard" (PDF). Version 1.1. VESA. 2004-10-29. hlm. 15–16. Diarsipkan (PDF) dari versi aslinya tanggal 2016-09-09. Diakses tanggal 2017-12-01.
  24. "Intelligent Platform Management Interface Specification Second Generation V2.0" (PDF). Document Revision 1.1. Intel, NEC, Hewlett-Packard & Dell. 2013-10-01. hlm. 563. Diarsipkan (PDF) dari versi aslinya tanggal 2016-03-27. Diakses tanggal 2017-12-01. The 7-bit portion of the slave address for the BMC is 0010_000b
  25. i2c.resource component Diarsipkan 2011-07-24 di Wayback Machine. untuk AmigaOS 4.x.
  26. Theo de Raadt (2015-05-29). "/sys/dev/i2c/i2c_scan.c#probe_val". Super User's BSD Cross Reference. OpenBSD. Diakses tanggal 2019-03-04. static u_int8_t probe_val[256];
  27. Constantine A. Murenin (2010-05-21). "5.2. I2C bus scan through i2c_scan.c". OpenBSD Hardware Sensors — Environmental Monitoring and Fan Control (MMath thesis). University of Waterloo: UWSpace. hdl:10012/5234. Document ID: ab71498b6b1a60ff817b29d56997a418.
  28. Introduction to HID over I2C
  29. "Inter-Integrated Circuit (I2C) Bus — Zephyr Project Documentation".
  30. "The Connector Zoo: I2C Ecosystems". 4 May 2022.
  31. "Qwiic".
  32. "Qwiic Connect System — Frequently Asked Questions". www.sparkfun.com. SparkFun Electronics. Diakses tanggal 2024-12-20.
  33. "What is STEMMA? | Adafruit STEMMA & STEMMA QT | Adafruit Learning System".
  34. "I2C Pin Out (Grove from Seeed Studio)". 22 April 2024.
  35. "I2C Pin Out (From DFRobot Gravity)". 22 April 2024.
  36. Linear Technology's LTC4151 Diarsipkan 2017-08-09 di Wayback Machine. memiliki dua pin untuk pemilihan alamat, yang masing-masing dapat diikat tinggi atau rendah atau dibiarkan tidak terhubung, menawarkan 9 alamat yang berbeda.
  37. Maxim's MAX7314 Diarsipkan 2017-07-13 di Wayback Machine. memiliki satu pin untuk pemilihan alamat yang akan diikat tinggi atau rendah atau dihubungkan ke SDA atau SCL, menawarkan 4 alamat yang berbeda.
  38. TI's UCD9224 Diarsipkan 2017-11-07 di Wayback Machine. menggunakan dua saluran ADC yang membedakan masing-masing dua belas level untuk memilih alamat 7-bit yang valid.
  39. "Re: [PATCH 4/5 add i2c_probe_device and i2c_remove_device"]. 2005-08-16. https://lkml.org/lkml/2005/8/16/156.
  40. Arne Pahl, Stefan Dickmann (2022), Analysis of sensor disturbances caused by IEMI, hlm. 159–165, doi:10.15488/12572, diakses tanggal 2025-07-04
  41. avr-libc: Example using the two-wire interface (TWI) Diarsipkan 2007-05-27 di Wayback Machine..
  42. "TESS -- Error". tmsearch.uspto.gov. Diakses tanggal 2018-04-29.[pranala nonaktif permanen]
  43. "What is TWI? How to Configure the TWI for I2C Communication" (PDF). Microchip Technology. 2018.
  44. Thornton, Scott (2017-11-29). "The improved inter-integrated circuit (I3C)". Microcontroller Tips. Diarsipkan dari versi aslinya tanggal 2018-02-03.
  45. US Patent 4689740, "Two-Wire Bus-System Comprising A Clock Wire And A Data Wire For Interconnecting A Number Of Stations", dikeluarkan tanggal 1987-08-25, diberikan kepada U.S. Philips Corporation
  46. "Philips sues eight more companies for infringement of I2C bus patent". EE Times. October 17, 2001. Diarsipkan dari versi aslinya tanggal April 2, 2021.
  47. I2C-bus specification Rev 2.0; Philips Semiconductors; December 1998; Archived.
  48. I2C-bus specification Rev 2.1; Philips Semiconductors; January 2000; Archived.
  49. I2C-bus specification Rev 3; NXP Semiconductors; June 19, 2007; Archived.
  50. I2C-bus specification Rev 4; NXP Semiconductors; February 13, 2012; Archived.
  51. I2C-bus specification Rev 5; NXP Semiconductors; October 9, 2012; Archived.
  52. "I2C-bus specification Rev 6" (PDF). NXP Semiconductors. April 4, 2014. Diarsipkan dari asli (PDF) tanggal April 26, 2021.

Bacaan lebih lanjut

[sunting | sunting sumber]

Pranala luar

[sunting | sunting sumber]