- Τι είναι το πρωτόκολλο επικοινωνίας SPI;
- Πώς λειτουργεί το πρωτόκολλο SPI;
- Διαφορά μεταξύ επικοινωνίας I2C και SPI
- SPI με PIC16F877A χρησιμοποιώντας XC8 Compiler:
- Επεξήγηση αρχείου κεφαλίδας SPI:
- Κύριο πρόγραμμα Επεξήγηση:
- Προσομοίωση PIC με εντοπισμό σφαλμάτων SPI:
Οι μικροελεγκτές PIC είναι μια ισχυρή πλατφόρμα που παρέχεται από το μικροτσίπ για ενσωματωμένα έργα. Η ευέλικτη φύση του επέτρεψε να βρει τρόπους σε πολλές εφαρμογές και δεν έχει αναπτυχθεί ακόμη πολύ. Εάν ακολουθήσατε τα σεμινάρια PIC μας, τότε θα έχετε παρατηρήσει ότι έχουμε ήδη καλύψει ένα ευρύ φάσμα μαθημάτων σχετικά με τον μικροελεγκτή PIC ξεκινώντας από τα βασικά. Στην ίδια ροή προχωρούμε να μάθουμε τα πρωτόκολλα επικοινωνίας που είναι διαθέσιμα με το PIC και πώς να τα χρησιμοποιήσουμε. Έχουμε ήδη καλύψει το I2C με μικροελεγκτή PIC.
Στο τεράστιο σύστημα ενσωματωμένων εφαρμογών, κανένας μικροελεγκτής δεν μπορεί να εκτελέσει όλες τις δραστηριότητες από μόνη της. Σε κάποιο στάδιο του χρόνου πρέπει να επικοινωνήσει με άλλες συσκευές για να μοιραστεί πληροφορίες, υπάρχουν πολλοί διαφορετικοί τύποι πρωτοκόλλων επικοινωνίας για να μοιραστούν αυτές τις πληροφορίες, αλλά τα πιο χρησιμοποιημένα είναι USART, IIC, SPI και CAN. Κάθε πρωτόκολλο επικοινωνίας έχει το δικό του πλεονέκτημα και μειονέκτημα. Ας επικεντρωθούμε στο πρωτόκολλο SPI για τώρα, καθώς αυτό θα μάθουμε σε αυτό το σεμινάριο.
Τι είναι το πρωτόκολλο επικοινωνίας SPI;
Ο όρος SPI σημαίνει " Serial Peripheral Interface ". Είναι ένα κοινό πρωτόκολλο επικοινωνίας που χρησιμοποιείται για την αποστολή δεδομένων μεταξύ δύο μικροελεγκτών ή για την ανάγνωση / εγγραφή δεδομένων από έναν αισθητήρα σε έναν μικροελεγκτή. Χρησιμοποιείται επίσης για επικοινωνία με κάρτες SD, καταχωρητές βάρδιας, ελεγκτές οθόνης και πολλά άλλα.
Πώς λειτουργεί το πρωτόκολλο SPI;
Η επικοινωνία SPI είναι σύγχρονη επικοινωνία, που σημαίνει ότι λειτουργεί με τη βοήθεια ενός σήματος ρολογιού που μοιράζεται μεταξύ των δύο συσκευών που ανταλλάσσουν τα δεδομένα. Επίσης, είναι μια αμφίδρομη επικοινωνία επειδή μπορεί να στείλει και να λάβει δεδομένα χρησιμοποιώντας ένα ξεχωριστό λεωφορείο. Η επικοινωνία SPI απαιτεί 5 καλώδια για να λειτουργήσει. Ένα απλό κύκλωμα επικοινωνίας SPI μεταξύ ενός κύριου και ενός σκλάβου φαίνεται παρακάτω
Τα πέντε καλώδια που απαιτούνται για την επικοινωνία είναι SCK (Serial Clock), MOSI (Master Out Slave In), MISO (Master In Slave Out) και SS (Slave Select). Η επικοινωνία SPI πραγματοποιείται πάντα μόνο μεταξύ ενός πλοιάρχου και ενός σκλάβου. Ένας κύριος μπορεί να έχει πολλούς σκλάβους συνδεδεμένους σε αυτό. Ο πλοίαρχος είναι υπεύθυνος για τη δημιουργία του παλμού του ρολογιού και το ίδιο μοιράζεται με όλους τους σκλάβους. Επίσης, όλες οι επικοινωνίες μπορούν να ξεκινήσουν μόνο από τον πλοίαρχο.
Ο ακροδέκτης SCK (γνωστός και ως σειριακό ρολόι SCL) μοιράζεται το σήμα ρολογιού που δημιουργεί ο πλοίαρχος με τους σκλάβους. Ο πείρος MOSI (γνωστός και ως SDA –Serial Data Out) χρησιμοποιείται για την αποστολή των δεδομένων από τον κύριο στο salve. Ο πείρος MISO (γνωστός και ως SDI - Serial Data In) χρησιμοποιείται για τη λήψη των δεδομένων από το salve στο master. Μπορείτε επίσης να ακολουθήσετε το βέλος στην παραπάνω εικόνα για να κατανοήσετε την κίνηση δεδομένων / σήματος. Τελικά, ο πείρος SS (γνωστός και ως CS –Chip select) χρησιμοποιείται όταν υπάρχουν περισσότερες από μία υπομονάδες συνδεδεμένες στο master. Αυτό μπορεί να χρησιμοποιηθεί για την επιλογή του απαιτούμενου σκλάβου. Ένα κύκλωμα δείγματος όπου συνδέονται περισσότεροι από ένας σκλάβοι με τον κύριο για επικοινωνία SPI φαίνεται στο παρακάτω κύκλωμα.
Διαφορά μεταξύ επικοινωνίας I2C και SPI
Έχουμε ήδη μάθει την επικοινωνία I2C με το PIC και έτσι πρέπει να είμαστε εξοικειωμένοι με τον τρόπο λειτουργίας του I2C και πού μπορούμε να τα χρησιμοποιήσουμε όπως το I2C μπορεί να χρησιμοποιηθεί για τη διασύνδεση της μονάδας RTC. Αλλά τώρα, γιατί χρειαζόμαστε το πρωτόκολλο SPI όταν έχουμε ήδη I2C. Ο λόγος είναι ότι οι επικοινωνίες I2C και SPI είναι πλεονεκτήματα με τους δικούς τους τρόπους και ως εκ τούτου είναι συγκεκριμένες για την εφαρμογή.
Σε κάποιο βαθμό, η επικοινωνία I2C μπορεί να θεωρηθεί ότι έχει κάποια πλεονεκτήματα σε σχέση με την επικοινωνία SPI, επειδή το I2C χρησιμοποιεί μικρότερο αριθμό pin και γίνεται πολύ βολικό όταν υπάρχει μεγάλος αριθμός σκλάβων συνδεδεμένων στο bus. Αλλά το μειονέκτημα του I2C είναι ότι έχει τον ίδιο δίαυλο για την αποστολή και τη λήψη δεδομένων και ως εκ τούτου είναι σχετικά αργός. Επομένως, βασίζεται αποκλειστικά στην εφαρμογή για να αποφασίσετε μεταξύ του πρωτοκόλλου SPI και I2C για το έργο σας.
SPI με PIC16F877A χρησιμοποιώντας XC8 Compiler:
Αρκετά βασικά, ας μάθουμε τώρα πώς μπορούμε να χρησιμοποιήσουμε την επικοινωνία SPI στον μικροελεγκτή PIC16F877A χρησιμοποιώντας το μεταγλωττιστή MPLABX IDE και XC8. Πριν ξεκινήσουμε να καταστήσουμε σαφές ότι αυτό το σεμινάριο μιλά μόνο για SPI στο PIC16F877a χρησιμοποιώντας μεταγλωττιστή XC8, η διαδικασία θα είναι η ίδια για άλλους μικροελεγκτές, αλλά ενδέχεται να απαιτηθούν μικρές αλλαγές. Να θυμάστε επίσης ότι για προχωρημένους μικροελεγκτές όπως η σειρά PIC18F, ο ίδιος ο μεταγλωττιστής μπορεί να έχει κάποια ενσωματωμένη βιβλιοθήκη για να χρησιμοποιεί τις δυνατότητες SPI, αλλά για PIC16F877A τίποτα τέτοιο δεν υπάρχει, οπότε ας δημιουργήσουμε ένα μόνοι μας. Η βιβλιοθήκη που εξηγείται εδώ θα δοθεί ως αρχείο κεφαλίδας για λήψη στο κάτω μέρος, το οποίο μπορεί να χρησιμοποιηθεί για την επικοινωνία του PIC16F877A με άλλες συσκευές SPI.
Σε αυτό το σεμινάριο θα γράψουμε ένα μικρό πρόγραμμα που χρησιμοποιεί την επικοινωνία SPI για να γράψει και να διαβάσει δεδομένα από το δίαυλο SPI. Στη συνέχεια θα επαληθεύσουμε το ίδιο χρησιμοποιώντας προσομοίωση Proteus. Όλος ο κωδικός που σχετίζεται με τα μητρώα SPI θα δημιουργηθεί μέσα στο αρχείο κεφαλίδας που ονομάζεται PIC16f877a_SPI.h. Με αυτόν τον τρόπο μπορούμε να χρησιμοποιήσουμε αυτό το αρχείο κεφαλίδας σε όλα τα επερχόμενα έργα μας στα οποία απαιτείται επικοινωνία SPI. Και μέσα στο κύριο πρόγραμμα θα χρησιμοποιήσουμε απλώς τις λειτουργίες από το αρχείο κεφαλίδας. Μπορείτε να κατεβάσετε τον πλήρη κώδικα μαζί με το αρχείο κεφαλίδας από εδώ.
Επεξήγηση αρχείου κεφαλίδας SPI:
Μέσα στο αρχείο κεφαλίδας πρέπει να προετοιμάσουμε την επικοινωνία SPI για το PIC16F877a. Όπως πάντα, το καλύτερο μέρος για να ξεκινήσετε είναι το δελτίο δεδομένων PIC16F877A. Οι καταχωρητές που ελέγχουν την επικοινωνία SPI για το PIC16F8777a είναι το SSPSTAT και το μητρώο SSPCON. Μπορείτε να τα αναφέρετε στις σελίδες 74 και 75 του φύλλου δεδομένων.
Υπάρχουν πολλές επιλογές παραμέτρων που πρέπει να επιλεγούν κατά την προετοιμασία της επικοινωνίας SPI. Η πιο συχνά χρησιμοποιούμενη επιλογή είναι ότι η συχνότητα ρολογιού θα ρυθμιστεί σε Fosc / 4 και θα γίνει στη μέση και το ρολόι θα ρυθμιστεί ως χαμηλό στην ιδανική κατάσταση. Έτσι, χρησιμοποιούμε επίσης την ίδια διαμόρφωση για το αρχείο κεφαλίδας, μπορείτε εύκολα να τα αλλάξετε αλλάζοντας τα αντίστοιχα bit.
SPI_Initialize_Master ()
Η συνάρτηση αρχικοποίησης SPI χρησιμοποιείται για την εκκίνηση της επικοινωνίας SPI ως κύρια. Μέσα σε αυτήν τη λειτουργία, ορίζουμε τους αντίστοιχους ακροδέκτες RC5 και RC3 ως ακίδες εξόδου. Στη συνέχεια, ρυθμίζουμε το SSPTAT και το μητρώο SSPCON για να ενεργοποιήσουμε τις επικοινωνίες SPI
άκυρο SPI_Initialize_Master () { TRISC5 = 0; // SSPSTAT = 0b00000000; // σελ 74/234 SSPCON = 0b00100000; // σελ. 75/234 TRISC3 = 0; // Ορισμός ως έξοδο για λειτουργία slave }
SPI_Initialize_Slave ()
Αυτή η λειτουργία χρησιμοποιείται για να ρυθμίσει τον μικροελεγκτή να λειτουργεί σε λειτουργία σκλάβου για επικοινωνία SPI. Κατά τη λειτουργία σκλάβου, ο πείρος RC5 πρέπει να ρυθμιστεί ως έξοδος και ο πείρος RC3 πρέπει να οριστεί ως είσοδος. Το SSPSTAT και το SSPCON έχουν ρυθμιστεί με τον ίδιο τρόπο τόσο για τον υποτελή όσο και για τον κύριο.
άκυρο SPI_Initialize_Slave () { TRISC5 = 0; // Η καρφίτσα SDO πρέπει να δηλώνεται ως έξοδος SSPSTAT = 0b00000000; // σελ 74/234 SSPCON = 0b00100000; // σελ 75/234 TRISC3 = 1; // Ορίστε ως έξω για την κύρια λειτουργία }
SPI_Write (εισερχόμενα char)
Η συνάρτηση SPI Write χρησιμοποιείται για την εγγραφή δεδομένων στο δίαυλο SPI. Παίρνει τις πληροφορίες από τον χρήστη μέσω της μεταβλητής που εισέρχεται και στη συνέχεια τις χρησιμοποιεί για να περάσει στον καταχωρητή Buffer. Το SSPBUF θα εκκαθαριστεί στον διαδοχικό παλμό ρολογιού και τα δεδομένα θα σταλούν στο δίαυλο λίγο-λίγο.
άκυρο SPI_Write (char incoming) { SSPBUF = εισερχόμενο; // Γράψτε τα δεδομένα του χρήστη σε buffer }
SPI_Ready2Read ()
Η λειτουργία SPI έτοιμη για ανάγνωση χρησιμοποιείται για να ελέγξει εάν τα δεδομένα στο δίαυλο SPI έχουν ληφθεί πλήρως και εάν μπορούν να διαβαστούν. Ο καταχωρητής SSPSTAT έχει ένα bit που ονομάζεται BF το οποίο θα ρυθμιστεί μόλις τα δεδομένα έχουν ληφθεί πλήρως, οπότε ελέγχουμε αν αυτό το bit έχει οριστεί αν δεν έχει ρυθμιστεί, τότε πρέπει να περιμένουμε μέχρι να αρχίσει να διαβάζει οτιδήποτε από το δίαυλο SPI.
unsigned SPI_Ready2Read () { if (SSPSTAT & 0b00000001) επιστροφή 1; αλλιώς επιστρέψτε 0; }
SPI_Διαβάστε ()
Το SPI Read χρησιμοποιείται για την ανάγνωση των δεδομένων από το δίαυλο SPI στον μικροελεγκτή. Τα δεδομένα που υπάρχουν στο δίαυλο SPI θα αποθηκευτούν στο SSPBUF, πρέπει να περιμένουμε έως ότου τα πλήρη δεδομένα αποθηκευτούν στο Buffer και στη συνέχεια μπορούμε να τα διαβάσουμε σε μια μεταβλητή. Ελέγουμε το BF bit του SSPSTAT register πριν διαβάσουμε το buffer για να βεβαιωθούμε ότι η λήψη δεδομένων είναι πλήρης.
char SPI_Read () // Διαβάστε τα ληφθέντα δεδομένα { ενώ (! SSPSTATbits.BF); // Κρατήστε πατημένο έως ότου οριστεί το bit BF, για να βεβαιωθείτε ότι τα πλήρη δεδομένα διαβάζονται επιστροφή (SSPBUF). // επιστρέψτε τα δεδομένα ανάγνωσης }
Κύριο πρόγραμμα Επεξήγηση:
Οι λειτουργίες που εξηγούνται στην παραπάνω ενότητα θα βρίσκονται στο αρχείο κεφαλίδας και μπορούν να κληθούν στο κύριο αρχείο c. Ας γράψουμε λοιπόν ένα μικρό πρόγραμμα για να ελέγξουμε εάν λειτουργεί η επικοινωνία SPI. Θα γράψουμε απλά λίγα δεδομένα στο δίαυλο SPI και θα χρησιμοποιήσουμε την προσομοίωση πρωτεϊνών για να ελέγξουμε εάν λαμβάνονται τα ίδια δεδομένα στο πρόγραμμα εντοπισμού σφαλμάτων SPI.
Όπως πάντα ξεκινάτε το πρόγραμμα ρυθμίζοντας τα bits διαμόρφωσης και στη συνέχεια είναι πολύ σημαντικό να προσθέσετε το αρχείο κεφαλίδας που μόλις εξηγήσαμε στο πρόγραμμα όπως φαίνεται παρακάτω
#περιλαμβάνω
Εάν έχετε ανοίξει το πρόγραμμα από το αρχείο zip που κατεβάσατε παραπάνω, από προεπιλογή, το αρχείο κεφαλίδας θα υπάρχει στον κατάλογο αρχείων κεφαλίδας του αρχείου έργου σας. Διαφορετικά, πρέπει να προσθέσετε το αρχείο κεφαλίδας χειροκίνητα μέσα στο έργο σας, αφού προσθέσετε τα αρχεία του έργου σας θα μοιάζουν με αυτό παρακάτω
Μέσα στο κύριο αρχείο πρέπει να αρχίσουμε το PIC ως Master για επικοινωνία SPI και στη συνέχεια μέσα σε ένα άπειρο loop ενώ θα γράψουμε τυχαίες τρεις δεκαεξαδικές τιμές στο δίαυλο SPI για να ελέγξουμε εάν λαμβάνουμε τις ίδιες κατά την προσομοίωση.
void main () { SPI_Initialize_Master (); ενώ (1) { SPI_Write (0X0A); __delay_ms (100); SPI_Write (0X0F); __delay_ms (100); SPI_Write (0X15); __delay_ms (100); } }
Παρατηρήστε ότι οι τυχαίες τιμές που χρησιμοποιούνται στο πρόγραμμα είναι 0A, 0F και 15 και είναι δεκαεξαδικές τιμές, οπότε πρέπει να δούμε τις ίδιες κατά την προσομοίωση. Αυτό είναι ότι ο κώδικας έχει τελειώσει, αυτό είναι απλώς ένα δείγμα, αλλά μπορούμε να χρησιμοποιήσουμε την ίδια μεθοδολογία για να επικοινωνήσουμε με άλλα MCU ή με άλλες μονάδες αισθητήρων που λειτουργούν στο πρωτόκολλο SPI.
Προσομοίωση PIC με εντοπισμό σφαλμάτων SPI:
Τώρα που το πρόγραμμά μας είναι έτοιμο, μπορούμε να το μεταγλωττίσουμε και στη συνέχεια να προχωρήσουμε στην προσομοίωση. Το Proteus διαθέτει ένα ωραίο εύχρηστο χαρακτηριστικό που ονομάζεται SPI debugger , το οποίο μπορεί να χρησιμοποιηθεί για την παρακολούθηση των δεδομένων μέσω ενός διαύλου SPI. Έτσι χρησιμοποιούμε το ίδιο και χτίζουμε ένα κύκλωμα όπως φαίνεται παρακάτω.
Επειδή υπάρχει μόνο μία συσκευή SPI στην προσομοίωση , δεν χρησιμοποιούμε τον πείρο SS και όταν δεν τον χρησιμοποιούμε θα πρέπει να γειωθεί όπως φαίνεται παραπάνω. Απλώς φορτώστε το αρχείο hex στον μικροελεγκτή PIC16F877A και κάντε κλικ στο κουμπί αναπαραγωγής για να προσομοιώσετε το πρόγραμμά μας. Μόλις ξεκινήσει η προσομοίωση, θα λάβετε ένα αναδυόμενο παράθυρο που εμφανίζει τα δεδομένα στο δίαυλο SPI όπως φαίνεται παρακάτω
Ας ρίξουμε μια πιο προσεκτική ματιά στα δεδομένα που εισέρχονται και ελέγξτε αν είναι τα ίδια με αυτά που γράψαμε στο πρόγραμμά μας.
Τα δεδομένα λαμβάνονται με την ίδια σειρά που γράψαμε στο πρόγραμμά μας και τα ίδια επισημαίνονται για εσάς. Μπορείτε επίσης να δοκιμάσετε την προσομοίωση ενός προγράμματος για επικοινωνία με δύο μικροελεγκτές PIC χρησιμοποιώντας το πρωτόκολλο SPI. Πρέπει να προγραμματίσετε ένα PIC ως master και το άλλο ως slave. Όλα τα απαιτούμενα αρχεία κεφαλίδας για αυτόν τον σκοπό αναφέρονται ήδη στο αρχείο κεφαλίδας.
Αυτό είναι μόνο μια ματιά στο τι μπορεί να κάνει το SPI, μπορεί επίσης να διαβάσει και να γράψει δεδομένα σε πολλές συσκευές. Θα καλύψουμε περισσότερα για το SPI στα επερχόμενα σεμινάρια μας με τη διασύνδεση διαφόρων ενοτήτων που λειτουργούν με το πρωτόκολλο SPI.
Ελπίζω να καταλάβατε το έργο και να μάθετε κάτι χρήσιμο από αυτό. Εάν έχετε αμφιβολίες, δημοσιεύστε τα στην παρακάτω ενότητα σχολίων ή χρησιμοποιήστε τα φόρουμ για τεχνική βοήθεια.
Ο πλήρης κύριος κωδικός δόθηκε παρακάτω. μπορείτε να κατεβάσετε αρχεία κεφαλίδας με όλο τον κώδικα από εδώ