Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

ADXL345 SPI

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] ADXL345 SPI

Messaggioda Foto Utentealle96 » 15 feb 2015, 10:41

Salve a tutti,
Sto provando a collegare la scheda ADXL345(accelerometro) con il PIC18F4550.
I collegamenti sono MOSI -> RD7, MISO -> RB0, SCK -> RB1, SS -> RB2.
Entrambe le schede sono alimentate a 3,3v per cui come valori di segnali in uscita dovrebbero essere perfettamente compatibili(correggetemi se sbaglio). Il PIC lavora come Master mentre L'ADXL è lo Slave.
Il codice sembra non funzionare in nella comunicazione SPI in generale, il codice per scrivere un dato e ottenere una risposta è il seguente:
Codice: Seleziona tutto
unsigned char ID = 0;
        //ADXL_Init();
        SS = 0;
        SSPBUF = 0x00; //scrivo l'adress
        while(!PIR1bits.SSPIF); //aspetto la fine della trasmissione
        SSPIF = 0; //azzero il flag
        SSPBUF = 0x00; //scrivo dati a caso per ottenere la risposta con lo shifting del reg
        while(!PIR1bits.SSPIF); //aspetto
        SSPIF = 0; //azzero
        ID = SSPBUF;
        SS = 1;


l'inizializzazione invece è
Codice: Seleziona tutto
SSPSTATbits.SMP = 0; //data sampled at middle of clock
    SSPSTATbits.CKE = 0; //idle to active clock state
    SSPCON1bits.WCOL = 0; //no collision
    SSPCON1bits.SSPEN = 1; //enable spi

    MOSI = 0; //output
    MISO = 1; //input
    SCK = 0; //output
    SS = 0; //output

    SSPCON1bits.CKP = 0; //idle state is low

    /*FOSC/4*/
    SSPCON1bits.SSPM0 = 0;
    SSPCON1bits.SSPM1 = 0;
    SSPCON1bits.SSPM3 = 0;


Purtroppo ricevo sempre 0x00 quindi credo non funzioni...voi vedete qualche errore che non ho notato?
Grazie per l'aiuto O_/
Avatar utente
Foto Utentealle96
15 4
 
Messaggi: 47
Iscritto il: 21 feb 2012, 16:21

0
voti

[2] Re: ADXL345 SPI

Messaggioda Foto UtenteWALTERmwp » 15 feb 2015, 18:48

alle96 ha scritto:Purtroppo ricevo sempre 0x00
... ma sei certo di ricevere ?
Premetto di non avere guardato le caratteristiche dell'oggetto ma tu dovresti averlo fatto quindi mi chiedo quale sia il (o uno dei) messaggio(i) che l'accelerometro può interpretare.
Non sarebbe male nemmeno "vedere" lo schema che, almeno, riporta il collegamento tra il microcontrollore e la schedina.

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8986
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[3] Re: ADXL345 SPI

Messaggioda Foto Utentealle96 » 15 feb 2015, 20:22

No, purtroppo non sono certo di ricevere #-o
I collegamenti fatti, gli unici sulla scheda alimentazioni (a 3,3v) escluse sono quelle indicate con MISO MOSI SS e SCK. Il dato che in teoria riceve e dovrebbe capire sarebbe il primo 0x00 che corrisponde al proprio device id (del accelerometro) e può essere letto senza essere inizializzato. Il secondo dato è casuale io ho messo 0x00 come potevo mettere 0xDF, quel dato serve solo per avviare il data shifting dei registri SSPBUF del PIC e del ADXL.
Io non sono certo di tutto questo per ciò mi sto affidando al vostro forum, per consigli e correzzioni, quindi vorrei sapere in linea teorica il mio ragionamento è giusto? scrivo un dato che lo slave capisca, aspetto e poi scrivo un altro dato a caso per lo shift? dovrebbe andare bene?

Grazie per il vostro aiuto O_/
Avatar utente
Foto Utentealle96
15 4
 
Messaggi: 47
Iscritto il: 21 feb 2012, 16:21

0
voti

[4] Re: ADXL345 SPI

Messaggioda Foto UtenteWALTERmwp » 15 feb 2015, 23:04

Ti anticipo una risposta ma da ignorante perché, come prima, ancora ignoro le caratteristiche della schedina dell'accelerometro (mi riprometto di andare a curiosare).

Lo 0x00 ha tanto la "faccia" dell'indirizzo di broadcasting.
alle96 ha scritto:quel dato serve solo per avviare il data shifting dei registri SSPBUF del PIC e del ADXL.
... questo non ho capito cosa significhi.
Il codice che hai riportato, in mancanza delle informazioni alle quali ho fatto riferimento prima, serve a poco.
Probabilmente tu hai collegato correttamente ma, mi ripeto, se riporti lo schema come ti ho già suggerito, può essere solo di aiuto.
L'alimentazione, sia positivo che negativo, è comune ai due (micro e ADXL345) ?

Hai scritto un cosa ("ricevo" ...) come per certa ma in pratica non è risultata tale.
Quanto sopra non per far pesare chissà che cosa ma semplicemente per invitarti ad essere più attento e completo nella tua esposizione.

Per il disegno (basta davvero poco) si usa FidoCadJ e se apri il menu a tendina dell'Help trovi gli articoli ed i riferimenti per scaricarlo e utilizzarlo; se a tal proposito hai qualche difficoltà faccelo sapere.

Saluti

p.s.
... nel codice, tra l'altro, non mi pare ci sia la parte di ricezione, o mi sbaglio ?
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8986
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[5] Re: ADXL345 SPI

Messaggioda Foto Utenteboiler » 15 feb 2015, 23:49

Hai un oscilloscopio per guardare cosa passa su MISO e MOSI?

Boiler
Avatar utente
Foto Utenteboiler
26,4k 5 9 13
G.Master EY
G.Master EY
 
Messaggi: 5600
Iscritto il: 9 nov 2011, 12:27

0
voti

[6] Re: ADXL345 SPI

Messaggioda Foto Utentealle96 » 16 feb 2015, 15:00

Rispondo subito a Boiler dicendo che no, purtroppo non ho un oscilloscopio :oops:
Per quanto riguarda il resto mi scuso se sono stato poco chiaro.

La comunicazione SPI, da quel che ho capito, si basa su due registri, uno interno al PIC o al master e uno interno all'ADXL o slave. Quando viene caricato un dato nel buffer dedicato al registro per la ricezione/trasmissione il dato del buffer viene caricato nel registro e per ogni impulso di clock, sia lo slave sia il master invia il primo degli 8 bit che compongono il registro, ed entrambi scrivono il bit che è arrivato nel rispettivo SDI nel bit vuoto del registro(vuoto perché è stato inviato). Come degli shift register. Quanto detto è giusto? perché il programma si basa su questo data shift dei registri.

Se questo dovesse essere giusto allora io scrivo prima 0x00 che corrisponde al Device ID dell'ADXL e riceverò qualcosa che è casuale o è rimasto precedentemente nei registri dell'ADXL(ricevo sempre per il data shifting) e in seguito invierò un dato qualunque solo per utilizzare questo data shifing ed ottenere quindi sul mio buffer ciò che corrisponde all'indirizzo 0x00.

Questo era il mio ragionamento che però non funziona vorrei sapere dove ho sbagliato. Per quanto riguarda lo schema non la vedo come parte molto importante perché a me serve più che altro sapere se il ragionamento che ho fatto (fuori da questo specifico caso) è giusto o se c'è qualche toppa.

Vi ringrazio per la pazienza e spero di essere stato più chiaro :ok:
Avatar utente
Foto Utentealle96
15 4
 
Messaggi: 47
Iscritto il: 21 feb 2012, 16:21

0
voti

[7] Re: ADXL345 SPI

Messaggioda Foto UtenteWALTERmwp » 16 feb 2015, 15:08

alle96 ha scritto:Vi ringrazio per la pazienza e spero di essere stato più chiaro
prego figurati ma non hai aggiunto nulla in più rispetto a prima.

Se lo schema non lo ritieni pertinente è una tua considerazione, del tutto rispettabile ma, a questo punto, nella mia semplicità ti suggerisco di ri-leggerti (o leggerti) con attenzione il datasheet del digital accelerometer e del PIC, nello specifico per quanto riguarda la periferica MSSP (pag.193).

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8986
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino


Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 5 ospiti