I2C singkatan dari Inter Integrated Circuit, adalah sebuah protokol untuk komunikasi serial antar IC, dan sering disebut juga Two Wire Interface (TWI). Bus yang digunakan untuk komunikasi antara mikrokontroler dan divais periferal seperti memori, sensor temperatur dan I/O expander.
Komunikasi dilakukan melalui dua jalur: SDA (serial data) dan SCL (serial clock). Setiap divais I2C memiliki 7-bit alamat yang unik. MSB adalah fix dan ditujukan untuk kategori divais. Sebagai contoh, 1010 biner ditujukan untuk serial EEPROM. Tiga bit berikutnya memungkinkan 8 kombinasi alamat I2C, yang berarti, dimungkinkan 8 divais dengan tipe yang sama, beroperasi pada bus I2C yang sama. Pengalamatan 7-bit memungkinkan 128 divasi pada bus yang sama. Alamat I2C dikirim dalam byte pertama. LSB dari byte ini digunakan untuk menunjukkan bila master akan melakukan penulisan (0) atau pembacaan (0) terhadap slave.
Divais yang mengirim data sepanjang bus disebut master, divais yang menerima data disebut slave. Master memulai transmisi dengan sebuah sinyal start, dan menghentikan transmisi dengan sebuah sinyal stop pada jalur SDA. Selama sinyal start dan stop, jalur SCL harus dalam keadaan high. Setelah master memulai pengiriman data dengan sebuah sinyal start, master menulis satu byte alamat divais kepada slave. Setiap byte data harus memiliki panjang 8-bit. Slave harus memberikan konfirmasi dari byte data yang diterimanya dengan sebuah bit acknowledge (ACK).
Compiler BASCOM-AVR dapat digunakan untuk membuat program yang dapat melakukan penulisan dan pembacaan ke dan dari EEPROM. BASCOM-AVR memiliki beberapa perintah terkait dengan pengendalian bus I2C.
- Config SDA : meng-konfigurasi jalur SDA, misalnya PORTB.0
- Config SCL : meng-konfigurasi jaluar SCL, misalnya PORTB.1
- I2cstart : menghasilkan sebuah kondisi start
- I2cstop : menghasilkan sebuah kondisi stop
- I2cwbyte : menulis satu byte pada divais target
- I2crbyte : membaca satu byte dari divais target
Dalam BASCOM-AVR, pertama kita harus meng-konfigurasi port yang digunakan untuk jalur SDA dan SCL dari bus I2C. Selanjutnya, kita kirimkan alamat divasi untuk memilih EEPROM yang terhubung dengan bus I2C. Setelah itu kita kirimkan dua byte ke EEPROM untuk memilih alamat dalam EEPROM dimana kita akan menuliskan data. Byte terakhir yang dikirim dalam rangkaian penulisan adalah byte data.
Dim D_w As Byte , D_r As Byte
Config Lcdpin = Pin , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 ,
Db7 = Portb.0 , E = Portb.6 , Rs = Portb.7
Config Lcd = 16 * 2
Cls
Cursor Off
Config Scl = Portd.0
Config Sda = Portd.1
D_w = 100
'********** menulis satu byte ke EEPROM ***********************************************
I2cstart 'memulai
I2cwbyte &B1010_0000 'kirim alamat divais
I2cwbyte 0 'H adress dari EEPROM
I2cwbyte 0 'L adress dari EEPROM
I2cwbyte D_w 'data ke EEPROM
I2cstop 'berhenti
Waitms 10
'********** membaca dari EEPROM **********************************************
I2cstart 'mulai
I2cwbyte &B1010_0000 'kirim alamat divais
I2cwbyte 0 'H address dari EEPROM
I2cwbyte 0 'L address dari EEPROM
I2cstart 'ulangi start
I2cwbyte &B1010_0001 'alamat slave untuk pembacaan
I2crbyte D_r , Nack 'baca byte dari EEPROM
I2cstop ' stop
Lcd "D_w= "
Lcd D_w 'show byte on LCD
Lowerline
Lcd "D_r= "
Lcd D_r
End