LA 2 M3 Prak Mikro (Komunikasi SPI)
1. Kondisi [Kembali]
Percobaan 2 kondisi 14 :
Tambahkan Buzzer sebagai input. Sehingga input yang tersedia adalah LED dan Buzzer.
2. Hardware [Kembali]
3. Rangkaian Simulasi [Kembali]
4. Listing Program [Kembali]
// master
#include <SPI.h> //Deklarasi library SPI
#define button 2
void setup (void) {
pinMode(button, INPUT_PULLUP);
Serial.begin(115200 ); //Set baud rate 115200
digitalWrite(SS, HIGH);
// disable Slave Select
SPI.begin ();
SPI.setClockDivider(SPI_CLOCK_DIV8); //divide the clock by 8
}
void loop (void) {
char c;
int nilai=digitalRead(button);
if(nilai==0){
digitalWrite(SS, LOW); //enable Slave Select
// send test string
for (const char * p = "Hello, world!\r" ; c = *p; p++)
{
SPI.transfer (c);
Serial.print(c);
}
digitalWrite(SS, HIGH); // disable Slave Select
delay(2000);
}
}
//Slave
#include <SPI.h>
#define led 2
#define Buzzer 3
char buff [50];
volatile byte indx;
volatile boolean process;
void setup (void) {
Serial.begin (115200); // harus sama antara master dan slave
pinMode(led, OUTPUT); // have to send on master in so it set as output
pinMode (Buzzer, OUTPUT);
SPCR |= _BV(SPE); // turn on SPI in slave mode
indx = 0; // buffer empty
process = false;
SPI.attachInterrupt(); // turn on interrupt
}
ISR (SPI_STC_vect) // SPI interrupt routine
{
byte c = SPDR; // read byte from SPI Data Register
if (indx < sizeof buff) {
buff [indx++] = c; // save data in the next index in the array buff
if (c == '\r') //check for the end of the word
process = true;
}
}
void loop (void) {
if (process) {
digitalWrite(led, HIGH);
tone (Buzzer, 100); //membunyikan Buzzer
process = false; //reset the process
Serial.println (buff); //print the array on serial monitor
indx = 0; //reset button to zero
delay(1000);
}
else
{
digitalWrite(led, LOW);
noTone(Buzzer); //tidak membunyikan Buzzer
}
}
5. Video Simulasi [Kembali]
6. Analisa [Kembali]
#include <SPI.h> //Deklarasi library SPI
#define button 2
void setup (void) {
pinMode(button, INPUT_PULLUP);
Serial.begin(115200 ); //Set baud rate 115200
digitalWrite(SS, HIGH);
// disable Slave Select
SPI.begin ();
SPI.setClockDivider(SPI_CLOCK_DIV8); //divide the clock by 8
}
void loop (void) {
char c;
int nilai=digitalRead(button);
if(nilai==0){
digitalWrite(SS, LOW); //enable Slave Select
// send test string
for (const char * p = "Hello, world!\r" ; c = *p; p++)
{
SPI.transfer (c);
Serial.print(c);
}
digitalWrite(SS, HIGH); // disable Slave Select
delay(2000);
}
}
#define led 2
#define Buzzer 3
char buff [50];
volatile byte indx;
volatile boolean process;
void setup (void) {
Serial.begin (115200); // harus sama antara master dan slave
pinMode(led, OUTPUT); // have to send on master in so it set as output
pinMode (Buzzer, OUTPUT);
SPCR |= _BV(SPE); // turn on SPI in slave mode
indx = 0; // buffer empty
process = false;
SPI.attachInterrupt(); // turn on interrupt
}
ISR (SPI_STC_vect) // SPI interrupt routine
{
byte c = SPDR; // read byte from SPI Data Register
if (indx < sizeof buff) {
buff [indx++] = c; // save data in the next index in the array buff
if (c == '\r') //check for the end of the word
process = true;
}
}
void loop (void) {
if (process) {
digitalWrite(led, HIGH);
tone (Buzzer, 100); //membunyikan Buzzer
process = false; //reset the process
Serial.println (buff); //print the array on serial monitor
indx = 0; //reset button to zero
delay(1000);
}
else
{
digitalWrite(led, LOW);
noTone(Buzzer); //tidak membunyikan Buzzer
}
}
1. Jelaskan transmisi data pada SPI dan gambarkan timing diagram dari transmisi data pada SPI.
Jawab :
SPI adalah protokol komunikasi secara synchronous yang memisahkan antara jalur data dan jalur detak, serta merupakan komunikasi serial full-duplex, yang memungkinkan komunikasi dua arah antara master dan slave secara simultan.
Keempat jalur yang membangun komunikasi SPI pada Arduino Uno terletak pada pin 10 (SS), 11 (MOSI), 12 (MISO) dan 13 (SCK). Transmisi data SPI dimulai pada saat master mengirimkan clock melalui SCK dengan frekuensi lebih kecil atau sama dengan frekuensi maksimum pada slave. Kemudian, master memberi logika nol pada SS untuk mengaktifkan slave sehingga pengiriman data (berupa siklus clock) siap untuk dilakukan. Pada saat siklus clock terjadi transmisi data full-duplex terjadi dengan dua keadaan sebagai berikut:
1. Master mengirim sebuah bit pada jalur MOSI, slave membacanya pada jalur yang sama.
2. Slave mengirim sebuah bit pada jalur MISO, master membacanya pada jalur yang sama.
Transmisi dapat menghasilkan beberapa siklus clock. Jika tidak ada data yang dikirim lagi maka master menghentikan clock tersebut dan kemudian menon-aktifkan slave.
Timing Diagram
Diagram pewaktuan (timing diagram) SPI dimulai pada saat SS diaktifkan (low). Saat SS aktif, MISO/MOSI mulai mengirimkan data. Pada saat clock berubah maka proses pengiriman data dilanjutkan pada bit yang lebih rendah. Proses tersebut berlangsung sampai pengiriman data dan siklus clock berakhir serta SS kembali dinon-aktifkan (high). Pada saat ini biasanya slave mengirimkan interrupt ke master yang mengindikasikan bahwa pengiriman data telah selesai dan siap untuk melakukan pengiriman data selanjutnya.
2. Bagaimana cara menghubungkan rangkaian SPI saat menggunakan lebih dari satu slave?
Jawab :
Keempat jalur yang membangun komunikasi SPI pada Arduino Uno terletak pada pin 10 (SS), 11 (MOSI), 12 (MISO) dan 13 (SCK). Penggunaan kabel untuk SS (Slave Select) dapat bertambah, sesuai dengan jumlah slave. Satu buah slave akan ditangani oleh satu buah SS. Jika kita menggunakan 1 master dan 2 slave, maka pada master terdapat pin 9 (SS1), pin 10 (SS2), 11 (MOSI), 12 (MISO) dan 13 (SCK). Dengan demikian, diperlukan sebanyak N + 3 pin untuk master, dimana N adalah jumlah slave yang digunakan.
Comments
Post a Comment