Πίνακας περιεχομένων:
- Βήμα 1: Τι είναι όλα αυτά τα πράγματα I2C τέλος πάντων;
- Βήμα 2: Παραγγείλετε ορισμένες συσκευές I2C
- Βήμα 3: Προγράμματα οδήγησης I2C
- Βήμα 4: Ας χτίσουμε
- Βήμα 5: Ας κωδικοποιήσουμε και δοκιμάζουμε
- Βήμα 6: Χρήση μνήμης I2C
- Βήμα 7: Πόροι Ιστού
- Βήμα 8: Σημειώσεις για τους Geeks
Βίντεο: Λεωφορείο I2C για ATtiny και ATmega: 8 βήματα
2024 Συγγραφέας: John Day | [email protected]. Τελευταία τροποποίηση: 2024-01-30 08:39
Λατρεύω τους μικροελεγκτές Atmel AVR! Από τη δημιουργία του Συστήματος Ανάπτυξης Γκέτο που περιγράφεται στο παρόν Εγχειρίδιο, δεν έχω τελειώσει να διασκεδάζω να πειραματίζομαι με το AVR ATtiny2313 και το ATmega168 ειδικότερα. Έφτασα ακόμη να γράψω ένα Instructable σχετικά με τη χρήση διακοπτών ως εισόδους και επέκτεινα την έννοια του Ghetto Development System σε CPLD. Κατά τη διάρκεια ενός πρόσφατου έργου, χρειάστηκα αρκετούς διακόπτες για τον καθορισμό τιμών ελέγχου. Τα AVR δεν είχαν αρκετές ακίδες εισόδου/εξόδου, οπότε έπρεπε να σκεφτώ κάτι. Θα μπορούσα να είχα δοκιμάσει ένα πολύπλοκο σύστημα εισόδου με πληκτρολόγιο και οθόνη, αλλά οι πόροι του ATtiny2313 θα είχαν εξαντληθεί. Ευτυχώς, η Atmel παρείχε έναν τρόπο αντιμετώπισης αυτού του προβλήματος, συμπεριλαμβάνοντας μια διεπαφή που μπορεί να συνδεθεί με πρόσθετα τσιπ (όπως μνήμες ή θύρες εισόδου/εξόδου) με μια απλή διεπαφή δύο καλωδίων. Είναι σωστό, χρησιμοποιώντας μόνο δύο ακίδες εισόδου/εξόδου σε ένα AVR μπορούμε να έχουμε πρόσβαση σε πολλές πρόσθετες ακίδες εισόδου/εξόδου, καθώς και σε άλλους πόρους επίσης. Αυτή η διεπαφή δύο συρμάτων είναι επίσημα γνωστή ως δίαυλος Inter-Integrated Circuit, ή απλά ο δίαυλος I2C και εφευρέθηκε από την NXP όταν ήταν ακόμα ημιαγωγών Philips. Αν διαβάζετε αυτό το Instructable, πιθανότατα έχετε ακούσει για το δίαυλο I2C και ίσως το έχετε χρησιμοποιήσει σε PIC ή άλλο μικροελεγκτή. Ενώ εννοιολογικά είναι πολύ απλό και υποστηρίζεται από πόρους υλικού στα AVR, τα προγράμματα οδήγησης λογισμικού εξακολουθούν να είναι απαραίτητα για τη χρήση του διαύλου I2C. Το Atmel παρέχει Σημειώσεις Εφαρμογής (δείτε τους Πόρους αργότερα σε αυτό το Instructable), αλλά αυτές είναι ελλιπείς και δεν εμφανίζουν παραδείγματα πέρα από την επικοινωνία με άλλη συσκευή AVR. Δεν είναι ο σκοπός αυτού του Instructable να διδάξει σε κανέναν πώς να δημιουργεί προγράμματα οδήγησης I2C για AVR. Μάλλον, θα παράσχω εκτεταμένες εκδόσεις των προγραμμάτων οδήγησης Atmel για συσκευές ATtiny2313 και ATmega168, θα εξηγήσω τις απαιτήσεις και τους περιορισμούς που ισχύουν κατά τη χρήση αυτών και θα σας δείξω παραδείγματα εργασίας συσκευών I2C. Αφού εργαστείτε με αυτό το Instructable, θα μπορείτε να χρησιμοποιήσετε με επιτυχία το δίαυλο I2C στα έργα AVR. Προφανώς, μπορείτε να αγνοήσετε τα προγράμματα οδήγησης είτε για μικροσκοπικά είτε για MEGA εάν ενδιαφέρεστε μόνο για ένα από αυτά. Για όσους ενδιαφέρονται να μάθουν περισσότερα για το δίαυλο I2C, θα παρέχω συνδέσμους προς το κατάλληλο υλικό.
Βήμα 1: Τι είναι όλα αυτά τα πράγματα I2C τέλος πάντων;
Ο δίαυλος I2C είναι μια απλή σύνδεση δύο καλωδίων που μπορεί να συνδέσει πολλές συσκευές μεταξύ τους και να τους επιτρέψει να ανταλλάξουν δεδομένα. Στην απλούστερη μορφή του υπάρχει μια κύρια συσκευή που επικοινωνεί με πολλαπλές βοηθητικές συσκευές. Όλες οι συσκευές συνδέονται παράλληλα με τα δύο καλώδια του διαύλου I2C. Τα δύο καλώδια είναι γνωστά ως SCL και SDA. Το SCL είναι η γραμμή ρολογιού και ελέγχεται από την κύρια συσκευή. Το SDA είναι η γραμμή δεδομένων δύο κατευθύνσεων. Για τη μεταφορά δεδομένων, ο κύριος αποστέλλει μια υποτελή διεύθυνση σε συνδυασμό με μια σημαία ανάγνωσης/εγγραφής ενός bit. Εάν είναι επιθυμητή η εγγραφή, ο κύριος κύριος θα συνεχίσει να στέλνει δεδομένα στη διεύθυνση υποβοήθησης. Εάν ζητηθεί ανάγνωση, ο υποτελής θα απαντήσει με δεδομένα. Για τον συντονισμό των συναλλαγών, οι γραμμές SCL και SDA χειρίζονται από τον κύριο και τον βοηθό για να σηματοδοτήσουν διάφορες συνθήκες. Αυτά περιλαμβάνουν START, STOP, ACK (αναγνώριση) και NAK (χωρίς αναγνώριση). Οι λεπτομέρειες αυτών των συνθηκών χειρίζονται οι οδηγοί. Οι πραγματικοί geeks μεταξύ σας μπορούν να μάθουν όλες τις λεπτομέρειες στους συνδέσμους που παρέχονται στο τέλος αυτού του Instructable. Οι ηλεκτρικές απαιτήσεις είναι αρκετά απλές. Ο κύριος και οι υποτελείς πρέπει να χρησιμοποιούν το ίδιο επίπεδο για Vcc, οι γείωση πρέπει να είναι συνδεδεμένες και οι γραμμές SCL και SDA πρέπει να τραβηχτούν μέχρι Vcc. Η τιμή των αντιστάσεων έλξης καθορίζεται με ακρίβεια από έναν υπολογισμό που βασίζεται στη συνολική χωρητικότητα στο δίαυλο, αλλά πρακτικά μπορεί να είναι σχεδόν οποιαδήποτε τιμή μεταξύ 1,8Κ και 10Κ. Ξεκινάω με 5.1K και χρησιμοποιώ χαμηλότερες τιμές μέχρι να λειτουργήσει. Αυτό συνήθως δεν αποτελεί πρόβλημα, εκτός εάν έχετε πολλές συσκευές ή μεγάλα μήκη καλωδίων μεταξύ των συσκευών. Ο ονομαστικός ρυθμός δεδομένων στο δίαυλο I2C είναι 100Kbits/δευτερόλεπτο. Οι τιμές 400Kbits/δευτερόλεπτο, 1Mbit/δευτερόλεπτο και άνω είναι επίσης δυνατές, αλλά δεν υποστηρίζονται από τους οδηγούς αυτού του Οδηγού. Όλες οι συσκευές I2C θα λειτουργούν με ταχύτητα 100Kbits/δευτερόλεπτο. Το ATtiny2313 και το ATmega168 εφαρμόζουν με διαφορετικό τρόπο το δίαυλο I2C. Το ATtiny2313 χρησιμοποιεί το υλικό Universal Serial Interface (USI) - το οποίο μπορεί επίσης να χρησιμοποιηθεί για το δίαυλο SPI. Το ATmega168 διαθέτει ειδικό υλικό για το δίαυλο I2C γνωστό ως Two Wire Interface (TWI). Μόλις γραφτούν τα προγράμματα οδήγησης, αυτές οι διαφορές είναι ως επί το πλείστον διαφανείς για τον χρήστη. Μια σημαντική διαφορά είναι στο λογισμικό: Το πρόγραμμα οδήγησης ATmega168 I2C διακόπτεται ενώ αυτό για το ATtiny2313 δεν είναι. Αυτό σημαίνει ότι ένα πρόγραμμα ATmega168 δεν χρειάζεται να περιμένει να πραγματοποιηθούν οι μεταφορές δεδομένων I2C, αλλά χρειάζεται μόνο να περιμένει πριν ξεκινήσει μια άλλη μεταφορά ή μέχρι να φτάσουν δεδομένα από μια λειτουργία ανάγνωσης. Τα παραδείγματα και η συζήτηση που πρέπει να ακολουθήσουν θα πρέπει να το καταστήσουν σαφές. Οι διευθύνσεις I2C έχουν μήκος 7 bits, οπότε έως και 127 συσκευές μπορούν να βρίσκονται στο δίαυλο εάν η καθεμία έχει μια μοναδική διεύθυνση. Όπως φαίνεται στο σχήμα, αυτή η διεύθυνση 7 bit μετατοπίζεται αριστερά ένα bit και το λιγότερο σημαντικό bit χρησιμοποιείται για την επισήμανση ανάγνωσης ή εγγραφής της συσκευής στη διεύθυνση. Επομένως, η πλήρης διεύθυνση slave είναι ένα byte 8 bit. Η πραγματική διεύθυνση προσδιορίζεται εν μέρει εσωτερικά στη συσκευή και δεν μπορεί να αλλάξει (4 πιο σημαντικά bits) και εν μέρει καθορίζεται από bits που ενδέχεται να συνδεθούν με ακίδες της συσκευής (3 τουλάχιστον σημαντικά bits) που μπορούν να συνδεθούν ψηλά ή χαμηλά για ρύθμιση συγκεκριμένη διεύθυνση. Ακούγεται μπερδεμένο, αλλά ένα παράδειγμα θα το καταστήσει σαφές. Το φύλλο δεδομένων PCA8574A δείχνει ότι τα τέσσερα πιο σημαντικά bits της διεύθυνσης I2C θα είναι πάντα 0111. Τα επόμενα τρία bits καθορίζονται από τις ρυθμίσεις στις ακίδες AD0, AD1 και AD2. Αυτοί οι πείροι μπορούν να συνδεθούν με τη γείωση ή με την παροχή θετικής τάσης (5 βολτ) για να αντιπροσωπεύουν 0 ή 1 αντίστοιχα. Έτσι, το εύρος των πιθανών διευθύνσεων είναι δεκαεξαδικό 38 έως 3F, όπως φαίνεται στο άλλο σχήμα από το φύλλο δεδομένων PCA8574. Έτσι, αλλάζοντας τις ρυθμίσεις του bit διεύθυνσης, έως και 8 PCA8574A μπορούν να βρίσκονται ταυτόχρονα στο δίαυλο I2C. Το καθένα θα ανταποκρίνεται στη συγκεκριμένη διεύθυνση σκλάβου του μόνο. Εάν χρειάζονται ακόμη περισσότερες θύρες εισόδου/εξόδου, μπορεί να χρησιμοποιηθεί το PCA8574. Η μόνη διαφορά μεταξύ του PCA8574 και του PCA8574A είναι ότι το εύρος διευθύνσεων I2C του PCA8574 είναι 20 έως 27 δεκαεξαδικό. Ο προσδιορισμός της διεύθυνσης μιας δεδομένης συσκευής μπορεί να προκαλέσει σύγχυση, καθώς ορισμένα φύλλα δεδομένων θεωρούν ότι το bit ανάγνωσης/εγγραφής είναι μέρος του διεύθυνση. Διαβάστε προσεκτικά το φύλλο δεδομένων και λάβετε υπόψη ότι η διεύθυνση slave θα έχει μήκος 7 bit. Το bit ανάγνωσης/εγγραφής πρέπει να αντιμετωπίζεται ξεχωριστά. Και πάλι, ένα παράδειγμα θα βοηθήσει. Το φύλλο δεδομένων για το 24C16 EEPROM με το οποίο θα πειραματιστούμε λέει ότι τα πρώτα (τα πιο σημαντικά) τέσσερα bit της διεύθυνσης slave είναι 1010. Τα επόμενα τρία bits μπορούν να προσδιοριστούν από τα A0, A1 και A2. αλλά σημειώστε ότι το φύλλο δεδομένων καλύπτει επίσης 24C01 έως 24C08 που είναι μικρότερου μεγέθους EEPROM. Το σχήμα από το φύλλο δεδομένων δείχνει ότι οι ρυθμίσεις αυτών των δυφίων διεύθυνσης αγνοούνται καθώς αυξάνεται το μέγεθος και αγνοούνται εντελώς για το 24C16. Δηλαδή, τα τρία τελευταία bits δεν έχουν σημασία και το 24C16 χρησιμοποιεί πραγματικά όλες τις διευθύνσεις I2C slave 50 έως 57 δεκαεξαδικές. Το εύρος των διευθύνσεων σκλάβων θα απευθύνεται στην πραγματικότητα σε διαφορετικά τμήματα εντός του 24C16. Τα πρώτα 256 byte βρίσκονται στη διεύθυνση 50h, τα επόμενα 256 στις 51h και ούτω καθεξής μέχρι τα τελευταία 256 στις 57h - για συνολικά 2K byte. Δεδομένου ότι η διεύθυνση της μνήμης RAM PCF8570 που επίσης πειραματιζόμαστε είναι σε αυτό το εύρος, το 24C16 και το PCF8570 δεν μπορούν να χρησιμοποιηθούν μαζί.
Βήμα 2: Παραγγείλετε ορισμένες συσκευές I2C
Τώρα που γνωρίζετε λίγο για το I2C Bus και θέλετε να το χρησιμοποιήσετε, γιατί να μην παραγγείλετε κάποιες συσκευές I2C να πειραματιστούν τώρα, ώστε να είναι στο δρόμο σας ενώ ετοιμάζετε το λογισμικό; Οι κατάλληλες συσκευές περιλαμβάνουν ένα I/ O Interface Expander (το αγαπημένο μου), ένα Static Ram και ένα EEPROM. Υπάρχουν πολλά ακόμη, αλλά αυτά είναι μια καλή αρχή. Οι επεξεργαστές AVR που θα χρησιμοποιήσουμε είναι οι ATtiny2313 και Atmega168 (χρησιμοποιούνται στο Arduino). Εάν είστε νέοι σε αυτά, ρίξτε μια ματιά σε αυτό το υπέροχο Instructable για να μάθετε για αυτά και να δημιουργήσετε το Ghetto Development System σας. Το σχήμα του ATmega168 στο παρόν Instructable δείχνει πώς να εφαρμόσετε το Ghetto Development System για αυτόν τον επεξεργαστή. Το καλώδιο παράλληλης θύρας είναι το ίδιο με αυτό για το ATtiny2313. (Δεν έχω δοκιμάσει την έκδοση USB του Ghetto Development System, οπότε δεν είμαι σίγουρος για τον τρόπο πρόσβασης του διαύλου I2C. Το ίδιο και για το Arduino.) Ακολουθούν αριθμοί μερών του Digikey. Port Expander: IC I2C I/O EXPANDER 568-4236-5-NDRam: IC SRAM 256X8 W/I2C 568-1071-5-NDEEPROM: IC EEPROM SERIAL 16K CAT24C16LI-G-ND
Βήμα 3: Προγράμματα οδήγησης I2C
Ακολουθούν οι περιγραφές των λειτουργιών του προγράμματος οδήγησης για το δίαυλο I2C. Αυτά αναπτύχθηκαν χρησιμοποιώντας τις σημειώσεις εφαρμογών Atmel για αρχάριους. Δεν θα μπορούσα να το κάνω χωρίς αυτούς ως βάση για να βασιστώ. Η ανάπτυξη έγινε χρησιμοποιώντας το WinAVR και τον μεταγλωττιστή gcc C. Οι περιορισμοί ρυθμού ρολογιού περιγράφονται παρακάτω για κάθε επεξεργαστή. Δεδομένου ότι δεν μπορώ να δοκιμάσω όλους τους δυνατούς συνδυασμούς γεύσης / ρυθμού ρολογιού, θα παραμείνω σε αυτό που πραγματικά μπορώ να δοκιμάσω και θα προσπαθήσω να υποδείξω τους περιορισμούς και τους περιορισμούς. Εδώ είναι οι λειτουργίες του προγράμματος οδήγησης και πώς να τους χρησιμοποιήσετε. Δείτε τα παραδείγματα για περισσότερες λεπτομέρειες και για να δείτε τις λειτουργίες που χρησιμοποιούνται σε πλήρη προγράμματα. Για το ATtiny2313: Απαιτήσεις ρολογιού: Τα προγράμματα οδήγησης έχουν σχεδιαστεί για ρυθμό ρολογιού 1MHz (η προεπιλεγμένη ταχύτητα) για ATtiny2313. Εάν θέλετε να τρέχετε με άλλους ρυθμούς, τότε θα πρέπει να προσαρμόσετε σταθερές στα προγράμματα οδήγησης. Στείλτε μου email αν χρειάζεστε βοήθεια για να το κάνετε αυτό. Μπορείτε επίσης να λάβετε κάποιες συμβουλές από τις σημειώσεις εφαρμογών Atmel στους συνδέσμους στο Βήμα πόρων. USI_TWI_Master_Initialise () Αυτή η λειτουργία προετοιμάζει το υλικό USI για λειτουργία I2C. Καλέστε το μία φορά στην αρχή του προγράμματος σας. Επιστρέφει άκυρο και δεν υπάρχουν ορίσματα. USI_TWI_Get_State_Info () Αυτή η συνάρτηση επιστρέφει πληροφορίες σφάλματος I2C και χρησιμοποιείται εάν παρουσιάστηκε σφάλμα κατά τη διάρκεια μιας συναλλαγής I2C. Δεδομένου ότι αυτή η συνάρτηση επιστρέφει μόνο έναν κωδικό σφάλματος, χρησιμοποιώ τη συνάρτηση TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg) για να αναβοσβήνει ένα LED σφάλματος. Οι κωδικοί σφάλματος ορίζονται στο USI_TWI_Master.h. Δείτε πώς μπορείτε να το ονομάσετε: TWI_Act_On_Failure_In_Last_Transmission (USI_TWI_Get_State_Info ()) USI_TWI_Start_Read_Write () Αυτή η λειτουργία χρησιμοποιείται για την ανάγνωση και εγγραφή μεμονωμένων byte σε συσκευές I2C. Χρησιμοποιείται επίσης για την εγγραφή πολλών byte. Υπάρχουν 6 βήματα για τη χρήση αυτής της συνάρτησης. 1) Δηλώστε ένα buffer μηνυμάτων στο πρόγραμμά σας για να κρατήσει τη διεύθυνση slave και τα byte δεδομένων που θα αποσταλούν ή θα ληφθούν. unsigned char messageBuf (MESSAGEBUF_SIZE); 2) Τοποθετήστε τη διεύθυνση Slave ως το πρώτο byte στο buffer. Μετακινήστε το ένα bit αριστερά και OR στο bit ανάγνωσης/εγγραφής. Σημειώστε ότι το bit ανάγνωσης/εγγραφής θα είναι 1 για ανάγνωση και 0 για εγγραφή. Αυτό το παράδειγμα προορίζεται για ανάγνωση. messageBuf (0) = (TWI_targetSlaveAddress << TWI_ADR_BITS) | (TRUE << TWI_READ_BIT); 3) Όταν κάνετε εγγραφή, τοποθετήστε το byte για εγγραφή στην επόμενη θέση στο buffer. 4) Καλέστε τη συνάρτηση USI_TWI_Start_Read_Write με το buffer μηνύματος και το μέγεθος του μηνύματος ως arguments.temp = USI_TWI_Start_Read_Write (messageBuf, 2); 5) Το η επιστρεφόμενη τιμή (θερμοκρασία σε αυτήν την περίπτωση) μπορεί να ελεγχθεί για να διαπιστωθεί εάν προέκυψε σφάλμα. Αν ναι, αντιμετωπίζεται όπως συζητήθηκε παραπάνω. Δείτε παραδείγματα στα προγράμματα. 6) Εάν ζητήθηκε ανάγνωση, η ανάγνωση byte θα βρίσκεται στη δεύτερη θέση του buffer. Εάν πρόκειται να γραφτούν πολλά byte (όπως σε μια συσκευή μνήμης), μπορεί να χρησιμοποιηθεί αυτή η ίδια ρουτίνα. Η ρύθμιση του buffer και η κλήση της ρουτίνας διαφέρουν ελαφρώς. Το δεύτερο byte στο buffer θα είναι η αρχική διεύθυνση μνήμης στην οποία θα γράψετε. Τα δεδομένα που θα γραφτούν θα είναι σε επόμενα byte. Το μέγεθος του μηνύματος θα είναι το μέγεθος που περιλαμβάνει όλα τα έγκυρα δεδομένα. Έτσι, εάν πρόκειται να γραφτούν 6 byte, τότε το μέγεθος του μηνύματος θα είναι 8 (διεύθυνση slave + διεύθυνση μνήμης + 6 bytes δεδομένων). USI_TWI_Start_Random_Read () Αυτή η συνάρτηση χρησιμοποιείται για την ανάγνωση πολλών byte από μια συσκευή I2C, συνήθως έχει νόημα μόνο μια ανάμνηση κάποιου είδους. Η χρήση αυτής της ρουτίνας είναι πολύ παρόμοια με την προηγούμενη ρουτίνα, με δύο εξαιρέσεις. Η ρύθμιση του bit ανάγνωσης/εγγραφής δεν έχει σημασία. Η κλήση αυτής της ρουτίνας θα προκαλεί πάντα μια λειτουργία ανάγνωσης. Το μέγεθος του μηνύματος πρέπει να είναι 2 συν τον αριθμό των byte για ανάγνωση. Εάν δεν εμφανιστούν σφάλματα, τα δεδομένα θα βρίσκονται στο buffer που ξεκινά από τη δεύτερη θέση. Για το ATmega168: Απαιτήσεις ρολογιού: Τα προγράμματα οδήγησης έχουν σχεδιαστεί για ρυθμό ρολογιού 4MHz για ATmega168. Το παράδειγμα του κώδικα δείχνει τον τρόπο ρύθμισης αυτού του ρυθμού ρολογιού. Εάν θέλετε να τρέχετε με άλλους ρυθμούς, τότε θα πρέπει να προσαρμόσετε σταθερές στα προγράμματα οδήγησης. Στείλτε μου μήνυμα ηλεκτρονικού ταχυδρομείου εάν πρέπει να το κάνετε αυτό. TWI_Master_Initialise () Αυτή η λειτουργία προετοιμάζει το υλικό TWI για λειτουργία I2C. Καλέστε το μία φορά στην αρχή του προγράμματος σας. Επιστρέφει άκυρο και δεν υπάρχουν επιχειρήματα. Βεβαιωθείτε ότι έχετε ενεργοποιήσει τις διακοπές καλώντας το swi () μετά την προετοιμασία. TWI_Get_State_Info () Αυτή η συνάρτηση επιστρέφει πληροφορίες σφάλματος I2C και χρησιμοποιείται εάν προέκυψε σφάλμα κατά τη διάρκεια μιας συναλλαγής I2C. Δεδομένου ότι αυτή η συνάρτηση επιστρέφει μόνο έναν κωδικό σφάλματος, χρησιμοποιώ τη συνάρτηση TWI_Act_On_Failure_In_Last_Transmission (TWIerrorMsg) για να αναβοσβήνει ένα LED σφάλματος. Οι κωδικοί σφάλματος ορίζονται στο TWI_Master.h, αλλά τροποποιούνται για σηματοδότηση σε LED σφάλματος. Δείτε το παράδειγμα κώδικα για λεπτομέρειες. Δείτε πώς μπορείτε να το ονομάσετε: TWI_Act_On_Failure_In_Last_Transmission (TWI_Get_State_Info ()) Σημειώστε ότι ο έλεγχος σφάλματος πραγματοποιείται βεβαιώνοντας ότι η συναλλαγή I2C είναι πλήρης (η λειτουργία που περιγράφεται παρακάτω) και στη συνέχεια δοκιμάζοντας λίγο τη λέξη καθολικής κατάστασης. TWI_Start_Rrite () These δύο συναρτήσεις λειτουργούν το ίδιο με τις αντίστοιχες συναρτήσεις που περιγράφηκαν παραπάνω αλλά με μερικές εξαιρέσεις. Δεν επιστρέφουν τιμές σφάλματος. Η ανάγνωση δεδομένων δεν μεταφέρεται στο buffer. Αυτό θα γίνει με τη συνάρτηση που περιγράφεται στη συνέχεια. Όταν καλείτε το TWI_Start_Random_Read, το μήνυμαSize πρέπει να είναι ο αριθμός των byte δεδομένων που ζητούνται συν ένα, όχι δύο. Το πρόγραμμα οδήγησης I2C για το ATmega168 οδηγείται σε διακοπή. Δηλαδή, οι συναλλαγές I2C ξεκινούν και στη συνέχεια εκτελούνται ανεξάρτητα, ενώ η κύρια ρουτίνα συνεχίζει να εκτελείται. Όταν η κύρια ρουτίνα θέλει δεδομένα από μια συναλλαγή I2C που ξεκίνησε, πρέπει να ελέγξει εάν τα δεδομένα είναι διαθέσιμα. Η κατάσταση είναι η ίδια με τον έλεγχο σφαλμάτων. Η κύρια ρουτίνα πρέπει να είναι σίγουρη ότι η συναλλαγή I2C έχει ολοκληρωθεί πριν από τον έλεγχο για σφάλματα. Οι επόμενες δύο συναρτήσεις χρησιμοποιούνται για αυτούς τους σκοπούς. TWI_Transceiver_Busy () Καλέστε αυτήν τη συνάρτηση για να δείτε αν έχει ολοκληρωθεί μια συναλλαγή I2C πριν ελέγξετε για σφάλματα. Τα παραδείγματα προγραμμάτων δείχνουν πώς να το χρησιμοποιήσετε. TWI_Read_Data_From_Buffer () Καλέστε αυτήν τη λειτουργία για να μεταφέρετε δεδομένα από το buffer λήψης του προγράμματος οδήγησης I2C στο buffer μηνυμάτων. Αυτή η λειτουργία θα βεβαιωθεί ότι η συναλλαγή I2C έχει ολοκληρωθεί πριν από τη μεταφορά των δεδομένων. Ενώ μια τιμή επιστρέφεται από αυτήν τη συνάρτηση, θεωρώ ότι ο έλεγχος του bit σφάλματος απευθείας είναι πιο αξιόπιστος. Δείτε πώς να το ονομάσετε. Το μέγεθος του μηνύματος πρέπει να είναι ένα μεγαλύτερο από τον αριθμό των επιθυμητών δυαδικών ψηφίων. Τα δεδομένα θα βρίσκονται στο messageBuf ξεκινώντας από τη δεύτερη τοποθεσία.temp = TWI_Read_Data_From_Buffer (messageBuf, messageSize);
Βήμα 4: Ας χτίσουμε
Ξεκινήστε κατεβάζοντας το αρχείο I2C Schematics.zip. Σως θελήσετε να δημιουργήσετε έναν φάκελο I2C στην περιοχή εργασίας σας για να διατηρήσετε τα διαγράμματα και τα παραδείγματα αρχείων προγράμματος. Αποσυμπιέστε τα σχήματα σε αυτόν τον κατάλογο. Θα βρείτε έναν φάκελο που ονομάζεται I2C Schematics. Ανοίξτε το αρχείο με το όνομα tiny I2C.pdf. Αυτό το σχηματικό δείχνει το ATtiny2313 Ghetto Development System και το PCA8574A I/O Port Expander (έχει το μεγάλο διακεκομμένο κουτί γύρω του). Το κύκλωμα Port Expander είναι χτισμένο σε μια σανίδα ψωμιού. Ρίξτε μια ματιά στις φωτογραφίες για να δείτε πώς μοιάζουν αυτά τα κυκλώματα. Είναι πραγματικά πολύ απλά. Το τμήμα ATtiny2313 του σχηματικού είναι μόνο το Ghetto Development System με τρία φλας (LED1, 2 και 3, συν R4, 5 και 6) και ένα κουμπί (S1) που συνδέεται με αυτό, συν ένα πρόσθετη λεπτομέρεια. Αυτή η λεπτομέρεια είναι η προσθήκη βραχυκυκλωτήρων (JP4, 5 και 6) που μπορούν να αφαιρεθούν για να επιτρέψουν τη σύνδεση των γραμμών SCL και SDA του διαύλου I2C. Οι βραχυκυκλωτήρες πρέπει να είναι στη θέση τους για προγραμματισμό και στη συνέχεια να αφαιρεθούν για να μπορούν να συνδεθούν SCL και SDA. Οι φωτογραφίες δείχνουν τα άλματα στη θέση τους και αφαιρούνται. Η τοποθέτηση αυτών των βραχυκυκλωτήρων εξαρτάται από εσάς, απλά πρέπει να τα τοποθετήσετε στο Ghetto Development System σας εάν θέλετε να χρησιμοποιήσετε το δίαυλο I2C. Ο δίαυλος I2C πρέπει να αποσυνδεθεί και να τοποθετηθούν οι βραχυκυκλωτήρες για προγραμματισμό. Σημειώστε ότι πρέπει πραγματικά να ασχοληθείτε μόνο με τα JP4 και JP6 για το δίαυλο I2C. Τοποθετήστε το JP5 αν νομίζετε ότι θα θελήσετε ποτέ να χρησιμοποιήσετε το δίαυλο SPI. Η ενσωμάτωση στο PCA8574A I/O Port Expander είναι πολύ απλή. Παρέχετε συνδέσεις Vcc (+5 βολτ) και Gnd (γείωση) και συνδέστε τα AD0, 1 και 2 στη γείωση (κάνει τη σκλάβη I2C διεύθυνση 38 εξάγωνη). Στη συνέχεια, συνδέστε 4 φλας και 4 διακόπτες DIP. (Εάν δεν έχετε διακόπτες DIP, μπορείτε απλώς να χρησιμοποιήσετε καλώδια. Συνδέστε τη γείωση ή αφήστε την πλωτή να ενεργοποιήσει ή απενεργοποιήσει το σήμα αντίστοιχα.) Τέλος, συνδέστε τις αντιστάσεις έλξης (R11 και 12) από SDA και SCL στο Vcc. Αυτά εμφανίζονται ως 3.3K, αλλά οποιαδήποτε τιμή από 1.8K έως 5.1K πρέπει να λειτουργεί (ίσως έως και 10K αλλά δεν το έχω δοκιμάσει). Αφού προγραμματίσετε το ATtiny2313, μπορείτε να αφαιρέσετε τους βραχυκυκλωτήρες και να συνδέσετε το SDA και το SCL για έλεγχο. Τώρα για το ATmega168. Η μόνη ρυτίδα εδώ είναι ότι μπορεί να μην έχετε δημιουργήσει ένα σύστημα ανάπτυξης γκέτο για αυτόν τον επεξεργαστή. Εάν συμβαίνει αυτό, τότε το σχηματικό που παρέχω (MEGA I2C.pdf) θα σας δείξει πώς. Αυτό είναι απλώς μια μετάθεση της έκδοσης ATtiny2313. Εάν σχεδιάζετε εκ των προτέρων, μπορείτε να βεβαιωθείτε ότι το καλώδιο προγραμματισμού σας θα ταιριάζει και στα δύο συστήματα. Η κύρια διαφορά είναι η προσθήκη C2 και C3. Δείτε τις εικόνες για τοποθέτηση αυτών, θα πρέπει να είναι πολύ κοντά στο τσιπ. ένα από αυτά είναι στην πραγματικότητα κάτω από το τσιπ. Αυτά βοηθούν να διατηρηθεί ο θόρυβος εκτός του μετατροπέα αναλογικού σε ψηφιακό. Δεν χρειάζεται να βάλετε τους βραχυκυκλωτήρες εκτός και αν σκοπεύετε να χρησιμοποιήσετε το δίαυλο SPI αφού δεν χρειάζονται για το δίαυλο I2C σε αυτό το τσιπ. Σημειώστε ότι ο πίνακας ψωμιού PCA8754A δεν θα αλλάξει. Απλώς θα συνδέσετε το SDA και το SCL και θα φύγετε! Εύκολο, ε;
Βήμα 5: Ας κωδικοποιήσουμε και δοκιμάζουμε
It'sρθε η ώρα να δημιουργήσετε τα προγράμματα οδήγησης και τα παραδείγματα προγραμμάτων. Θα ξεκινήσουμε με το ATtiny2313 και το breadboard PCA8574A που μόλις φτιάξαμε. Κατεβάστε το αρχείο I2C.zip στον κατάλογο εργασίας I2C και αποσυμπιέστε το. Θα έχετε έναν νέο φάκελο που ονομάζεται I2C. Σε αυτό θα βρείτε USI I2C (για ATtiny2313) και TWI I2C (για ATmega168). Στο USI I2C, θα βρείτε το φάκελο Θύρα I_O. Αυτός ο φάκελος περιέχει τον κωδικό για το πρώτο παράδειγμα προγράμματος και τα προγράμματα οδήγησης USI I2C. Χρησιμοποιώντας το WinAVR, μεταγλωττίστε και φορτώστε τον κώδικα στο ATtiny2313. Πάρτε μια βαθιά ανάσα και ενεργοποιήστε το ρεύμα. Δείτε τι πρέπει να περιμένετε: Κατά την ενεργοποίηση, το LED 1 στη θύρα PD6 του ATtiny2313 αναβοσβήνει δύο φορές. Τίποτα άλλο δεν θα συμβεί μέχρι να πατήσετε το κουμπί (S1). Κάθε φορά που πατάτε το κουμπί, οι διακόπτες διαβάζονται και η ρύθμισή τους θα εμφανίζεται στα LED που είναι συνδεδεμένα με το PCA8574A. Αλλάξτε την τιμή των διακοπτών, πατήστε το κουμπί και οι λυχνίες LED θα αλλάξουν. Συνεχίστε να το κάνετε μέχρι να ξεπεράσετε τη συγκίνηση που βλέπετε να λειτουργεί. Εάν (Θεός φυλάξου!) Τα πράγματα δεν λειτουργούν όπως αναμένεται, ελέγξτε προσεκτικά την καλωδίωσή σας. Τα σφάλματα I2C θα σηματοδοτούνται με αναβοσβήνει στο LED3 (PD4) και πιθανότατα σημαίνει ότι πρέπει να ελέγξετε ότι το SDA και το SCL είναι συνδεδεμένα με τους σωστούς πείρους και έχουν τραβηχτεί σωστά. Εάν τα πράγματα εξακολουθούν να μην λειτουργούν, διαβάστε το υπόλοιπο αυτής της ενότητας για να μάθετε σχετικά με τον εντοπισμό σφαλμάτων. Τώρα επιστρέψτε και ας ρίξουμε μια ματιά στον κώδικα. Ανοίξτε το αρχείο USI_I2C_Port.c. Αυτός είναι ο κώδικας για το παράδειγμα προγράμματος. (Τα USI_TWI_Master.c και USI_TWI_Master.h περιέχουν τα προγράμματα οδήγησης - μπορείτε να τα αγνοήσετε εκτός αν είστε περίεργοι.) Χρησιμοποιήστε το παράδειγμα για να καθοδηγήσετε τις δικές σας εφαρμογές I2C. Κυρίως, το πρόγραμμα σας δείχνει πώς να προετοιμάσετε και να χρησιμοποιήσετε τα προγράμματα οδήγησης I2C, συμπεριλαμβανομένων των ρυθμίσεων επάνω στη διεύθυνση slave και στο υπόλοιπο buffer μηνύματος και βγάζοντας τα δεδομένα από αυτήν. Θα δείτε επίσης πώς καταργώ το κουμπί και ρυθμίζω τον βρόχο while. Υπάρχουν μερικές λεπτομέρειες του προγράμματος που αξίζει να αναφερθούν. Σημειώστε ότι τα δεδομένα από τους διακόπτες αντιστρέφονται προτού γραφτούν στις λυχνίες LED του Port Expander. Σημειώστε επίσης ότι οι θύρες εισόδου στο Port Expander πρέπει να είναι γραμμένες ως High για να λειτουργούν σωστά. Αυτές οι λεπτομέρειες περιγράφονται στο φύλλο δεδομένων PCA8574A. Διαβάζετε πάντα προσεκτικά τα φύλλα δεδομένων! Περισσότερο ενδιαφέρον παρουσιάζει η χρήση εντοπισμού σφαλμάτων υπό όρους. Κοντά στην αρχή του αρχείου προγράμματος βρίσκεται η δήλωση // #define DEBUG και πασπαλίζονται σε όλο τον κώδικα οι δηλώσεις #ifdef DEBUG. Όσο το DEBUG δεν έχει οριστεί (οι δύο καμπύλες κάνουν τη γραμμή ένα σχόλιο και δεν επιτρέπουν τον ορισμό του), ο κώδικας εντός των δηλώσεων #ifdef έως #endif δεν θα καταρτιστεί. Αλλά αν τα πράγματα δεν λειτουργούν όπως περιμένετε, επανασυγκολλήστε και φορτώστε ξανά τον κώδικα με #define DEBUG χωρίς σχολιασμό. Θα λάβετε πολύ περισσότερα αναβοσβήματα στις λυχνίες LED που μπορείτε να αποκωδικοποιήσετε για να ακολουθήσετε την εκτέλεση του προγράμματος σας και θα σας βοηθήσουν να βρείτε πού ακριβώς τα πράγματα πάνε στραβά. Στην πραγματικότητα, σας συνιστώ να το δοκιμάσετε μόνο για να δείτε τι συμβαίνει. Αυτό που θα δείτε είναι ότι το LED 2 (στο PD5) θα αναβοσβήνει καθώς η πρόοδος εκτέλεσης μέσω του προγράμματος. Η τιμή που διαβάζεται από τους διακόπτες αναβοσβήνει στο LED 1 (PD6) προτού εμφανιστεί στα LED Port Expander. Θα πρέπει να μπορείτε να παρακολουθείτε το πρόγραμμα καθώς εκτελείται χρησιμοποιώντας αυτά τα LED. Θα συνεργαστούμε με το ATmega168 στη συνέχεια. παραλείψτε αυτήν την ενότητα εάν ενδιαφέρεστε μόνο για το ATtiny2313. Ακόμα μαζί μου? Καλός. Μεταβείτε στο φάκελο TWI_I2C, αλλάξτε τον κατάλογο εργασίας σας σε IO_Port και μεταγλωττίστε και φορτώστε το TWI_I2C_Port.c στο ATmega168. Αποσυνδέστε τις γραμμές SDA και SCL από το ATtiny2313 και συνδέστε τις στο ATmega168. Συνδέστε τη δύναμη και τη γείωση και ενεργοποιήστε. Η λειτουργία πρέπει να είναι η ίδια! Παίξτε μέχρι να υποχωρήσει η συγκίνηση και, στη συνέχεια, ας δούμε τον κωδικό. Ανοίξτε το TWI_I2C_Port.c. Ο κώδικας είναι σχεδόν πανομοιότυπος εκτός από τον χειρισμό σφαλμάτων και την προσαρμογή οδηγών διακοπής. Εδώ είναι οι διαφορές: Σημειώστε ότι το ρολόι πρέπει να ρυθμιστεί στα 4MHz για να λειτουργήσει σωστά ο δίαυλος I2C. Το sei (); η δήλωση ενεργοποιεί τις διακοπές μετά την προετοιμασία των προγραμμάτων οδήγησης I2C. Για έλεγχο για σφάλματα, ελέγχεται ένα συγκεκριμένο bit κατάστασης. Κατά την ανάγνωση, η συνάρτηση TWI_Read_Data_From_Buffer πρέπει να κληθεί για να μεταφέρει τα δεδομένα που διαβάζονται στο buffer μηνυμάτων. Κατά τη διάρκεια μιας εγγραφής, ενώ (TWI_Transceiver_Busy ()) πρέπει να χρησιμοποιηθεί για να βεβαιωθείτε ότι η μεταφορά έχει ολοκληρωθεί πριν ελέγξετε για σφάλματα. Αυτές οι δύο τελευταίες λειτουργίες περιγράφονται παραπάνω στην περιγραφή των προγραμμάτων οδήγησης. Εκτός από αυτό, ο κώδικας είναι σχεδόν ο ίδιος με αυτόν του ATtiny2313. Το DEBUG λειτουργεί το ίδιο επίσης εάν θέλετε να πειραματιστείτε με αυτό.
Βήμα 6: Χρήση μνήμης I2C
Τώρα που μάθαμε να χρησιμοποιούμε το δίαυλο I2C για να διαβάζουμε και να γράφουμε ένα I/O Port Expander, ας προχωρήσουμε στη χρήση μνήμων I2C, τόσο της RAM όσο και της EEPROM. Η κύρια διαφορά είναι ότι μπορούν να διαβαστούν ή να γραφτούν πολλαπλά byte από μνήμες με μία μόνο εντολή I2C. Για να ετοιμαστούμε για αυτά τα πειράματα, πρέπει να τροποποιήσουμε ελαφρώς το υλικό και να δημιουργήσουμε μερικά νέα κυκλώματα στο breadboard. Διατηρήστε το κύκλωμα Port Expander αφού θα το χρησιμοποιήσουμε για να εμφανίσουμε ορισμένες τιμές μνήμης. Αφαιρέστε τους διακόπτες DIP από το PCA8574A και τοποθετήστε τα φλας σε αυτές τις ακίδες. Εάν δεν έχετε αρκετά φλας, μετακινήστε αυτά στα P4 έως P7 σε P0 έως P3. (Οι τιμές που πρέπει να εμφανίζονται είναι αρκετά μικρές.) Τώρα κοιτάξτε το σχηματικό I2C Ram.pdf και συνδέστε το PCF8570 στο breadboard. Ρίξτε μια ματιά και στην εικόνα. Φροντίστε να συνδέσετε τον πείρο 7 με το Vcc. Τρέξτε καλώδια για SDA και SCL από το PCA8574A. Δεν απαιτούνται πρόσθετες αντιστάσεις έλξης. Εάν ενδιαφέρεστε επίσης για το EEPROM, δημιουργήστε αυτό το κύκλωμα επίσης χρησιμοποιώντας το I2C EEPROM.pdf για το 24C16, αλλά προειδοποιήστε ότι το παράδειγμα χρησιμοποιεί το ATmega168. Αυτό το κύκλωμα είναι πραγματικά απλό. Όπως συζητήθηκε παραπάνω, τα bits διευθύνσεων πρέπει να αγνοηθούν. Απλώς συνδέστε τη δύναμη και τη γείωση. Μην συνδέετε το SDA και το SCL μόλις ακόμα δεν έχουμε τελειώσει τον πειραματισμό με το Ram. Θα ξεκινήσουμε τα πειράματα μνήμης με το ATtiny2313 που είναι συνδεδεμένο στο PCA8574A Port Expander και στο PCF8570 Ram. Το πρόγραμμα θα γράψει ορισμένους αριθμούς στο Ram, στη συνέχεια θα τους διαβάσει ξανά και θα τους εμφανίσει στο Port Expander. Αλλάξτε τον κατάλογο εργασίας σας σε RAM κάτω από το USI I2C. Χρησιμοποιήστε το αρχείο δημιουργίας για να μεταγλωττίσετε και να κατεβάσετε το USI_I2C_RAM.c. Σημειώστε ότι τα αρχεία προγράμματος οδήγησης I2C είναι πανομοιότυπα με αυτά που χρησιμοποιήσαμε νωρίτερα. Συνδέστε το ρεύμα και θα δείτε ένα μόνο αναβοσβήσιμο στο LED 1 (PD6). Τα δεδομένα θα γραφτούν στα πρώτα 4 byte μνήμης. Πατήστε το κουμπί και δύο byte θα διαβαστούν και θα εμφανιστούν. Θα πρέπει να δείτε μία λυχνία LED στο Port Expander (P0), μια παύση δύο δευτερολέπτων και μετά δύο λυχνίες LED (P0 και P1). Άλλη μια παύση δύο δευτερολέπτων και τα LED θα πρέπει να σβήσουν. Πατήστε ξανά το κουμπί για να ξεκινήσετε την ακολουθία από την αρχή. Η εντοπισμός σφαλμάτων είναι παρόμοια με τη μέθοδο που περιγράφεται παραπάνω. Ας ρίξουμε μια ματιά στον κώδικα. Ανοίξτε το USI_I2C_RAM.c. Θα πρέπει να μοιάζει αρκετά με τον προηγούμενο κώδικα. Οι κύριες διαφορές είναι οι λεπτομέρειες ανάγνωσης και γραφής μνήμης. Κοιτάξτε τον τρόπο φόρτωσης του buffer μηνυμάτων πριν από την κλήση που πραγματικά γράφει. Το πρώτο byte είναι η διεύθυνση slave με το bit ανάγνωσης/εγγραφής ρυθμισμένο κατάλληλα. Αλλά το επόμενο byte είναι η διεύθυνση μνήμης στην οποία θα ξεκινήσει η εγγραφή δεδομένων. Έπειτα έρχονται τα πραγματικά byte δεδομένων τα οποία θα φορτωθούν διαδοχικά στη μνήμη ξεκινώντας από τη διεύθυνση που καθορίσαμε. Καθορίζουμε το μέγεθος του μηνύματος ως 6. Έτσι ξεκινάμε να γράφουμε στη διεύθυνση 00 και γράφουμε τις τιμές 01, 03, 02 και 06 στις θέσεις μνήμης 00 έως 03. Για να διαβάσουμε τα δεδομένα από τη μνήμη πρέπει να χρησιμοποιήσουμε τη συνάρτηση USI_TWI_Start_Random_Read. Το buffer μηνύματος λαμβάνει τη διεύθυνση slave στο πρώτο byte και την αρχική διεύθυνση στο δεύτερο byte. Στη συνέχεια, καλέστε τη συνάρτηση με το μέγεθος του μηνύματος ρυθμισμένο στον αριθμό των byte για ανάγνωση συν 2. Σημειώστε ότι το bit ανάγνωσης/εγγραφής δεν έχει σημασία, καθώς μια ανάγνωση θα γίνει ανεξάρτητα. Τα δεδομένα που επιστρέφονται θα ξεκινήσουν στη δεύτερη θέση στο buffer μηνυμάτων. Μόλις διαβαστούν τα δεδομένα, αντιστρέφονται για εμφάνιση στο Port Expander και γράφονται ένα byte κάθε φορά σε αυτό με παύση μεταξύ των τιμών. Τέλος, τα LED Port Expander απενεργοποιούνται. Οι εγγραφές στο Port Expander είναι ίδιες με αυτές που έγιναν στα προηγούμενα παραδείγματα. Για διασκέδαση, μπορείτε να σχολιάσετε τη δήλωση #define DEBUG όπως παραπάνω και να δείτε πολλά LED που αναβοσβήνουν. Έντονος ενθουσιασμός μετά από ένα άλλο επιτυχημένο πείραμα, ας μεταβούμε στο ATmega168 και στο EEPROM. Αλλάξτε τον κατάλογο εργασίας σας σε EEPROM στο TWI I2C. Χρησιμοποιήστε το αρχείο δημιουργίας για να μεταγλωττίσετε και να κατεβάσετε το TWI_I2C_EEPROM.c. Σημειώστε ότι τα αρχεία προγράμματος οδήγησης I2C είναι πανομοιότυπα με αυτά που χρησιμοποιήσαμε νωρίτερα για το PCA8574A. Για να δοκιμάσετε το πρόγραμμα, αποσυνδέστε το ATtiny2313 και συνδέστε το ATmega168. Αφήστε το λεωφορείο I2C γαντζωμένο στο Ram και ενεργοποιήστε το. Τα αποτελέσματα είναι διαφορετικά αφού τώρα γράφουμε και διαβάζουμε περισσότερα δεδομένα. Το LED 1 στο PD7 θα αναβοσβήνει κατά την εκκίνηση. Πατήστε το κουμπί και τα δεδομένα θα διαβαστούν από τη μνήμη και θα εμφανιστούν. Οι λυχνίες LED στο PCA8574 πρέπει να αναβοσβήνουν με την ακόλουθη σειρά: P1, P0 & P2, (όλα απενεργοποιημένα), P0 & P1, P1 & P2. Τέλος, τα LED LED πρέπει να σβήσουν. Πατήστε ξανά το κουμπί για να το επαναλάβετε. Ω, αλλά περιμένετε, λέτε. Δεν είναι αυτό το πρόγραμμα για την EEPROM; Δεδομένου ότι έχουμε πρόσβαση σε μια συσκευή μνήμης στην ίδια διεύθυνση I2C, το ίδιο πρόγραμμα λειτουργεί τόσο για το Ram όσο και για το EEPROM. Απενεργοποιήστε και μετακινήστε το SDA και το SCL από το Ram στο EEPROM και εκτελέστε ξανά το πρόγραμμα. Θα πρέπει να λειτουργεί ακριβώς το ίδιο. Λάβετε υπόψη ότι το EEPROM και το Ram δεν μπορούν να συνδεθούν στο δίαυλο I2C ταυτόχρονα, επειδή μοιράζονται την ίδια διεύθυνση. (Οι έξυπνοι μεταξύ σας μπορεί να σκεφτούν να αλλάξουν τα προγραμματιζόμενα bit διευθύνσεων στο Ram, αλλά αυτό δεν θα λειτουργήσει. Το 24C16 χρησιμοποιεί ολόκληρο το μπλοκ διευθύνσεων που μπορούν να προγραμματιστούν για το Ram.) Εντάξει, ας δούμε αυτό το τελευταίο πρόγραμμα Το Ανοίξτε το TWI_I2C_EEPROM.c. Το πρώτο πράγμα που πρέπει να παρατηρήσετε είναι ότι έχω υποδείξει πώς να αντιμετωπίσετε το πλήρες 24C16 EEPROM. Μπορεί να έχει πρόσβαση σε 256 κομμάτια byte σε 8 διαφορετικές διευθύνσεις σκλάβων I2C. Δείτε πώς ορίζεται το MEMORY_ADDR ως η αρχική διεύθυνση στα 50 δεκαεξαδικά. γι αυτό δούλεψε ο Κριός. Εάν θέλετε να αποκτήσετε πρόσβαση σε άλλα μπλοκ του 24C16, χρησιμοποιήστε τις άλλες διευθύνσεις όπως σας έχω υποδείξει. Ρίξτε μια ματιά στον τρόπο με τον οποίο ρυθμίσα να γράφω στη μνήμη. Πρώτα τοποθετείται στο buffer η διεύθυνση slave με το σύνολο bit ανάγνωσης/εγγραφής, στη συνέχεια η διεύθυνση έναρξης του 00 και στη συνέχεια 16 byte δεδομένων. Η συνάρτηση TWI_Start_Read_Write καλείται να γράψει τα δεδομένα (όπως πριν) με το μέγεθος του μηνύματος να είναι 18. Όταν πατηθεί το κουμπί, χρησιμοποιούμε TWI_Start_Random_Read και TWI_Read_Data_From_Buffer για να διαβάσουμε τα δεδομένα πίσω. Κάθε τρίτο byte εμφανίζεται στα LED Port Expander. Τέλος, τα LED είναι απενεργοποιημένα για να περιμένετε το επόμενο πάτημα του κουμπιού. Wonderσως αναρωτιέστε γιατί επέλεξα να γράψω 16 byte. Εάν διαβάσετε προσεκτικά το φύλλο δεδομένων, θα δείτε ότι το 24C16 κάνει έναν κύκλο εγγραφής κάθε φορά που λαμβάνει 16 byte ακόμη και αν αποστέλλονται περισσότερα byte. Φαινόταν λοιπόν ένας ωραίος αριθμός για χρήση. Εάν επιλέξετε να το αυξήσετε, θα πρέπει να αλλάξετε το μέγεθος του MESSAGEBUF_SIZE. Θα πρέπει επίσης να αλλάξετε την τιμή TWI_BUFFER_SIZE στο TWI_Master.h. Αυτό συμβαίνει επειδή το πρόγραμμα οδήγησης αντιγράφει τα δεδομένα από το buffer μηνυμάτων για χρήση από τη ρουτίνα της υπηρεσίας διακοπής. Συγχαρητήρια! Είστε τώρα έτοιμοι να χρησιμοποιήσετε το λεωφορείο I2C στα δικά σας έργα!
Βήμα 7: Πόροι Ιστού
Ακολουθούν οι σύνδεσμοι προς τα φύλλα δεδομένων για τα μέρη που χρησιμοποιούνται για τα πειράματα. Πρέπει οπωσδήποτε να τα πάρετε αν δεν πάρετε τίποτα άλλο. Port ExpanderRamEEPROMΑν είστε δημιουργός του I2C, το NXP (Philips) έχει πολλά υπέροχα πράγματα. (Τους αρέσει να χρησιμοποιούν αγκύλες στις διευθύνσεις URL τους, οπότε δεν μπορώ να τις συμπεριλάβω σωστά. Συγγνώμη.] Για να φτάσετε στην περιοχή I2C, επιλέξτε Διασύνδεση από τη λίστα Προϊόντων. Θα μπορείτε να μεταβείτε στον ιστότοπό τους I2C και πρόσβαση σε όλα τα φύλλα δεδομένων και τις σημειώσεις εφαρμογών που προσφέρουν. Η περιγραφή και οι τεχνικές λεπτομέρειες του διαύλου I2C είναι ιδίως εδώ. Πάρτε τα φύλλα δεδομένων ATtiny2313 και ATmega168 (βιβλία δεδομένων;) από την Atmel. Οι σημειώσεις εφαρμογής Atmel είναι εδώ. Δείτε AVR310 και AVR315. Πιάστε επίσης τον κωδικό. Ρίξτε μια ματιά εδώ για πολλά περισσότερα πράγματα I2C.
Βήμα 8: Σημειώσεις για τους Geeks
Για τον πραγματικό geek που θέλει να μάθει τις λεπτομέρειες, εδώ είναι μερικά πράγματα που πρέπει να έχετε κατά νου αν κοιτάξετε τις Σημειώσεις εφαρμογών Atmel και τον κωδικό προγράμματος οδήγησης:- Η μέθοδος διεύθυνσης και εντολής μιας συσκευής I2C δεν αποτελεί μέρος των προδιαγραφών! Εκτός από τη διεύθυνση slave και το bit ανάγνωσης/εγγραφής, οι εντολές, οι λειτουργίες κ.λπ. δεν καθορίζονται και είναι συγκεκριμένες για μια δεδομένη συσκευή. Για να γίνει αυτό πολύ σαφές, σημειώστε ότι το σχήμα που χρησιμοποιείται στο παράδειγμα Atmel ισχύει μόνο για αυτό το παράδειγμα και είναι σχεδόν μη τυποποιημένο.- Η υλοποίηση USI διαφέρει από την εφαρμογή TWI σε μερικούς σημαντικούς τρόπους. + Με το USI, το χρονόμετρο παρέχεται από λογισμικό. με το TWI παρέχεται από μια γεννήτρια ταχύτητας bit. + Η μέθοδος USI δεν χρησιμοποιεί διακοπές. το TWI κάνει. Αυτό έχει κάποια λογική αφού η οικογένεια Mega (χρησιμοποιώντας το TWI) θα μπορούσε να κάνει πολλά άλλα πράγματα και δεν θα πρέπει να παρασυρθεί από μεταφορές I2C. Μια έκδοση με διακοπή για το USI είναι σίγουρα δυνατή, απλώς δεν εφαρμόζεται σε αυτό το Instructable. + Το υλικό USI δεν είναι βελτιστοποιημένο για I2C και μπορεί να χειριστεί μόνο μεταφορές 8 bit. Αυτό σημαίνει ότι απαιτούνται δύο μεταφορές για την αποστολή του ένατου bit (είτε NACK είτε ACK). Το υλικό TWI το χειρίζεται αυτόματα. Αυτό καθιστά την εφαρμογή του προγράμματος οδήγησης USI λίγο πιο περίπλοκη. + Ο εντοπισμός σφαλμάτων για το TWI χειρίζεται υλικό. Η USI απαιτεί χειρισμό λογισμικού που περιπλέκει κάπως τα πράγματα. + Το υλικό TWI ελέγχει άμεσα τη διαμόρφωση της θύρας. Το υλικό USI απαιτεί τη διαμόρφωση των bit των θυρών πριν από τη χρήση της θύρας. Αυτό θα το δείτε στη ρουτίνα Master_Initialize για το USI. Δεν έχω βρει τρόπο να λειτουργήσει αυτή η προσέγγιση. Η χρήση δύο εξωτερικών αντιστάσεων μοιάζει με ένα αρκετά απλό σχέδιο, οπότε δεν ξόδεψα πολύ χρόνο σε αυτό.
Συνιστάται:
Ηλεκτρονικό διαστημικό λεωφορείο: 8 βήματα (με εικόνες)
Electronic Space Shuttle: Έφτιαξα αυτό το έργο που συνδέει δύο από τα αγαπημένα μου πεδία: το ηλεκτρονικό και το διάστημα. Αυτό το διαστημικό λεωφορείο είναι κατασκευασμένο εξ ολοκλήρου από την αρχή
MicroPython σε φθηνό $ 3 ESP8266 WeMos D1 Mini για 2x καταγραφή θερμοκρασίας, Wifi και στατικά για κινητά: 4 βήματα
MicroPython σε φθηνή τιμή $ 3 ESP8266 WeMos D1 Mini για 2x καταγραφή θερμοκρασίας, Wifi και κινητά στατιστικά: Με μικροσκοπικό φτηνό τσιπ / συσκευή ESP8266 μπορείτε να καταγράφετε δεδομένα θερμοκρασίας έξω, στο δωμάτιο, στο θερμοκήπιο, στο εργαστήριο, στο ψυγείο ή σε άλλα μέρη εντελώς δωρεάν. Αυτό το παράδειγμα θα χρησιμοποιήσουμε για την καταγραφή της θερμοκρασίας του χώρου ψύξης, εντός και εκτός. Η συσκευή θα είναι
Cambus - Σύστημα συλλογής δεδομένων σε αστικό λεωφορείο: 8 βήματα
Cambus - Σύστημα συλλογής δεδομένων σε αστικά λεωφορεία: Μεταξύ των προβλημάτων και δυσκολιών που είναι γνωστά στα μέσα μαζικής μεταφοράς, ο πληθυσμός στερείται πληροφοριών σε πραγματικό χρόνο και με τη μικρότερη δυνατή διεκδίκηση. Ο συνωστισμός των λεωφορείων με τα μέσα μαζικής μεταφοράς απομακρύνει τους χρήστες, οι οποίοι προτιμούν να χρησιμοποιούν τα δικά τους οχήματα, ακόμη και
Ευαίσθητα μαξιλάρια παιχνιδιού για πίεση (για ψηφιακές παιδικές χαρές - και περισσότερα): 11 βήματα (με εικόνες)
Παιχνιδιάρικα μαξιλάρια ευαίσθητα στην πίεση (για ψηφιακές παιδικές χαρές - και περισσότερα): Αυτό είναι ένα εγχειρίδιο για να σας δείξει πώς να φτιάξετε ένα μαξιλάρι ευαίσθητο στην πίεση - το οποίο μπορεί να χρησιμοποιηθεί για τη δημιουργία ψηφιακών παιχνιδιών ή παιχνιδιών. Μπορεί να χρησιμοποιηθεί ως αντίσταση ευαίσθητης σε δύναμη μεγάλης κλίμακας και αν και παιχνιδιάρικο, θα μπορούσε να χρησιμοποιηθεί για πιο σοβαρά έργα
Πώς να φτιάξετε μια μικρογραφία PowerTech (λεωφορείο δράκων): 11 βήματα
Πώς να χτίσετε μια μικρογραφία PowerTech (λεωφορείο δράκων): | ________ | ________ | ________ | ________ | ________ | __________ | ________ | _______ | __________ | _______ | ______ || ________ | ________ | ________ | ________ | ________ | __________ | ________ | _______ | __________ | _______ | ______ || ________ | ________ | ________ | ________ | ________ |