Hai Sobat semua.
Dalam sistem
digital elektronika kita mengenal beberapa teknik antarmuka yang menghubungkan
antara mikrokontroler atau mikroprosesor dengan serpih memori atau I/O.
Antarmuka yang mengatur komunikasi terdiri dari 2 teknik yaitu antarmuka
paralel dan serial.
Pada antarmuka
paralel, konfigurasi jalur yang digunakan terbagi ke dalam 3 bagian yang
dikenal dengan istilah BUS yaitu Bus Alamat, Bus Kendali dan Bus Data. Pada
sistem mikrokontroler, teknik pengalamatan sangat mutlak untuk menentukan
serpih mana yang akan berkomunikasi dengan sistem. Antarmuka dengan memori
menggunakan bus alamat dengan jumlah bit yang bergantung pada kapasitas serpih
itu sendiri. Jumlah bit alamat biasa ditetapkan sesuai dengan perhitungan
secara biner yaitu 2n sehingga penamaan bit alamat terdiri dari A0
sampai An. Hal ini juga berlaku untuk bus data yang jumlahnya
menurut hitungan biner 2n dan terdiri dari D0 sampai Dn.
Namun bus data biasa ditentukan berdasarkan tingkatan byte atau per 8 bit.
Terakhir adalah bus kendali yang digunakan untuk mengatur kondisi antarmuka dan
arah komunikasi yang akan dilakukan. Arah komunikasi biasanya menggunakan jalur
antarmuka WR dan RD yang pada beberapa serpih kadang dipisah namun ada juga
yang disatukan dengan level logika dijadikan pengenalan status komunikasinya.
Kembali pada pengalamatan di mana terkadang dijumpai serpih dengan jumlah jalur
alamat yang sama atau bahkan penggunaan beberapa serpih sejenis maka setiap
serpih menyediakan sebuah penyemat yang dinamai CS (chip select).
Antarmuka serial
menjadi pilihan yang populer saat ini karena hanya membutuhkan sedikit jalur
penghubung antara mikrokontroler dengan serpih atau perangkat. Teknik antarmuka
secara serial ini memiliki bentuk yang beragam. Sobat tentu sudah sangat
familiar dengan beberapa diantaranya seperti RS232, RS422, RS485 atau yang saat
ini sangat populer yaitu USB (universal serial bus). Atau seperti yang sudah
pernah aku tulis seperti Wiegand, remot atau komunikasi serial 3 kabel yang
menggunakan penyemat CS atau RST serta SCLK dan I/O seperti pada serpih DS1302
dan seri 93C46/56/66.
Kali ini kita akan
mengenal satu lagi teknik antarmuka secara serial menggunakan protokol I2C.
Serpih-serpih yang
mendukung protokol I2C menyediakan 2 jalur penghubung antarmuka
yaitu SCL (serial clock) dan SDA (serial data). Kelebihan yang diusung oleh
antarmuka jenis ini adalah sebuah mikrokontroler yang terhubung dengan beberapa
I2C serpih sejenis dalam satu jalur komunikasi, bisa mencapai 8 unit
sekaligus. Pada jenis serpih tertentu, contoh penggunaan bersama “Remote 8-bit
I/O Expander” dengan masing-masing 8 unit yaitu PCF8574 dan PCF8574A, bahkan
bisa mencapai 16 unit sekaligus, hal ini tentu sangat menghemat kebutuhan jalur
yang akhirnya menyederhanakan rangkaian yang dibuat.
Pada protokol
antarmuka I2C, di mana perangkat mengirim data ke bus didefinisikan
sebagai pemancar (transmitter) dan sebaliknya saat menerima data didefinisikan
sebagai penerima (receiver). Perangkat yang mengendalikan pesan disebut Master
dan sebaliknya perangkat yang dikendalikan disebut Slave.
Pada antarmuka I2C
terdapat 2 kondisi untuk memulai dan mengakhiri komunikasi serial. Pertama
adalah kondisi START. Perubahan sinyal jalur data (SDA) dari tinggi ke rendah
pada saat jalur pulsa (SCL) tinggi maka kondisi ini didefinisikan sebagai
START. Kondisi kedua adalah STOP. Perubahan sinyal jalur data (SDA) dari rendah
ke tinggi pada saat jalur pulsa (SCL) tinggi maka kondisi ini didefinisikan
sebagai STOP. Operasi transfer data dilaksanakan pada periode antara kondisi
START dan STOP.
Kondisi lain yang
perlu dicermati pada antarmuka I2C adalah bilamana kedua jalur baik
SDA maupun SCL berkondisi tinggi maka status serpih dalam kondisi tidak sibuk
dan siap diajak berkomunikasi. Kemudian kondisi yang berkaitan dengan Data Sah,
ini terjadi bilamana status SDA setelah kondisi START adalah stabil pada
periode SCL yang tinggi. Kondisi logika SDA berubah selama periode SCL rendah.
Pada setiap akhir
dari penerimaan dari perangkat baik alamat maupun data, perangkat master harus
membangkitkan sinyal ACK (acknowledge) yaitu dengan memberikan pulsa tambahan
pada SCL. SDA harus dikondisikan rendah selama periode pulsa dari SCL. Untuk
mempermudah pemahaman, pada intinya pada setiap akhir penerimaan byte maka
master wajib membangkitkan kondisi ACK yaitu kondisi pemberian sinyal pulsa
tambahan pada SCL pada kondisi di mana SDA harus ditetapkan rendah. Namun
kondisi ACK dapat ditetapkan dengan SDA yang tinggi pada akhir periode transfer
di mana master kemudian membangkitkan kondisi STOP.
Berikut
adalah contoh penentuan konfigurasi penyemat pada antarmuka I2C.
Sobat bisa menggunakan penyemat lain sesuai rancangan rangkaian yang dibuat. Pada
modul ini dicontohkan penggunaan P1.0 untuk SDA dan P1.1 untuk SCL. Selanjutnya
modul juga membutuhkan beberapa bit data yang berfungsi sebagai status dan
kondisi dalam proses antarmuka.
SDA bit p1.0
SCL bit p1.1
RegisterBendera data 20h
FACK bit RegisterBendera.0
FLB bit RegisterBendera.1
FSRDY bit RegisterBendera.2
Bit
FACK adalah bit yang berfungsi sebagai bendera status dari kondisi Acknowledge.
Bit FLB (flag last bit) digunakan untuk menetapkan akhir dari proses antarmuka
pada mode baca. FSRDY (flag slave ready) adalah bit bendera status untuk
kondisi siap dari serpih.
I2C_Check_Con:
jb SCL, SlaveReady
clr FSRDY
ret
SlaveReady:
setb FSRDY
ret
I2C_Start_Con:
clr SCL
setb SDA
setb SCL
clr SDA
acall Delay5us
ret
I2C_Stop_Con:
clr SCL
clr SDA
acall Delay3us
setb SCL
setb SDA
nop
Delay5us:
nop
Delay3us:
ret
Seperti diutarakan sebelumnya bahwa pada
antarmuka protokol I2C dikenal istilah master
dan slave serta transmitter dan receiver. Maka pada modul untuk istilah baca
dan tulis dari dan ke serpih menggunakan istilah-istilah tersebut.
Pertama
akan kita melihat operasi menulis ke serpih yang disebut Master Transmitter
atau subrutin Master_Tx. Register yang mempengaruhi subrutin ini adalah
akumulator yang bisa berisi informasi alamat, data atau kendali (control byte).
Register R7 digunakan untuk cacahan sebanyak 8 bit atau 1 byte. Bit Carry
dimanfaatkan untuk memeriksa level logika data setelah perintah RLC di mana bit
pertama yang diperiksa dimulai dari MSB. Pada akhir subrutin dilaksanakan juga
pemeriksaan SDA untuk menentukan status bit FACK pada setiap akhir transmisi 1
byte data.
Master_Tx:
push 07h
push acc
mov r7,
#8
TxD_High:
clr SCL
rlc a
jnc TxD_Low
setb SDA
ajmp TxD_Pulse
TxD_Low:
clr SDA
TxD_Pulse:
setb SCL
acall Delay3us
djnz r7, TxD_High
clr SCL
setb SDA
acall Delay3us
setb SCL
jnb SDA, TxD_Ack
clr FACK
ajmp MTx_End
TxD_Ack:
setb FACK
MTx_End:
pop acc
pop 07h
ret
Berikutnya adalah subrutin Master_Rx atau Master Receiver.
Register yang digunakan adalah akumulator untuk menampung informasi data. Bit
yang mempengaruhi adalah FLB yang nilai digunakan untuk menentukan akhir dari
transmisi dengan kondisi ACK atau No_ACK.
Master_Rx:
push 07h
mov r7,
#8
clr c
Next_RxD:
clr SCL
setb SDA
acall Delay3us
setb SCL
jnb SDA,
Rxd_Low
setb c
ajmp Save_RxD
RxD_Low:
clr c
Save_RxD:
rlc a
djnz r7, Next_Rxd
clr SCL
jb FLB, No_Ack
clr SDA
ajmp Ack_Pulse
No_Ack:
setb SDA
Ack_Pulse:
setb SCL
pop 07h
ret
Modul di atas adalah subrutin antarmuka yang
bisa digunakan pada semua serpih berbasis I2C maka aku memisahkannya
dengan nama I2C.TXT yang dapat disisipkan atau digabungkan pada aplikasi lain
yang menggunakan protokol I2C tentunya .
Udah ya, makasih
udah baca postingan aku. Semoga bisa bermanfaat, sukur-sukur bisa diterapkan
oleh sobat semua.
Salam....
MAKASIH MAS SIGIT'' ATAS INFONYA..
BalasHapusSama-sama Mas FAHMI
BalasHapusSemoga bermanfaat untuk kita semua untuk bisa share pengalaman.
Mas Sigit, itu deklarasi bit untuk FLB dan FSRDY kok sama ya?
BalasHapusOh iya Pak, ada kesalahan penulisan
BalasHapustertulis:
FLB bit RegisterBendera.1
FSRDY bit RegisterBendera.1
Bisa diganti dengan:
FLB bit RegisterBendera.1
FSRDY bit RegisterBendera.2
Trims atas perhatiannya. Nanti akan saya edit lagi.