Komunikasi SPI Menggunakan Arduino di Proteus

1. Tujuan Praktikum

Setelah menyelesaikan praktikum ini, mahasiswa mampu:

  1. Memahami konsep komunikasi SPI (Serial Peripheral Interface)
  2. Mengidentifikasi pin SPI pada Arduino
  3. Mensimulasikan komunikasi SPI di Proteus
  4. Mengimplementasikan sistem Master–Slave berbasis SPI
  5. 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

Arsitektur SPI – Komunikasi SPI Menggunakan Arduino di Proteus

 

SPI memiliki 4 jalur utama:

PinNamaFungsi
MOSIMaster Out Slave InData dari master ke slave
MISOMaster In Slave OutData dari slave ke master
SCKSerial ClockClock dari master
SS / CSSlave SelectMengaktifkan 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 master slave – Komunikasi SPI Menggunakan Arduino di Proteus

        • 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

    1. Buka Proteus
    2. Tambahkan 2 Arduino UNO
    3. Hubungkan pin SPI sesuai tabel
    4. Tambahkan Virtual Terminal ke Slave
    5. Compile program di Arduino IDE
    6. Upload file HEX ke masing-masing Arduino di Proteus
    7. 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:

      1. Mengapa SPI disebut full duplex?
      2. Apa fungsi SS?
      3. Apa yang terjadi jika SCK tidak terhubung?
      4. Mengapa SPI lebih cepat dibanding I2C?
      5. 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:

ModeCPOLCPHAClock saat diamData diambil pada
000LOWtepi naik
101LOWtepi turun
210HIGHtepi turun
311HIGHtepi 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

AspekSPII2CUART
Jumlah kabel4 (+1 SS per slave)22 (TX, RX)
ClockAda (dari master)Ada (dari master)Tidak ada, baud rate disepakati
Kecepatan tipikalBeberapa MHz hingga puluhan MHz100 kHz – 1 MHz9.600 – 115.200 bps (umum)
Alamat perangkatTidak; dipilih lewat pin SSYa, alamat 7-bitTidak (point-to-point)
Arah dataFull duplexHalf duplexFull duplex

Kunci Jawaban Analisis

  1. Full duplex: MOSI dan MISO adalah jalur terpisah, sehingga kirim dan terima terjadi bersamaan dalam satu siklus clock.
  2. Fungsi SS: memilih slave yang aktif; slave hanya merespons saat pin SS-nya LOW.
  3. SCK putus: tidak ada clock, sehingga tidak ada bit yang tergeser; slave tidak menerima apa pun.
  4. Lebih cepat dari I2C: jalur push-pull tanpa resistor pull-up, tanpa fase alamat dan ACK, serta full duplex.
  5. 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

      1. Modifikasi program agar Master mengirim string
      2. Tambahkan LED di Slave yang menyala saat menerima data
      3. Gunakan Logic Analyzer untuk melihat sinyal SCK, MOSI, dan MISO
      4. 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.

Related Articles

Chat Langsung dengan Kami
Staff bisaioti 1 — +62 823-3306-4821 E-Course, Offline Course, Hardware & Teknis IoT/OT Staff bisaioti 2 — +62 823-3306-4821 Training Korporat & Toko Hardware