Risposte:
Una vera periferica di controllo SPI nell'MCU può spesso funzionare molto più velocemente rispetto al bit-bang dell'interfaccia. Naturalmente, dipende dall'MCU, ma non mi sorprenderebbe vedere un controller SPI in esecuzione a 30+ MHz, mentre il bit banging potrebbe essere limitato a circa 1 MHz (se sei fortunato).
Ma c'è dell'altro. Durante il bit-bang, l'MCU è impegnato a bit-bang. Sta spostando i dati e modificando le linee GPIO. Significa che non può fare altro. Quando si utilizza un controller SPI, il controller è impegnato a fare tutte quelle cose e la MCU è libera di fare altre cose.
Quindi, con un controller SPI effettivo, il trasferimento SPI effettivo è molto più veloce e l'MCU recupera alcuni cicli che può utilizzare per fare altre cose.
Non c'è alcuna differenza in termini che puoi ottenere lo stesso risultato usando entrambi i metodi, ma ci sono alcuni motivi per cui sceglieresti uno sopra l'altro.
L'uso di una periferica SPI eviterà al processore di preoccuparsi di generare i tempi per il bit bang dei pin I / O, consentendogli di eseguire altre attività di calcolo e semplificando la programmazione della CPU. Poiché la periferica è implementata nell'hardware, funzionerà più velocemente e consumerà meno energia dell'I / O di bit banging. Potrebbero verificarsi casi in cui si desidera bit I / O bit per interfacciarsi con SPI se l'applicazione richiede che si scelga un processore senza una periferica SPI. Per motivi di sanità mentale consiglierei di evitarlo a meno che non sia assolutamente necessario.
SPI è un'interfaccia sincrona , con il master che controlla l'orologio. Ciò significa che se sei il maestro, puoi scegliere la velocità e il tempo di clock. I dispositivi slave avranno un limite superiore sulla frequenza di clock che sono in grado di gestire, ma in genere non importa quanto lentamente l'orologio sia inferiore a quello. Più specificamente, di solito c'è un tempo minimo necessario a ogni slave per vedere l'orologio nello stato alto e basso prima che possa passare di nuovo, e ci saranno alcune impostazioni minime di dati e limiti sulla linea di dati che circonda il bordo dell'orologio su cui il lo slave legge la riga di dati.
Per questo motivo, impiantare un master SPI nel firmware è davvero abbastanza semplice. L'ho fatto spesso per praticità nell'uso di determinati pin, quando non esisteva hardware SPI integrato o non era disponibile a tale scopo per qualsiasi motivo. Fare un master SPI nel firmware è più facile che mai.
Molti dispositivi Slave SPI sono abbastanza veloci, quindi spesso i tempi minimi di clock e di configurazione sono rispettati semplicemente assicurandosi che ciascuno abbia una larghezza di almeno un ciclo di istruzioni. In tal caso, il codice è molto breve e veloce. In alcuni casi, un dispositivo slave potrebbe richiedere due o tre cicli di istruzioni per fase di clock, ma non è nemmeno difficile da garantire. Il loop di bit SPI di basso livello richiede di spostare in posizione il bit di uscita successivo, afferrare il bit di ingresso e controllare il contatore del loop. Di solito è possibile soddisfare i requisiti di temporizzazione minima di due o tre cicli semplicemente organizzando quando si guida e si campionano le linee con alcune delle altre spese generali inserite nei punti giusti. Se la velocità è importante, è possibile utilizzare il preprocessore dell'assemblatore per scrivere un ciclo non srotolato. Con tecniche come questa,
Ci sono alcuni vantaggi nel fare il master SPI nel firmware. L'hardware SPI a volte è un po 'ridicolo nel modo in cui può essere configurato. C'è sempre il problema di cosa dovrebbe succedere esattamente quando si afferma la selezione degli slave. Il primo bit viene quindi scritto nelle righe di dati? Cosa succede se l'orologio si avvia in basso e le linee dati dovrebbero essere bloccate sul fronte di discesa? A volte questo conta, a volte no. Con un master SPI del firmware, puoi essere più indulgente e possibilmente usare la stessa routine per comunicare con diversi slave. Ad esempio, è possibile assicurarsi che la linea dati MOSI (Master Out Slave In) sia stabile su entrambi i bordi dell'orologio. L'hardware SPI generalmente non lo farà, quindi tale hardware dovrebbe essere riconfigurato a seconda dello slave con cui sta comunicando in quel momento.
Un altro vantaggio di un master SPI del firmware è che è possibile scegliere un numero arbitrario di bit per sequenza SPI. L'hardware è generalmente limitato a multipli di 8 bit. La maggior parte dei dispositivi sono progettati per consentire trasferimenti di byte interi, ma spesso non li richiedono. Ad esempio, un A / D a 10 bit probabilmente invierà prima i 10 bit di dati, quindi invierà 0 o immondizia se continui a sincronizzarlo. Se si utilizza SPI hardware, si sarà costretti a trasferire 16 bit e mascherare la spazzatura. Tutto funzionerà bene, ma un master SPI del firmware potrebbe effettivamente essere più veloce dell'hardware in questo caso a causa del fatto che trasferisce solo i 10 bit minimi richiesti.
I principali vantaggi dei master SPI hardware sono che il firmware può avviare un trasferimento di byte, quindi spegnersi e fare qualcos'altro. Il clock può anche essere più veloce di quanto riesca a ottenere anche un ciclo firmware non srotolato. Si noti che sebbene entrambi questi vantaggi possano essere importanti in determinate circostanze, sono spesso irrilevanti. La maggior parte del codice SPI che utilizza l'hardware per trasferire un byte, passa immediatamente in un ciclo di attesa affinché l'hardware completi il trasferimento. Controllare anche attentamente i requisiti di temporizzazione dello slave. I dispositivi SPI sono generalmente veloci nel loro insieme, ma ci sono casi in cui è necessario rallentare l'hardware per adattarsi alla velocità massima che lo slave può gestire.
Questo era tutto dal punto di vista principale. In breve, ci sono spesso pochi vantaggi nell'usare l'hardware SPI come master e persino alcuni vantaggi nel non usarlo a volte. Tuttavia, questo è tutto diverso per gli schiavi. Dal momento che il master controlla l'orologio, gli slave devono essere pronti a qualunque cosa faccia il master ogni volta che lo fa il master. I requisiti di temporizzazione sono spesso piuttosto brevi rispetto ai tempi di istruzione, quindi avere hardware che implementa uno slave SPI è di solito quello che vuoi.
È possibile eseguire slave SPI nel firmware, ma è complicato, è necessario contare attentamente i cicli e la latenza e di solito si finisce con l'implementazione di un sottoinsieme del protocollo che si conosce il proprio master. Ad esempio, una volta ho dovuto progettare un equivalente digitale di una vecchia scheda controller analogica (volevano funzionalità extra che non potevano essere ragionevolmente fatte in analogico e volevano qualcosa di più piccolo, più economico da produrre e più stabile). Questa scheda si è interfacciata con il resto del sistema tramite un bus SPI. La vecchia scheda analogica aveva un D / A a due canali per impostare i valori di controllo e un A / D a due canali per rileggere i valori misurati. L'implementazione di entrambi in un singolo processore è stata complicata, e comprendeva capire quale sottoinsieme dei protocolli hardware D / A e A / D SPI effettivamente utilizzati dal master esistente. Comprendeva anche un processore che poteva funzionare in modo significativamente più veloce della frequenza di clock SPI. Alla fine, ho usato tre interrupt, uno per ogni selezione di slave e uno per il fronte di salita della linea di clock. Quest'ultimo doveva essere l'interrupt con la massima priorità nel sistema, altrimenti il requisito di latenza non poteva essere soddisfatto.
Ad ogni modo, il punto generale è che un master SPI del firmware è facile, piccolo, veloce e flessibile e ci sono pochi motivi per evitare di farlo. D'altra parte, per uno slave vuoi davvero l'hardware, o devi svegliarti e pensare molto attentamente a tempistica, latenza e simili.
Dipende da cosa stai facendo lo SPI. Se il tuo interesse è ottenere i più alti tassi di dati, l'hardware è sempre più veloce del bitbanging (ad esempio il chip arm cortex in teensy 3 Posso inviare dati a 22 Mbps utilizzando il supporto SPI hardware, rispetto a ~ 4,5 Mbps con bitbanging può anche gestire un numero arbitrario di bit per trasferimento da 3-16, utile quando si inviano dati in blocchi di 12 bit per determinati controller a led!)). Su avrs 16Mhz, la differenza è un po 'meno estrema, la velocità di dati più alta con l'hardware sembra essere alta 4 / bassa 5 Mbps, mentre il bitbanging è di circa 2,3 Mbps).
Inoltre, se usi il supporto hardware, di nuovo, a seconda del microcontrollore in questione, hai a tua disposizione opzioni per l'uso dei controller DMA per spostare i tuoi dati, lasciando che il tuo codice torni ad altre cose potenzialmente più interessanti del baby-sitter dei dati Scrivi.
Tutto quanto sopra dipende dal fatto che l'SPI hardware sia o meno un'opzione.
Se si utilizza SPI bit-bang, non è possibile utilizzare l'interrupt SSP per gestire le comunicazioni. Questo non è così importante per SPI per molti usi