Καθολική Σειριακή Διεπιφάνεια (Universal Serial Interface) Εισαγωγή Η καθολική σειριακή διεπιφάνεια (universal serial interface, USI) παρέχει SPI (Serial peripheral interface) και I 2 C (Inter integrated circuit bus) σειριακή επικοινωνία με ένα τμήμα υλικού. Σε αυτό το κεφάλαιο θα μελετήσουμε τη χρήση των δύο αυτών τεχνικών. Το τμήμα USI υπάρχει στις διατάξεις MSP430x20xx. Το τμήμα USI παρέχει τις βασικές λειτουργίες για την υποστήριξη σειριακής επικοινωνίας. Στην πιο απλή του μορφή είναι ένας 8bit ή 16bit καταχωρητής που μπορεί να αποδόσει ροές δεδομένων ή όταν συνδυαστεί με λογισμικό να υλοποιήσει σειριακή επικοινωνία. Επιπρόσθετα το USI περιλαμβάνει λειτουργίες υλικού για τη διευκόλυνση των SPI και I2C. Περιλαμβάνει ακόμα και διακοπές για να συνδράμει το λογισμικό στη σειριακή επικοινωνία και για να διατηρήσει τις υπερχαμηλές απαιτήσεις ισχύος του MSP430. To USI περιλαμβάνει: Τρία σύρματα υποστήριξης τρόπου SPI Υποστήριξη I2C τρόπου Μεταβλητό μήκος δεδομένων Λειτουργία σκλάβου σε LPM4 δε χρειάζεται εσωτερικό ρολόι Επιλογή MSB ή LSB σειράς στα δεδομένα Έλεγχος αρχής και τερματισμού στον τρόπο I2C με αυτόματο έλεγχο SCL Ανίχνευση απώλειας αυθαιρεσίας στον τρόπο master Προγραμματιζόμενη γέννηση ρολογιού Επιλέξιμη πολικότητα ρολογιού και ελέγχου φάσης Πρακτικά, το USI είναι ένα μικρό τμήμα κυκλωμάτων, που περιλαμβάνεται στους μικρούς μικροελεγκτές F20x2 και F20x3. Υποστηρίζει μόνον σειριακή επικοινωνία (μέσω SPI και I2C). Περιέχει έναν καταχωρητή ολίσθηση, μια γεννήτρια ρολογιού, έναν μετρητή και μερικά ακόμα κυκλώματα για την υποστήριξη του I2C. Οι μεγαλύτερες εκδόσεις MSP430F2xx και MSP430F4xx περιέχουν ένα ή περισσότερεα USCI (universal serial communication interface). Στην περίπτωση αυτή το υλικό διαχειρίζεται σχεδόν όλες τις πλευρές 1
της επικοινωνίας, αντίθεται με το USI, οπότε το λογισμικό απαιτείται μόνο για την παροχή των δεδομένων που θα μεταδοθούν και θα αποθηκευτούν. Τί είναι το SPI και το I2C? Επιπλέον περιέχει το κατάλληλο υλικό για να υλοποιήσει SPI (Serial peripheral interface) και I 2 C (Interintegrated circuit)επικοινωνία. Τέλος, έχει τη δυνατότητα διακοπών για να ελαττώσει επιπλέον το φόρτο λογισμικού που απαιτεί η σειριακή επικοινωνία και να διατηρήσει την ιδιότητα χαμηλής κατανάλωσης ισχύος του MSP430. Ποιο είναι το βασικό χαρακτηριστικών των SPI και I2C? Το κύριο χαρακτηριστικό του SPI και του I2C είναι ότι χρησιμοποιούνται για την επικοινωνία του μικροελεγτή με άλλα κυκλώματα στην ίδια πλακέτα (PCB) με σύγχρονο τρόπο, ενώ η ασύγχρονη επικοινωνία είναι απαραίτητη για την ανταλλαγή δεδομένων με διαφορετικές διατάξεις π.χ. σε ένα PC. Συνεπώς, απλή καλωδίωση είναι αρκετή για τη χρήση PSI ή I2C, αρκεί όλες οι διατάξεις της πλακέτας να λειτουργούν με την ίδια τάση. Το γεγονός ότι οι δύο αυτοί τρόποι επικοινωνίας είναι σύγχρονοι, σημαίνει ότι ένα σήμα ρολογιού θα πρέπει να στέλνεται μαζί με τα δεδομένα. Η διάταξη που παράγει τους παλμούς ρολογιού ονομάζεται master ενώ οι άλλες διατάξεις είναι slaves. Απαιτείται ένα ξεχωριστό λοιπόν, καλώδιο για τη μεταφορά του ρολογιού. Πώς γίνεται η μετάδοση πληροφορίας στα SPI και I2C? Η πληροφορία πρέπει να αποστείλεται σε πλαίσια (frames), καθένα από τα οποία να είναι αρκετά βραχύ, ώστε τα ξεχωριστά ρολόγια του πομπού και του δέκτη να παραμένουν συγχρονισμένα. Πρακτικά τα πλαίσια δεδομένων είναι ένα byte μήκος. Η μετάδοση και η λήψη είναι ουσιαστικά ξεχωριστές διαδικασίες και μπορούν να πραγματοποιούνται ταυτόχρονα δίνοντας τη δυνατότητα πλήρους διπλής επικοινωνίας (full duplex). Μόνον ένα καλώδιο χρειάζεται σε κάθε διεύθυνση μετάδοσης (και η γείωση βέβαια, που ποτέ δεν την προσμετράμε). Ποιές οι διαφορές SPI και I2C? Τα SPI και I2C έχουν παρόμοιες εφαρμογές. Η κύρια διαφορά μεταξύ τους είναι ότι το I2C αποτελεί ένα πραγματικό bus, το οποίο είναι σχεδιασμένο για να υποστηρίξει μεγάλο αριθμό συσκευών. Η μεταφορές ακολουθούν ένα πρωτόκολλο που ξεκινά με μια διεύθυνση για την επιλογή ενός συγκεκριμένου slave και περιλαμβάνει επιβεβαίωση μέσω bits για τη σήμανση της σωστής παράδοσης. Υπάρχει μόνον ένα καλώδιο για τα δεδομένα, δηλαδή συνολικά δύο καλώδια μαζί με το ρολόι. Τα δεδομένα ταξιδεύουν και προς τις δύο μεριές αλλά μόνον προς μια κατεύθυνση τη φορά, δηλαδή το I2C υποστηρίζει half duplex μετάδοση. Αντίθετα το SPI χρησιμοποιεί δύο γραμμές ώστε η πληροφορία να στέλνεται ταυτόχρονα και προς τις δύο κατευθύνσεις. Συγκεκριμένα απαιτείται η διαδικασία αυτής της επικοινωνίας να είναι και προς τις δύο κατευθύνσεις ταυτόχρονα στην περίπτωση του SPI. Η πλήρης έκδοση του SPI περιέχει μια επιπλέον γραμμή για την επιλογή του κατάλληλου slave οπότε συνολικά χρησιμοποιούνται τέσσερα καλώδια. 2
Δεν υπάρχει καθόλου έλεγχος της μετάδοσης με λογισμικό, δηλαδή ούτε διεύθυνσης ούτε επιβεβαίωση. Συνολικά, το SPI χρειάζεται περισσότερα καλώδια από το I2C και προσφέρει λιγότερο έλεγχο, αλλά είναι απλούστερο και ταχύτερο. Συνεπώς, είναι προτιμότερο όταν θέλουμε να μεταφέρουμε μεγάλο πλήθος δεδομένων. Σε ποιες επικοινωνίες χρησιμοποιούμε τα SPI και I2C? Επεκτάσεις θυρών για να αυξήσουμε το πλήθος των ακροδεκτών κατά την ψηφιακή είσοδο ή έξοδο σήματος. ADCs και DACs. Αισθητήες με ψηφιακές εξόδους π.χ. θερμόμετρα. Εξωτερική μνήμη (dataflash, EEPROM). Ρολόγια πραγματικού χρόνου. Άλλους επεξεργαστές. 3
Μπλόκ διάγραμμα SPI 4
Μπλόκ διάγραμμα I2C Η Λειτουργία του USI Το τμήμα USI είναι ένας καταχωρητής ολίσθησης και ένας μετρητής bit που περιλαμβάνει την απαραίτητη λογική για να υποστηρίξει το SPI και το I2C. Ο καταχωρητής ολίσθησης του USI ονομάζεται USISR και είναι άμεσα προσπελάσιμος από το λογισμικό. Περιέχει κάθε φορά τα δεδομένα που θα μεταδωθούν ή τα δεδομένα που έχουν ληφθεί. 5
Ο μετρητής bit καταμετρά το πλήθος των bits και θέτει τη σημαία διακοπής USIIFG όταν η τιμή USΙCNTx γίνει 0. Αυτό μπορεί να συμβεί είτε με διαδοχικές μειώσεις είτε με απευθείας μηδενισμό των bits USICNTx. Όταν γράφουμε στον USICNTx μια τιμή >0, τότε αυτόματα USIIFG 0 όταν USIIFGCC=0, διαφορετικά ο USIIFG μένει ανεπηρέαστος. Η μείωση των USICNTx σταματά όταν γίνουν 0. Δε θα υποχειλίσουν στην τιμή 0FFh. Τόσο ο μετρητής όσο και ο καταχωρητής ολίσθησης οδηγούνται από το ίδιο ρολόι ολίσθησης. Σε ακμή ανόδου του ρολογιού ολίσθησης, τα USICNTx ελαττώνονται και ο USISR δειγματοληπτεί την επόμενη είσοδο bit. Ο μανδαλωτής που είναι συνδεδεμένος με την έξοδο του καταχωρητή ολίσθησης καθυστερεί την αλλαγή της εξόδου μέχρι την ακμή πτώσης τους ρολογιού ολίσθησης. Μπορεί να γίνει διαφανής με USIGE=1. Αυτή η ενέργεια θα δώσει κατευθείαν το MSB ή το LSB του USISR στον ακροδέκτη SDO, ανάλογα με την τιμή του bit USILSB. Αρχικοποίηση του USI Οταν το bit λογισμικού επανάθεσης του USI, USISWRST, τίθεται, οι σημαίες USIIFG, USISTTIFG, USISTP και USIAL παραμένουν στην κατάσταση επανάθεσης. Τα USISR και USICNTx δε δέχονται σήμα ρολογιού και τα περιεχόμενά τους δεν αλλάζουν. Σε τρόπο I2C, η γραμμή SCL απελευθερώνεται μέσω του λογισμικού και τίθεται σε διαθεσιμότητα (idle state). Για να ενεργοποιήσουμε τη λειτουργία της θύρας USI, θα πρέπει να θέσουμε τα αντίστοιχα bits USIPEx στον καταχωρητή ελέγχου του USI. Αυτή η ενέργεια θα επιλέξει τη λειτουργία του ακροδέκτη και διατηρεί τις λειτουργίες PxIN και PxIFG. Με αυτόν τον τρόπο, μπορούμε να διαβάσουμε το επίπεδο εισόδου της θύρας μέσω του καταχωρητή PxIN μέσω λογισμικού και τα εισερχόμενα ρεύμα δεδομένων μπορεί να προκαλέσει διακοπές θύρας στις μεταδώσεις των δεδομένων. Αυτό είναι χρήσιμο, για παράδειγμα, για την παραγωγή διακοπής θύρας στην ακμή START. Παραγωγή Σήματος Ρολογιού USI Το σύστημα παραγωγής παλμών ρολογιού στο USI περιέχει έναν πολυπλέκτη ρολογιού, έναν διαιρέτη, και τη δυνατόττηα επιλογής της πολικότητας του ρολογιού. Η πηγή ρολογιού μπορεί να επιλεχθεί από τα εσωτερικά ρολόγιο ACLK ή SMCLK, από εξωτερικό ρολόι SCLK, καθώς και από τις εξόδους σύγκρισης/σύλληψης του Timer_A. Επιπλέον, είναι δυνατό να πάρουμε ρολόι μέσω λογισμικού χρησιμοποιώντας το bit USISWCLK όταν USISELx=100. Τα bits USIDIVx μπορούν να χρησιμοποιηθούν για να διαιρέσουν το επιλεγμένο ρολόι με δύναμη του 2 και μέχρι το 128. Το παραγμένο ρολόι, USICLK, σταματά όταν USIIFG=1 ή όταν το τμήμα λειτουργεί σε κατάσταση σκλάβου. Το bit USICKPL χρησιμοποιείται για να επιλέξουμε την πολικότητα του USICLK. Όταν το USICKPL=0, το μη ενεργό μέρους του USICLK είναι 0. Όταν το USICKPL=1 το μη ενεργό μέρος του USICLK είναι 1. 6
Τρόπος SPI Το τμήμα του USI είναι διαμορφωμένο σε τρόπο SPI όταν USII2C=0. Το bit ελέγχου USICKPL επιλέγει το μη ενεργό τμήμα του ρολογιού του SPI ενώ το USICKPH επιλέγει την ακμή ρολογιού στην οποία το SDO ανανεώνεται και το SDI δειγματοληπτείται. Το επόμενο σχήμα δείχνει τη σχέση ρολογιού/δεδομένων για μια 8bit μεταφορά MSB πρώτα. Τα USIPE5, USIPE6 και USIPE7 πρέπει να τεθούν για να ενεργοποιηθεί η λειτουργία των θυρών SCLK, SDO και SDI. SPI Τρόπος Αφέντη Το τμήμα του USI διαμορφώνεται σε τρόπο SPI αφέντη, θέτωντας το bit αφέντη USIMST και καθαρίζοντας το bit I2C, USII2C. Επειδή ο αφέντης θα δώσει το ρολόι στον ή στους σκλάβους, θα πρέπει να γίνει επιλογή του κατάλληλου ρολογιού και το SCLK να διαμορφωθεί για έξοδο. Όταν USIPE5=1, το SCLK διαμορφώνεται αυτόματα ως έξοδος. Όταν το USIIFG=0 και το USICNTx>0, η παραγωγή ρολογιού ενεργοποιείται και ο αφέντης θα δίνει παλμούς ρολογιού στα δεδομένα εισόδου/εξόδου χρησιμοποιώντας τον USISR. Τα δεδομένα που λαμβάνονται θα πρέπει να διαβάζονται από τον καταχωρητή ολίσθησης πριν τα νέα δεδομένα γραφούν σε αυτόν για μετάδοση. Σε μια τυπική εφαρμοφή, το λογισμικό του USI θα διαβάσει τα ληφθέντα δεδομένα από τον USISR, θα γράψει σε αυτόν τα δεδομένα για μετάδοση και να ενεργοποιήσει το τμήμα για την επόμενη μεταφορά γράφοντας τον αριθμό των bits που θα μεταφερθούν, τον USICNTx. SPI Τρόπος Σκλάβου Το τμήμα του USI διαμορφώνεται σε τρόπο SPI σκλάβου καθαρίζοντας το USIMST και το USII2C bit. Στον τρόπο αυτό, όταν USIPE5=1, το SCLK διαμορφώνεται αυτόματα σε λειτουργία εισόδου και το USI λαμβάνει το ρολόι εξωτερικά από τον αφέντη. 7
Αν το USI θα μεταδόσει δεδομένα, ο καταχωρητής ολίσθησης θα πρέπει πρώτα να φορτωθεί με τα δεδομένα πριν ο αφέντης δώσει την πρώτη ακμή ρολογιού. Η έξοδος θα πρέπει να έχει ενεργοποιηθεί με το USIOE. Όταν USICKPH=1, το MSB θα φαίνεται στον SDO αμέσως μετά τη φόρτωση του καταχωρητή ολίσθησης. Ο ακροδέκτης SDO απενεργοποιείται καθαρίζοντας τον bit USIOE. Αυτό είναι χρήσιμο όταν ο σκλάβος δεν είναι διευθυνσιοδοτημένες σε ένα περιβάλλον πολλών σκλάβων πάνω στο bus. Όταν ληφθούν τα bits, τα δεδομένα πρέπει να διαβασθούν από τον USISR και καινούργια δεδομένα να φορτωθούν σε αυτόν πριν την επόμενη ακμή ρολογιού από τον αφέντη. Σε μια τυπική εφαρμογή, μετά τη λήψη των δεδομένων, το λογισμικό USI θα διαβάσει τον USISR καταχωρητή, θα γράψει νέα δεδομένα σε αυτόν για μετάδοση, και θα ενεργοποιήσει το τμήμα του USI για την επόμενη μεταφορά γράφοντας το πλήθος των bits που θα μεταδοθούν, στον USICNTx. Λειτουργία του USISR Ο 16 bit USISR αποτελείται από δύο 8 bit καταχωρητές, τους USISRL και USISRH. Το bit ελέγχου USI16B επιλέγει το πλήθος των bits του USISR που θα χρησιμοποιηθούν για τη μετάδοση και λήψη των δεδομένων. Όταν το USI16B=0, μόνον τα 8 bit χαμηλότερης τάξης θα χρησιμοποιηθούν, δηλαδή μόνον ο USISRL. Για τη μετάδοσης < 8bits, τα δεδομένα θα πρέπει να φορτωθούν στον USISRL ώστε τα μηχρησιμοποιημένα bits να μην ολισθήσουν εκτός. Τα δεδομένα θα πρέπει να είναι ευθυγραμμισμένα ως προς το MSB ή το LSB, ανάλογα με την τιμή του USILSB. Το επόμενο σχήμα δείχνει το χειρισμό δεδομένων 7 bit. 8
Όταν USI16B=1, και τα 16bits χρησιμοποιούνται για το χειρισμό δεδομένων. Όταν χρησιμοποιούμε τον USISR για να προσπελάσουμε και το USISRL και το USISRH, τα δεδομένα θα πρέπει να προσαρμόζονται όταν <16bits χρησιμοποιούνται με τον ίδιο τρόπο που φάνηκε στο προηγούμενο σχήμα. Διακοπές SPI Υπάρχει ένα διάνυσμα διακοπής που σχετίζεται με το τμήμα του USI και μια σημαία διακοπής, σχετική με τη λειτουργία του SPI. Όταν το USIIE και το GIE bit είναι σε θέση, η σημαία διακοπής θα παράγει μια αίτηση διακοπής. Ο USIIFG είναι σε κατάσταση θέσης όταν το USICNT γίνεται μηδέν, είτε μετρώντας, είτε άμεσα γράφοντας 0 στα bits USICNTx. Το USIIFG καθαρίζεται με το να γράψουμε μια τιμή >0 στα bits USICNTx όταν USIIFGCC=0, ή άμεσα μέσω του λογισμικού. Τρόπος I2C Το τμήμα USI διαμορφώνεται σε τρόπο I2C όταν USII2C=1, USICKPL=1 και USICKPH=0. Για συμβατότητητα των δεδομένων I2C, τα USILSB και USI16B θα πρέπει να έχουν καθαριστεί. Τα USIPE6 και USIPE7 θα πρέπει να έχουν τεθεί για να ενεργοποιήσουν τις λειτουργίες θύρας SCL και SDA. I2C Λειτουργία Αφέντη Για να διαμορφώσουμε το τμήμα USI σε λειτουργία I2C αφέντη, θα πρέπει να θέσουμε το bit USIMST. Σε τρόπο αφέντη, τα ρολόγια γενιούνται από το τμήμα USI και εξάγουν στη γραμμή SCL ενώ USIIFG=0. 9
Όταν το USIIFG=1, το SCL θα σταμαστήσει σε κατάσταση διαθεσιμότητας, ή σε υψηλό επίπεδο. Υποστηρίζεται επίσης και η λειτουργία πολλαπλών αφεντών. Ο αφέντης υποστηρίζει τους σκλάβους που κρατάνε τη γραμμή SCL σε χαμηλή κατάσταση, μόνον όταν USIDIVx>0. Όταν το USIDIVx τίθεται σε /1 υποδιαίρεση ρολογιού (USIDIVx=0), οι συνδεδεμένοι σκλάβοι δεν πρέπει να κρατάνει τη γραμμή SCL σε χαμηλή τάση κατά τη διάρκει της μετάδοσης των δεδομένων. Σε διαφορετική περίπτωση μπορεί να έχουμε αστοχία επικοινωνίας. I2C Λειτουργία Σκλάβου Για να διαμορφώσουμε το USΙ σε Ι2C λειτουργία σκλάβου, θα πρέπει πρώτα να καθαρίσουμε το USIMST. Σε λειτουργία σκλάβου, η SCL διατηρείται σε χαμηλή τάση αν USIIFG=1, USISTTIFG=1 ή αν USICNTx=0. Ο USISTTIFG πρέπει να καθαριστεί από το λογισμικό μετά τη ρύθμιση του σκλάβου και να ετοιμαστεί να λάβει τη διεύθυνση του σκλάβου από τον αφέντη. Μετάδοση I2C Σε τρόπο μετάδοσης, τα δεδομένα πρέπει πρώτα να φορτωθούν στον USISRL. Η έξοδος ενεργοποιείται θέτοντας το USIOE και η μετάδοση ξεκινά γράφοντας 8 στα USICTNx. Η διαδικασία αυτή καθαρίζει το USIIFG και το SCL έρχεται σε τρόπο αφέντη ή απελευθερώνται από την κράτηση σε τρόπο σκλάβου. Μετά τη μετάδοση όλων των 8 bits, ο USIIFG τίθεται και το σήμα ρολογιού στον SCL σταματά στον τρόπο αφέντη ή διατηρείται χαμηλά στην επόμενη χαμηλή στον τρόπο σκλάβου. Για να λάβει το I2C bit επιβεβαίωσης, το USIOE bit καθαρίζεται με το λογισμικό και τα USICNTx φορτώνονται με 1. Αυτή η διαδικασία καθαρίζει το USIIFG και ένα bit λαμβάνεται στον USISRL. Όταν ο USIIFG επανατίθεται ξανά, το LSB του USISRL είναι το λαμβανόμενο bit επιβεβαίωσης και μπορεί να ελεγχθεί από το λογισμικό. ; Receive ACK/NACK BIC.B #USIOE,&USICTL0 ; SDA input MOV.B #01h,&USICNT ; USICNTx = 1 TEST_USIIFG BIT.B #USIIFG,&USICTL1 ; Test USIIFG JZ TEST_USIIFG BIT.B #01h,&USISRL ; Test received ACK bit JNZ HANDLE_NACK ; Handle if NACK...Else, handle ACK I2C Δέκτης Σε τρόπο I2C δέκτη, η έξοδος θα πρέπει να φανερωθεί καθαρίζοντας το USIOE και να προετοιμαστεί το USI για λήψη, γράφοντας 8 στον USICNTx. Η διαδικασία αυτή καθαρίζει το USIIFG και το SCL έρχεται σε τρόπο αφέντη ή απελευθερώντεται από την κράτηση σε χαμηλή τάση αν ήταν σε τρόπο σκλάβου. Το USIIFG θα επανατεθεί μετά από 8 παλμούς ρολογιού. Η διαδικασία αυτή σταματά το σήμα ρολογιού 10
στον SCL στον τρόπο αφέντη ή κρατά το SCL σε χαμηλή τάση στην επόμενη χαμηλή φάση στον τρόπο σκλάβου. Για να μεταδόσουμε bit επιβεβαίωσης ή μη επιβεβαίωσης, το MSB του καταχωρητή ολίσθηση φορτώνεται με 0 ή 1, το USIOE τίθεται με το λογισμικό για να ενεργοποιήσει την έξοδο και 1 γράφεται στα USICNTx bits. Μόλις το MSB ολισθήσει έξω, ο USIIFG θα τεθεί και το κύκλωμα μπορεί να προετοιμαστεί για λήψη του επόμενου I2C byte δεδομένων. ; Generate ACK BIS.B #USIOE,&USICTL0 ; SDA output MOV.B #00h,&USISRL ; MSB = 0 MOV.B #01h,&USICNT ; USICNTx = 1 TEST_USIIFG BIT.B #USIIFG,&USICTL1 ; Test USIIFG JZ TEST_USIIFG...continue... ; Generate NACK BIS.B #USIOE,&USICTL0 ; SDA output MOV.B #0FFh,&USISRL ; MSB = 1 MOV.B #01h,&USICNT ; USICNTx = 1 TEST_USIIFG BIT.B #USIIFG,&USICTL1 ; Test USIIFG JZ TEST_USIIFG...continue... Συνθήκη Εκκίνησης (START) Μια συνθήκη START είναι μια υψηλή σε χαμηλή μετάβας στο SDA ενώ το SCL είναι σε υψηλή τάση. Η συνθήκη START μπορεί να παραχθεί θέτοντας το MSB στον καταχωρητή ολίσθησης σε 0. Θέτοντας τα USIGE και USIOE bits κάνουμε την έξοδο του μανδαλωτή διάφανη και το MSB του καταχωρητή ολίσθησης άμεσα μεταφέρεται στην SDA και κάνει τη γραμμή χαμηλή. Αν καθαρίσουμε το USIGE επαναφέρουμε τη λειτουργία μανδαλωτή ρολογιού και παραμένει 0 στην SDA μέχρι τα δεδομένα να ολισθήσουν έξω με το SCL. ; Generate START MOV.B #000h,&USISRL ; MSB = 0 BIS.B #USIGE+USIOE,&USICTL0 ; Latch/SDA output enabled BIC.B #USIGE,&USICTL0 ; Latch disabled...continue... Συνθήκη Τερματισμού (STOP) Η συνθήκη STOP είναι μια μετάβαση χαμηλού σε υψηλό σήμα στην SDA ενώ η SCL είναι σε ψηλό σήμα. Για να ολοκληρώσουμε το bit επιβεβαίωσης και να τραβήξουμε την SDA χαμηλά ώστε να προετοιμάσουμε τη συνθήκη STOP, χρειάζεται να καθαρίσουμε το MSB στον καταχωρητή ολίσθησης και να φορτώσουμε 1 στα USICNTx. Η ενέργεια αυτή παράγει έναν χαμηλής τάσης παλμό στον SCL και κατά τη διάρκεια αυτή της χαμηλής φάσης, η SDA τραβιέται χαμηλά. Η SCL σταματά σε κατάσταση 11
αναμονής (idle) ή σε υψηλή κατάσταση, επειδή το κύκλωμα είναι σε κατάσταση αφέντη. Για να παράγουμε τη μετάβαση χαμηλού σε υψηλό το MSB τίθεται στον καταχωρητή ολίσθησης και τα USICNTx φορτώνται την τιμή 1. Θέτοντας τα USIGE και USIOE κάνουμε τον μανδαλωτή εξόδου διάφανο και το MSB του USISRL απελευθερώνει την SDA σε κατάσταση idle. Ο καθαρισμός του USIGE αποθηκεύει το MSB στον μανδαλωτή εξόδου και η έξοδος απενεργοποιείται καθαρίζοντας το USIOE. Η SDA παραμένει υψηλά μέχρι μια συνθήκη START εξαιτίας του εξωτερικού pullup. ; Generate STOP BIS.B #USIOE,&USICTL0 ; SDA=output MOV.B #000H,&USISRL ; MSB = 0 MOV.B #001H,&USICNT ; USICNT = 1 for one clock TEST_USIIFG BIT.B #USIIFG,&USICTL1 ; Test USIIFG JZ TEST_USIIFG ; MOV.B #0FFH,&USISRL ; USISRL = 1 to drive SDA high BIS.B #USIGE,&USICTL0 ; Transparent latch enabled BIC.B #USIGE+USIOE,&USICTL; Latch/SDA output disabled...continue... Καταχωρητές του USI 12
Ασκήσεις Εργασία 1. Χρήση του USI ως μετρητή ριπής. Γράψτε κώδικα που να υλοποιεί τα επόμενα: 13
1. Σταματήστε τον watchdog timer. 2. Θέστε ACLK=VLO (Χρήση BCSCTL3), ενώ τα MCKK=SMCLK=DCO. 3. Θέστε τον ακροδέκτη P1.0 ως έξοδο. 4. Θέστε το USI σε SPI τρόπου αφέντη. 5. Ενεργοποιήστε τις διακοπές του μετρητή του USI με τη σημαία σε κατάσταση θέσης. 6. Το ρολόι ACLK να διαιρεθεί με 128. 7. Να ενεργοποιηθεί η λειτουργία του USI. 8. Το κύκλωμα να εισέλθει σε κατάσταση LPM3 w/ interrupt. 9. Γράψτε ρουτίνα διακοπής ώστε ο USICNT να φορτωθεί με την τιμή 32 και να φορτώνεται κάθε φορά μετά από τη διακοπή που θα καθαρίζει και τη σημαία διακοπής. Μέσα σε αυτή τη ρουτίνα να γίνεται και η εναλλαγή του P1.0 χρησιμοποιώντας exclusive OR. Εργασία 2. Λειτουργία του USI σε τρόπο SPI full duplex 3 wire master O SPI αφέντης θέλουμε να επικοινωνήσει full duplex με τον SPI σκλάβο, χρησιμοποιώντας 3 καλώδια. Το σήμα του P1.4 θέλουμε να μεταδωθεί από τον SPI αφέντη και να ληφθεί από το Ρ1.0 του SPI σκλάβου. Ο αφέντηςθα τροφοδοτήσει με παλμό τον σκλάβο για reset και εκκίνηση συγχρονισμού. To ACLK θα απενεργοποιηθεί και τα MCLK = SMCLK = εξορισμού DCO. Η γενική τοπολογία φαίνεται στο επόμενο σχήμα. Υλοποιήστε τα επόμενα βήματα 1. Δημιουργήστε μια μεταβλητή int i. 14
2. Σταματήστε τον watchdog timer. 3. Θέστε τον Ρ1.4 σε κατάσταση θέσης (αλλιώς να είναι σε κατάσταση επανάθεσης) 4. «Τραβήξτε» (pull up) τον P1.4. 5. Θέστε τον Ρ1.0 σε κατάσταση εξόδου (αλλιώς να είναι σε κατάσταση εισόδου). 6. Θέστε τον τρόπο λειτουργίας του SPI αφέντη. 7. Ενεργοποιήστε τις διακοπές του μετρητή του USI με τη σημαία να παραμένει σε θέση. 8. Το ρολόι του USI να είναι 16 SMCLK. 9. Ενεργοποιήστε τη λειτουργία του USI. 10. Φορτώστε τα δεδομένα στον USISRL. 11. Επαναθέστε τον σκλάβο (Ρ1). 12. Χρησιμοποιείστε την for (i = 0xFFF; i > 0; i ); για να προλάβει ο σκλάβος να ετοιμαστεί. 13. Φορτώστε τα bit μέτρησης USICNT με την τιμή 8. 14. Θέστε το σύστημα σε κατάσταση LPM0 w/ interrupt. 15. Γράψτε κώδικα για τη διακοπή USI_VECTOR που να εκτελεί τη διαδικασία της μετάδοσης λήψης. Εργασία 3. Λειτουργία του USI σε τρόπο SPI full duplex 3 wire slave Υλοποιήστε τις λειτουργίες της προηγούμενης άσκησης αλλά για λειτουργία σε τρόπο σκλάβου. 15