I2C
(Inter-Integrated Circuit) atau TWI (Two Wire Interface) bagian 3
EEPROM
24C32
EEPROM
24C32, diperlihatkan pada gambar 10,
adalah EEPROM 32 Kb atau 4 KB buatan Microchip. Selain
buatan microchip ada juga beberapa EEPROM buatan pabrik yang berbeda
seperti AT24C32 buatan Atmel, LR24C32 buatan Leshan Radio dll.
Fokus pembahasan disini adalah EEPROM 24C32 buatan Microchip.
Kita perlu mengenal
karakteristik dari EEPROM karena ia harus diperlakukan berbeda pada
komunikasi serial TWI (I2C). Mengakses EEPROM dengan menggunakan
metode serial TWI tidak seperti mengakses devise lain yang
diperlengkapi dengan komunikasi serial TWI. Pembahasan khusus pada
EEPROM jenis 24C32 diperlukan agar kita dapat mengaksesnya (operasi
baca atau menulis).
Gambar 10 Pinout dari EEPROM 24C32.
Pengalamatan/pemilihan EEPROM ini ditentukan oleh kaki A0, A1 dan A2.
Microchip memberikan alamat pada EEPROM ini 1-0-1-0-x-x-x dengan
x-x-x menunjukkan kaki A0, A1, A2 yang merupakan LSB dari alamat
EEPROM tersebut. Jadi perintah baca/tulis pada master diperlihatkan
pada gambar 11.
Gambar 9. Format dan State pada mode Master Receiver
Gambar 11. Pengalamatan EEPROM 24C32
Proses penulisan sebuah byte, dengan mengacu gambar 11, pada EEPROM
sebagai berikut :
1. Master (UC) membangkitkan pulsa start.
2. Master membangkitkan 8 bit alamat yang akan ia kirimkan data, yang
terdiri dari : 4 bit alamat Slave, 3 bit memilih EEPROM pada bus TWI,
1 bit LOW untuk operasi menulis EEPROM.
3. Jika EEPROM siap untuk menerima data dari UC maka akan
membangkitkan pulsa ACK (LOW), tetapi jika sedang sibuk maka akan
membengkitkan NACK.
4. Master mengirimkan 8 bit MSB alamat untuk ditulis pada Address
Pointer EEPROM.
5. EEPROM menjawab dengan ACK.
6. Master mengirimkan lagi 8 bit LSB alamat untuk ditulis pada
Address Pointer EEPROM.
7. EEPROM sudah menerima alamat lengkap untuk data yang akan ditulis
pada EEPROM Array, sehingga EEPROM membangkitkan pulsa ACK.
8. Master mengirimkan data yang akan ditulis pada EEPROM Array.
9. EEPROM mengirimkan sinyal ACK
10. Master mengirimkan pulsa STOP.
Segera setelah Master mengirimkan pulsa STOP, EEPROM mulai melakukan
penulisan, proses dilakukan secara internal pada EEPROM, data yang
dikirimkan Master ke alamat EEPROM Array. Alamat EEPROM array yang
dikirimkan master disimpan dalam Address Pointer EEPROM. Jadi data
yang dikirim oleh Master tidak langsung ditulis ke EEPROM Array
tetapi disimpan dalam Buffer atau yang dikenal dengan nama Cache.
Jumlah Cache memory pada EEPROM 24C32 adalah sebesar 64 Byte. Hal ini
berarti Master dapat mengirimkan data sebanyak 64 Byte dalam satu
kali proses pengiriman data. Gambar 12 memperlihatkan pengiriman data
1 Byte dari Master ke EEPROM sedangkan gambar 13 adalah pengiriman
data lebih dari 1 Byte. Data maksimum yang dikirim master adalah
sebesar 64 Byte, jika data lebih besar dari 64 Byte maka akan terjadi
overwrite pada data yang pertama dikirim. Hal ini berarti data yang
pertama dikirim akan dihapus.
Gambar 12. Pengiriman data 1 Byte dari Master
Gambar 13. Pengiriman data dari Master lebih dari 1 Byte
Pada saat penulisanan internal data yaitu proses pemindahan data di
Cache memory ke EEPROM Array, 24C32 tidak akan membangkitkan ACK
signal sehingga dapat dipergunakan untuk menentukan apakah dia sudah
dapat melayani permintaan Master atau masih sibuk yang ditandai NACK.
Khusus EEPROM 24C32 produksi Microchip memiliki 64 Cache Memory
sehingga maksimum pengiriman data dari Master ke Slave (EEPROM 24C32)
adalah sebanyak 64 byte. Tetapi hendaknya jumlah data yang dikirim
(yang akan ditulis ke EEPROM 24C32) kurang dari 64 byte pada satu
kali proses pengiriman. EEPROM buatan pabrik yang lain memiliki cache
memory yang lebih kecil bahkan ada yang tidak dilengkapi dengan cache
memory.
Proses pembacaan pada 24C32 sama dengan proses penulisan hanya saja
bit ke-8 merupakan HIGH. Ada 3 (tiga) operasi dasar pada Permintaan
data dari Master ke Slave, yaitu : Current Read, Random Read dan
Sequential Read. Setelah operasi Read/Write Address Counter memegang
alamat terakhir yang diakses. Address Counter tersebut selalu
ditambahkan 1 untuk operasi berikutnya. Sehingga operasi berikutnya
pada EEPROM, Address Counter bertambah satu. Sehingga hal ini dapat
dimamfaatkan untuk operasi Current Address Read. Proses operasi
Current Address Read adalah :
1. Master mengirimkan 8 bit alamat dengan bit ke-8 adalah HIGH
(Read).
2. Slave menjawab dengan pulsa ACK
3. Slave mengirimkan data yang terdapat pada Address Counter + 1
4. Master memberikan pulsa STOP bukan memberikan ACK.
5. Slave menghentikan proses pengiriman data.
Gambar 14. Proses Current Address
Pada operasi Random Read, Slave mengirimkan data sesuai dengan dengan
alamat yang diminta oleh Master. Untuk melaksanakan operasi tersebut
:
1. Master mengirimkan 8 bit alamat (Control Byte) dengan bit ke-8
adalah LOW (Write).
2. Slave menjawab dengan ACK
3. Master mengirmkan byte alamat. Byte alamat ini merupakan MSB dari
alamat yang dituju oleh Master. Byte alamat tersebut dituliskan ke
Address Pointer dari 24C32.
4. Slave menjawab dengan ACK
5. Master mengirimkan 8 bit alamat. Sekarang yang dikirim LSB dari
alamat yang dituju oleh Master. Pengiriman 2 byte alamat, yang
dikirim oleh Master, menghasilkan alamat yang lengkap pada Address
Pointer.
6. Slave menjawab dengan ACK.
7. Master mengirimkan pulsa START Pengiriman pulsa START
memberitahukan bahwa penulisan di Slave dihentikan.
8. Master mengirimkan 8 bit alamat (Control Byte) dengan bit ke-8
adalah HIGH (READ).
9. Slave menjawab dengan ACK dan mengirimkan data, yang alamatnya ada
di Address Counter, ke Master.
10. Master menjawab dengan NACK dan kemudian mengirimkan pulsa STOP.
Gambar 15 menunjukan operasi random read pada EEPROM 24C32.
Gambar 15. Operasi Read Random
Proses pembacaan EEPROM 24C32 secara sequensial sama seperti operasi
Random Read. Hanya saja Master mengirimkan sinyal ACK pada saat byte
data diterima. Pengiriman sinyal ACK oleh Master ini memberitahukan
Slave untuk mengirimkan data pada alamat berikutnya. Jika Master
menginginkan pengirman data dihentikan maka Master menjawab dengan
NACK diikuti dengan pulsa STOP. Gambar 16 memperlihatkan proses
sequential read. Seluruh data pada EEPROM 24C32 dapat dibaca
seluruhnya pada satu kali operasi sequensial read.
Gambar 16. Proses Sequential Read
Mengakses EEPROM 24C32 dengan menggunakan UC ATMega328 memerlukan
kombinasi dari Mode Master Transmitter dan Mode Master Receiver.
Diperlukannya kedua mode tersebut untuk mengakses EEPROM karena untuk
mengakses diperlukan pentranferan data dari Master ke Slave dan
begitu juga sebaliknya (data dari Slave ke Master). Sebagai contoh,
Master memerintahkan Slave untuk mengirimkan data, maka Master
mengirimkan alamat data ke Slave. Pada saat ini Master harus
berstatus sebagai MT mode. Kemudian data dikirimkan oleh Slave ke
Master sehingga Master harus mengubah statusnya menjadi MR mode.
Proses tersebut diilustrasikan pada gambar 17.
Gambar 17. Proses Pembacaan EEPROM pada UC ATMega328
Register-Register
pada TWI
Bits
7..0 – TWI Bit Rate Register
TWBR mensetting division factor untuk bit rate generator. Bit rate
generator adalah dipergunakan untuk membangkitkan frekuensi serial
clock (SCL) ketika dalam mode Master.
Bit TWINT akan diset oleh Hardware ketika TWI telah selesai
melaksanakan perintah dan mengharapkan sebuah program (Interrupt
vektor) untuk meresponnya. Interrupt Service Vector tersebut bersifat
optional, jadi boleh tidak ada. Interrupt Vector akan dijalankan jika
kedua bit, bit global Interrupt dan TWIE, berstatus set. Selama TWINT
Flag dalam keadaan set, bus serial clock (SCL) akan dipaksa tetap
dalam LOW. TWINT Flag harus diclearkan secara software dengan
menuliskan zero ke bit TWINT. Ingatlah bahwa TWINT Flag tidak berubah
menjadi LOW secara automatis, diclearkan secara hardware, ketika
interrupt sevice vector telah selesai dijalankan.
Bit 6 – TWEA: TWI Enable Acknowledge Bit
Bit TWEA mengontrol pembangkitan pulsa ACK (Acknowledge). Jika bit
ini di-clearkan maka UC disconnected secara virtual dari bus TWI.
Bit 5 – TWSTA: TWI START Condition Bit
Menset bit TWSTA dan UC dalam posisi sebagai Master, UC akan
mengecek apakah bus TWI dalam keadaan free (tidak sibuk). Pulsa START
akan dibangkitkan jika bus TWI sedang free. Jika bus TWI sedang sibuk
maka UC akan menunggu sampai pulsa STOP diterima oleh UC. Segera
setelah pulsa STOP diterima, UC membangkitkan pulsa START lagi dan
menclaim sebagai Master TWI Bus. Bit TWSTA harus diclearkan secara
software ketika pulsa START telah dikirimkan.
Bit 4 – TWSTO: TWI STOP Condition Bit
Saat UC berstatus sebagai Master, men-set bit TWSTO akan
membangkitkan pulsa STOP. Bit ini akan diclearkan secara automatis
(oleh Hardware) ketika pulsa STOP telah dikirimkan.
Bit 3 – TWWC: TWI Write Collision Flag
Jika bit TWWC berubah menjadi set maka ini mengindikasikan bahwa
telah terjadi usaha untuk menulis TWDR (TWI Data Register) ketika
TWINT berada dalam keadaan LOW. Flag ini akan diclearkan dengan
penulisan register TWDR ketika TWINT dalam posisi HIGH.
Bit 2 – TWEN: TWI Enable Bit
Menset bit TWEN mengaktifkan TWI Interface dan men-enablekan operasi
TWI. Hal ini berarti pin I/O diambil alih oleh TWI menjadi pin SCL
dan pin SDA.
Bit 1 – Res: Reserved Bit
Bit 0 – TWIE: TWI Interrupt Enable
Jika bit TWIE dan global interrupt di-set, maka vector interrupt akan
dijalankan ketika TWINT flag HIGH.
Kelima bit ini menggambarkan status dari TWI Logic dan bus serial
SDA dan SCL. Harga yang dibaca dari register TWSR merupakan gabungan
dari 5 bit dari TWI Status dan 2 bit dari harga prescaler. Programmer
harus me-mask kedua bit prescaler menjadi zero ketika akan mengecek
kelima bit status. Hal ini menghasilkan pengecekan status terlepas
(bebas) dari prescaler setting.
Bit 2 – Res: Reserved Bit
Bits 1..0 – TWPS: TWI Prescaler Bits
Kedua bit ini dipergunakan untuk bit rate prescaler.
Tabel 1. Prescaler untuk menghitung bit rate.
Table 21-7 on page 243 adalah tabel 1. Prescaler untuk menghitung bit
rate
Pada Mode Transmit, Byte berikutnya yang akan dikirimkan dikandung
pada register TWDR.
Pada Mode Receive, Register TWDR mengandung byte terakhir yang
diterima.
Data Register tidak dapat diinisialisasi oleh user sebelum interrupt
pertama terjadi. Data pada TWDR akan tetap stabil selama TWINT set.
Bits 7..0 – TWD: TWI Data Register
Kedelapan bit ini berisi data byte berikutnya yang akan dikirim oleh
UC atau berisi data byte terakhir yang diterima UC dari bus TWI.
Contoh Program.
/****************************************************************************
Program
Untuk mengakses EEPROM 24C32 Microchip dengan menggunakan komunikasi
TWI
Kaki
A0, A1, A2 pada EEPROM 24C32 di hubungkan dengan GND
Frekuensi
Serial Clock (SCL) 100 kHz
Penulisan
Data 0x75 ke alamat EEPROM 0x0005
Mempergunakan
LED sebagai indikator komunikasi TWI
LED
menyala jika mendapat LOW (aktif LOW).
Frekuensi
Clock CPU 8 MHz
*****************************************************************************/
#include
<avr/io.h>
#define
Dev24C32 0xA0 // Alamat EEPROM/Control Byte 24C32 (memilih
EEPROM)
#define
F_CPU 8000000UL
#define
SCL_CLOCK 100000L // Frekuensi serial clock 100kHz
#define
START 0x08 //Status Kode pada TWSR yg menunjukkan pulsa START
telah
dikirim
//
UC menggunakan mode Master Transmitter. Hal. 229 Tabel 21.2
#define
SLA_W 0xA0 // Alamat Slave (EEPROM) untuk operasi write
0xA0=10100000
//
1010 alamat dari Microchip. 000 karena A0, A1, A2 di
//
GND. 0 = W
#define
MT_SLA_ACK 0x18 // Status kode pada TWSR yg menunjukkan SLA_W
telah
//dikirim
Pulsa ACK dari Slave telah diterima oleh
//Master
Transmitter
#define
MT_DATA_ACK 0x28 // Status kode pada TWSR yg menunjukkan Data byte
telah
//dikirim
Pulsa ACK dari Slave telah diterima oleh Master
uint8_t
alamat_msb = 0x00;
uint8_t
alamat_lsb = 0x05;
uint8_t
Data =0x75;
int
main(void)
{
//==============Inisialisasi=====================================================
DDRB
= 0xff; // Seluruh pin PORTB sebagai output
PORTB
= 0xff; // Seluruh LED Padam
//
inisialisasi komunikasi TWI clock: 100 kHz clock, TWPS = 0 =>
prescaler = 1
TWSR
= 0; // no prescaler
TWBR
= ((F_CPU/SCL_CLOCK)-16)/2; //hal. 222
//=================================================================================
//=======
Kirim Pulsa Start ==========================================
TWCR
= (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); // Hal. 226
Baris pertama
//
Tunggu sampai TWINT Flag set, Hal ini menunjukkan bahwa sinyal START
telah //dikirim
while(!(TWCR
& (1<<TWINT))); //Hal. 226 Baris kedua
//
Cek apakah pengiriman pulsa START sukses atau slave tidak busy
if((TWSR
& 0xF8) != START)
{
PORTB &= ~(1<<PB1);
//LED
di PB1 menyala menunjukkan terjadi error pada pengiriman pulsa START.
}
//Sampai
disini pengiriman pulsa START telah sukses
//========Kirim
alamat Slave (byte control) + 0 ================================
//
+ 0 menunjukkan operasi write pada Slave
TWDR
= SLA_W; // Alamat EEPROM 24C32 + operasi write
TWCR
= (1<<TWINT) | (1<<TWEN); // kirim byte control. Hal.
226, baris ke-3
//
Tunggu TWINT Flag menjadi set, hal ini menunjukkan byte control telah
terkirim
//
dan UC menerima ACK/NACK
while(!(TWCR
& (1<<TWINT))) //hal. 226, baris ke-4
//Cek
harga TWI Status register, jika status berbeda dari MT_SLA_ACK maka
//telah terjadi error
if((TWSR
&0xF8) != MT_SLA_ACK) //MT_SLA_ACK = 0x18. Hal.229, tabel
21.2
{
PORTB &= ~(1<<PB2);
//LED
di PB2 menyala menunjukkan terjadi error pada pengiriman byte control
}
//Sampai
disini pengiriman control byte telah sukses
//
=============Kirim Alamat yang dituju pada EEPROM
==============================
//
pengiriman pertama MSB dari alamat EEPROM
TWDR
= alamat_msb; //alamat_msb = 0x00
TWCR
= (1<<TWINT) | (1<<TWEN);
//
Tunggu TWINT Flag menjadi set, hal ini menunjukkan MSB telah terkirim
dan
//
dan telah ditulis di address pointer, UC telah menerima ACK
while
(!(TWCR & (1<<TWINT)));
//Cek
harga TWI Status register, jika status berbeda dari MT_DATA_ACK maka
//telah
terjadi error
if
((TWSR&0xF8) != MT_DATA_ACK) //MT_DATA_ACK = 0x28. hal.229,
tabel 21.2
{
PORTB
&= ~(1<<PB3);
//LED
di PB3 menyala menunjukkan terjadi error pada penulisan data byte
}
//
pengiriman kedua LSB dari alamat EEPROM
TWDR
= alamat_lsb ; //alamat_lsb = 0x05
TWCR
= (1<<TWINT) | (1<<TWEN);
//
Tunggu TWINT Flag menjadi set, hal ini menunjukkan MSB telah terkirim
dan
//
dan telah ditulis di address pointer, UC telah menerima ACK
while
(!(TWCR & (1<<TWINT)));
//Cek
harga TWI Status register, jika status berbeda dari MT_DATA_ACK maka
//telah
terjadi error
if
((TWSR&0xF8) != MT_DATA_ACK) //MT_DATA_ACK = 0x28. hal.229,
tabel 21.2
{
PORTB
&= ~(1<<PB4);
//LED
di PB4 menyala menunjukkan terjadi error pada penulisan data byte
}
//
Sampai disini pengiriman alamat EEPROM (Address Pointer) sukses
//============Kirim
data yang akan ditulis ke EEPROM ===========================
TWDR
= Data; //data = 0x75
TWCR
= (1<<TWINT) | (1<<TWEN);
//
Tunggu TWINT Flag menjadi set, hal ini menunjukkan MSB telah terkirim
dan
//
dan telah ditulis di address pointer, UC telah menerima ACK
while
(!(TWCR & (1<<TWINT)));
//Cek
harga TWI Status register, jika status berbeda dari MT_DATA_ACK maka
//telah
terjadi error
if
((TWSR&0xF8) != MT_DATA_ACK) //MT_DATA_ACK = 0x28. hal.229,
tabel 21.2
{
PORTB
&= ~(1<<PB5);
//LED
di PB5 menyala menunjukkan terjadi error pada penulisan Data ke ke
//cache
24C32
}
//
Sampai disini pengiriman Data ke EEPROM sukses
//============Kirim
Pulsa STOP untuk menghentikan komunikasi==================
TWCR
= (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
//
====Pengiriman data ke EEPROM dengan Komunikasi TWI Sukses
PORTB
= 0xff; // Seluruh LED Nyala menunjukkan Pengiriman data
sukses
return
0;
}
Tidak ada komentar:
Posting Komentar