- Τι είναι το SPI;
- Εργασία SPI
- Καρφίτσες SPI στο Arduino UNO
- Χρησιμοποιώντας SPI στο Arduino
- Απαιτούνται στοιχεία για την επικοινωνία Arduino SPI
- Διάγραμμα κυκλώματος επικοινωνίας Arduino SPI
- Πώς να προγραμματίσετε το Arduino για επικοινωνία SPI:
- Arduino SPI Master Programming Επεξήγηση
- Επεξήγηση προγραμματισμού Arduino SPI Slave
- Πώς λειτουργεί το SPI στο Arduino; - Ας το δοκιμάσουμε!
Ένας μικροελεγκτής χρησιμοποιεί πολλά διαφορετικά πρωτόκολλα για επικοινωνία με διάφορους αισθητήρες και λειτουργικές μονάδες. Υπάρχουν πολλοί διαφορετικοί τύποι πρωτοκόλλων επικοινωνίας για ασύρματη και ενσύρματη επικοινωνία, και η πιο συχνά χρησιμοποιούμενη τεχνική επικοινωνίας είναι η Σειριακή Επικοινωνία. Η σειριακή επικοινωνία είναι η διαδικασία αποστολής δεδομένων ένα bit κάθε φορά, διαδοχικά, μέσω ενός καναλιού επικοινωνίας ή ενός διαύλου. Υπάρχουν πολλοί τύποι σειριακής επικοινωνίας, όπως UART, CAN, USB, I2C και SPI.
Σε αυτό το σεμινάριο, μαθαίνουμε για το πρωτόκολλο SPI και πώς να το χρησιμοποιήσουμε στο Arduino. Θα χρησιμοποιήσουμε το πρωτόκολλο SPI για επικοινωνία μεταξύ δύο Arduinos. Εδώ ένα Arduino θα λειτουργήσει ως Master και ένα άλλο θα λειτουργήσει ως Slave, δύο LED και κουμπιά θα συνδεθούν και με το Arduino. Για να δείξουμε την επικοινωνία SPI, θα ελέγξουμε την κύρια πλευρά LED με το πλήκτρο στην υποτελή πλευρά και αντίστροφα χρησιμοποιώντας το πρωτόκολλο σειριακής επικοινωνίας SPI.
Τι είναι το SPI;
Το SPI (Serial Peripheral Interface) είναι ένα πρωτόκολλο σειριακής επικοινωνίας. Η διεπαφή SPI βρέθηκε από τη Motorola το 1970. Το SPI έχει σύνδεση full-duplex, πράγμα που σημαίνει ότι τα δεδομένα αποστέλλονται και λαμβάνονται ταυτόχρονα. Αυτό είναι ότι ένας κύριος μπορεί να στείλει δεδομένα σε έναν σκλάβο και ένας σκλάβος μπορεί να στείλει δεδομένα στον κύριο ταυτόχρονα. Το SPI είναι σύγχρονη σειριακή επικοινωνία σημαίνει ότι το ρολόι απαιτείται για λόγους επικοινωνίας.
Η επικοινωνία SPI εξηγείται προηγουμένως σε άλλους μικροελεγκτές:
- Επικοινωνία SPI με μικροελεγκτή PIC PIC16F877A
- Διασύνδεση 3,5 ιντσών με οθόνη αφής TFT LCD με Raspberry Pi
- Προγραμματισμός μικροελεγκτή AVR με ακίδες SPI
- Διασύνδεση Nokia 5110 Graphical LCD με το Arduino
Εργασία SPI
Ένα SPI έχει μια κύρια / Slave επικοινωνία χρησιμοποιώντας τέσσερις γραμμές. Ένα SPI μπορεί να έχει μόνο έναν κύριο και μπορεί να έχει πολλούς σκλάβους. Ένας κύριος είναι συνήθως μικροελεγκτής και οι σκλάβοι μπορούν να είναι μικροελεγκτής, αισθητήρες, ADC, DAC, LCD κ.λπ.
Ακολουθεί η αναπαράσταση του διαγράμματος μπλοκ του SPI Master με το Single Slave.
Το SPI ακολουθεί τέσσερις γραμμές MISO, MOSI, SS και CLK
- MISO (Master in Slave Out) - Η γραμμή Slave για την αποστολή δεδομένων στο master.
- MOSI (Master Out Slave In) - Η κύρια γραμμή για την αποστολή δεδομένων στα περιφερειακά.
- SCK (Serial Clock) - Οι παλμοί ρολογιού που συγχρονίζουν τη μετάδοση δεδομένων που δημιουργείται από τον κύριο.
- SS (Slave Select) –Ο Master μπορεί να χρησιμοποιήσει αυτήν την καρφίτσα για να ενεργοποιήσει και να απενεργοποιήσει συγκεκριμένες συσκευές.
Master SPI με πολλαπλούς σκλάβους
Για να ξεκινήσουμε την επικοινωνία μεταξύ master και slave, πρέπει να ρυθμίσουμε την καρφίτσα Slave Select (SS) της απαιτούμενης συσκευής σε LOW, έτσι ώστε να μπορεί να επικοινωνεί με τον κύριο. Όταν είναι υψηλό, αγνοεί τον κύριο. Αυτό σας επιτρέπει να έχετε πολλές συσκευές SPI που μοιράζονται τις ίδιες κύριες γραμμές MISO, MOSI και CLK. Όπως μπορείτε να δείτε στην παραπάνω εικόνα, υπάρχουν τέσσερα εξαρτήματα στα οποία τα SCLK, MISO, MOSI είναι κοινά συνδεδεμένα στο master και το SS κάθε slave είναι ξεχωριστά συνδεδεμένο σε μεμονωμένες καρφίτσες SS (SS1, SS2, SS3) του master. Με τον καθορισμό του απαιτούμενου SS pin LOW, ένας κύριος μπορεί να επικοινωνήσει με αυτόν τον υποτελή.
Καρφίτσες SPI στο Arduino UNO
Η παρακάτω εικόνα δείχνει τις καρφίτσες SPI που υπάρχουν στο Arduino UNO (σε κόκκινο κουτί).
Γραμμή SPI |
Καρφιτσώστε στο Arduino |
MOSI |
11 ή ICSP-4 |
ΜΙΣΟ |
12 ή ICSP-1 |
SCK |
13 ή ICSP-3 |
SS |
10 |
Χρησιμοποιώντας SPI στο Arduino
Πριν ξεκινήσετε τον προγραμματισμό για επικοινωνία SPI μεταξύ δύο Arduinos. Πρέπει να μάθουμε για τη βιβλιοθήκη Arduino SPI που χρησιμοποιείται στο Arduino IDE.
Η βιβλιοθήκη
1. SPI. Έναρξη ()
ΧΡΗΣΗ: Για να αρχικοποιήσετε το δίαυλο SPI ρυθμίζοντας SCK, MOSI και SS στις εξόδους, τραβώντας SCK και MOSI χαμηλά και SS υψηλά.
2. SPI.setClockDivider (διαχωριστικό)
ΧΡΗΣΗ: Για να ορίσετε το διαχωριστικό ρολογιού SPI σε σχέση με το ρολόι συστήματος. Τα διαθέσιμα διαχωριστικά είναι 2, 4, 8, 16, 32, 64 ή 128.
Διαβήτης:
- SPI_CLOCK_DIV2
- SPI_CLOCK_DIV4
- SPI_CLOCK_DIV8
- SPI_CLOCK_DIV16
- SPI_CLOCK_DIV32
- SPI_CLOCK_DIV64
- SPI_CLOCK_DIV128
3. SPI.attachInterrupt (χειριστής)
ΧΡΗΣΗ: Αυτή η λειτουργία καλείται όταν μια δευτερεύουσα συσκευή λαμβάνει δεδομένα από τον κύριο.
4. SPI. Μεταφορά (val)
ΧΡΗΣΗ: Αυτή η συνάρτηση χρησιμοποιείται για την ταυτόχρονη αποστολή και λήψη δεδομένων μεταξύ master και slave.
Ας ξεκινήσουμε λοιπόν με την πρακτική επίδειξη του πρωτοκόλλου SPI στο Arduino. Σε αυτό το σεμινάριο θα χρησιμοποιήσουμε δύο arduino ένα ως master και άλλο ως slave. Και οι δύο Arduino είναι συνδεδεμένες με LED και ένα κουμπί ξεχωριστά Το Master LED μπορεί να ελεγχθεί χρησιμοποιώντας το κουμπί του slave Arduino και το LED του slave Arduino μπορεί να ελεγχθεί με το κουμπί του master Arduino χρησιμοποιώντας το πρωτόκολλο επικοινωνίας SPI που υπάρχει στο arduino.
Απαιτούνται στοιχεία για την επικοινωνία Arduino SPI
- Arduino UNO (2)
- LED (2)
- Κουμπί πίεσης (2)
- Αντίσταση 10k (2)
- Αντίσταση 2.2k (2)
- Ψωμί
- Σύνδεση καλωδίων
Διάγραμμα κυκλώματος επικοινωνίας Arduino SPI
Το παρακάτω διάγραμμα κυκλώματος δείχνει τον τρόπο χρήσης του SPI στο Arduino UNO, αλλά μπορείτε να ακολουθήσετε την ίδια διαδικασία για την επικοινωνία Arduino Mega SPI ή την επικοινωνία Arduino nano SPI. Σχεδόν όλα θα παραμείνουν τα ίδια εκτός από τον αριθμό pin. Πρέπει να ελέγξετε το pinout του Arduino nano ή mega για να βρείτε τις καρφίτσες Arduino nano SPI και τις καρφίτσες Arduino Mega, αφού έχετε κάνει ότι όλα τα άλλα θα είναι τα ίδια.
Έχω δημιουργήσει το παραπάνω κύκλωμα πάνω από ένα breadboard, μπορείτε να δείτε τη ρύθμιση κυκλώματος που χρησιμοποίησα για δοκιμή παρακάτω.
Πώς να προγραμματίσετε το Arduino για επικοινωνία SPI:
Αυτό το σεμινάριο έχει δύο προγράμματα ένα για τον κύριο Arduino και ένα άλλο για το slave Arduino. Πλήρη προγράμματα και για τις δύο πλευρές δίνονται στο τέλος αυτού του έργου.
Arduino SPI Master Programming Επεξήγηση
1. Πρώτα απ 'όλα πρέπει να συμπεριλάβουμε τη βιβλιοθήκη SPI για τη χρήση λειτουργιών επικοινωνίας SPI.
#περιλαμβάνω
2. Σε άκυρη ρύθμιση ()
- Ξεκινάμε τη σειριακή επικοινωνία στο Baud Rate 115200.
Serial.begin (115200);
- Συνδέστε το LED στον ακροδέκτη 7 και το κουμπί Πιέστε στον ακροδέκτη 2 και ρυθμίστε αυτές τις ακίδες OUTPUT και INPUT αντίστοιχα.
pinMode (κουμπί ip, INPUT); pinMode (LED, OUTPUT);
- Στη συνέχεια ξεκινάμε την επικοινωνία SPI
SPI.begin ();
- Στη συνέχεια ορίζουμε την επικοινωνία Clockdivider για SPI. Εδώ έχουμε ρυθμίσει το διαχωριστικό 8.
SPI.setClockDivider (SPI_CLOCK_DIV8);
- Στη συνέχεια, ορίστε την καρφίτσα SS ΥΨΗΛΗ αφού δεν ξεκινήσαμε καμία μεταφορά στο slave arduino.
digitalWrite (SS, ΥΨΗΛΟΣ);
3. Σε κενό βρόχο ():
- Διαβάζουμε την κατάσταση του ακροδέκτη του κουμπιού που είναι συνδεδεμένος στο pin2 (Master Arduino) για την αποστολή αυτών των τιμών στο slave Arduino.
buttonvalue = digitalRead (ipbutton);
- Ορίστε τη λογική για τη ρύθμιση της τιμής x (Θα σταλεί σε σκλάβος) ανάλογα με την είσοδο από τον πείρο 2
εάν (buttonvalue == HIGH) { x = 1; } αλλιώς { x = 0; }
- Πριν από την αποστολή της αξίας πρέπει να ΧΑΜΗΛΟΥΜΕ η τιμή επιλογής σκλάβου για να ξεκινήσει η μεταφορά σε σκλάβο από τον κύριο.
digitalWrite (SS, LOW);
- Εδώ έρχεται το σημαντικό βήμα, στην ακόλουθη δήλωση στέλνουμε την τιμή του κουμπιού που είναι αποθηκευμένη στη μεταβλητή Mastersend στο slave arduino και λαμβάνουμε επίσης τιμή από το slave που θα αποθηκευτεί στη μεταβλητή Mastereceive .
Mastereceive = SPI.μεταφορά (Mastersend);
- Μετά από αυτό, ανάλογα με την τιμή Mastereceive , θα ανάβουμε ή θα σβήσουμε το LED Master Arduino.
if (Mastereceive == 1) { digitalWrite (LED, ΥΨΗΛΟΣ); // Σετ καρφίτσας 7 HIGH Serial.println ("Master LED ON"); } αλλιώς { digitalWrite (LED, LOW); // Σετ καρφίτσας 7 LOW Serial.println ("Master LED OFF"); }
Σημείωση: Χρησιμοποιούμε το serial.println () για να δούμε το αποτέλεσμα στο Serial Motor του Arduino IDE. Ελέγξτε το βίντεο στο τέλος.
Επεξήγηση προγραμματισμού Arduino SPI Slave
1. Πρώτα απ 'όλα πρέπει να συμπεριλάβουμε τη βιβλιοθήκη SPI για τη χρήση λειτουργιών επικοινωνίας SPI.
#περιλαμβάνω
2. Σε άκυρη ρύθμιση ()
- Ξεκινάμε τη σειριακή επικοινωνία στο Baud Rate 115200.
Serial.begin (115200);
- Συνδέστε το LED στον ακροδέκτη 7 και το κουμπί Πιέστε στον ακροδέκτη 2 και ορίστε αυτές τις ακίδες OUTPUT και INPUT αντίστοιχα.
pinMode (κουμπί ip, INPUT); pinMode (LED, OUTPUT);
- Το σημαντικό βήμα εδώ είναι οι ακόλουθες δηλώσεις
pinMode (MISO, OUTPUT);
Η παραπάνω δήλωση ορίζει το MISO ως OUTPUT (Πρέπει να στείλετε δεδομένα στο Master IN). Έτσι, τα δεδομένα αποστέλλονται μέσω MISO του Slave Arduino.
- Τώρα ενεργοποιήστε το SPI σε Slave Mode χρησιμοποιώντας το SPI Control Register
SPCR - = _BV (SPE);
- Στη συνέχεια, ενεργοποιήστε τη διακοπή για επικοινωνία SPI. Εάν ληφθούν δεδομένα από τον κύριο, καλείται η Διακοπή ρουτίνας και η ληφθείσα τιμή λαμβάνεται από το SPDR (SPI data Register)
SPI.attachInterrupt ();
- Η τιμή από το κύριο λαμβάνεται από το SPDR και αποθηκεύεται στη μεταβλητή Slavereceived . Αυτό συμβαίνει μετά από τη λειτουργία Interrupt Routine.
ISR (SPI_STC_vect) { Slavereceived = SPDR; ελήφθη = αλήθεια; }
3. Στη συνέχεια στο βρόχο κενού () θέτουμε το Slave arduino LED να ανάβει ή να σβήνει ανάλογα με την τιμή Slavereceived
εάν (Slavereceived == 1) { digitalWrite (LEDpin, HIGH); // Ορίζει τον ακροδέκτη 7 ως HIGH LED ON Serial.println ("Slave LED ON"); } αλλιώς { digitalWrite (LEDpin, LOW); // Ορίζει τον ακροδέκτη 7 ως LOW LED OFF Serial.println ("Slave LED OFF"); }
- Στη συνέχεια διαβάζουμε την κατάσταση του κουμπιού Slave Arduino Push και αποθηκεύουμε την τιμή στο Slavesend για να στείλουμε την τιμή στο Master Arduino δίνοντας αξία στο SPDR register.
buttonvalue = digitalRead (κουμπίpin); εάν (buttonvalue == HIGH) {x = 1; } αλλιώς {x = 0; } Slavesend = x; SPDR = Slavesend;
Σημείωση: Χρησιμοποιούμε το serial.println () για να δούμε το αποτέλεσμα στο Serial Motor του Arduino IDE. Ελέγξτε το βίντεο στο τέλος.
Πώς λειτουργεί το SPI στο Arduino; - Ας το δοκιμάσουμε!
Παρακάτω είναι η εικόνα της τελικής ρύθμισης για επικοινωνία SPI μεταξύ δύο Arduino Boards.
Όταν πατηθεί το κουμπί στο Master side, ανάβει το λευκό LED στην υποτελή πλευρά.
Και όταν πατηθεί το κουμπί στο Slave πλευρά, το κόκκινο LED στην κύρια πλευρά ανάβει.
Μπορείτε να δείτε το παρακάτω βίντεο για να δείτε την επίδειξη της επικοινωνίας Arduino SPI. Εάν έχετε οποιεσδήποτε ερωτήσεις παρακαλώ αφήστε τις στην ενότητα σχολίων, χρησιμοποιήστε τα φόρουμ μας.