SPI
//MASTER
#include <SPI.h>
#define button 2
void setup()
{
Serial.begin(9600);
digitalWrite(SS,HIGH);
pinMode(button,INPUT_PULLUP);
SPI.begin();
SPI.setClockDivider(SPI_CLOCK_DIV8);
}
void loop()
{
char c;
int nilai = digitalRead(button);
if (nilai == 0){
digitalWrite(SS,LOW);
for(const char *p= "Hello,World\r"; c = *p;p++)
{
SPI.transfer (c);
Serial.print (c);
}
}
else{
}
digitalWrite (SS,HIGH);
delay(2000);
}
//SLAVE
#include <SPI.h>
char buff[50];
volatile byte indx;
volatile boolean process;
#define led 5
void setup() {
pinMode(led, OUTPUT);
Serial.begin(9600);
pinMode(MISO, OUTPUT);
SPCR |= _BV(SPE);
indx = 0;
process = false;
SPI.attachInterrupt();
}
ISR (SPI_STC_vect)
{
byte c = SPDR;
if (indx < sizeof buff)
{
buff[indx++] = c;
if (c == '\r')
process = true;
}
}
void loop() {
// digitalWrite(SS,LOW);
if (process)
{
Serial.println (buff);
indx = 0;
digitalWrite (led, HIGH);
delay (2000);
digitalWrite (led, LOW);
process = false;
}
else {
Serial.println("error");
}
}
#include <SPI.h>
#define button 2
void setup()
{
Serial.begin(9600);
digitalWrite(SS,HIGH);
pinMode(button,INPUT_PULLUP);
SPI.begin();
SPI.setClockDivider(SPI_CLOCK_DIV8);
}
void loop()
{
char c;
int nilai = digitalRead(button);
if (nilai == 0){
digitalWrite(SS,LOW);
for(const char *p= "Hello,World\r"; c = *p;p++)
{
SPI.transfer (c);
Serial.print (c);
}
}
else{
}
digitalWrite (SS,HIGH);
delay(2000);
}
#include <SPI.h>
char buff[50];
volatile byte indx;
volatile boolean process;
#define led 5
void setup() {
pinMode(led, OUTPUT);
Serial.begin(9600);
pinMode(MISO, OUTPUT);
SPCR |= _BV(SPE);
indx = 0;
process = false;
SPI.attachInterrupt();
}
ISR (SPI_STC_vect)
{
byte c = SPDR;
if (indx < sizeof buff)
{
buff[indx++] = c;
if (c == '\r')
process = true;
}
}
void loop() {
// digitalWrite(SS,LOW);
if (process)
{
Serial.println (buff);
indx = 0;
digitalWrite (led, HIGH);
delay (2000);
digitalWrite (led, LOW);
process = false;
}
else {
Serial.println("error");
}
}
2. Bagaimana proses pengiriman data pada SPI ?
Berdasarkan teori, Serial Peripheral Interface
(SPI) merupakan salah satu mode komunikasi serial synchronous kecepatan tinggi
yang dimiliki oleh ATmega 328. Komunikasi SPI memiliki 3 jalur yaitu MOSI,
MISO, dan SCLK. Dan sesuai dengan teori tersebut, dapat diketahui setelah
percobaan dilakukan, bahwa proses pengiriman data pada SPI ialah sebagai berikut:
a. clock akan memberikan sinyal dari master ke slave,
dimana fungsi dari clock adalah untuk menyamakan/ menyinkronkan data antara
master dan slave.
b. lalu, master akan mengirimkan data kepada slave,
dan master dapat memilih slave mana yang akan dikirimkan data melalui slave
select.
c. data yang dikirimkan dari master ke slave dapat
melalui jalur MOSI ataupun jalur MISO sesuai dengan jalur mana yang diatur
sebagai outputnya atau sebagai pengirim data.
d. kondisi yang diujikan pada percobaan ini ialah
ketika tobol button ditekan, maka LED akan menyala, dan ketika tidak ada lagi
data yang dikirim maka master akan menghentikan clock dan memonaktifkan slave.
Kekurangan
pada komunikasi menggunakan SPI ini adalah meskipun data dapat dikirimkan ke
banyak slave, tetapi untuk mengirimkan data tersebut membutuhkan pin yang
banyak sesuai dengan slave yang digunakan.
Tidak ada komentar:
Posting Komentar