- Τι είναι το Bit Banging;
- Πότε να χρησιμοποιήσετε το Bit Banging
- Αλγόριθμος για σειριακή επικοινωνία μέσω Bit Banging
- Bit Banging μέσω SPI
- Παράδειγμα Bit Banging: Επικοινωνία SPI στο Arduino
- Μειονεκτήματα του Bit Banging
- UART μέσω Bit Banging στο Arduino
Οι διασυνδέσεις επικοινωνίας είναι ένας από τους παράγοντες που λαμβάνονται υπόψη κατά την επιλογή ενός μικροελεγκτή που θα χρησιμοποιηθεί για ένα έργο. Ο σχεδιαστής διασφαλίζει ότι ο μικροελεγκτής που επιλέγεται έχει όλες τις διεπαφές που απαιτούνται για την επικοινωνία με όλα τα άλλα στοιχεία που θα χρησιμοποιηθούν για το προϊόν. Η ύπαρξη ορισμένων από αυτές τις διεπαφές όπως το SPI και το I2C στον μικροελεγκτή αυξάνει πάντοτε το κόστος τέτοιων μικροελεγκτών, και ανάλογα με τον προϋπολογισμό BOM μπορεί να καταστήσει έναν επιθυμητό μικροελεγκτή μη προσιτό. Σε καταστάσεις όπως αυτές οι τεχνικές όπως το Bit Banging μπαίνουν στο παιχνίδι.
Τι είναι το Bit Banging;
Το bit banging είναι μια τεχνική για σειριακή επικοινωνία στην οποία η όλη διαδικασία επικοινωνίας αντιμετωπίζεται μέσω λογισμικού αντί αποκλειστικού υλικού. Για τη μετάδοση δεδομένων, η τεχνική περιλαμβάνει τη χρήση λογισμικού για την κωδικοποίηση των δεδομένων σε σήματα και παλμούς που χρησιμοποιούνται για χειρισμό της κατάστασης ενός πείρου I / O ενός μικροελεγκτή που χρησιμεύει ως ο πείρος Tx για την αποστολή δεδομένων στη συσκευή στόχο. Για τη λήψη δεδομένων, η τεχνική περιλαμβάνει τη δειγματοληψία της κατάστασης του πείρου Rx μετά από ορισμένα διαστήματα που καθορίζονται από τον ρυθμό baud της επικοινωνίας. Το λογισμικό ορίζει όλες τις παραμέτρους που απαιτούνται για την επίτευξη αυτής της επικοινωνίας, συμπεριλαμβανομένου του συγχρονισμού, του χρονισμού, των επιπέδων κ.λπ., οι οποίες συνήθως αποφασίζονται από ειδικό υλικό όταν δεν χρησιμοποιείται bit banging.
Πότε να χρησιμοποιήσετε το Bit Banging
Το Bit-Banging χρησιμοποιείται συνήθως σε περιπτώσεις όπου ένας μικροελεγκτής με την απαιτούμενη διεπαφή δεν είναι διαθέσιμος ή όταν η εναλλαγή σε έναν μικροελεγκτή με την απαιτούμενη διεπαφή μπορεί να είναι πολύ ακριβός. Παρέχει έτσι έναν φτηνό τρόπο για να επιτρέπει στην ίδια συσκευή να επικοινωνεί χρησιμοποιώντας διάφορα πρωτόκολλα. Ένας μικροελεγκτής που ήταν προηγουμένως ενεργοποιημένος μόνο για επικοινωνία UART, μπορεί να εξοπλιστεί για επικοινωνία χρησιμοποιώντας SPI και 12C μέσω bit banging.
Αλγόριθμος για σειριακή επικοινωνία μέσω Bit Banging
Ενώ ο κώδικας για την εφαρμογή bit banging μπορεί να διαφέρει σε διαφορετικούς μικροελεγκτές και μπορεί επίσης να διαφέρει για διαφορετικά σειριακά πρωτόκολλα, αλλά η διαδικασία / αλγόριθμος για την εφαρμογή bit banging είναι η ίδια σε όλες τις πλατφόρμες.
Για παράδειγμα, για την αποστολή δεδομένων χρησιμοποιείται ο ψευδοκώδικας.
- Αρχή
- Αποστολή bit έναρξης
- Περιμένετε να χρονομετρηθεί η αντιστοίχιση με το ρυθμό baud του δέκτη
- Αποστολή bit δεδομένων
- Περιμένετε για διάρκεια για να αντιστοιχεί ξανά στο ρυθμό baud του δέκτη
- Ελέγξτε εάν έχουν αποσταλεί όλα τα bit δεδομένων. Εάν όχι, μεταβείτε στο 4. Εάν ναι, μεταβείτε στο 7
- Αποστολή bit διακοπής
- Να σταματήσει
Η λήψη δεδομένων τείνει να είναι λίγο πιο περίπλοκη, συνήθως μια διακοπή χρησιμοποιείται για να καθοριστεί πότε τα δεδομένα είναι διαθέσιμα στον ακροδέκτη του δέκτη. Αυτό βοηθά να διασφαλιστεί ότι ο μικροελεγκτής δεν σπαταλά πάρα πολύ την ισχύ επεξεργασίας. Παρόλο που ορισμένες εφαρμογές χρησιμοποιούν οποιαδήποτε από τις καρφίτσες I / O μικροελεγκτών, αλλά οι πιθανότητες θορύβου και σφαλμάτων, αν όχι πιθανώς χειρισμένες, είναι υψηλότερες. Ο αλγόριθμος για τη λήψη δεδομένων μέσω διακοπών εξηγείται παρακάτω.
- Αρχή
- Ενεργοποίηση διακοπής στην καρφίτσα Rx
- Όταν ενεργοποιείται η διακοπή, αποκτήστε το bit έναρξης
- Περιμένετε για χρονισμό σύμφωνα με το ρυθμό baud
- Διαβάστε τον πείρο Rx
- Επαναλάβετε από 4 έως ότου ληφθούν όλα τα δεδομένα
- Περιμένετε για χρονισμό σύμφωνα με το ρυθμό baud
- Ελέγξτε για bit διακοπής
- Να σταματήσει
Bit Banging μέσω SPI
Όπως αναφέρθηκε παραπάνω, το bit banging για διαφορετικά πρωτόκολλα λειτουργεί διαφορετικά και επομένως είναι σημαντικό να διαβάσετε για κάθε πρωτόκολλο, να κατανοήσετε τη διαμόρφωση δεδομένων και το ρολόι πριν επιχειρήσετε να εφαρμόσετε. Λαμβάνοντας ως παράδειγμα τη λειτουργία SPI 1, η βασική τιμή του ρολογιού είναι πάντα 0 και τα δεδομένα αποστέλλονται ή λαμβάνονται πάντα στην άνοδο του ρολογιού. Το διάγραμμα χρονισμού για το πρωτόκολλο επικοινωνίας SPI Mode 1 φαίνεται παρακάτω.
Για να εφαρμοστεί αυτό, μπορεί να χρησιμοποιηθεί ο ακόλουθος αλγόριθμος.
- Αρχή
- Ρυθμίστε τη χαμηλή ακίδα SS για να ξεκινήσετε την επικοινωνία
- Ρυθμίστε τον πείρο για το Master Out Slave In (MOSI) στο πρώτο κομμάτι των δεδομένων που θα σταλούν
- Ρυθμίστε τον ακροδέκτη ρολογιού (SCK) έτσι ώστε τα δεδομένα να μεταδίδονται από τον κύριο και να λαμβάνονται από τον υποτελή
- Διαβάστε την κατάσταση του Master in Slave Out (MISO) για να λάβετε το πρώτο κομμάτι δεδομένων από το slave
- Ορίστε το SCK Low, έτσι ώστε τα δεδομένα να μπορούν να σταλούν στην επόμενη άνοδο
- Μεταβείτε στο 2 έως ότου έχουν μεταδοθεί όλα τα bit δεδομένων.
- Ρυθμίστε το SS pin High για να διακόψετε τη μετάδοση.
- Να σταματήσει
Παράδειγμα Bit Banging: Επικοινωνία SPI στο Arduino
Για παράδειγμα, ας εφαρμόσουμε τον αλγόριθμο για επικοινωνία SPI μέσω bit banging στο Arduino για να δείξουμε πώς τα δεδομένα μπορούν να κτυπηθούν bit μέσω του SPI χρησιμοποιώντας τον παρακάτω κώδικα.
Ξεκινάμε δηλώνοντας ότι θα χρησιμοποιηθούν οι καρφίτσες του Arduino.
const int SSPin = 11; const int SCKPin = 10; const int MISOPin = 9; const int MOSIPin = 8; byte sendData = 64; // Τιμή προς αποστολή byte slaveData = 0; // για την αποθήκευση της τιμής που έστειλε ο σκλάβος
Στη συνέχεια, μεταβαίνουμε στη συνάρτηση void setup () όπου δηλώνεται η κατάσταση των ακίδων. Μόνο η πινέζα Master in Slave out (MISO) δηλώνεται ως είσοδος, καθώς είναι η μόνη καρφίτσα που λαμβάνει δεδομένα. Όλες οι άλλες ακίδες δηλώνονται ως έξοδος. Αφού δηλώσετε τις λειτουργίες καρφιτσών, ο ακροδέκτης SS έχει ρυθμιστεί σε ΥΨΗΛΟ. Ο λόγος για αυτό είναι να διασφαλιστεί ότι η διαδικασία είναι χωρίς σφάλματα και η επικοινωνία ξεκινά μόνο όταν είναι χαμηλή.
άκυρη ρύθμιση () { pinMode (MISOPin, INPUT). pinMode (SSPin, OUTPUT); pinMode (SCKPin, OUTPUT); pinMode (MOSIPin, OUTPUT); digitalWrite (SSPin, HIGH); }
Στη συνέχεια, ξεκινάμε το βρόχο για την αποστολή δεδομένων. Σημειώστε ότι αυτός ο βρόχος θα συνεχίσει να στέλνει τα δεδομένα επανειλημμένα.
Ξεκινάμε τον βρόχο γράφοντας τον πείρο SS χαμηλά, για να ξεκινήσουμε την αρχή της επικοινωνίας και καλούμε τη συνάρτηση bitbangdata που διασπά τα προκαθορισμένα δεδομένα σε bits και στέλνει. Με αυτήν την ενέργεια, γράφουμε στη συνέχεια την καρφίτσα SS HIGH για να δείξουμε το τέλος της μετάδοσης δεδομένων.
void loop () { digitalWrite (SSPin, LOW). // SS low slaveData = bitBangData (sendData); // μετάδοση δεδομένων digitalWrite (SSPin, HIGH); // Υψηλή SS ξανά }
Η bitbangdata () συνάρτηση γράφεται κατωτέρω. Η συνάρτηση λαμβάνει τα δεδομένα που πρέπει να σταλούν και τα διασπά σε bit και τα στέλνει με βρόχο πάνω από τον κώδικα για τη μετάδοση όπως υποδεικνύεται στο βήμα 7 του αλγορίθμου.
byte bitBangData (byte _send) // Αυτή η συνάρτηση μεταδίδει τα δεδομένα μέσω bitbanging { byte _receive = 0; για (int i = 0; i <8; i ++) // 8 bits σε byte { digitalWrite (MOSIPin, bitRead (_send, i)); // Ρύθμιση MOSI digitalWrite (SCKPin, HIGH). // SCK high bitWrite (_receive, i, digitalRead (MISOPin)); // Λήψη MISO digitalWrite (SCKPin, LOW). // SCK low } επιστροφή _receive; // Επιστροφή των ληφθέντων δεδομένων }
Μειονεκτήματα του Bit Banging
Η υιοθέτηση bit banging θα πρέπει ωστόσο να είναι μια καλά μελετημένη απόφαση, καθώς υπάρχουν πολλά μειονεκτήματα στο bit banging που μπορεί να το καθιστούν μη αξιόπιστο για εφαρμογή σε ορισμένες λύσεις. Το bit banging αυξάνει την ισχύ που καταναλώνει ο μικροελεγκτής λόγω της υψηλής ισχύος επεξεργασίας που καταναλώνεται από τη διαδικασία. Σε σύγκριση με το εξειδικευμένο υλικό, περισσότερα σφάλματα επικοινωνίας, όπως δυσλειτουργίες και διακυμάνσεις, συμβαίνουν όταν χρησιμοποιείται bit banging ειδικά όταν η επικοινωνία δεδομένων πραγματοποιείται από τον μικροελεγκτή ταυτόχρονα με άλλες εργασίες. Η επικοινωνία μέσω bit banging συμβαίνει σε ένα κλάσμα της ταχύτητας με την οποία συμβαίνει όταν χρησιμοποιείται ειδικό υλικό. Αυτό μπορεί να είναι σημαντικό σε ορισμένες εφαρμογές και μπορεί να κάνει λίγο χτύπημα μια «όχι τόσο καλή» επιλογή.
Το bit banging χρησιμοποιείται για όλα τα είδη σειριακών επικοινωνιών όπως: RS-232, ασύγχρονη σειριακή επικοινωνία, UART, SPI και I2C.
UART μέσω Bit Banging στο Arduino
Μία από τις δημοφιλείς υλοποιήσεις του bit banging είναι η Arduino Software Serial βιβλιοθήκη που επιτρέπει στο Arduino να επικοινωνεί μέσω UART χωρίς τη χρήση των αποκλειστικών καρφιτσών UART (D0 και D1). Αυτό δίνει μεγάλη ευελιξία καθώς οι χρήστες μπορούν να συνδέσουν όσες σειριακές συσκευές μπορεί να υποστηρίζει ο αριθμός των καρφιτσών στην πλακέτα Arduino.