Esiste un malinteso popolare secondo cui i resistori di pull-up sono necessari o indispensabili sulle linee in un bus SPI. Sono qui per dirvi inequivocabilmente che i resistori di pull-up non sono richiesti su un bus SPI per eseguire la sua funzione base di invio e ricezione di dati digitali.
Il buffer in un'interfaccia SPI ha una topologia push-pull che (ad alto livello) coinvolge MOSFET di commutazione lato alto e lato basso, formando essenzialmente un invertitore CMOS. Come vedremo in questo articolo, la presenza di resistori di pull-up non ha impatto sulla funzionalità di un bus push-pull.
Detto questo, ci sono casi in cui ha senso posizionare un resistore di pull-up su un bus push-pull, e in alcuni datasheet un produttore di componenti lo raccomanderà o lo richiederà. Esamineremo queste situazioni e come influenzano il comportamento del vostro sistema. Sebbene ci possano essere soluzioni più elaborate che eliminano la necessità di resistori di pull-up in queste situazioni, il posizionamento di un resistore di pull-up può essere una soluzione che mantiene il vostro design semplice e fornisce una garanzia che l'interfaccia funzionerà correttamente.
Diamo un'occhiata al modello tipico di un buffer in un'interfaccia SPI. Tutti i buffer SPI hanno una topologia push-pull che consiste in commutazione di lato alto e lato basso che trasmette un segnale sul bus, e ogni segnale nel bus SPI (CS, MOSI, MISO e SCLK) avrà questa topologia. Un esempio di questo circuito è mostrato di seguito. Nota che un vero buffer SPI non è semplice come due MOSFET, ma l'idea generale è la stessa.
Invertitore CMOS come driver SPI. L'uscita si collega a una traccia (rappresentata come elementi concentrati) e a un circuito di carico (modello equivalente RC).
Il motivo principale per utilizzare questa topologia è per scaricare le capacità nel circuito del buffer per fornire velocità di transizione ragionevolmente rapide sull'uscita, che saranno molto più brevi del periodo di clock sul bus. Questo è ciò che consente tassi di trasmissione dati più veloci rispetto a un protocollo open-drain (ad es., I2C).
Un bus SPI che include resistori di pull-up è essenzialmente un driver inverter CMOS con un resistore in parallelo con il FET lato alto nel buffer di uscita. Ora vediamo cosa succede durante ogni stato di commutazione nel driver e possiamo vedere cosa succede sul bus.
Durante lo stato di uscita logica ALTA, il NMOS è SPENTO e il PMOS è ACCESO. VDDIO ora fornisce corrente alla traccia collegata e al carico. La capacità nella traccia e nel carico inizia quindi a caricarsi fino a quando la tensione vista al carico corrisponde a VDDIO. Qui, la resistenza ON del PMOS è dell'ordine di mOhm, mentre il resistore di pull-up è dell'ordine di 1 a 10 kOhm. Ovviamente, il resistore di pull-up è così grande che è essenzialmente cortocircuitato dal PMOS nello stato di uscita logica ALTA.
Poiché tutta la corrente scorre attraverso il PMOS nello stato logico ALTO indipendentemente dalla presenza del resistore di pull-up, le caratteristiche di commutazione non saranno influenzate.
Ora consideriamo che il circuito sia passato allo stato di uscita logica LOW. In questo stato, l'NMOS è ON e il PMOS è OFF, quindi la traccia e la capacità di carico si scaricano attraverso l'NMOS verso la rete GND. Poiché il PMOS è spento, appare come una resistenza molto alta (ordine di MOhm) che è molto maggiore del valore della resistenza di pull-up (da 1 a 10 kOhm).
Poiché il pull-up è la resistenza minore in questo caso, permetterà un valore di corrente di VDDIO/R(pu) a fluire verso l'NMOS. Per una resistenza di pull-up da 1 a 10 kOhm e VDDIO = 3,3 V, la corrente di perdita verso l'NMOS sarebbe di 0,33 a 3,3 mA. Questo è molto minore della corrente SPI tipica di ~50 mA, quindi ancora una volta non noteremo alcun effetto sulle caratteristiche di commutazione. Il tempo di discesa sul bus sarà limitato dalle capacità di carico e traccia, dall'impedenza resistiva di uscita del circuito buffer e dalla resistenza in stato ON dell'NMOS.
È evidente che il posizionamento di una resistenza di pull-up su una linea SPI non influisce sulla sua capacità di trasmettere un segnale sul bus. Pertanto, il pull-up dovrebbe svolgere qualche altra funzione che non è legata alla trasmissione dei dati, altrimenti la resistenza non sarebbe utilizzata.
Le ragioni per l'uso di una resistenza di pull-up su una o più linee in un'interfaccia SPI variano a seconda della situazione proposta. Alcune situazioni in cui vengono utilizzate le resistenze di pull-up includono:
La motivazione dichiarata per il posizionamento in una qualsiasi di queste situazioni è quella di impostare lo stato logico su uno dei componenti periferici nel bus. La raccomandazione più comune è quella di posizionare una resistenza di pull-up sul pin CS di una periferica per tirarlo in alto. Se la periferica ha un pin di abilitazione attivo basso, allora questo tirerà sempre il pin in alto a meno che il lato driver del pull non imposti il pin in basso.
Un esempio di tale utilizzo è mostrato di seguito. Nel layout del PCB, la resistenza di pull-up sarebbe posizionata vicino al pin CS di questo periferico.
Posizionamento tipico di una resistenza di pull-up sul pin CS di un bus SPI.
Perché si utilizzerebbe? Il motivo dichiarato è che durante l'avvio del sistema, il pin CS potrebbe trovarsi in uno stato fluttuante e ciò potrebbe creare il rischio che il rumore possa corrompere i dati sul bus. Inoltre, se il dispositivo host si avvia prima del periferico e il pin CS diventa abilitato involontariamente, l'host potrebbe iniziare a manipolare i dati nel periferico. Questo è talvolta citato come motivo per posizionare una resistenza di pull-up su periferiche di memoria.
Ad oggi, non riesco a trovare un motivo convincente per posizionare una resistenza di pull-up sulla linea SCLK (clock). Il motivo è che il circuito logico di ricezione non cambierà stato se non sono soddisfatte altre condizioni (specificamente lo stato della linea CS) indipendentemente dalla presenza di un segnale di clock. Alcune note applicative e schede tecniche raccomandano le resistenze di pull-up per MISO o MOSI per vari motivi, ma testare se questo funziona è semplice e la resistenza può sempre essere dissaldata quando si lavora sul proprio prototipo.
Poiché questo è spesso citato come un problema con lo stato del pin CS durante l'avvio del sistema, penso che il sequenziamento dell'alimentazione tra periferiche e l'host del sistema sarebbe il miglior approccio per prevenire questo problema durante l'avvio. Nei sistemi più piccoli, potrebbe non esserci spazio nel dispositivo disponibile per più regolatori o per un sequenziatore di potenza che possa passare l'alimentazione richiesta. È una soluzione più semplice posizionare una resistenza di pull-up, ma capire che queste resistenze di pull-up non sono necessarie affinché l'interfaccia funzioni correttamente.
Se hai bisogno di costruire elettronica di potenza affidabile o sistemi digitali avanzati, utilizza il set completo di funzionalità di progettazione PCB e strumenti CAD di classe mondiale in Altium Designer. Per implementare la collaborazione nell'ambiente interdisciplinare di oggi, le aziende innovative stanno utilizzando la piattaforma Altium 365 per condividere facilmente i dati di progettazione e avviare i progetti alla produzione.
Abbiamo solo sfiorato la superficie di ciò che è possibile con Altium Designer su Altium 365. Inizia oggi la tua prova gratuita di Altium Designer + Altium 365.