Minggu, 28 Februari 2016

Komunikasi I2C (Inter-Integrated Circuit) atau TWI (Two Wire Interface) bagian 3

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 7 – TWINT: TWI Interrupt Flag
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.


Bits 7..3 – TWS: TWI Status
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