3.23. Dasar-dasar I2C

I2C (Inter-Integrated Circuit, diucapkan "I-kuadrat-C" atau "I-dua-C") adalah bus serial dua kabel yang dirancang untuk tautan jarak pendek antarchip pada papan yang sama. Posisinya berada di antara SPI dan UART dalam hal prioritas: lebih lambat dari SPI tetapi lebih hemat pin, dan beralamat (beberapa perangkat pada dua kabel yang sama) di mana SPI memerlukan saluran CS khusus per perangkat.

I2C adalah bus pilihan untuk sensor laju rendah -- akselerometer, sensor suhu, sensor kelembaban, magnetometer, jam waktu nyata, EEPROM -- di mana penghematan pin dan kompleksitas bus lebih penting daripada throughput mentah.

3.23.1. Dua kabel, keduanya open-drain

Bus I2C hanya memiliki dua sinyal:

  • SCL (serial clock). Dikendalikan oleh kontroler (sebagian besar waktu).

  • SDA (serial data). Dikendalikan oleh perangkat mana pun yang sedang berbicara saat ini -- kontroler selama fase alamat dan data keluar, periferal selama pembacaan dan bit ACK.

Kedua jalur bersifat open-drain: setiap perangkat pada bus dapat menarik jalur ke ground tetapi tidak pernah mendorongnya tinggi. Dua resistor pull-up pada bus (biasanya 2.2 hingga 10 ke rel suplai) menarik jalur tinggi ketika tidak ada yang menariknya rendah. Perilaku wired-OR muncul dari ini -- perangkat mana pun yang menarik jalur rendah menang, dan kondisi tinggi hanyalah "tidak ada yang berbicara".

Pull-up internal MCU pada pin SCL dan SDA-nya biasanya tidak cukup kuat untuk berfungsi sebagai pull-up bus sendiri; resistor eksternal pada bus biasanya diperlukan. Banyak papan breakout sensor sudah menyertakannya; periksa lembar data sebelum menambahkan lebih banyak.

3.23.2. Transaksi

Setiap transaksi I2C mengikuti bentuk yang sama:

SCL and SDA traces. SDA falls while SCL is high (START), then SCL clocks bytes on SDA -- a 7-bit address byte with a read/write bit and an ACK, then a register byte and an ACK, then a data byte and a NACK, then SDA rises while SCL is high (STOP).

Transaksi I2C: START, alamat 7-bit + R/W, ACK, register, ACK, data, NACK, STOP.

Pertukaran berlangsung bit per bit:

  • START. Kontroler menarik SDA rendah saat SCL masih tinggi. Tepi yang tidak biasa ini memberitahu setiap perangkat pada bus bahwa transaksi akan segera dimulai.

  • Alamat + R/W. Kontroler mengklik keluar alamat periferal 7-bit diikuti oleh satu bit baca/tulis (0 untuk tulis, 1 untuk baca).

  • ACK / NACK. Setelah setiap byte, penerima mengendalikan SDA selama satu clock untuk ACK (rendah) atau NACK (tinggi). Pada byte alamat, periferal memberikan ACK jika mengenali alamatnya sendiri; jika tidak ada perangkat yang memberikan ACK, kontroler melihat NACK dan mengetahui alamat tersebut tidak ada di bus.

  • Byte data. Masing-masing diikuti oleh ACK dari penerima. Pada penulisan, periferal memberikan ACK setiap byte; pada pembacaan, kontroler memberikan ACK setiap byte yang diinginkannya dan NACK pada byte terakhir untuk memberitahu periferal untuk berhenti.

  • STOP. Kontroler melepaskan SDA tinggi saat SCL tinggi, mengakhiri transaksi.

Repeated start adalah START kedua yang dikeluarkan tanpa STOP di antaranya -- kontroler beralih arah (tulis alamat, kemudian baca alamat) pada periferal yang sama tanpa melepaskan bus.

3.23.3. Pengalamatan

Ruang alamat 7-bit mencakup 0x08 -- 0x77; nilai di ujung-ujungnya dicadangkan untuk keperluan khusus. Alamat setiap perangkat ditetapkan oleh perancang chip; banyak komponen memungkinkan beberapa bit rendah diubah di tingkat papan (dengan menghubungkan pin ke tinggi atau rendah) sehingga dua sensor yang sama dapat berada di bus yang sama.

Jika dua perangkat berbagi alamat, tidak ada cara untuk berbicara dengan salah satunya tanpa yang lain ikut campur, jadi periksa lembar data sebelum memasangkan komponen. i2c.scan() (dibahas di I2C dalam kode) menelusuri ruang alamat dan melaporkan alamat mana yang merespons, yang merupakan cara standar untuk mengetahui apa yang ada di bus.

3.23.4. Kekuatan dan kelemahan

Kekuatan dan kelemahan bus menentukan ceruk penggunaannya:

  • Dua pin untuk banyak perangkat. Satu pasang SCL/SDA dapat membawa selusin sensor. SPI akan memerlukan pin CS tambahan per perangkat.

  • Kecepatan standar. 100 kHz ("mode standar") dan 400 kHz ("mode cepat") mencakup hampir setiap sensor. 1 MHz dapat dicapai tetapi mulai menuntut lebih banyak dari kapasitansi bus dan ukuran pull-up.

  • Lambat relatif terhadap SPI. Apa pun yang memindahkan lebih dari beberapa ratus kilobit per detik sebaiknya menggunakan SPI.

  • Konflik alamat. Dua perangkat dengan alamat yang sama pada satu bus adalah kesalahan perangkat keras yang tidak dapat diatasi oleh protokol.