Jika pada artikel sebelumnya sudah saya bahas bagaimana mengakses EEPROM internal, dalam beberapa kasus jumlah atau kapasitas 256 byte tidaklah cukup. Jangan kawatir, masih ada EEPROM lain, yang tentunya bukan internal, yang kapasitasnya lebih dari 256 byte.
Pembahasan EEPROM eksternal saya awali dengan memperkenalkan sebuah EEPROM AT24C1024 dari Atmel dengan kapasitas 1024 byte atau 1KByte, lumayan bisa menyimpan data 4 kali lipat dari EEPROM internal-nya PIC16F877. Namun yang lebih penting adalah antarmukanya menggunakan I2C, jadi sekalian belajar bagaimana membuat rangkaian dasar I2C dan membuat programnya sekaligus.
I2C (“i-squared cee” or “i-two cee”; Inter-Integrated Circuit; generically referred to as “two-wire interface”) is a multi-master serial single-ended computer bus invented by Philips that is used to attach low-speed peripherals to a motherboard, embedded system, cellphone, or other electronic device. Since the mid 1990s, several competitors (e.g. Siemens AG (later Infineon Technologies AG), NEC, Texas Instruments, STMicroelectronics (formerly SGS-Thomson), Motorola (later Freescale), Intersil, etc.) brought I2C products on the market, which are fully compatible with the NXP (formerly Philips’s semiconductor division) I2C-system. As of October 10, 2006, no licensing fees are required to implement the I2C protocol. However, fees are still required to obtain I2C slave addresses allocated by NXP. (wikipedia)
Pada Gambar 1 ditunjukkan contoh rangkaian antarmuka I2C dengan sebuah master (mikrokontroler), tiga slave (ADC, DAC dan mikrokontroler lainnya) dan (tidak lupa) dua buah resistor pull-up yang masing-masing ditempatkan pada kaki SCL dan SDA. Pada Gambar 2 ditunjukkan contoh IC AT24C1024.
Gambar 1
Gambar 2
Deskripsi AT24C1024
The AT24C1024 provides 1,048,576 bits of serial electrically erasable and programmable read only memory (EEPROM) organized as 131,072 words of 8 bits each. The device’s cascadable feature allows up to two devices to share a common two-wire bus. The device is optimized for use in many industrial and commercial applications where low-power and low-voltage operation are essential. The devices are available in space-saving 8-lead PDIP, 8-lead EIAJ SOIC, 8-lead Leadless Array (LAP) and 8-lead SAP packages. In addition, the entire family is available in 2.7V (2.7V to 5.5V) versions. (datasheet)
Fitur AT24C1024
- Low-voltage Operation: 2.7 (VCC = 2.7V to 5.5V)
- Internally Organized 131,072 x 8
- Two-wire Serial Interface
- Bidirectional Data Transfer Protocol
- Write Protect Pin for Hardware and Software Data Protection
- 256-byte Page Write Mode (Partial Page Writes Allowed)
- Random and Sequential Read Modes
- Self-timed Write Cycle (5 ms Typical)
- High Reliability
- Endurance: 100,000 Write Cycles/Page
- Data Retention: 40 Years
Diagram Pin
Gambar 3
Deskripsi PIN
- SERIAL CLOK (SCL): digunakan untuk memberikan detak sisi positif (L-H) ke masing-masing piranti EEPROM dan luaran detak sisi negatif (H-L) dari masing-masing piranti;
- SERIAL DATA (SDA): merupakan pin dwi-arah saluran data serial. Pin ini bersifat open-drain dan dapat di-OR-kan dengan sejumlah piranti dengan open-drain atau open-collector lainnya;
- DEVICE/ADDRESSES (A1): untuk menentukan alamat EEPROM yang bersangkutan, karena hanya 1 pin untuk alamat, maka hanya maksimal 2 EEPROM AT24C1024 yang bisa dirangkaikan (total 2×1024=2048byte);
- WRITE PROTECT (WP): jika dihubungkan ke GND membolehkan operasi penulisan, sebaliknya jika dihubungkan ke Vcc, maka tidak diperbolehkan operasi penulisan, hanya pembacaan data saja.
Rangkaian antarmuka AT24C1024 dengan PIC16F877
Gambar 4
Contoh Program Pustaka
void write_ext_eeprom(int chip, long address, char data) { i2c_start(); i2c_write(chip); i2c_write((address >> 8 ) & 0x7F); i2c_write(address); i2c_write(data); i2c_stop(); delay_ms(10); }
int read_ext_eeprom(int chip, long address) { int data; i2c_start(); i2c_write(chip); i2c_write((address >> 8 ) & 0x7F); i2c_write(address); i2c_start(); i2c_write(chip | 0x01); data = i2c_read(0); i2c_stop(); return(data); }
Penjelasan
- Ada dua fungsi yang kita definisikan disini, untuk menulis data ke EEPROM (void write_ext_eeprom(int chip, long address, char data)) dan membaca data dari EEPROM (read_ext_eeprom(int chip, long address));
- Prosedure untuk menulis maupun membaca data ke/dari EEPROM dengan antarmuka i2c pada prinsipnya sama (begitu juga peralatan lain berbasis antarmuka i2c), diawali dengan instruksi i2c_start() dilanjutkan dengan i2c_write(id_chip) untuk memilih chip mana yang akan diakses;
- Perhatikan bahwa penggunaan antarmuka i2c memungkinkan beberapa device i2c disusun menggunakan rangkaian multidrop, sebagaimana ditunjukkan pada Gambar 1;
- Kemudian instruksi dilanjutkan dengan menuliskan alamat lokasi EEPROM yang akan diakses, menggunakan i2c_write((address >> 8 ) & 0x7F); dan i2c_write(address);. Mengapa bentuknya seperti ini, silahkan diperhatikan Gambar 5 dan 6 tentang format alamat dan data pada AT24C1024;
Gambar 5. format pengalamatan AT24C1024
Gambar 6. format penulisan data AT24C1024
Contoh Program Utama
#include <16f877.h> #fuses HS, NOWDT, PUT, NOPROTECT #use delay(CLOCK=20000000)
#use RS232(BAUD=9600, XMIT=PIN_B7, RCV=PIN_B6) // used for PICKit2 #use i2c(master, sda=PIN_D2, scl=PIN_D3) // use I2C interfacing
#include "eeprom_lib.h"
void main() { long i; char c,e,cmd; delay_ms(2000); puts("Hello...!"); while (true) { puts("1: Write EEPROM"); puts("2: Read EEPROM"); puts("c: Clear EEPROM");
c='a'; cmd=getc(); switch(cmd) { case '1': puts("Start writing..."); for (i=0;i<100;++i) { write_ext_eeprom(160,i,c); printf("%c",c); c++; if (c=='z') c='a'; delay_ms(50); } //puts("Stop writing..."); break; case '2': puts("Start reading..."); for (i=0;i<100;++i) { e=read_ext_eeprom(160,i); printf("%c",e); } printf("\n\r"); delay_ms(50); //puts("Stop reading..."); break; case 'c': puts("Start erasing..."); for (i=0;i<100;++i) { write_ext_eeprom(160,i,0); } puts("It is erased..."); break; default: puts("Please select the menu..."); break; } } }
Penjelasan
- Progran utama ini merupakan utilitas EEPROM AT24C1024, bisa digunakan untuk membaca data dari EEPROM, menuliskan data serta menghapus isi EEPROM. Hanya untuk 100 lokasi pertama (dari total 256 lokasi) EEPROM dan hanya satu EEPROM (EEPROM yang pertama), walaupun pada rangkaian terdapat 2 EEPROM;
- Data yang dituliskan adalah data karakter dari ‘a’ s/d ‘z’ dan diulang lagi;
- Anda silahkan mengembangkan untuk mengakses seluruh alamat EEPROM dan seluruh EEPROM yang tersedia, juga menuliskan data-data yang diinginkan atau barangkali langsung diaplikasikan ke aplikasi tertentu, misalnya, simpan data suhu, tekanan, dll;
- Alamat EEPROM pertama adalah 160 dan yang kedua adalah 164;
- Selamat mencoba dan semoga bermanfaat.
Ditulis di Kitakyushu, 11 Desember 2011.