Translate

Antarmuka Mikrokontroler Dengan Serpih Memori Atau I/O Dengan Protokol I2C



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....

4 komentar:

  1. MAKASIH MAS SIGIT'' ATAS INFONYA..

    BalasHapus
  2. Sama-sama Mas FAHMI

    Semoga bermanfaat untuk kita semua untuk bisa share pengalaman.

    BalasHapus
  3. Mas Sigit, itu deklarasi bit untuk FLB dan FSRDY kok sama ya?

    BalasHapus
  4. Oh iya Pak, ada kesalahan penulisan

    tertulis:
    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.

    BalasHapus