Considerazioni sulla terminazione del bus SPI


22

Quindi, nella mia domanda precedente ho chiesto di utilizzare il bus SPI a breve distanza per la comunicazione scheda-scheda. Mi è stato consigliato di provare i resistori di terminazione. Ho posizionato un resistore vicino alla destinazione (ma non esattamente lì, c'era una distanza di 1 cm) e l'ho messo a terra [poiché questa era una scheda senza impronte di resistore di terminazione, ho dovuto improvvisare. Non ho potuto saldare il resistore sul dispositivo in quanto è un TQFP e ha pin delicati.]

Da alcuni test di base, ho scoperto che una resistenza da 1K riduceva a malapena il superamento. 470 Ohm e 180 Ohm funzionavano meglio. Più in basso sono andato, meglio ha funzionato. Con 180 Ohm, il superamento era di circa un volt o un po 'più basso. Ora, sfortunatamente, non posso scendere molto di più perché la corrente è più di quanto il mio MCU possa gestire. Ho risolto il problema, sull'attuale revisione della scheda, usando una resistenza di 330 Ohm in serie. Ciò ha portato il superamento a 3,7 V e il tempo di salita è stato di 10 o 11 ns. Ma vorrei davvero una soluzione "adeguata" alla prossima revisione. I miei requisiti di frequenza rimangono gli stessi: 2 MHz ma preferirei 4 MHz.

Quindi ho sentito che avrei dovuto chiedere qui: alla prossima revisione del consiglio di amministrazione, dovrei mettere dei buffi buffer sulle linee? Trovare un buffer non è davvero un problema, ma l'attuale disegno aumenterà in modo significativo: ho 8 dispositivi sull'SPI che hanno bisogno di terminazione e 3 linee che sono sempre attive vanno a ciascuna. Un esempio, SCK va a tutti e 8 i dispositivi. Ogni dispositivo avrà, diciamo, una resistenza di terminazione da 100 Ohm. Quindi questo è un assorbimento di corrente di 12 * 3.3 / 100 = 390 mA!

Quindi qual è il miglior ricorso qui? Dovrei cercare la "terminazione attiva" usando i diodi Schottky come morsetti?

EDIT: per quanto riguarda l'impedenza di linea: come ho già detto in precedenza, l'intenzione è quella di collegare 4 schede esterne. La distanza da pad a pad è la stessa per tutti (12 pollici). Tuttavia, ci sono anche dispositivi sulla stessa scheda dell'MCU - ma questi non hanno bisogno di terminazioni - le lunghezze sono di circa un pollice (o meno) e c'è pochissimo superamento (300 o mV). Le tracce che vanno alle schede esterne sono approssimativamente della stessa lunghezza e larghezza. Il secondo strato sulla mia tavola è un piano di terra ininterrotto.


Un metodo comune è posizionare un resistore in serie che corrisponda all'impedenza di linea. Prova qualcosa come una terminazione seriale di 50ohm. Sarebbe utile se le tracce e le connessioni fossero progettate in modo da essere un'impedenza fissa. Prova però a terminazioni seriali inferiori e vedi cosa trovi. Ha suggerito una terminazione a terra di 32 ohm, in realtà puoi fare questa potenza molto più bassa, ben 3dB in meno, mettendo un 64 ohm alla barra di alimentazione e un 64ohm alla barra di terra.
Kortuk,

@Kortuk Un resistore da 32 Ohm, sfortunatamente, non ha ridotto significativamente il superamento. Tuttavia, l'impronta era anche nel posto sbagliato (non è mai stato inteso come terminatore) e non alla fonte, quindi potrebbe non essere sicuro. Per quanto riguarda l'impedenza di linea, tutte le linee hanno, approssimativamente, la stessa lunghezza e larghezza. Tutti corrono su un piano completo un piano, che si trova sul 2 ° strato.
Saad,

1
La terminazione della serie è alla fonte, se la metti al caricamento non fa nulla. Prova a posizionare un 50ohm proprio alla tua sorgente in serie per vedere l'effetto.
Kortuk,

Puoi pensarlo come descritto da Stevenvh, c'è l'intera linea che funge da condensatore e che il resistore agisce come R con esso per un passaggio basso, se lo pensi come un modello aggregato. Un resistore abbinato lì se guardi il modello della linea di trasmissione significa che hai la metà della corsa dell'onda di ampiezza e quindi quando colpisce l'altra estremità e la riflette salta a pieno valore.
Kortuk,

Risposte:


32

Parlare della fine del segnale è come aprire una lattina di worm. Questo è un argomento ENORME difficile da sintetizzare in sole duecento parole. Pertanto, non lo farò. Lascerò una quantità enorme di roba da questa risposta. Ma ti darò anche un grande avvertimento: c'è molta disinformazione sul terminare i resistori in rete. In effetti, direi che la maggior parte di ciò che si trova in rete è errato o fuorviante. Un giorno scriverò qualcosa di grosso e lo pubblicherò sul mio blog, ma non oggi.

La prima cosa da notare è che il valore del resistore da utilizzare per la terminazione deve essere correlato all'impedenza di traccia. Il più delle volte il valore del resistore è uguale all'impedenza della traccia. Se non sai qual è l'impedenza di traccia, allora dovresti capirlo. Sono disponibili molti calcolatori di impedenza online . Una ricerca su Google ne farà apparire decine di più.

La maggior parte delle tracce di PCB ha un'impedenza da 40 a 120 ohm, motivo per cui hai scoperto che una resistenza di terminazione da 1k non ha fatto quasi nulla e una resistenza da 100 ish ohm era molto meglio.

Esistono molti tipi di terminazione, ma possiamo approssimativamente metterli in due categorie: terminazione di origine e fine. La terminazione di origine è al driver, la terminazione di fine è in fondo. All'interno di ciascuna categoria, ci sono molti tipi di terminazioni. Ogni tipo è il migliore per usi diversi, senza un tipo buono per tutto.

La tua terminazione, una singola resistenza a terra all'estremità remota, in realtà non è molto buona. In effetti, è sbagliato. La gente lo fa, ma non è l'ideale. Idealmente, quel resistore andrebbe su un diverso power rail a metà del tuo power rail. Quindi, se la tensione I / O è di 3,3 V, quel resistore non passerà a GND, ma un'altra barra di alimentazione a metà di 3,3 V (ovvero 1,65 V). Il regolatore di tensione per questa guida deve essere speciale perché deve alimentare e assorbire corrente, dove la maggior parte dei regolatori alimenta solo corrente. I regolatori che lavorano per questo uso menzioneranno qualcosa sulla risoluzione nella prima pagina del foglio dati.

Il grosso problema con la maggior parte delle terminazioni è che consumano molta corrente. C'è una ragione per questo, ma non ci entrerò. Per un uso a bassa corrente dobbiamo guardare alla terminazione della fonte. La forma più semplice e più comune di terminazione della sorgente è un semplice resistore in serie all'uscita del driver. Il valore di questo resistore è uguale all'impedenza di traccia.

La terminazione di origine funziona in modo diverso rispetto alla terminazione di fine, ma l'effetto netto è lo stesso. Funziona controllando i riflessi del segnale, non prevenendo i riflessi in primo luogo. Per questo motivo, funziona solo se l'output di un driver sta alimentando un singolo carico. Se sono presenti più carichi, è necessario fare qualcos'altro (come utilizzare la terminazione finale o resistori di terminazione multipli). L'enorme vantaggio della terminazione di origine è che non carica il driver come fa la terminazione di fine.

Ho detto prima che il resistore in serie per la terminazione della sorgente deve trovarsi sul driver e deve avere lo stesso valore dell'impedenza di traccia. Questa è stata una semplificazione eccessiva. C'è un dettaglio importante da sapere al riguardo. La maggior parte dei driver ha una certa resistenza sul suo output. Quella resistenza è solitamente nell'intervallo 10-30 ohm. La somma della resistenza di uscita e della resistenza deve essere uguale all'impedenza di traccia. Diciamo che la tua traccia è di 50 ohm e il tuo driver ha 20 ohm. In questo caso il tuo resistore sarebbe 30 ohm da 30 + 20 = 50. Se i fogli dati non indicano quale sia l'impedenza / resistenza di uscita del driver, è possibile supporre che sia 20 ohm, quindi guardare i segnali sul PCB e vedere se deve essere regolato.

Un'altra cosa importante: quando guardi questi segnali su un o-scope DEVI sondare il ricevitore. Probabilmente altrove ti darà una forma d'onda distorta e ti indurrà a pensare che le cose sono peggiori di quello che sono realmente. Inoltre, assicurati che la clip di terra sia il più corta possibile.

Conclusione: passa alla terminazione della sorgente con un resistore da 33 a 50 ohm e dovresti andare bene. Si applicano le solite avvertenze.


David, grazie mille per una risposta esaustiva. Tutto aveva perfettamente senso, ma penso che ci sia un'ulteriore complicazione nel mio sistema: le linee SPI vanno da una scheda all'altra. Pertanto, stimare l'impedenza della linea potrebbe essere difficile: il segnale si sposta per circa 3 "sulla scheda principale, passa attraverso un cavo a nastro da 6" e quindi viaggia nuovamente lungo una traccia da 3 "fino a raggiungere la sua destinazione. I fili del cavo a nastro sono alternati terra (come SCK, GND, MOSI, GND ecc.) La tua raccomandazione 30-20 Ohm è ancora valida?
Saad,

@Saad Quello che ho fatto in casi del genere (e l'ho fatto molto) è usare un singolo resistore sul driver e modificarne il valore una volta creato il prototipo. È un compromesso, ma funziona. Al momento ho diversi sistemi che eseguono SPI su cavi da 1 piede con 3-6 pollici di tracce su ciascun PCB. Alcuni di quelli funzionano a 30 MHz! Sì, inizia con 33 o 47 ohm e modifica da lì.

3
+1 già, ma un diagramma che mostra come collegare una terminazione di origine (ovvero, in serie, non dalla linea a terra) sarebbe molto utile.
The Photon,

16

Dato che stai percorrendo brevi distanze, non credo che i resistori di terminazione siano una buona idea. Come hai scoperto, devono essere abbastanza bassi per fare il lavoro, quindi la linea assorbe molta corrente e la tensione viene attenuata di 2 se guidi anche la linea con la stessa impedenza.

La frequenza di clock non è poi così elevata, quindi le frequenze necessarie per supportare anche la velocità in bit di 4 MHz non sono quelle che causano il problema. Il problema è che hai bordi veloci che guidano le linee, che hanno armoniche nei 100s di MHz, che causano il problema. Alle frequenze desiderate, hai un sistema a grumi, non una linea di trasmissione. Questo rende le cose notevolmente più facili.

La soluzione quindi è attenuare le alte frequenze di cui non si ha realmente bisogno ma che causano il problema. Questo può essere fatto con un semplice filtro passa-basso RC immediatamente dopo tutto ciò che guida una linea. Questo è in parte quello che stanno facendo i resistori da 330 Ω. Formano un filtro passa-basso con la capacità parassita della linea. Apparentemente questo non è abbastanza e / o non è abbastanza prevedibile. Questo può essere risolto con una certa capacità deliberata su ciascuna linea.

Volete far funzionare il bus a 4 MHz, il che significa che il segnale più veloce che deve supportare è un'onda quadra a 4 MHz. Ciò significa che la lunghezza di ciascun livello è di 125 ns. Diciamo che vogliamo che siano almeno 4 costanti di tempo, il che implica un tempo di assestamento del 98%. Ciò significa che la costante di tempo massima che vogliamo consentire è 31 ns. 31ns / 330Ω = 94 pF. Questo è il carico totale sui resistori serie 330 Ω necessario per ottenere la costante di tempo di 31 ns. Ci saranno sempre delle capacità parassite che non puoi prevedere, quindi vedrei come stanno le cose con 47 pF. Ciò lascia spazio a 10-20 pF di capacità nascosta pur non superando la nostra costante di tempo massima consentita.

Le resistenze serie devono essere il più vicino possibile a tutti i pin che guidano il bus. Questo presuppone che tutti gli altri pin sul bus saranno input CMOS quando uno sta guidando. Per le linee che sono sempre e solo guidate da un singolo pin (come la linea di clock, che è guidata solo dal master), avvicina il 47 pF il più vicino possibile dopo il resistore. Per le linee che possono essere guidate da pin diversi in momenti diversi (come MISO), posizionare il 47 pF da qualche parte vicino al centro di tutti i driver. Ogni linea ottiene un solo condensatore da 47 pF, indipendentemente da quanti driver, ma esiste una resistenza per ciascun driver.

I calcoli di cui sopra sono pensati per essere una buona guida per iniziare. Alcuni parametri non possono essere conosciuti e quindi spiegati in anticipo. Inizia con 330 Ω in serie e 47 pF a terra, ma non aver paura di cambiare le cose in base ai risultati reali osservati.


2

In assenza di una terminazione, quando un segnale viene inviato da una sorgente a bassissima impedenza a un ricevitore ad altissima impedenza, il segnale rimbalzerà avanti e indietro ripetutamente; la fase del segnale verrà capovolta di 180 gradi su ogni round trip.

Se non si desidera che i segnali vengano riflessi quando colpiscono la destinazione, è possibile utilizzare la terminazione finale. Ciò farà sì che il segnale venga assorbito in modo pulito a destinazione senza essere riflesso, ma molte implementazioni comuni causeranno un carico CC significativo alla sorgente.

In molti casi, si possono ottenere risultati altrettanto utili se si inserisce invece un resistore serie alla sorgente del segnale. Se non vi è alcun ricevitore all'estremità lontana della linea, il segnale verrà riflesso quando arriva lì, ma tale riflesso sarà assorbito dalla sorgente piuttosto che riflesso nuovamente. Si noti inoltre che la terminazione di origine non impone un carico CC sul dispositivo che guida la linea.

In assenza di terminazione, se una linea è pilotata da una bassa impedenza e ricevuta con un'alta impedenza, il dispositivo ricevente può vedere una tensione superiore alla tensione di pilotaggio (in teoria, fino a due volte la tensione, se l'impedenza di pilotaggio della sorgente è zero e l'impedenza di ricezione è infinita). Se la sorgente o il ricevitore sono correttamente terminati, la tensione ricevuta sarà quasi uguale alla tensione del convertitore (se una sorgente a impedenza zero pilotava un ricevitore a impedenza adeguata o una sorgente a impedenza propria pilotava un ricevitore a impedenza infinita, la tensione ricevuta equivale alla tensione del convertitore). Se entrambi sono terminati correttamente, la tensione di ricezione sarà la metà della tensione del convertitore.

La simulazione qui lo dimostra. Include un generatore di impulsi che produce una catena di impulsi circa 49 volte al secondo, due linee di ritardo di 5 ms in serie (tempo di andata e ritorno 1/50 di secondo) e resistori di terminazione commutabili su entrambe le estremità.

Il circuito include tre interruttori SPDT; fare clic su uno per cambiarne lo stato. I due interruttori inferiori controllano la terminazione della sorgente e della destinazione. Per quelli, "su" rappresenta una buona conclusione e "giù" rappresenta una cattiva. L'interruttore superiore controlla se la linea deve essere pilotata da un generatore di impulsi automatico o da un ingresso logico manuale. Per inviare manualmente gli impulsi lungo la linea, commutare l'interruttore superiore "giù", quindi sincronizzare la "L" accanto.

I segnali raggiungono la destinazione sarà puro se sia la sorgente o destinazione sia correttamente terminato. Se entrambi sono terminati correttamente, la tensione del segnale ricevuto sarà la metà della tensione del convertitore. Se uno è correttamente terminato ma l'altro no, la tensione ricevuta sarà circa il 91% della tensione del convertitore (i resistori "cattivi" sono "errati" di un fattore dieci e quindi non riescono ad assorbire circa (10/11) dell'energia). Se nessuno dei due viene terminato, la tensione ricevuta inizialmente sarà circa 1,665 volte la tensione del convertitore, ma ogni 20 ms compariranno strani riflessi.


1

Prova una terminazione CA (ad esempio un condensatore 470 pF in serie con un resistore da 110 Ohm) e collega questa combinazione di serie dall'uscita della destinazione SPI Clock a terra. La terminazione assorbirà circa 30 mA per la durata del tempo limite qualcosa che può facilmente fare, ma altrimenti zero corrente. Per la linea di dati bidirezionale diventa un po 'più complicato. Ho inserito una terminazione 470 pF, 220 Ohm AC sia sull'estremità master che su quella slave della linea dati SPI e funziona, vale a dire, accettabile overshoot e undershoot.

Accolgo con favore commenti su questo.


0

Non andando troppo in profondità nei dettagli come i post precedenti hanno colpito l'unghia sulla testa. Dipende dal fatto che SPI è linee sbilanciate. Anche se la frequenza di clock è bassa, è necessario rispettare i bordi di clock veloci. Nel mio caso ho trovato una resistenza da 470 ohm in serie con la linea SPI CLK sul lato Master. Rimuovendo quel resistore e implementando la soluzione consigliata per le linee sbilanciate da Lattice e i suggerimenti pubblicati sopra (potevo implementare solo metà della soluzione dal lato Slave, ottimizzato i cappucci del filtro di conseguenza) Sono stato in grado di estendere la lunghezza del mio cavo di comunicazione a nastro SPI da Da 10 cm a 160 cm senza errori di comunicazione:

Migliorare l'immunità al rumore per l'interfaccia seriale : un white paper su Lattice Semiconductor (luglio 2014)

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.