Komunikasi SPI Menggunakan Arduino di Proteus

1. Tujuan Praktikum
Setelah menyelesaikan praktikum ini, mahasiswa mampu:
- Memahami konsep komunikasi SPI (Serial Peripheral Interface)
- Mengidentifikasi pin SPI pada Arduino
- Mensimulasikan komunikasi SPI di Proteus
- Mengimplementasikan sistem Master–Slave berbasis SPI
- Menganalisis proses transfer data SPI
2. Dasar Teori
2.1 Pengertian SPI
SPI (Serial Peripheral Interface) adalah protokol komunikasi serial sinkron yang dikembangkan oleh
📌 Motorola
SPI digunakan untuk komunikasi jarak dekat antara mikrokontroler dan perangkat periferal seperti:
- ADC/DAC
- Sensor
- SD Card
- Display TFT
- EEPROM
2.2 Arsitektur SPI

SPI memiliki 4 jalur utama:
| Pin | Nama | Fungsi |
| MOSI | Master Out Slave In | Data dari master ke slave |
| MISO | Master In Slave Out | Data dari slave ke master |
| SCK | Serial Clock | Clock dari master |
| SS / CS | Slave Select | Mengaktifkan slave |
Karakteristik:
- Sinkron (menggunakan clock)
- Full duplex
- Kecepatan tinggi
- Tidak memiliki sistem addressing seperti I2C
3. Alat dan Bahan
Software:
- 🖥️ Proteus Design Suite
- 🖥️ Arduino IDE
Komponen di Proteus:
- Arduino UNO (2 buah)
- Virtual Terminal
- Logic Analyzer (opsional)
- Resistor
- LED (opsional)
4. Skenario Praktikum
🎯 Sistem yang Dibuat

- Arduino 1 → Master
- Arduino 2 → Slave
- Master mengirim data karakter ke Slave
- Slave menampilkan data ke Virtual Terminal
5. Rangkaian di Proteus
5.1 Konfigurasi SPI Arduino UNO
SPI | Pin Arduino |
MOSI | D11 |
MISO | D12 |
SCK | D13 |
SS | D10 |
5.2 Wiring Master – Slave
Master | Slave |
D11 (MOSI) | D11 |
D12 (MISO) | D12 |
D13 (SCK) | D13 |
D10 (SS) | D10 |
GND | GND |
⚠ Penting: Ground harus terhubung bersama.
6. Program
6.1 Program MASTER
#include <SPI.h>
void setup() {
Serial.begin(9600);
SPI.begin();
pinMode(10, OUTPUT);
}
void loop() {
digitalWrite(10, LOW); // Aktifkan Slave
SPI.transfer('A'); // Kirim karakter A
digitalWrite(10, HIGH); // Nonaktifkan Slave
delay(1000);
}6.2 Program SLAVE
#include <SPI.h>
volatile byte receivedData;
void setup() {
Serial.begin(9600);
pinMode(MISO, OUTPUT);
SPCR |= _BV(SPE); // Enable SPI
SPI.attachInterrupt();
}
ISR (SPI_STC_vect) {
receivedData = SPDR;
}
void loop() {
Serial.println((char)receivedData);
delay(500);
}7. Langkah Praktikum
- Buka Proteus
- Tambahkan 2 Arduino UNO
- Hubungkan pin SPI sesuai tabel
- Tambahkan Virtual Terminal ke Slave
- Compile program di Arduino IDE
- Upload file HEX ke masing-masing Arduino di Proteus
- Jalankan simulasi
8. Hasil yang Diharapkan
- Master mengirim karakter ‘A’
- Slave menerima data
- Virtual Terminal menampilkan huruf A setiap 1 detik
9. Analisis
Mahasiswa diminta menjawab:
- Mengapa SPI disebut full duplex?
- Apa fungsi SS?
- Apa yang terjadi jika SCK tidak terhubung?
- Mengapa SPI lebih cepat dibanding I2C?
- Apakah SPI cocok untuk komunikasi jarak jauh?
Mode SPI dan Pengaturan Kecepatan
Master dan slave harus sepakat soal polaritas clock (CPOL) dan fase pengambilan data (CPHA). Kombinasi keduanya disebut mode SPI:
| Mode | CPOL | CPHA | Clock saat diam | Data diambil pada |
|---|---|---|---|---|
| 0 | 0 | 0 | LOW | tepi naik |
| 1 | 0 | 1 | LOW | tepi turun |
| 2 | 1 | 0 | HIGH | tepi turun |
| 3 | 1 | 1 | HIGH | tepi naik |
Di sisi master, gunakan SPI.beginTransaction() agar kecepatan, urutan bit, dan mode jelas:
SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0)); // 1 MHz
digitalWrite(SS, LOW);
SPI.transfer('A');
digitalWrite(SS, HIGH);
SPI.endTransaction();Pembahasan Tugas 1: Mengirim String
Master mengirim karakter satu per satu dan menutup dengan '\n' sebagai penanda akhir:
#include <SPI.h>
void setup() {
SPI.begin();
pinMode(SS, OUTPUT);
digitalWrite(SS, HIGH);
}
void loop() {
const char pesan[] = "Halo Slave\n";
digitalWrite(SS, LOW);
for (int i = 0; pesan[i] != '\0'; i++) {
SPI.transfer(pesan[i]);
delayMicroseconds(20); // beri waktu slave memproses interrupt
}
digitalWrite(SS, HIGH);
delay(1000);
}Slave mengumpulkan karakter ke buffer di dalam interrupt, lalu mencetaknya di loop():
#include <SPI.h>
char buf[32];
volatile byte pos = 0;
volatile bool selesai = false;
void setup() {
Serial.begin(9600);
pinMode(MISO, OUTPUT);
SPCR |= _BV(SPE);
SPI.attachInterrupt();
}
ISR(SPI_STC_vect) {
char c = SPDR;
if (pos < sizeof(buf) - 1) buf[pos++] = c;
if (c == '\n') selesai = true;
}
void loop() {
if (selesai) {
buf[pos] = '\0';
Serial.print(buf);
pos = 0;
selesai = false;
}
}Membuktikan Full Duplex
Pada setiap SPI.transfer(), master mengirim satu byte sekaligus menerima satu byte dari slave. Isi register SPDR di slave akan terkirim ke master pada transfer berikutnya. Tambahkan SPDR = 'B'; di dalam ISR slave, lalu di master tampilkan nilai kembalian SPI.transfer(); master akan menerima ‘B’ sambil mengirim data.
SPI vs I2C vs UART
| Aspek | SPI | I2C | UART |
|---|---|---|---|
| Jumlah kabel | 4 (+1 SS per slave) | 2 | 2 (TX, RX) |
| Clock | Ada (dari master) | Ada (dari master) | Tidak ada, baud rate disepakati |
| Kecepatan tipikal | Beberapa MHz hingga puluhan MHz | 100 kHz – 1 MHz | 9.600 – 115.200 bps (umum) |
| Alamat perangkat | Tidak; dipilih lewat pin SS | Ya, alamat 7-bit | Tidak (point-to-point) |
| Arah data | Full duplex | Half duplex | Full duplex |
Kunci Jawaban Analisis
- Full duplex: MOSI dan MISO adalah jalur terpisah, sehingga kirim dan terima terjadi bersamaan dalam satu siklus clock.
- Fungsi SS: memilih slave yang aktif; slave hanya merespons saat pin SS-nya LOW.
- SCK putus: tidak ada clock, sehingga tidak ada bit yang tergeser; slave tidak menerima apa pun.
- Lebih cepat dari I2C: jalur push-pull tanpa resistor pull-up, tanpa fase alamat dan ACK, serta full duplex.
- Jarak jauh: tidak cocok; SPI dirancang untuk jalur pendek di dalam board atau antarmodul berdekatan.
Di Proteus, instrumen SPI DEBUGGER dapat dipasang di jalur SCK/MOSI/MISO/SS untuk melihat isi setiap byte yang dikirim.
10. Kaitan dengan Industri
SPI banyak digunakan pada:
- Modul SD Card
- ADC resolusi tinggi
- Display TFT industri
- Sistem embedded berkecepatan tinggi
Namun dalam sistem PLC industri, komunikasi lebih sering menggunakan:
- Modbus
- Profibus
- Profinet
Karena SPI hanya cocok untuk komunikasi jarak pendek di dalam board.
11. Tugas Tambahan
- Modifikasi program agar Master mengirim string
- Tambahkan LED di Slave yang menyala saat menerima data
- Gunakan Logic Analyzer untuk melihat sinyal SCK, MOSI, dan MISO
- Ubah kecepatan SPI dan amati perubahan sinyal
📝 FORMAT LAPORAN
- Cover
- Tujuan
- Dasar teori
- Rangkaian
- Program
- Hasil simulasi
- Analisis
- Kesimpulan
Baca juga:
— Training ESP32 Berbasis IoT – Pelatihan Praktis & Bersertifikat
Baca juga: Ingin Jadi Ahli IoT & Otomasi? Semua Bisa Dimulai dari Arduino! untuk memahami roadmap lengkap belajar Arduino dari dasar hingga proyek IoT.




