# Συζήτηση Κυκλωμάτων > Ψηφιακά Κυκλώματα > Μικροελεγκτές >  >  Arduino Uno και SPI

## alefgr

Η μέχρι τώρα η εμπειρία μου με σύνδεση περιφερειακών, ήταν μόνο στο I2C bus. Τις τελευταίες ημέρες άρχισα να πειραματίζομαι και με το SPI και συγκεκριμένα με το ADC chip MCP3302. Προσπάθησα να βρώ σε διάφορα forums κάτι που έχει σχέση με την ταχύτητα του clock του SPI, αλλά δεν βρήκα καμία απάντηση στο θέμα που με απασχολεί. Το ερώτημα είναι προς όλους τους ειδικούς γύρω από το SPI και τον ATmega 328.

Θέλω να συνδέσω στο SPI bus πάνω από ένα IC, διαφορετικό. Τι κάνω στην περίπτωση που το κάθε IC θέλει την δική του ταχύτητα; Υπάρχει τρόπος να αυξομειώνεται η ταχύτητα του bus σε κάθε επιλογή του αντίστοιχου IC μέσω του slave select ή πρέπει να τα λειτουργήσω όλα τα ICs αναγκαστικά στην χαμηλότερη ταχύτητα;

Απ’ ότι είδα στο συγκεκριμένο ADC chip που πειραματίζομαι, όσο χαμήλωνα την ταχύτητα του bus, τόσο είχα μετρήσεις με μεγαλύτερη ακρίβεια. Από την άλλη θέλω να το δουλέψω ταυτόχρονα με το Ethernet shield (Ethernet και SD κάρτα) και εκεί θα ήθελα να έχω την μέγιστη δυνατή ταχύτητα.

----------


## bchris

Αν εχει ενα μονο SPI ο μC, τοτε αναγκαστικα θα πρεπει καθε φορα που μιλας σε αλλο περιφερειακο να αλλαζεις και την ταχυτητα.

Εναλλακτικα μπορεις να μιλας στο αργο ADC χρησιμοποιοντας την τεχνικη bit-bang.
Να αφιερωσεις δηλαδη εσυ 4 pins αυθαιρετα απο τον μC για MOSI, MISO, CS & CLK και να τα ανοιγοκλεινεις κατα βουληση, με τα καταλληλα delays ενδιαμεσα.

----------


## alefgr

Αν κατάλαβα καλά μιλάς για software SPI, η οποία λύση παρουσιάζει αρκετό ενδιαφέρον. Το μόνο κακό είναι ότι στον ATmega328 με τα λιγοστά I/O είναι μιά σημαντική σπατάλη αλλά υπάρχει πάντα και οι λύση έλεγχος μέσω I/O expanders. Επίσης θέλει πολύ καλή γνώση στο χρονισμό του bus και όταν δεν έχεις κάποιον digital analyzer, υπάρχει σημαντική δυσκολία να βρεις λύση αν κάπου σκαλώσεις.

Μιά άλλη λύση που έχω αρχίσει να ψάχνω είναι μέσω SPI to I2C bridge.

----------


## billy

Απλό είναι, αν έχεις πχ 3 περιφερειακά, τότε τα συνδέεις όλα παράλληλα στα MOSI, MISO και CLK και χρησιμοποιείς και τρία SS I/O pins, ένα για το καθένα. Όποτε θέλεις να χρησιμοποιήσεις ένα περιφερειακό, θέτεις την επιθυμητή ταχύτητα του SPI, θέτεις το SPI mode του περιφερειακού (1-4) και κάνεις assert το SS pin του. Μετά το τέλος της επικοινωνίας κάνεις deassert το SS pin του και τέλος.

Καλό θα ήταν μετά την αλλαγή ταχύτητας και mode να στέλνεις 1-2 dummy bytes στο SPI bus για να μην έχεις προβλήματα. Επίσης αν θέλεις να χρησιμοποιήσεις ISP (ο οποίος δουλεύει στο SPI) πρέπει να βάλεις εξωτερικά pullups σε όλα τα SS pins. Αλλιώς πολύ πιθανόν να έχεις προβλήματα στο προγραμματισμό του AVR.

----------


## alefgr

Το έχω λύσει το πρόβλημα με την βιβλιοθήκη μου σχετικά με το MCP3302. Όταν κάνω select το pin του, αποθηκεύω την τρέχουσα ταχύτητα του SPI με την εντολή

_spi_rate = (SPCR & 0x3) | ((SPSR & 0x1) << 2);
SPI.setClockDivider(_adc_rate);

και πριν κάνω deselect το pin καλώ

SPI.setClockDivider(_spi_rate);

Εδώ και ένα μήνα δουλεύει άψογα η εφαρμογή μου. Ταυτόχρονα στο SPI δουλεύω Ethernet και SD κάρτα.

----------

nestoras (07-09-15)

----------


## thanasis 1

Εχω να κανω μια ερωτηση οσο αφορα το spi,στην περιπτωση μου εχω να συνδεσω στον arduino mega μια sd card 
και ενα nrf24l01.Διαβασα το ποστ 4 και λογικα την sd card θα την συνδεσω κανονικα στα pin του spi και για το nrf24l01
θα πρεπει να ορισω ενα αλλο πιν στο arduino ως ss.Υπαρχει καποιο παραδειγμα για το πως γινεται αυτο??

----------


## alefgr

Συνήθως η επιλογή του SS/SPI γίνεται μέσω της βιβλιοθήκης απ’ όπου θα ελέγχεται η sd κάρτα σου. Υποθέτω στο ξεκίνημα που κάνεις setup την βιβλιοθήκη σου καλώντας μια ρουτίνα initialize, ταυτόχρονα θα πρέπει να ορίζεις και το SS_PIN.

----------


## thanasis 1

Στο spi χρειαζονται pull up αντιστασεις σε καποιο απο τα mosi,miso,sck,cs?
Καποιοι ελεγαν οτι χρειαζεται μονο στο cs πιν.Τι ισχυει?

----------


## kostasd

> Εχω να κανω μια ερωτηση οσο αφορα το spi,στην περιπτωση μου εχω να συνδεσω στον arduino mega μια sd card 
> και ενα nrf24l01.Διαβασα το ποστ 4 και λογικα την sd card θα την συνδεσω κανονικα στα pin του spi και για το nrf24l01
> θα πρεπει να ορισω ενα αλλο πιν στο arduino ως ss.Υπαρχει καποιο παραδειγμα για το πως γινεται αυτο??



δεν καταφερα να τα κανω να δουλεψουν μαζι! δεν εφαρμωσα ομως την λυση του 2ου λινκ.
εβλα 2ο arduino μονο για το nrf24l01

http://forum.arduino.cc/index.php?topic=222964.0
https://forum.arduino.cc/index.php?topic=360718.0

----------


## thanasis 1

Θελω να συνδεσω 5 ασθητηρια σε εναν μ/ε με spi.
Απλα συνδεω παραλληλα τα mosi,miso,sck χωρις καποιες αντιστασεις??Διαβασα πολλα στο ιντερνετ και λεγανε οτι δεν χρειαζεται καμια αντισταση πουθενα,αλλοι οτι θελει μονο στο miso και στο cs pull up.
Ρωταω γιατι σχηματικα που εχω δει εχουν σε σειρα συνδεδεμενη αντισταση στο mosi και miso καθως και pul up σε ολα.Τι να κανω εγω??

----------


## Fire Doger

Δες *εδώ
*Στο miso βάζουν γιατί είναι σε κατάσταση υψηλής αντίστασης και στα άλλα για να υπάρχει ένα default επίπεδο όταν κάνει reset ο μΕ κλπ
Τις αντιστάσεις σε σειρά δεν είμαι σίγουρος γιατί τις βάζουν, ίσως γιατί οι τάσεις λειτουργίας master-slave είναι διαφορετικές.

Γιατί το θες?Προσωπικό Project ή κάτι άλλο?

----------

thanasis 1 (12-11-16)

----------


## thanasis 1

Ναι στεφανε για προσωπικο project προκειται.
Απλα ρωταω γιατι εγω θα τα εβαζα ετσι σκετα πανω στην πλακετα χωρις τιποτα,μετα ειδα ομως τα ετοιμα πλακετακια και με εβαλε σε σκεψεις.
Αρα βαζω σε ολα μια pull up 10k και ησυχαζω?

----------


## Fire Doger

Ε βάλ' τες ξέρω γω, κακό δεν κάνουν για μια πλακέτα.
Δες *εδώ* που το εξηγούν και λίγο καλύτερα πότε χρειάζονται.

----------

thanasis 1 (12-11-16)

----------


## G.G.

> δεν καταφερα να τα κανω να δουλεψουν μαζι! δεν εφαρμωσα ομως την λυση του 2ου λινκ.
> εβλα 2ο arduino μονο για το nrf24l01
> 
> http://forum.arduino.cc/index.php?topic=222964.0
> https://forum.arduino.cc/index.php?topic=360718.0



Λοιπον,είχα και εγω το ίδιο πρόβλημα, και έκανα τη λύση του 2ου λινκ, το οποίο το βρήκα και λογικό. Και δούλεψε!!!. Το καρτάκι με το SD έχει πάνω του ένα level  shifter (LVC125A) με 3-state outputs. Το MISO που δημιουργεί πρόβλημα ελέγχεται από το πιν 13, το οποίο είναι στο GND. Αυτό, σύμφωνα με τον πίνακα αληθείας, στην έξοδο του MISO δίνει LOW (σε κατάσταση ηρεμείας) αλλά με χαμηλή αντίσταση εξόδου, με αποτέλεσμα όταν δουλεύει το nRF24, η τάση του MISO να επιρρεάζεται λόγω της χαμηλής αντίστασης εξόδου. Αυτό που πρέπει να διορθωθεί είναι αντί το πιν 13 να είναι στο GND, να συνεθεί με το CS, όπου όταν το καρτάκι SD δεν δουλεύει, το CS είναι HIGH και η έξοδος του MISO έχει υψηλή αντίσταση (συμφωνα με τον πίνακα αληθείας) και δεν επειρρεάζεται από το MISO του nRF24. Εγώ έκοψα με ένα ξυράφι το δρόμο του πιν13 προς το GND, και κόλλησα ένα καλώδιο στο πιν13 και στο CS.DSC04158.jpg111.png

----------

Fire Doger (16-02-17)

----------


## thanasis 1

Καλημερα,μου συμβαινει το εξης παραδοξο με τρια αισθητηρια που εχω συνδεδεμενα μεσω spi.
Εχω φτιαξει μια πλακετα οπου εχω κολλησει σε αυτην ενα γυροσκοποιο ενα επιταχυνσιομετρο και ενα αισθητηρα βαρομετρικης πιεσης,
οταν παω να διαβασω τα αισθητηρια δεν μου λειτουργουν δηλαδη δεν μπορω να διαβασω τις μετρησεις,αν ομως απομονωσω τα δυο και 
διαβασω ενα ενα ξεχωριστα τοτε παιρνω σωστα τις μετρησεις και απο τα τρια αισθητηρια.Ξερει κανεις γιατι μπορει να συμβαινει αυτο?
Εχω συνδεσει ολα τα SCL μαζι τα SDA καθως και τα SDO και απο τα τρια αισθητηρια,εχω ελεγξει το pcb δεν υπαρχει κανενα βραχυκυκλωμα και ολα ειναι συνδεδεμενα σωστα.

----------


## manolena

Απο ό,τι βλέπω Θανάση και τα 3 έχουν δυνατότητα επιλογής στην επικοινωνία ή με SPI ή με I2C. Γράφεις πιο κάτω πως έχεις συνδέσει και το SDA και το SDO και το SCL. Αν θες να τα δουλέψεις σε SPI mode πρέπει να χρησιμοποιήσεις ακόμα τρία πινάκια απο τον μC σου για τα CS (Chip Select) σήματα του καθενός (σε HIGH εμπλέκεται ο δίαυλος SPI). Αν τα δουλέψεις σε I2c πρέπει αυτά τα πινάκια να τα οδηγήσεις σε LOW και να χρησιμοποιήσεις μόνο SCL και SDA για τον έλεγχο του διαύλου.

----------


## thanasis 1

Μανο εχω και απο ενα πιν ως cs για καθε ενα αισθητηριο απλα δεν το εγραψα.
Δεν μπορω να καταλαβω γιατι δεν δουλευει οταν ειναι ολα συνδεδεμενα.

----------


## manolena

Με όποιο θές να μιλήσεις, του ανεβάζεις το CS σε HIGH, τα άλλα δύο τα κρατάς σε LOW. Έτσι μιλας σε SPI;

----------


## thanasis 1

Ναι μανο ετσι επικοινωνω με τα αισθητηρια.
Τελικα βρηκα το προβλημα,ειχε να κανει με τους χρονους που κραταω χαμηλα τα πιν cs.

----------

