Teori Singkat
Komunikasi data SPI merupakan komunikasi data digital serial secara sinkron sama seperti halnya I2C, yaitu membutuhkan jalur sinkronisasi pewaktu transmisi data serial. Perbedaannya adalah pada jumlah bus data bus I2C hanya menggunakan satu jalur data (SDA) untuk berkomunikasi, sedangkan SPI menggunakan 2 jalur data (MOSI dan MISO) komunikasi tetap dijalankan secara half duplex karena bersifat komunikasi sinkron.
Kelebihan dari komunikasi serial sinkron SPI sama halnya dengan I2C yaitu memungkinkan untuk dilakukan komunikasi serial multi-node. Perbedaannya adalah SPI membutuhkan jalur tambah untuk memilih slave (SS) sebanyak piranti yang terhubung pada bus komunikasi Gambar 1 menunjukan bus SPI untuk komunikasi beberapa piranti sekaligus
Gambar 1. Bus komunikasi SPI |
Secara umum, antarmuka SPI juga digunakan Arduino untuk berkomumikasi dengan sensor sekaligus. Dengan kelebihan bus SPI tersebut maka Arduino mampu membaca banyak sensor dalam satu bus saja, hal ini memberikan efektifitas perancangan system benam semakin tinggi.
Seperti yang ditunjukan oleh Gambar 1, pada bus komunikas SPI hanya terdapat 1-Master dan n-SLAVE. Berbeda dengan Bus I2C yang memperbolehkan n-MASTER dan n-SLAVE. Berbeda dengan bus I2C yang menjadi empat :MOSI (mater out-serial in), MISO (master in-serial out), SCK (Serial Clock), dan SS (Slave Select).
MOSI adalah bus transisi data satu arah dari MASTER menuju SLAVE yang sudah dipilih berdasarkan pin SS, sehingga hanya ada satu SLAVE saja yang dapat berkomunikasi dalam satu waktu. MISO adalah bus transmisi data satu arah dari SLAVE yang terpilih berdasarkan pin SS menuju MASTER. Komunikasi data hanya bisa dilakukan oleh MASTER-SLAVE saja, sedangkan komunikasi SLAVE-SLAVE tidak diperbolehkan.
Gambar 2. Format paket transmisi data pada komunikasi serian sinkron SPI |
Format data komunikasi serial SPI berbeda dengan I2C Perbedaannya adalah pada paket data yang dikirmkan seperti yang ditunjukan oleh gambar 2. Paket data SPI tidak mengandung informasi alamat SLAVE, hal ini karena SLAVE sudah dipilih secara perangkat keras melalui jalur SS pada Bus.
Sehingga secara umum, format data SPI lebih sederhana dari pada I2C. Panjang data komunikasi SPI bisa bervariasi tergantung jenis pirantinya. Pada UART hanya dibatasi satu data saja untuk setiap paket pengiriman. Pada papan system Arduino, frekwensi detak bus SPI memiliki rentang yang lebar yaitu antara 125Kbps-8Mbps.
Pada papan Arduino UNO, bus SPI terhubung dengan 4 pin khusus yaitu :10 (SS), 11(MOSI), 12 (MISO) dan 13 (SKCK). Untuk memilih slave tidak hanya terbatas pada pin 10 saja, namun bisa dialokasikan untuk pin digital yang lain sebanyak yang diperlukan.
Alat dan Bahan Percobaan
Pada sesi ini akan diperkenalkan tentang cara melakukan serial papan Arduino dengan piranti SD/MMC menggunakan fasilitas SPI. Adapun alat dan bahan yang digunakan selama percobaan adalah :
- Sparkfun microUSB
Bahan percobaan yang berfungsi sebagai penyimpan data digital berkapasitas besar. - Papan Arduino UNO
Bahan percobaan sebagai piranti utama untuk menguji komunikasi SPI dengan piranti Memory microSD.
Langkah Percobaan
Percobaan komunikasi data serial SPI oleh papan Arduino melibatkan dua aktifitas, yaitu perancangan antarmuka perangka keras dan pemrograman perangkat lunak. Adapun langkah percobaannya adalah sebagai berikut :
- Desain antarmuka perangkat keras
Percobaan menghbungkan papan arduino Uno dengan piranti mikroSD. Gambar 3 menunjukan antarmuka perangkat keras sebagai percobaan.Gambar 3. Antarmuka papan Arduino Uno dengan memori microSD - Pemrograman perangkat lunak
Percobaan yang akan dilakukan adalah melakukan komunikasi SPI antara papan arduino dengan microSD. Berikut ini contoh kode program yang harus anda buat untuk menguji komuikasi digital serial sinkron SPI dengan menggunakan Library : SPI.H dan SD.H#include <SPI.h>
#include <SD.h>
#define SS 10
Sd2Card card;
SdVo1ume volume;
SdFi1e root;
void setup(){
Serial.begin (9600); //baudrate = 9600bps
Serial.println("Inisialisasi microSD");
if (!card.init(SPI_HALF_SPEED,SS)){ //apa kartu terdeteksi?
Serial.println("inisialisasi gagal"); //jika tidak
while(1);
}
else{
Serial.println("inisialisasi berhasil"); //jika ya
Serial.print("Card type: "); //tampilan informasi
switch (card.type()){
case SD_CARD_TYPE_SD1;
Serial.println("SD1");
break;
case SD_CARD_TYPE_SD2;
Serial.println("SD2");
break;
case SD_CARD_TYPE_SDHC;
Serial.println("SDHC");
break;
default:
Serial.println("Unknown");
}
}
}
void loop(){} //tidak melakukan apa-apa
Ketik contoh kode program diatas, kompilasi dan upload ke papan Arduino. Kemudian pengamatan dilakukan menggunakan serial monitor pada Arduino IDE dan Simpulkan.
Tugas
Berikut ini deskripsi tugad yang harus anda lakukan terkait dengan tahapan-tahapan percobaan yang sudah dilakukan.
- Membuat file dengan nama nama_file.txt mengguankan notepad pada PC/Laptop kemudian simpan file tersebut pada microSD. Perlu diperhatikan bahwa nama) file tidak boleh lebih dari 8 karakter, contoh = “log.txt” seperti pada contoh kode program.
- Melakukan proses menyimpan data ke dalam file yang sudah dibuat pada microSD menggunakan papan Arduino. Ketik contoh kode program berikut, kompilasi, dan upload ke papan Arduino.
#include <SPI.h>
#include <SD.h>
#define SS 10
File myFi1e;
void setup(){
Serial.begin(9600); //baudrate = 9600bps
Serial.printIn("Inisialisasi microSD...");
if (!SD.begin(SS)){ //apa SD terdeteksi?
Serial.printIn("inisialisasi gagal"); //jika tidak
while(1);
}
else {
Serial.println("inisialisasi sukses"); //jika ya
Serial.println("menyimpan file...");
myFi1e = SD.open("log.txt", FILE_WRITE); //mode tulis
if (myFi1e){ //apa file tersedia?
myFi1e.printIn("Nama = Joko Widodo"); //jika ya
myFi1e.printIn("Alamat = Jakarta");
myFi1e.printIn("Pekerjaan = Presiden");
myFi1e.close();
Serial.println("penyimpanan selesai");
}
else{
Serial.printIn("gagal membuka file"); //jika tidak
}
}
}
void loop(){} //tidak melakukan apa-apa - Melakukan proses data dari file yang tersimpan dan terisi pada microSD menggunakan papan Arduino. Ketik contoh kode program berikut, kompilasi dan upload ke papan Arduino.
#include <SPI.h>
#include <SD.h>
#define SS 10
File myFi1e;
void setup(){
Serial.begin(9600); //baudrate = 9600bps
Serial.printIn("Inisialisasi microSD...");
if (!SD.begin(SS)){ //apa SD terdeteksi?
Serial.printIn("inisialisasi gagal"); //jika tidak
while(1);
}
else {
Serial.println("inisialisasi sukses"); //jika ya
Serial.println("menyimpan file...");
myFi1e = SD.open("log.txt"); //mode baca
if (myFi1e){ //apa file tersedia?
myFi1e.printIn("isi file:"); //jika ya,tampilkan
while(myFile.available()){
Serial.write(myFile.read());
}
myFile.close();
}
else{
Serial.printIn("gaga1 membuka file"); //jika tidak
}
}
}
void loop(){} //tidak melakukan apa-apa - Ulangi percobaan dengan mengisi informasi yang berbeda pada dile di dalam microSD.
- Membuat laporan percobaan yang berisi foto antarmuka perangkat keras dan kode program yang berhasil dibuat dan berjalan dengan benar.