Komunikasi SPI



1. Hardware [Kembali]


A. LED


B. Push Button



2. Rangkaian Simulasi [Kembali]



3. Flowchart [Kembali]


A. Master




B. Slave




4. Listing Program [Kembali]


A. SPI Master

//
// Deklarasi library SPI
#include <SPI.h>

// Deklasrasi Button
#define BUTTON 2

// Data yang akan dikirimkan
uint8_t _data;

void setup (void) {
  // Konfigurasi button sebagai Input
  pinMode(BUTTON, INPUT);
  // Menonaktifkan Slave Select
  digitalWrite(SS, HIGH);
  // Memulai SPI Master
  SPI.begin ();
  // Mengatur pre-scaler clock
  SPI.setClockDivider(SPI_CLOCK_DIV8);
}

void loop (void) {
  if (digitalRead(BUTTON) == LOW) {
    _data = 1;
    // Mengaktifkan Slave
    digitalWrite(SS, LOW);
    // Mengirim data
    SPI.transfer(_data);
    // Menonaktifkan Slave
    digitalWrite(SS, HIGH);
  } else {
    _data = 0;
    // Mengaktifkan Slave
    digitalWrite(SS, LOW);
    // Mengirim data
    SPI.transfer(_data);
    // Menonaktifkan Slave
    digitalWrite(SS, HIGH);
  }
}
//

B. SPI Slave

//
// Menambahkan library SPI
#include <SPI.h>

// Deklarasi pin LED
#define LED 2

// Data yang diterima
uint8_t _data;

// Flag data sudah diproses
uint8_t proceed = true;

void setup (void) {
  // Konfigurasi LED sebagai OUTPUT
  pinMode(LED, OUTPUT);
  // Konfigurasi MISO sebagai output
  pinMode(MISO, OUTPUT);
  // Mengaktifkan SPI mode slave
  // SPCR = Serial Peripheral Control Register
  SPCR |= _BV(SPE);
  SPI.attachInterrupt(); // turn on interrupt
}

// SPI interrupt Routine
ISR (SPI_STC_vect) {
  // Membaca byte pada SPI Data Register
  _data = SPDR;
  proceed = false;
}

void loop (void) {
  // Mengecek apakah data belum diproses
  if (!proceed) {
    // Mengecek data
    if (_data == 1) {
      // LED menyala
      digitalWrite(LED, HIGH);
    } else if (_data == 0) {
      // LED padam
      digitalWrite(LED, LOW);
    }
    // Toggle Flag
    // Data sudah diproses
    proceed = true;
  }
}
//

5. Video Simulasi [Kembali]



6. Link Download [Kembali]









0 komentar:

Posting Komentar