È sicuro SPI per essere interrotto?


17

Sto scrivendo su una scheda microSD dal mio firmware, ma è l'attività con la priorità più bassa, quindi può essere interrotta da altre attività mentre è nel mezzo della lettura / scrittura.

Supponiamo ora che abbia comunicato con questa scheda microSD usando un UART. Il problema durante le letture sarebbe che l'hardware RX FIFO traboccerebbe, quindi il ritardo massimo che posso fare sarebbe (dimensione FIFO × byte / secondo), e durante le scritture non ci sarebbero problemi, perché l'altra estremità aspetterebbe solo che io invia il prossimo personaggio.

Come funziona ora sto usando SPI? La situazione è la stessa che per le scritture non ha importanza e per le letture dipende dalle dimensioni SPI FIFO?

Risposte:


22

La stragrande maggioranza dei dispositivi SPI sarà perfettamente felice a qualsiasi velocità di dati inferiore al massimo specificato. Si potrebbe eseguire parte di una transazione, fare una pausa in qualsiasi momento, tornare qualche anno dopo e finirla. A condizione che non vi fossero anomalie sull'orologio, sulla selezione o sulle linee elettriche, la transazione sarebbe stata completata normalmente.

Esistono tre avvertenze principali di cui tenere conto:

  1. In generale, una volta che una transazione è iniziata su un bus SPI, nessuno dei fili sul bus può essere utilizzato per altri scopi fino al completamento della transazione. In generale, ciò significa che un interrupt non può utilizzare un bus SPI tranne quando è l'unica cosa che utilizzerà bus (può essere possibile per l'interrupt di avere l'uso esclusivo del bus in alcuni momenti, e per il principale programma per avere l'uso esclusivo in altri momenti). Alcuni dispositivi includono perni speciali per far loro "ignorano" il bus nel mezzo di una transazione, ma anche con tali caratteristiche non consiglierei cercando di avere un interrupt sospendere un'operazione SPI con un solo dispositivo, eseguire una transazione con un altro dispositivo, e poi lasciare che il codice sottostante riprendere la sua transazione con il primo. Meglio avere l'uso interrupt un bus SPI separato.
  2. Alcuni dispositivi possono comportarsi in modo strano se una transazione va avanti da troppo tempo. Alcuni chip orologio in tempo reale, per esempio, non double-buffer registri ora / data, ma invece fermo eventi "time-anticipate" che si verificherebbero durante una transazione e applicare loro dopo la transazione è stata completata. Se una transazione impiega così tanto tempo che arriva un secondo evento di anticipo, quest'ultimo evento verrà ignorato, facendo scorrere l'orologio per quel lasso di tempo. Vedo nessuna scusa per la progettazione di un chip in modo tale (anche se uno non voleva che il costo del doppio buffering dei dati, specificando che il software è stato responsabile di assicurare la coerenza sarebbe più conveniente che aggiungendo la logica di "aggiornamento differimento", e sarebbe minimizzare la probabilità di disturbi dell'orologio), ma esistono tali chip.
  3. Esistono alcuni dispositivi che utilizzano un segnale di clock e dati, ma che utilizzano una "pausa" per indicare l'inquadramento. L'esempio recente più di questo che ho incontrato è stata una stringa di luce di controllo-per-lampadina LED. Non mi piacciono particolarmente questi progetti (si potrebbe anche indicare l'inquadratura usando tre fronti di salita consecutivi sul cavo dati senza alcun clock intermedio) ma, di nuovo, tali dispositivi esistono.

Sebbene alcuni tipi di comunicazioni richiedano l'utilizzo di temporizzazioni particolari, raramente vi sono motivi per cui i dispositivi SPI le richiedano. Tuttavia, si deve essere consapevoli dell'esistenza di tali dispositivi.


3
+1 Nizza! Completamente d'accordo con tutte le tue opinioni / frustrazioni. Visto troppe volte pure.
DrFriedParts

11

Controllo di una copia della specifica (che non posso citare per il copyright / motivi NDA) il tasso di SPI è specificato iniziando a 0 Hz implicando funzionamento statico va bene. Sotto SPI si ottiene solo i dati indietro mentre il dispositivo è in fase di clock, quindi se si utilizza uno SPI hardware riceverai qualcosa solo dopo che i dati (anche se 0 / non si preoccupano) è stato inviato. Quindi, a questo proposito è diverso da un UART in cui è possibile ricevere i dati non richiesti indietro in qualsiasi momento.


Così la mia unica preoccupazione dovrebbe essere che la scheda MicroSD ha una sorta di time-out build-in, ma non Spi stessa?
Mouse

5
Secondo le specifiche da tutto quello che ho potuto vedere non ci dovrebbe essere alcuna forma di timeout sulla scheda SD o, in modo da non vedere veramente si dovrebbe avere alcun problema. Anni fa ho scritto un po 'di codice personalizzato e durante il debug era single stepping tramite il codice lasciando diciamo 10 secondi o più tra le operazioni di SPI e tutto andava bene.
PeterJ

1
+1, Poter correre SPI fino a 0 Hz è utile sapere per debug. Grazie.
Anindo Ghosh

1
Vale la pena notare che su alcuni dispositivi SPI l'uscita dati può cambiare solo su un fronte di clock particolare, ma su alcuni altri l'uscita dei dati può talvolta cambiare in modo asincrono; questo è particolarmente comune con un po ' "occupato". Su alcuni chip, se uno ha eliminato lo stato del bit "occupato" ed è ancora sull'output quando la parte diventa non occupata, l'output cambierà in modo asincrono. Stato In alcuni altri chip, il segnalato "occupato" non cambierà fino a quando è ri-clock. Entrambi i modelli hanno vantaggi e svantaggi, quindi è utile sapere che esistono due tipi di disegni.
Supercat
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.