Home Forum MICROCONTROLLORI Implementazione SPI Hardware

Questo argomento contiene 6 risposte, ha 4 partecipanti, ed è stato aggiornato da  giazax 2 anni, 2 mesi fa.

Stai vedendo 7 articoli - dal 1 a 7 (di 7 totali)
  • Autore
    Articoli
  • #59154

    giazax
    Partecipante

    Salve a tutti,
    dovrei interfacciare un pic18f con una scheda della ASD, su cui sono presenti ben tre sensori, il protocollo di comunicazione tra PIC e Scheda è SPI, mentre la “modalità SPI è TBD” (qualcuno può chiarirmi cosa significa esattamente?)…per poter interagire con la scheda ho dei “codici comando” con una descrizione di questo tipo

    tipo comando codice comando origine Dati
    Lettura sensore T1 0x0a Master nessuno
    Risposta lettura sensore T1 0x0a Slave Temperatura

    Il mio compilatore è il c18 per poter leggere il dato temperatura devo inviare DUE COMANDI (della libreria c18) uno dopo l’altro (ad esempio utilizzando la writeSWSPI) e poi per leggere il mio dato devo andare a vedere i bit del MISO?

    grazie per i vostri suggerimenti

    #71798
    Piero Boccadoro
    Piero Boccadoro
    Partecipante

    Una domanda: posso sapere dove hai trovato tbd?
    Perchè la mia prima reazione sarebbe dirti che vuol dire “To-Be-Defined”, visto che si tratta di una sigla standard ISO 639-3…

    Le tra righe “tipo comando …. Temperatura” sono testo scritto in una tabella, vero? Potresti postare da dove l’hai presa? Magari così è più facile darti una mano.

    #71799

    giazax
    Partecipante

    salve,
    tbd era su un documento…che poi sono un paio di fogli che poi mi e’ stato dato…..chiedendo in giro mi e’ stato detto che devo usare le funzioni spi del compilatore c18…..e no il bit banging…..quello che non capisco e’ che la funzione readspi legge solo un byte…mentre il mol dato e’ composto da 4 byte….come faccio a leggerlo con questa funzione? perche’ non posso usare il bit banging?

    grazie per i suggerimenti

    #71800

    Emanuele
    Keymaster

    Il fatto che la SPI sia in modalità TBD lo trovo abbastanza preoccupante in quanto TBD significa appunto ToBeDefined. Per quanto riguarda la SPI se ti metti in modalità master decidi tu cosa fare, ma bisognerebbe capire meglio le specifiche TBD del dispositivo :)

    Considera che la SPI in C18 può essere CON o SENZA periferica e che per una verifica dovresti dare anche un’occhiata all’assembler ed infine:

    si, puoi usare il bit banging e farti la routine di ricezione a mano (in assembler). Questa ultima potrebbe essere necessaria se il dispositivo utilizza una SPI anomala (forse proprio per queto è TBD???)

    #71801

    giazax
    Partecipante

    …la routine l’ho fatta in c, ma se uso le funzioni della lbreria del c18 potrei utilizzare una cosa del tipo :
    writespi(istruzione di lettura sensore)
    dato1 = readspi()
    dato2 = readspi()
    dato3 = readspi()
    dato4 = readspi()

    poiche il dato in uscita e’ di 4 byte, di cui il primo e proprio l’istruzione data, il 2 e il 3 sono i 16 bit della misura, mentre il 4 e il crc calcolato sui primi 3 …..? oppure devo pulire il registro di scorrimento del pic (16f8723)?….oppure non ho capito nulla?

    grazie per il tuo aiuto

    #71804

    MIMMO_INT.C
    Membro

    Buona sera a tutti!
    Concordo con quanto detto da Emanuele. Bisognerebbe conoscere le specifiche della scheda per valutare al meglio le modalità di comunicazione.
    Premetto che non ho ancora avuto modo di cimentarmi praticamente con il modulo MSSP dei microcontrollori Microchip.
    Posso solo darti alcuni suggerimenti facilmente reperibili in rete.
    Quando usi il modulo MSSP in modalità SPI, devi smanettare con quattro registri. Due registri di configurazione:
    – SSPCON1 (registro di controllo)
    – SSPSTAT (registro di stato)
    e altri due registri:
    – SSPBUF (buffer register)
    – SSPSR (shift register non direttamemte accessibile)
    Per far partire la comunicazione con il dispositivo Slave, il Master (il PICmicro in questo caso) deve scrivere un dato fittizio nel registro SSPBUF, in modo da innescare gli impulsi di clock (ovviamente il Master comanda la comunicazione). Ogni colpo di clock corrisponde a un bit trasmesso. Il formato dei dati dipende dalle specifiche dettate da una delle periferiche in gioco.
    Un generico dato RICEVUTO dal registro SSPSR (bit a bit), viene copiato nel registro SSPBUF e viene generato un interrupt (il bit SSPIF assume lo stato logico 1). Questo può tornarti utile in qualche modo.
    Altra cosa importante: quando l’intero byte viene trasferito nel registro SSPBUF, viene portato a 1 anche il bit BF (Buffer Full). Questo bit bisogna testarlo ognoqualvolta si voglia trasmettere un dato, evitando problemi di “collisione”. In pratica, se il buffer è pieno (BF è uguale a 1) non si possono inviare dati DAL master, perché i dati trasmessi transitano anch’essi dal registro SSPBUF. In merito a tale problema, un ulteriore bit si porta a 1 per segnalare il DISASTRO: il bit WCOL (Write COLlision detect). Se WCOL vale 1, viene bloccata la richiesta di trasmissione del dato. WCOL va azzerato via software!
    Un’ultima cosa, importantissima! In ricezione, se il buffer presenta dei dati validi, un semplice accesso in lettura a SSPBUF permette automaticamente di azzerare il bit BF, in modo tale da predisporre il modulo MSSP alla successiva ricezione o trasmissione del nuovo dato.
    Puoi eseguire tale operazione attraverso un’istruzione simile alla seguente:

    temp = SSPBUF; // Leggo dal registro SSPBUF e copio il contenuto
    // nella variabile temp.
    // Il bit BF viene portato a 0.

    La routine per leggere il dato (da te scritta) potrebbe essere corretta (potrebbe!). Bisogna vedere in che modo vengono trasmessi quei 4 byte. Se fosse necessario un intervento in trasmissione da parte del Master per ricevere i 4 byte (magari dopo il primo), allora sarebbe il caso di adottare un accorgimento simile a quello sopra riportato.
    Purtroppo non ho mai “giocato” con questi registri e con la libreria spi del C18. Spero comunque di esserti stato di aiuto.
    Ti riporto le fonti dalle quali ho reperito le informazioni sopra riportate:

    – Pillole di Microcontrollori PIC (Paolo Rognoni – INWARE edizioni)
    – SD Card Projects using the PIC Microcontroller (Dogan Ibrahim – Newnes)
    http://ww1.microchip.com/downloads/en/devicedoc/spi.pdf

    #71805

    giazax
    Partecipante

    Grazie mille, per i tuoi suggerimenti….ho pensato di provare i due modi, sia il bit banging, che il modulo mssp….che postero’, e poi ci sono due cose che mi piacerebbe capire, il primo se i due metodi sono equivalenti per quanto riguarda le prestazioni, la seconda riguarda proprio la lettura di 32 bit in uscita…se cioe’ basta la lettura in sequenza del buffer per riuscire a catturare tutti i dati che mi servono….non mi resta altro che imlementare le funzioni e fare delle prove….sperando di non fare errori

Stai vedendo 7 articoli - dal 1 a 7 (di 7 totali)

Devi aver eseguito l’accesso per poter rispondere a questa discussione.