Anda di halaman 1dari 49

KOMUNIKASI SERIAL TWI

DYAH LESTARI
Pendahuluan

Bus I2C dikembangkan pada awal 1980-an oleh Philips Semikonduktor.


Tujuan awall mempermudah koneksi CPU dengan chip periferal di TV-set.
I2C merupakan singkatan dari Inter-Integrated Circuit menyediakan
hubungan komunikasi antar IC.
Bus I2C digunakan di berbagai bidang aplikasi bukan hanya peralatan audio
dan video.
Bus I2C telah diadopsi oleh beberapa produsen chip terkemuka seperti Xicor,
ST Microelectronics, Infineon Technologies, Intel, Texas Instruments, Maxim,
Atmel, Analog Devices dan lain-lain dengan nama TWI (Two Wire Inteface).

Pendahuluan

TWI memungkinkan perancang untuk menghubungkan beberapa piranti


terkait (mikrokontroler, transduser, display, memori, dan lain-lain)
secara bersama-sama dalam sebuah sistem menggunakan metode
TWI.
TWI memungkinkan maksimum 128 piranti terhubung secara bersama-
sama. Setiap piranti mempunyai alamat yang unik dan dapat mengirim
serta menerima data melalui bus dua kabel pada frekuensi sampai 400
kHz. Hal ini akan memungkinkan piranti tersebut secara bebas bertukar
informasi dengan piranti yang lain dalam jaringan
Protokol I2C

Komunikasi serial half duplex


Transmisi data serial dilakukan dalam mode asinkron
Menggunakan dua kabel untuk berkomunikasi: jalur bi-directional SDA-
Serial Data dan bi-directional SCL-Serial Clock dengan pull up resistor,
dengan resistor pull-up pada setiap kawat bus.
Salah satu dari dua perangkat, yang mengendalikan seluruh proses,
dikenal sebagai Master dan yang lain yang merespon permintaan dari
master dikenal sebagai perangkat Slave.
ACK sinyal (pengakuan) dikirim / diterima dari kedua belah pihak
setelah setiap transfer untuk mengurangi kesalahan.
Komunikasi I2C
Proses dalam Komunikasi I2C
I2C Bus Event - START

Kondisi start bertindak sebagai sinyal untuk semua IC yang terhubung


yang menunjukkan bahwa akan ada data yang ditransmisikan ke bus.
Sebagai hasilnya, semua IC yang terhubung akan mendengarkan bus.
I2C Bus Event - STOP

Kondisi STOP dikirim sebagai sinyal untuk semua alat yang ada di bus
yang menunjukkan bahwa bus tersedia kembali (idle).
I2C Bus Event - Mengirimkan Satu
Byte Ke Slave

Setelah kondisi START dikirim, satu byte dapat ditransmisikan oleh


Master ke Slave. Byte pertama setelah kondisi start akan
mengidentifikasi slave yang ada di bus dan memilih mode operasi (read
atau write).
I2C Bus Event - Meminta
Acknowledge dari Slave

Setelah alamat atau data ditransmisikan ke bus, data atau alamat


ini harus di ACKNOWLEDGE oleh slave.
Jika yang dikirim adalah alamat: jika alamat cocok dengan alamat
slave, maka slave dan hanya slave yang alamatnya cocok akan
memberikan respons dengan ACK.
Jika yang dikirim adalah data byte ke slave yang sudah cocok
alamatnya, slave itu juga akan memberikan respons ACK.
Slave yang akan memberikan ACK menarik jalur SDA menjadi LOW
segera setelah menerima transmisi bit ke delapan
I2C Bus Event - Menerima Satu Byte
dari Slave

Setelah slave alamatnya cocok dan slave telah memberikan ACK, satu
byte dapat diterima dari slave jika R/W bit pada address di set ke READ
(set ke 1).
Sintax protokolnya sama dengan mengirimkan satu byte ke slave,
kecuali sekarang master tidak diperbolehkan menyentuh jalur SDA.
Master mengirimkan 8 pulsa clock di jalur SCL.
Slave sekarang mengontrol jalur SDA, jalur ini akan menjadi HIGH jika
slave ingin mengirimkan 1 atau tetap LOW jika ingin mengirimkan 0
I2C Bus Event - Menerima Satu Byte
dari Slave
I2C Bus Event - Memberikan
Acknowledge ke Slave

Setelah menerima satu byte dari slave, master harus memberikan


acknowledge ke slave.
Master dalam kondisi kontrol penuh jalur SDA dan SCL
Pemberian acknowledge ini dilakukan jika ingin membaca data
lebih dari satu byte dari slave.
Jika ingin membaca hanya satu byte atau pada saat menerima byte
terakhir pada pembacaan data lebih dari satu byte maka pada
tahap (3) SDA di set menjadi HIGH dalam hal ini kondisinya
dinamakan NOT ACKNOWLEDGE (NACK).
I2C Bus Event - Kondisi No
Acknowledge

NACK adalah kondisi saat master membaca data dari slave. Jika saat
pengiriman data bit ke delapan dari master ke slave, slave tidak
menarik SDA menjadi LOW maka kondisi ini dinamakan NACK. Kondisi
ini dapat diartikan :
Slave tidak ada di bus (jika data yang dikirim adalah alamat)
Slave kehilangan pulsa dan tidak sinkron dengan jalur SCL master
Bus dalam kondisi stuck. Salah satu jalur mungkin tertahan LOW secara
permanent.
Pada kondisi ini master harus membatalkan transmisi dengan
mengirimkan kondisi stop ke BUS.
Register dalam TWI

TWBR-TWI Bit Rate Register


TWSR-TWI Status Register
TWDR-TWI Data Register
TWCR-TWI Control Register
TWAR-TWI (Slave) Address Register
TWBR-TWI Bit Rate Register

Register ini digunakan pada mode master untuk mengeset faktor


pembagi untuk bit rate genarator (Frekuensi SCL CLock). Bit rate
generator unit mengontrol periode waktu SCL. Frekuensi clock SCL
ditentukan oleh Bit Rate Register (TWBR) dan bit prescaler dari register
TWSR.
TWSR-TWI Status Register

Bit 7-3 TWS : TWI Status


Bit ini menunjukkan status bus TWI. Status lengkapnya dapat dilihat di
datasheet.
Bit 2 Reserved bit
TWSR-TWI Status Register

Bit 1-0 TWPS : TWI Prescaler Bits


Bit ini digunakan untuk menentukan prescaler dari Bit rate generator unit sesuai
dengan tabel berikut.

Formula untuk menentukan Frekuensi SCL Clock adalah


TWDR-TWI Data Register

TWDR selalu mengandung data terakhir yang ada di bus SDA. Pada
mode transmitter TWDR berisi byte berikutnya yang akan
ditransmisikan. Saat mode receiver, TWDR berisi byte terakhir yang
diterima. Data di TWDR tetap stabil selama TWINT flag dalam kondisi
HIGH
TWCR-TWI Control Register

Bit 7 TWINT : TWI Interrupt Flag


Bit ini digunakan untuk memonitor status TWI. TWINT di set oleh
hardware saat TWI telah menyelesaikan pekerjaannya. SCL akan menjadi
LOW sampai saat TWINT bit di set. TWINT flag harus di clear dengan
software sebelum memulai operasi apapun pada TWI. TWINT flag di clear
dengan memberikan logika 1 padanya
TWCR-TWI Control Register

Bit 6 TWEA : TWI Enable Acknowledge Bit


Bit TWEA digunakan untuk menghasilkan pulsa ACK. Pulsa ACK dihasilkan
Jika bit TWEA ditulis menjadi 1. Dilain pihak jika bit TWEA adalah 0 maka
perangkat dapat diputus secara virtual dari bus TWI untuk sementara waktu.
Bit 5 TWSTA : TWI START Condition Bit
Dengan memberikan logika 1 ke bit ini, perangkat menjadi kontroler
master lalu mengecek apakah bus tersedia (bus tidak sibuk dalam transmisi
dengan master lain). Setelah itu menghasilkan kondisi start di bus. Jika bus
tidak bebas maka TWI menunggu sampai kondisi stop terdeteksi kemudian
menghasilkan kondisi start baru untuk mengklaim sebagai master dari bus.
TWCR-TWI Control Register

Bit 4 TWSTO : TWI STOP Condition Bit


Dengan memberikan logika 1 ke TWSTO bit, master mengirimkan
kondisi stop ke bus TWI. Ketika kondisi stop dijalankan di bus, bit TWSTO
menjadi logika 0 secara otomatis.
Bit 3 TWWC : TWI Write Collision Flag
Bit ini digunakan untuk menghindari bentrokan saat penulisan ke
TWDR. Bit TWWC akan berlogika 1 saat TWDR berusaha menulis (TWINT
berlogika 0). TWWC berlogika 0 dengan menulis TWDR saat TWINT high.
TWCR-TWI Control Register

Bit 2 TWEN : TWI Enable Bit


Bit TWEN digunakan untuk mengaktifkan/menonaktifkan interface TWI.
Saat bit ini diberi logika 1, operasi TWI diaktifkan. Jika bit ini berlogika 0,
TWI dimatikan dan transmisi TWI dihentikan
Bit 1 Reserved bit dan selalu ditulis 0
Bit 0 TWIE : TWI Interrupt Enable
Bit TWIE digunakan untuk mengaktifkan atau mematikan interrupt
request TWI. interrupt request aktif dengan memberi logika 1 ke TWIE dan
nonaktif dengan memberikan logika
TWAR-TWI (Slave) Address Register

Bit 7-1 TWA : TWI (Slave) Address Bit


Bit ini digunakan untuk menyimpan 7 bit alamat slave saat diprogram
sebagai slave transmitter atau receiver
Bit 0 TWCGA : TWI General Call Recognition Enable Bit
Bit ini digunakan untuk mengaktifkan slave untuk meng-acknowledge
alamat general call (0x00)
Mode Kerja TWI

Master sebagai transmitter


Master sebagai receiver
Slave sebagai receiver
Slave sebagai transmitter
Master Sebagai Transmitter

1. Inisialisasi master
Inisialisasi sebagai master berarti mengeset frekuensi clock TWI (SCL). Hal ini
dilakukan dengan mengeset bit rate di TWBR dan bit prescaler di TWSR.
2. Mengirim kondisi start
1) Clear TWINT dengan memberikan logika 1
2) Set TWSTA bit untuk mengirimkan kondisi start
3) Set TWEN bit untuk inisialisasi TWI
4) Memonitor status TWINT flag
5) Mengecek byte ACK (menggunakan pengkondisian while karena frekuensi SCL sangat
kecil dibandingkan dengan frekuensi clock mikrokontroler. Byte ACK dapat
dibandingkan dengan memonitor status TWSR
Master Sebagai Transmitter

3. Mengirim alamat slave, data direction bit (write) dan menunggu sinyal
ACK
1) Menaruh 7 bit alamat slave dan direction control bit di TWDR
2) Clear TWINT flag
3) Mengaktifkan TWI dengan memberikan 1 ke bit TWEN
4) Memonitor status TWINT, TWINT flag akan berlogika 0 ketika data di TWDR
telah ditransmisikan
5) Cek kebenaran ACK
Master Sebagai Transmitter

4. Mengirim 8bit data dan menunggu ACK


1) Menaruh 8 bit data di TWDR
2) Clear TWINT flag
3) Mengaktifkan TWI dengan memberikan 1 ke bit TWEN
4) Memonitor status TWINT, TWINT flag akan berlogika 0 ketika data di TWDR
telah ditransmisikan
5) Cek kebenaran ACK
Master Sebagai Transmitter

5. Mengirim kondisi Stop


1) Clear TWINT flag
2) Set bit TWEN
3) Memberikan logika 1 ke bit TWSTO
4) Memonitor status TWSTO bit, bit TWSTO akan clear setelah kondisi stop
terkirim
Master Sebagai Receiver

6. Mengirim kondisi start


Sama dengan langkah 2
Pada langkah ke 6 ini kondisi start dikirim setelah kondisi stop. Jika
satu atau lebih kondisi start dikirim sebelum kondisi stop maka ini disebut
kondisi repetitive start. Kondisi ini sama dengan kondisi start
perbedaannya hanya di ACK. Jika data dikirim terus menerus dengan arah
yang sama maka tidak perlu kondisi start, repetitive start atau stop di
antaranya. Data kedua dapat ditransmisikan setelah menerima ACK dari
byte data pertama
Master Sebagai Receiver

7. Mengirim alamat slave, data direction bit (read) dan menunggu sinyal
ACK
1) Menaruh 8 bit data di TWDR (7bit alamat slave + data direction bit (read =
1)
2) Clear TWINT flag
3) Mengaktifkan TWI dengan memberikan 1 ke bit TWEN
4) Memonitor status TWINT, TWINT flag akan berlogika 0 ketika data di TWDR
telah ditransmisikan
5) Cek kebenaran ACK
Master Sebagai Receiver

8. Membaca data dari bus SDA


1) Clear TWINT flag
2) Set TWEN bit
3) Memonitor status TWINT
4) Cek ACK. Jika master ingin menerima byte terakhir dari slave, status TWSR akan menjadi
0x58. Setelah menerima byte terakhir, repetitive start dikirimkan oleh master untuk
melanjutkan komunikasi atau memberikan kondisi stop untuk menghentikan proses. Jika
2 kondisi itu tidak diberikan maka master ingin terus menerima byte dari slave sehingga
status TWSR menjadi 0x50. Untuk memberikan ACK ke slave tentang byte terakhir, bit
TWEA digunakan saat pengiriman data. Jika bit TWEA di set, penerimaan berlanjut. Jika
bit TWEA low, master memerintahkan slave untuk mengirimkan byte terakhir
5) Mengambil data yang diterima
Master Sebagai Receiver

9. Mengirim kondisi Stop


Library i2c.h

void i2c_init(void)
Fungsi untuk inisialisasi bus I2C. Fungsi ini adalah fungsi pertama yang harus dipanggil sebelum
menggunakan fungsi-fungsi lain.
unsigned char i2c_start(void)
Memberikan Kondisi Start. Mengembalikan nilai 1 jika bus bebas atau 0 jika bus I 2C sedang sibuk
void i2c_stop(void)
Memberikan kondisi stop
unsigned char i2c_read(unsigned char ack)
Membaca satu byte data dari bus. Parameter ACK menunjukkan apakah ACK diberikan setelah
membaca satu byte.
unsigned char i2c_write(unsigned char data)
Menulis satu byte data ke bus. Mengembalikan nilai 1 jika slave memberikan ACK atau 0 jika tidak.
EEPROM AT24C01A

AT24C01A adalah EEPROM


serial 1024 bit yang
diorganisasi menjadi 128 x 8
byte. Piranti ini diakses melalui
antarmuka 2 kabel.
EEPROM AT24C01A

Alamat EEPROM AT24C01A adalah 0xA0.


Bit A2, A1 dan A0 adalah bit alamat untuk
EEPROM 1 kbit. 3 bit ini harus dibandingkan
dengan hubungan bit tersebut secara
perangkat kerasnya.
Bit ke-7 dari alamat piranti adalah bit pemilihan
operasi read/write. Operasi READ dilakukan jika
bit ini diberi logika HIGH sedangkan operasi
WRITE dilakukan jika bit ini diberi logika LOW.
Operasi byte write

Memberi START
Mengirim alamat piranti
Mengirim alamat tempat data akan disimpan/word address
Mengirim data
Memberi STOP
Operasi page write

Dalam metode page write, pengguna dapat menyimpan 8 byte data


secara berurutan ke dalam EEPROM. Setelah mengirim data pertama,
mikrokontroler dapat mengirim 7 data berikutnya secara berurutan.
EEPROM akan memberi sinyal ACK setelah menerima setiap data.
Setelah data ke-8 dikirim maka mikrokontroler akan memberi sinyal
STOP.
Operasi current read

Memberi START
Mengirim alamat piranti
Mengirim alamat tempat data akan dibaca/word address
Memberi START
Mengirim alamat piranti (termasuk bit READ)
Membaca data (termasuk NO ACK)
Memberi STOP
Mengembalikan nilai berupa data yang dibaca
Operasi sequential write

AT24C01A dapat dibaca dengan metode sequential write, artinya


pengguna dapat membaca 8 byte data secara berurutan dari EEPROM.
Setelah membaca data pertama, mikrokontroler dapat membaca 7 data
berikutnya secara berurutan. Mikrokontroler akan memberi sinyal ACK
setelah setiap data diterima, kecuali untuk data terakhir, mikrokontroler
akan memberi sinyal NO ACK setelah menerima data terakhir. Setelah
data ke-8 diterima maka mikrokontroler akan memberi sinyal STOP.
RTC DS1307

Sebuah RTC dasarnya seperti sebuah


jam.
RTC bekerja menggunakan sumber
daya dari listrik atau baterai dan
menyimpan waktu meskipun saat
listrik padam. Dengan menggunakan
RTC, pengguna dapat mencatat waktu
meskipun mikrokontroler diprogram
ulang atau mencabutnya dari USB
atau sumber daya.
RTC DS1307

RTC DS1307 ini menggunakan sistem full binary-coded decimal (BCD)


untuk jam dan kalendernya seta mempunyai 56 byte Non-Volatile SRAM
untuk penyimpanan data.
Alamat dan data ditransmisikan secara serial menggunakan I2C.
Jam dan kalender dapat memberikan informasi detik, menit, jam, hari,
tanggal, bulan, dan tahun. Jam pada IC ini dapat beroperasi dalam 24
jam atau 12 jam dengan format AM/PM.
DS1307 ini mempunyai power-sense circuit yang mendeteksi kegagalan
sumber daya dan otomatis berpindah ke daya baterai.
Register dalam RTC DS1307
Proses Transfer Data pada Bus Serial
I2C DS1307
Proses Transfer Data pada Bus Serial
I2C DS1307

Transfer data dari master transmitter ke slave receiver. Byte pertama


ditransmisikan oleh master adalah alamat slave. Selanjutnya diikuti
satu atau beberapa data byte. Slave merespons dengan memberikan
acknowledge bit setelah setiap byte diterima. Data ditransmisikan MSB
terlebih dahulu.
Transfer data dari slave transmitter ke master receiver. Byte pertama
yang merupakan alamat slave ditransmisikan oleh master. Slave
kemudian merespons dengan acknowledge bit. Lalu diikuti dengan
slave mengirimkan satu atau beberapa data byte ke master. Master
memberikan acknowledge bit setelah semua byte diterima. Di akhir
byte terakhir yang diterima, NACK diberikan oleh master ke slave.
Slave receiver mode (mode tulis)
Slave receiver mode (mode tulis)

Serial data dan clock diterima melalui SDA dan SLC. Setelah setiap byte
diterima, ACK bit di kirimkan. Kondisi START dan STOP dikenali sebagai awal
dan akhir transfer serial. Hardware melakukan pengenalan alamat setelah
penerimaan alamat slave dan direction bit. Alamat slave adalah byte pertama
yang diterima setelah maser memberikan kondisi START. Alamat slave berisi
7-bit alamat DS1307 yaitu 1101000 diikuti dengan direction bit (R/W), yang
pada mode write bernilai 0. Setelah menerima alamat slave, DS1307
mengirimkan ACK pada SDA. Setelah DS1307 mengenali alamat slave dan
write bit, master mengirimkan data ke DS1307. Proses ini mengeset register
pointer pada DS1307. Master dapat mengirimkan 0 atau data byte lagi.
Pointer register otomatis bertambah satu alamat setelah setiap byte diterima.
Master kemudian memberikan kondisi STOP untuk menghentikan penulisan
data.
Slave transmitter mode (mode baca)
Slave transmitter mode (mode baca)

Byte pertama yang ditransmisikan adalah 7-bit alamat slave diikuti


dengan RW bit yang bernilai 1. Setelah menerima dan mendecode
alamat slave, DS1307 memberikan ACK. DS1307 mulai mengirimkan
data dimulai dengan alamat register yang dintuntuk oleh pointer
register. Jika pointer register tidak ditulis sebelum inisialisasi mode
baca, byte pertama yang dibaca adalah yang terakhir disimpan di
pointer register. Pointer register otomatis bertambah satu setelah
setiap byte dibaca. DS1307 harus menerima Not Acknowledge (NACK)
untuk menghentikan pembacaan.

Anda mungkin juga menyukai