Buonasera a tutti, come da titolo sto riscontrando un problema nell'usare l'Arduino UNO collegato in SPI con più slave (2 PN532, 1 lettore microSD).
Il problema sarebbe che se collegati insieme (il PN532 ed il lettore microSD) non funzionano, o meglio nel programma riesco ad inizializzare uno solo se stacco l'altro.
Invece, se uso solo i due moduli PN532 o solo il lettore microSD funziona tutto a meraviglia.
Io ed il mio compagno pensiamo che possa essere un problema dell'ordine di lettura dei bit, che nella libreria che usiamo (che si trova qui) legge partendo dall'LSB, mentre per la gestione della SD ci affidiamo ad SD.h di cui non riusciamo a trovare molte informazioni Googlando (ma secondo me anche per il clock diverso che però mi sa che viene gestito localmente nelle librerie).
Qualcuno sarebbe in grado di darci una mano a risolvere questo problema?
e le abbiamo richiamate in ogni metodo della nostra classe prima di eseguire le operazioni di lettura, scrittura e di verifica se il tag era presente, e per ora funziona tutto.
... mmm ... se non sbaglio, quasi tutti i moduli SPI (inclusa la SD) vogliono MSBFIRST mentre vedo che la libreria per il 532 imposta LSBFIRST ... occorre quindi fare le impostazioni della SPI con la SPISettings.
Prova a leggere QUI, c'è proprio un esempio di questo tipo.
Altrimenti, visto che quei moduli hanno anche il bus I2C, usateli su I2C e lasciate su SPI solo la SD.
gpb01:
... mmm ... se non sbaglio, quasi tutti i moduli SPI (inclusa la SD) vogliono MSBFIRST mentre vedo che la libreria per il 532 imposta LSBFIRST ... occorre quindi fare le impostazioni della SPI con la SPISettings.
Prova a leggere QUI, c'è proprio un esempio di questo tipo.
Altrimenti, visto che quei moduli hanno anche il bus I2C, usateli su I2C e lasciate su SPI solo la SD.
Guglielmo
L'ideale per noi sarebbe usare il protocollo SPI perché è l'unica che supporta anche Android (come viene riportato nel datasheet) oltre all'HSU, che però ci porterebbe via dei PIN che ci servono.
Ho provato a usare SPISetting nel setup() e non funziona (potrebbe essere che vadano modificate le librerie con SPISetting impostato manualmente da me?).
Hai letto il link che ti ho dato? li si vede come fare e ... SI, probabilmente, seguendo quello che c'è scritto li, ocorrerà forse modificare le librerie o, magari, aggiungere un metodo per cambiare le impostazioni.
gpb01:
Hai letto il link che ti ho dato? li si vede come fare e ... SI, probabilmente, seguendo quello che c'è scritto li, ocorrerà forse modificare le librerie o, magari, aggiungere un metodo per cambiare le impostazioni.
Guglielmo
Sì sì, l'avevo letto, però nel datasheet viene riportato che il bit order per il PN532 è per forza LSBFIRST. Avresti qualche consiglio su come aggirare questo problema via software? O anche hardware.
This can be used to define a SPI device interaction in your Arduino code, and is the system that allows you to change the way you interact with devices on the fly, by having preset definitions for speed, bit order and SPI Mode using the configuration values above. For example, let’s say you had two chips: the Rheingold RH805 Framistat, and the Rheingold RH764 Combobulator. Looking at the datasheets, the RH805 is a MSB first device that likes SPI Mode 2, while the RH764 is an LSB first device that likes SPI Modes 0 and 3. Both are capable of 4 Mhz speeds. You would define them in the declarations area of your sketch like this…
e le abbiamo richiamate in ogni metodo della nostra classe prima di eseguire le operazioni di lettura, scrittura e di verifica se il tag era presente, e per ora funziona tutto. Ora dovremmo implementare gli interrupt sul bus SPI, se qualcuno riesce a darci qualche dritta ci farebbe un grande favore, intanto guardo online cosa riesco a trovare
Aggiornamento:
Guardando online ho trovato solo un paio di thread in cui consigliavano l'uso del pin IRQ, solo che non riesco a trovare documentazioni complete a riguardo...
Aggiornamento 2:
Abbiamo fatto delle prove usando attachInterrupt() prendendo il PIN IRQ (perché è attivo basso) di un lettore e non funziona, perciò per ora faremo tutto in polling, se qualcuno ha una soluzione a questo problema non esiti a scrivere
gpb01:
In che senso? Cosa vorresti fare con interrupts? Spiega ...
Guglielmo
Vorremmo che quando appoggiamo il tag sul lettore NFC lui faccia partire una routine in cui fa alcune query ad un database e delle operazioni di scrittura su SD. Solo che a quanto pare con questi due moduli l'interrupt si può implementare solo tramite l'uso del pin IRQ che però funziona solo in I2C.
Solo che, essendo che i due moduli condividono lo stesso indirizzo non possiamo collegarli in I2C.
c3n21:
Solo che a quanto pare con questi due moduli l'interrupt si può implementare solo tramite l'uso del pin IRQ che però funziona solo in I2C.
Spiegami, il pin IRQ NON genera nulla se si seleziona SPI e genera un segnale solo se si sceglie I2C o ... comunque genera un segnale e voi non sapete come usarlo?
gpb01:
Spiegami, il pin IRQ NON genera nulla se si seleziona SPI e genera un segnale solo se si sceglie I2C o ... comunque genera un segnale e voi non sapete come usarlo?
Guglielmo
Esatto. In SPI non genera nulla, o almeno nulla che possa essere misurato dal multimetro. Non abbiamo provato in I2C per il motivo sopra degli indirizzi però stando a quanto si dice nei forum pare che funzioni solo con I2C.
Allora NON vedo alcuna soluzione ... l'SPI è un bus in cui il colloquio deve essere iniziato dal master e ... qualcuno lo deve avvertire il master :
Dovete trovare il modo di generare un segnale all'avvicinarsi della tessera ... ad esempio un rivelatore di prossimità ad infrarossi o una cosa di simile.
gpb01:
Allora NON vedo alcuna soluzione ... l'SPI è un bus in cui il colloquio deve essere iniziato dal master e ... qualcuno lo deve avvertire il master :
Dovete trovare il modo di generare un segnale all'avvicinarsi della tessera ... ad esempio un rivelatore di prossimità ad infrarossi o una cosa di simile.