uM FPU non riconosciuta (SPI)

Sto cercando di interfacciare una FPU (questa) con Arduino Due tramite SPI.
La Fpu è alimentata tramite 3.3V (presi da Arduino) e riesco a gestirla tramite RS232 (ho infatti aggiunto a parte un MAX3232 per la comunicazione seriale) e l’IDE dedicato. Tuttavia non riesco in alcun modo a farla comunicare con la scheda Arduino.
Il codice che ho usato è il più semplice possibile, fatto giusto per vedere se il collegamento viene stabilito.

#include <SPI.h>
#include <Fpu.h>
#include <FpuSerial.h>

void setup() {
  Serial.begin(9600);
  
  SPI.begin(52);
  Fpu.begin(52);
  
  if (Fpu.sync() == SYNC_CHAR)
  {
    FpuSerial.printVersion();
    Serial.println();
  } else {
    Serial.print("uM-FPU not detected");
    while(1) ;
  }
}

void loop() {
}

Il pin CS della Fpu è collegato al 52 di Arduino. Ho provato anche con il pin di default, il 10, ma non cambia niente.
I pin della Fpu relativi all’interfaccia SPI sono collegati ai pin presenti al centro di Arduino (MOSI, MISO, SCK), come indicato in fondo a pagina 5 del datasheet

Se qualcuno mi può aiutare ne sarei grato, non so più cosa fare.

Michele

visto che usa delle librerie dedicate, hai provato a collegarla ad una UNO ?
Poca roba e' compatibile con la DUE

Brunello:
visto che usa delle librerie dedicate, hai provato a collegarla ad una UNO ?
Poca roba e' compatibile con la DUE

Purtroppo non sono in possesso della Uno. Ci sono dei valori in particolare che posso controllare / modificare manualmente nella libreria dedicata? Non so, tipo clock divider o parametri simili

EDIT:
All'interno della libreria della FPU ho modificato i seguenti valori relativi ai pin dell'interfaccia SPI, adeguandoli alla Due. Continua però a non funzionare

#define SCK_PIN   76
#define MISO_PIN  74
#define MOSI_PIN  75

Ma sei sicuro che le librerie da usare sono adatte per Arduino DUE?
L' hai letto da qualche parte?
Ciao Uwe

Io ho la versione a 64bit e, con la UNO, non c'è alcun problema.

Ti sei studiato il [datasheet](http://micromegacorp.com/downloads/documentation/uMFPU-V3_1 Datasheet.pdf), controllato le [release notes](http://micromegacorp.com/downloads/documentation/uMFPU-V3_1 Release Notes.pdf) e le varie application notes ?

Guglielmo

uwefed:
Ma sei sicuro che le librerie da usare sono adatte per Arduino DUE?
L' hai letto da qualche parte?
Ciao Uwe

In effetti non ho letto da nessuna parte della compatibilità con la Due. Il funzionamento a 3.3V non credo sia un problema in quanto lo stesso datasheet ne riporta il funzionamento a quella tensione (seppur abbassando il clock a 14MHz).
Inoltre, facendola lavorare tramite SPI, non mi sono posto tropp i problemi riguardo alla compatibilità (e di questo me ne faccio una colpa).

gpb01:
Io ho la versione a 64bit e, con la UNO, non c'è alcun problema.

Ti sei studiato il [datasheet](http://micromegacorp.com/downloads/documentation/uMFPU-V3_1 Datasheet.pdf), controllato le [release notes](http://micromegacorp.com/downloads/documentation/uMFPU-V3_1 Release Notes.pdf) e le varie application notes ?

Guglielmo

Ho letto il datasheet e i vari documenti più e più volte e non credo di aver sbagliato i collegamenti (appena ho il PC sottomano faccio uno schema con Fritzing, se riesco).

Smicuz96:
Ho letto il datasheet e i vari documenti più e più volte e non credo di aver sbagliato i collegamenti (appena ho il PC sottomano faccio uno schema con Fritzing, se riesco).

In tutti i casi non avrai nessun vantaggio utilizzando quei chip con la DUE visto che questa scheda Arduino utilizza un processore con core ARM Cortex M3 @84 MHz che è di gran lunga più performante dei PIC18LF utilizzati per quelle FPU.
Detto in altri termini, qualunque calcolo esegui nativamente sulla DUE richiede meno tempo che farlo tramite quelle FPU.

astrobeed:
In tutti i casi non avrai nessun vantaggio utilizzando quei chip con la DUE visto che questa scheda Arduino utilizza un processore con core ARM Cortex M3 @84 MHz che è di gran lunga più performante dei PIC18LF utilizzati per quelle FPU.

Forse, l’unico vantaggio che potrebbe avere, è il parallelismo. Mi spiego …

… in quel PIC puoi installare un tuo codice che effettua tutta una serie di operazioni e ti restituisce il risultato, quindi, ove occorre, tu potresti continuare a fare quello che vuoi mentre quello effettua i calcoli.

Sono casi un po’ limite dove, appunto, operazioni parallele sono possibili ed accelerano il processo globale.

Guglielmo

Infatti l'utilizzo da me previsto è l'analisi, fatta in parallelo, dei dati forniti da un ricevitore GPS collegato tramite RS232.
Solo che poi, non essendo la FPU correttamente rilevata, non riesco a passare i dati, frutto di alcuni calcoli, ad Arduino.

Smicuz96:
Infatti l'utilizzo da me previsto è l'analisi, fatta in parallelo, dei dati forniti da un ricevitore GPS collegato tramite RS232.

Allora ti dico subito che con quella fpu non ci fai nulla visto che l'analisi dei dati GPS richiede l'utilizzo dei double (64 bit), con i normali float introduci errori notevoli nei calcoli per via della scarsa risoluzione.

astrobeed:
Allora ti dico subito che con quella fpu non ci fai nulla visto che l'analisi dei dati GPS richiede l'utilizzo dei double (64 bit), con i normali float introduci errori notevoli nei calcoli per via della scarsa risoluzione.

Non ho la necessita di una grande precisione, per quello posso commutare direttamente il ricevitore verso Arduino. L'importante però è che riesca a farli comunicare, anche perché mi dispiacerebbe assai dovervi rinunciare

Per curiosità ... hai provato a comunicarci via I2C ?

E in ogni caso, puoi mettere una foto (possibilmente nitida) dei collegamenti che hai fatto ? ... più occhi vedono meglio di due :wink:

Guglielmo

gpb01:
Per curiosità ... hai provato a comunicarci via I2C ?

E in ogni caso, puoi mettere una foto (possibilmente nitida) dei collegamenti che hai fatto ? ... più occhi vedono meglio di due :wink:

Guglielmo

Ho provato a fare due foto, ma avendo saldato tutto sulla protoshield (su cui sono presenti anche altri elementi relativi allo stesso progetto), non so fino a che punto si capisca. Comunque ho controllato anche una ad una tutte le saldature e non mi pare ci siano problemi.
Ho indicato a mano i pin della FPU e dell'interfaccia SPI per capire un po' i collegamenti. Lascia stare i due connettori e lo switch (i connettori non sono coinvolti e lo switch cambia semplicemente la destinazione della porta rs232).


Riassumo in modo un po' più chiaro le connessioni tra i pin:
1 (Fpu) --> 3.3V
4 (Fpu) --> 10 / 52 (Arduino) (per le prove di adesso sto usando il 10)
11 (Fpu) --> 74 (MISO) (Arduino)
12 (Fpu) --> 75 (MOSI) (Arduino)
13 (Fpu) --> GND
14 (Fpu) --> 3.3V
16 (Fpu) --> 76 (SCK) (Arduino)
17 (Fpu) --> GND
18 (Fpu) --> 3.3V

Nel caso in cui non si capisse niente nelle foto (molto probabile), queste sono le foto senza scritte:
fronte
retro

Ho dimenticato di chiederti ...
... naturalmente tu hai configurato il chip per lavorare in "SPI Bus Interface" vero ? :smiley:

Guglielmo

gpb01:
Ho dimenticato di chiederti ...
... naturalmente tu hai configurato il chip per lavorare in "SPI Bus Interface" vero ? :smiley:

Guglielmo

Si. L'unico problema dell'IDE della FPU è che mi dà, in seguito ad ogni modifica, un "Programmig error". Però, di fatto, le funzioni da me scritte vengono inserite e la configurazione per l'SPI viene salvata (mi viene proprio specificato SPI quando mando una richiesta alla Fpu per il controllo della versione). Credo sia un bug dell'ide.

Mmm ... i collegamenti sembrano giusti, la modalità SPI Bus Interface (mi raccomando quella) dici di averla impostata ... resta solo il dubbio che ci sia un incompatibilità con la DUE a livello di librerie (... o/e di tempistiche) ...

Purtroppo, per "tagliare la testa al toro" ... ti serve un Arduino UNO su cui provare. Amici che possono prestartelo ? :roll_eyes:

Guglielmo

gpb01:
Mmm ... i collegamenti sembrano giusti, la modalità SPI Bus Interface (mi raccomando quella) dici di averla impostata ... resta solo il dubbio che ci sia un incompatibilità con la DUE a livello di librerie (... o/e di tempistiche) ...

Purtroppo, per "tagliare la testa al toro" ... ti serve un Arduino UNO su cui provare. Amici che possono prestartelo ? :roll_eyes:

Guglielmo

Ho appena controllato e confermo di aver impostato l'opzione "SPI Interface". Le sole altre due opzioni sono "CS pin selects interface" e "I2C interface (CS pin ignored)", a cui corrispondono ovviamente differenti schemi di collegamento.
Purtroppo vedo piuttosto difficile il procurarmi una Uno, in quanto nessuno che conosca di persona ne è in possesso... Se prendessi, giusto per provare, una Uno compatibile?
Prima di fare ulteriori acquisti, mi sai suggerire qualche parametro su cui posso intervenire nelle librerie?
A pagina 7 del datasheet è riportato uno schema con delle tempistiche riguardanti l'SPI. Può essere utile?

EDIT:
ho provato a modificare il clock divider per rendere il segnale SCK della stessa frequenza di quello fornito dalla Uno alla Fpu (4 MHz, con SPI_CLOCK_DIV4). Nel file Fpu.cpp ho pertanto modificato

SPI.setClockDivider(SPI_CLOCK_DIV4);

in

SPI.setClockDivider(SS_PIN, 21);

La situazione rimane invariata :frowning:

Smicuz96:
Ho appena controllato e confermo di aver impostato l'opzione "SPI Interface". Le sole altre due opzioni sono "CS pin selects interface" e "I2C interface (CS pin ignored)", a cui corrispondono ovviamente differenti schemi di collegamento.

... guardando pagina 16 del datasheet, devi aver programmato i bit 1 e 0 del byte 0 del Mode con il bit 1 a 1 ed il bit 0 a quello che vuoi.

Guglielmo

Ho controllato i bit di configurazione ed è esattamente come da te riportato. Con attivati Idle mode, sleep mode e SPI mode il primo byte è impostato su 1B.

Smicuz96:
Se prendessi, giusto per provare, una Uno compatibile?

Direi che ti può sicuramente essere utile in tanti altri casi in cui dovrai verificare compatibilità e quant'altro ... :wink:

Guglielmo

*P.S. : Al momento sono a corto di altre idee ... * ::slight_smile: