Comunicazione SPI con più moduli

Ciao a tutti.
Ho un Arduino mega al quale ho necessità di collegare diversi dispositivi spi, con, ovviamente, MOSI, MISO e CLK in comune, e i vari pin digitali SS diversi l'uno dall'altro.
Mi chiedevo, però, come potesse funzionare, perché, nel caso vengano interrogati due moduli assieme, ci sarebbe qualche problema, giusto?
Quindi vorrei chiedere a voi come ci si bisogna comportare quando si hanno più moduli con interfaccia SPI.
I moduli in questione sono:
RFID
SD
shift register (74hc595)
Modulo GSM

Grazie

Se ti studi come funziona il bus SPI ... prima QUI , poi QUI ed infine magari anche QUI ...

... vedrai che capirai perché il tuo è un falso problema :slight_smile:

Guglielmo

Probabilmente mi sarò perso qualche pezzo io, in quanto non ho trovato esempi su come utilizzarli o altro. Lo schema di collegamento lo so, però mi chiedo come fare ad interrogare un modulo alla volta.
Potete riassumermi in poche parole ciò che bisognerebbe fare per ottenere ciò? Poi sarò io a provare e studiare più approfonditamente, però se ho scritto qui è perché ho già cercato più volte su Google, senza ottenere nessun codice di esempio o testi di spiegazione.
Grazie

Giochi o a rovescio:
Fai tu l'esempio di come interrogheresti due o più moduli.
Non ti sto prendendo in giro...

Inizierei col primo, e finito il primo farei il secondo.
Il problema è che lo farei io, quindi so di dover farne uno alla volta....
Però se nel codice capita un momento in cui ne partono due di moduli, lì si blocca tutto...
Io pensavo di verificare i pin e, se uno è LOW, pongo tutti gli altri a HIGH....
Non so come fare però...
Come si dovrebbe fare realmente?

Nei link che ti ho dato, è chiaramente indicato che chi comanda il tutto è il pin di SS.

Normalmente TUTTI i devices sono disabilitati (pin SS = HIGH), quando si vuole parlare con un device lo si seleziona (suo pin SS = LOW) e, terminato di usarlo, lo si deseleziona (pin SS = HIGH) ... tutto qui.

Tutte le librerie che trovi per Arduino, normalmente, già fanno ciò.

Su Arduino NON esiste il multitasking quindi NON esiste che "contemporaneamente" possano avvenire più cose.

Guglielmo

AleDi2:
Inizierei col primo, e finito il primo farei il secondo.

Non è quello che ti ho chiesto io, ma ci stai arrivando....

Intendi proprio il codice?

Per quel che dice gpb01, sapevo già che HIGH è inutilizzato e LOW è interrogato... E che non è multitasking

Se intendi il codice, farei così:

digitalWrite(S1, LOW);
digitalWrite(S2, HIGH);
//tutto ciò che riguarda la comunicazione
digitalWrite(S1, HIGH);
digitalWrite(S2, HIGH);

Non saprei cosa intendi se non questo...
Detto ciò... Come devo procedere?

Pensavo anche di associare HIGH e LOW ad una variabile che diventa 0 o 1, e, ad esempio:

if (b == 0){
a = 1;
}
else if (a == 0){
b = 1;
}

AleDi2:
Detto ciò... Come devo procedere?

Ancora ? ? ? :o :o :o

Procedi come ti è stato ampiamente detto e spiegato ... (non possiamo scrivere noi il codice per te) !

E se usi le librerie per gestire le varie cose ... t'ho già detto che fanno tutto loro.

Guglielmo

Ancora??? Se non sbaglio ho detto che NON ho capito ciò che intendeva lui, sicuramente meno impaziente...
Non puoi cercare di capire che ci sto provando? Se non sbaglio ho anche scritto un codice su come farei, in modo sintentico, per gestire i pin SS.
E poi capisco, non serve mettere il grassetto. Su internet lo chiamano linguaggio web: come con il maiuscolo, che significa urlare, il grassetto non viene visto come una maniera tranquilla di comunicare.
Io son fatto così, e non pretendo che tu cambi in base a ciò che voglio, ma vorrei solo un attimo di rispetto, così si chiama a casa mia. Non pretendo altro che RISPETTO per ciò che penso, anche perché ti avevo già fatto notare che il modo in cui ti approcci con me viene visto da me come modo non cortese, perché io son fatto così.
Per favore, non chiedo altro che rispetto e pazienza.
Ripeto che sto provando a capire da solo lo SPI, e ringrazio per l'aiuto, ma dire "cerca di capire ciò che diciamo" oppure "fattelo da solo, perché non siamo qui a scrivere il codice per te", non lo vedo d'aiuto, ma, soprattutto la seconda, come offesa, in quanto non ho MAI, e dico MAI, chiesto il codice bello che pronto.

Una piccola ed ultima cosa: se il problema persiste, perché per me è un problema, non ho problemi (scusate la ripetizione) ad andarmene dal forum, facendovi però notare una cosa:
Il forum è nato per aiutare, non per creare differenze e dire frasi poco carine, mai dette dal diretto interessato.

Ascolta, a me della net-etiquette frega poco o nulla, ed uso sempre il grassetto (... e spesso anche il maiuscolo) per portare l'attenzione del lettore su cose ben precise, ad esempio, nel tuo caso, che ti abbiamo detto più volte che i pin SS devono stare HIGH e che devi portare LOW, solo per il tempo necessario, il pin SS del device con cui vuoi parlare.

Ti è stato anche detto che le librerie fanno ciò da sole e che quindi non te ne devi preoccupare e, dato che immagino tu utilizzi per quei moduli librerie già fatte (senza reinventare l'acqua calda), non te ne devi preoccupare perché le varie chiamate ai vari metodi delle librerie alzano ed abbassano il pin SS del device interessato.

Chiarito tutto ciò, cosa altro c'è esattamente da spiegare ? ? ? :o

Guglielmo

gpb01:
Ascolta, a me della net-etiquette frega poco o nulla, ed uso sempre il grassetto (... e spesso anche il maiuscolo) per portare l'attenzione del lettore su cose ben precise, ad esempio, nel tuo caso, che ti abbiamo detto più volte che i pin SS devono stare HIGH e che devi portare LOW, solo per il tempo necessario, il pin SS del device con cui vuoi parlare.

Ti è stato anche detto che le librerie fanno ciò da sole e che quindi non te ne devi preoccupare e, dato che immagino tu utilizzi per quei moduli librerie già fatte (senza reinventare l'acqua calda), non te ne devi preoccupare perché le varie chiamate ai vari metodi delle librerie alzano ed abbassano il pin SS del device interessato.

Chiarito tutto ciò, cosa altro c'è esattamente da spiegare ? ? ? :o

Guglielmo

C'è da spiegare il fatto che, alcuni moduli (shift register) NON li uso con le librerie, e quindi li attivo io da codice. Quindi, la possibilità di scontro con altri moduli c'è.
Detto ciò, affermi che le librerie gestiscono l'attivazione dei pin SS e che, se un modulo è LOW, le librerie lo riconoscono, e gli altri moduli di conseguenza non vanno a LOW anche se dovrebbero?

Sia tu che le librerie venite eseguiti SEQUENZIALMENTE (e non parallelamente, né in multitask) ...

...detto questo ogni volta che qualcuno fa una cosa (tu o una libreria), dato che le cose NON possono essere contemporanee, abbassa il pin SS, fa quello che deve fare e lo rialza, quindi NON ci posono essere mai due pin di SS contemporaneamente a LOW.

Se la cosa avviene significa semplicemente che il software è scritto male (c'è un grave errore) e che qualcuno si è scordato, dopo aver fatto quello che deve fare, di riportare HIGH il pin di SS.

Guglielmo

Un poco confuso, temo
Se gestisco un modulo per volta, chi attiverebbe gli altri?

gpb01:
Sia tu che le librerie venite eseguiti SEQUENZIALMENTE (e non parallelamente, né in multitask) ...

...detto questo ogni volta che qualcuno fa una cosa (tu o una libreria), dato che le cose NON possono essere contemporanee, abbassa il pin SS, fa quello che deve fare e lo rialza, quindi NON ci posono essere mai due pin contemporaneamente a LOW.

Se la cosa avviene significa semplicemente che il software è scritto male (c'è un grave errore) e che qualcuno si è scordato, dopo aver fatto quello che deve fare, di riportare HIGH il pin di SS.

Guglielmo

Effettivamente non ho pensato al fatto che, avendo diviso in loop più piccoli i vari compiti da fare, risulta impossibile che vadano a scontrarsi...
Io ho fatto così praticamente:

void loop() {
Led();
RfidModule();
GSMModule();
//ecc ecc... 
} 

void Led() {
//codice
} 
void RfidModule() {
//codice
} 
void GSMModule() {
//codice
}

È così via...
Quindi, se scrivo bene il codice, tutto ciò risulta a posto

AleDi2:
... se un modulo è LOW, le librerie lo riconoscono, e gli altri moduli di conseguenza non vanno a LOW anche se dovrebbero?

NO, come detto nessuno riconosce nulla perché ogniuno ha il DOVERE di tenere il pin SS ad HIGH, portarlo a LOW solo per fare l'operazione richiesta e, subito dopo, riportarlo ad HIGH quindi ... non ci possono essere mai due pin SS a LOW, altrimenti qualcuno sta sbagliando il programma.

Guglielmo

AleDi2:
Quindi, se scrivo bene il codice, tutto ciò risulta a posto

Non è che hai molte altre possibilità ...
... utilizzerai una periferica, poi un'altra, poi un'altra ancora e così via ... ciascuna inizialmente avrà il pin SS a HIGH, lo porterà a LOW per fare quanto gli richiedi e lo riporterà subito ad HIGH.

Dove non usi librerie dovrai essere tu a ricordarti di fare questa cosa prima di chiamare altre funzioni/metodi.

Guglielmo

Ottimo, grazie mille.
Mi ero perso il fatto che va in sequenza.