Translate

Antarmuka I2C Untuk Memori AT24C32/64



Pada artikel sebelumnya, penulis sudah pernah membahas mengenai memori AT24C512. Maka kali ini akan penulis bahas mengenai memori sejenis yang memiliki kapasitas lebih kecil yaitu AT24C32 dan AT24C64. Sebenarnya secara pemrograman, kedua IC memori ini hampir sama persis dengan AT24C512 hanya ada beberapa perbedaan terutama pada kapasitas; besarnya byte pada prosedur PageWrite yaitu hanya 32 saja; waktu proses penulisan tWC yang hanya 10/5 ms; dan tentunya pin alamatnya yaitu A2, A1 dan A0.

Ini adalah 2 dari produk memori keluaran dari Atmel yaitu AT24C32 yang memiliki kapasitas sebesar 32.768 bit atau 4.096 byte dalam setiap kemasannya dan AT24C64 dengan kapasitas 65.536 bit atau 8.192 byte. Memori yang dikemas cukup efisien dalam penggunaan pin dalam antarmuka dengan mikrokontroler. Dikenal dengan nama 2-wire Serial EEPROM menggunakan teknologi I2C.


Untuk antarmuka dengan mikrokontroler, AT24C32/64 memiliki 2 pin SCL (serial clock) dan SDA (serial data). Operasi antarmuka yang dijalankan menurut kaidah I2C. Memori ini juga memiliki pin untuk tujuan pengalamatan yaitu A2, A1 dan A0 sehingga memungkinkan untuk penggunaan secara paralel hingga 8 unit sekaligus. Kita dapat merakit secara paralel memori ini dengan antarmuka I2C untuk mendapatkan maksimal sebesar 32 kByte untuk AT24C32 dan 64 kByte untuk AT24C64. Memori ini juga dilengkapi dengan pengaman terjadi kesalahan prosedur yang dapat menghilangkan isinya yaitu memiliki pin WP (write protect) di mana jika pin ini dihubungkan ke catu (Vcc) maka operasi tulis akan diabaikan.

Secara internal memori AT24C32/64 memiliki alamat 1010H pada MSB yang harus ditambahkan pada saat melakukan operasi pengalamatan diikuti oleh alamat sesuai dengan pin A2, A1 dan A0. Format pengalamatan unit memori ini dapat dilihat di bawah ini.


AT24C32/64 memiliki prosedur yang dapat dijalankan untuk operasi baca maupun tulis. Pada operasi menulis sendiri disediakan 2 mode yaitu Byte Write atau penulisan isi memori per-byte dan Page Write yaitu penulisan memori secara perhalaman dengan jumlah data perhalaman adalah 32 byte. Pada penulisan WordAddress yang terdiri dari 2 byte maka pada AT24C64, bit yang bertanda (*) adalah diabaikan karena memori jenis ini hanya memiliki alamat memori dari 0000H sampai 1FFFH. Sementara untuk AT24C32, bit yang bertanda (#) juga diabaikan karena memori jenis ini hanya memiliki alamat memori dari 0000H sampai 0FFFH saja.


Untuk melakukan prosedur baca tulis pada memori AT24C32/64 maka diperlukan program seperti di bawah ini. Isi dari program sama persis dengan AT24C512 yang sudah dibahas pada artikel sebelumnya. Karena sebab tersebut maka penulis melakukan sedikit perubahan pada beberapa bagian yaitu angka 512 untuk AT24C512 diganti 32 untuk AT24C32 dan 64 untuk AT24C64 dan beberapa catatan tentang apa saja yang perlu diubah dari list program di bawah ini.

Kita mulai pembahasan dengan subrutin AT24C32_Write yang dijalankan untuk menulis dalam mode single byte maupun page write. Untuk itu ada beberapa register yang harus ditetapkan. Register B diperlukan untuk menentukan alamat unit, karena AT24C32/64 memiliki alamat unit 2 bit (A2, A1 dan A0) maka nilai B bisa berisi antara 00H sampai 07H. Register akumulator (ACC) digunakan untuk menentukan banyaknya byte yang akan ditulis. Register R0 digunakan untuk menunjukkan data yang akan disimpan. Dan register DPTR untuk menentukan alamat memori dari AT24C32/64.

AT24C32_Write:

;     Input : B    > Unit Address
;             ACC  > Length Data, max 32 byte
;             R0   > Buffer Data
;             DPTR > Memory Address

Catatan:

Untuk memori AT24C64 subrutin AT24C32_Write di atas bisa diganti dengan AT24C64_Write.

Rutin AT24C32_Write selanjutnya akan menjalankan program dengan menyimpan banyaknya data yang akan ditulis dari akumulator ke register R7. Kemudian register B akan dimanipulasi ke akumulator dengan menambahkan nibel MSB dari AT24C32/64 yaitu 1010H. Karena proses menulis maka bit 0 akan dinolkan. Proses selanjutnya adalah mengirim Device Address dan Word Address di mana panjang word address adalah 2 byte. Setiap pengiriman byte data maka nilai bit FACK akan senantiasa diperiksa untuk memeriksa kesalahan unit memori.

      push  07h
      push  06h
      push  05h
      mov   r7, a
      acall I2C_Start_Con
      mov   a, b
      orl   a, #10100000b
      acall Master_Tx
      jnb   FACK, EndC32Write
      mov   a, dph
      acall Master_Tx
      jnb   FACK, EndC32Write
      mov   a, dpl
      acall Master_Tx
      jnb   FACK, EndC32Write

Sekarang memori AT24C32/64 siap untuk menerima data yang berasal dari register R0. Banyaknya data yang ditulis ditentukan oleh nilai register R7. Pada setiap byte yang ditulis, unit memori membutuhkan waktu (tWR) untuk proses penyimpanan selama kurang lebih 5 ms. Setelah seluruh data selesai ditulis maka akan diakhiri dengan memanggil subrutin I2C_Stop_Con.

      PageWrite:
            mov   a, @r0
            inc   r0
            acall Master_Tx
            jnb   FACK, EndPageWrite
            acall AT24C32_WriteDelay
            djnz  r7, PageWrite

            EndC32Write:
                  acall I2C_Stop_Con
                  pop   05h
                  pop   06h
                  pop   07h
                  ret

Untuk memberikan waktu bagi AT24C32/64 memproses penyimpana data maka diperlukan penundaan tWR selama kurang lebih 5 ms dengan subrutin penunda AT24C32_WriteDelay berikut.

            AT24C32_WriteDelay:
                  mov   r6, #10    

                  WriteDelay:
                        mov   r5, #250
                        djnz  r5, $
                        djnz  r6, WriteDelay
                        ret

Catatan:

Untuk penggunaan catu daya bagi memori dengan tegangan 1,8 volt maka sesuai referensi dari datasheet maka waktu tWR setidaknya 10 ms. Untuk itu nilai register R6 harus 20.

Nah, selanjutnya kita akan membahas mengenai pembacaan isi memori AT24C32/64. Register yang digunakan masih sama hanya saja fungsi register R0 di sini digunakan untuk menyimpan data dari memori. Prosedur berikutnya masih sama dengan proses menulis untuk pengiriman Device Address dan 2 byte WordAddress.

AT24C32_Read:

;     Input : B    > Unit Address
;             ACC  > Length Data, max buffer size
;             DPTR > Memory Address
;     Output      : R0   < Buffer Data

      push  07h
      mov   r7, a
      acall I2C_Start_Con
      mov   a, b
      orl   a, #10100000b
      acall Master_Tx
      jnb   FACK, EndC32Read
      mov   a, dph
      acall Master_Tx
      jnb   FACK, EndC32Read
      mov   a, dpl
      acall Master_Tx
      jnb   FACK, EndC32Read

Untuk proses membaca, kita perlu mengirimkan kembali perintah I2C_Start_Con dilanjutkan dengan mengirin DeviceAddress. Pada prosedur pembacaan maka nilai bit FLB (flag last bit) digunakan untuk menentukan proses karena pada setelah pembacaan byte terakhir, tidak akan mengirimkan sinyak Acknowledge.

      acall I2C_Start_Con
      mov   a, b
      orl   a, #10100001b
      acall Master_Tx
      jnb   FACK, EndC32Read
      clr   FLB

      SequentialRead:
            djnz  r7, SeqRead
            setb  FLB

            SeqRead:
                  acall Master_Rx
                  mov   @r0, a
                  inc   r0
                  jb    FLB, EndC32Read
                  ajmp  SequentialRead

      EndC32Read:
            acall I2C_Stop_Con
            pop   07h
            ret

Berikut adalah subrutin yang digunakan untuk me-reset memori pada beberapa kondisi seperti setelah protokol interupsi, power loss atau reset sistem. Prosedur reset hanyalah memberikan pulsa clock SCL sebanyak 9 kali dengan kondisi SDA tinggi. Dalam beberapa penerapan, penulis jarang menggunakan subrutin ini tapi untuk mengikuti prosedur sebaiknya digunakan.

AT24C32_Reset:
      push  07h
      push  06h
      setb  SDA
      mov   r7, #9

      Reset512:
            clr   SCL
            mov   r6, #2
            djnz  r6, $
            setb  SCL
            mov   r6, #2
            djnz  r6, $
            djnz  r7, Reset32
            jb    SDA, End512Reset
;           setb  Fail

      End32Reset:
            pop   06h
            pop   07h
            ret

Program di atas penulis masukkan dalam file bernama AT24C32.TXT untuk modul subrutin AT24C32 dan AT24C64.TXT untuk AT24C64 dengan atau tanpa perubahan agar dapat digunakan pada aplikasi lainnya.

Agar Sobat tidak bingung, aku lampirkan list program untuk I2C.TXT yang sudah pernah kutulis pada artikel “Antarmuka Dengan Protokol I2C” sebelumnya dapat dilihat berikut ini:

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

Master_Tx:

;     Input : ACC > Data

      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

Master_Rx:

;     Input  : FLB > 1/0     
;     Output : ACC < Data

      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



Sudah ya, terima kasih sudah membaca artikel ini. Semoga apa yang penulis sampaikan bermanfaat dan bisa diterapkan oleh sobat semua.

Salam....


1 komentar:

  1. maksih udah menyempatkan menulis artikel ini...saya blm pernah menemukan halaman yag FULL dan gratis ....seperti halaman blog ini...
    mudah-mudahan yg NULIS artikel ini ( pak sigit widodo) diberikan kesehatan dan rizqi yg melimpah....supaya bisa nulis artikel yg lebih banyak lagi.....maju terus pak

    BalasHapus