SPI o I2C: quale utilizzare per un bus longish


36

Sto contemplando un progetto che richiederebbe diversi AVR che parlano tra loro su un autobus. Sarebbero separati da ben 6 piedi.

Sembra che sia I2C che SPI possano far comunicare una serie di micro su un bus, ma non ho visto nulla parlare di quanto sarebbe lungo. Qualcuno ha provato a collegare questi protocolli su distanze di diversi piedi?


Ho eseguito il bus I2C attraverso un cavo in un'occasione. Col senno di poi, avrei dovuto usare invece CAN o RS-485 (con microcontrollori su entrambe le estremità).
Nick Alexeev

Risposte:


19

Come altri hanno già detto, SPI e I2C possono essere utilizzati su lunghe distanze purché i resistori di pull-up, le frequenze di clock e così via.

Le principali alternative (che offriranno una migliore immunità al rumore) sono RS485 e CAN . Entrambi utilizzano linee differenziali per ridurre al minimo i problemi di rumore e sono più adatti a questa lunghezza di trasmissione dei dati rispetto a I2C o SPI. Tuttavia, non credo che molti (qualsiasi?) AVR siano dotati di periferiche CAN integrate, che rendono l'utilizzo CAN molto più semplice.

Direi che la cosa più importante da considerare quando si sceglie un bus è assicurarsi che il protocollo utilizzato per comunicare tra dispositivi includa un CRC o equivalente in modo da poter determinare se un messaggio è stato ricevuto correttamente (CAN ha questo come parte di il pacchetto). Considerando questo, è anche utile avere una risposta di tipo ACK / NACK come parte del protocollo in modo che un messaggio corrotto possa essere ritrasmesso.


Sembra che uno dei due funzionerà. Penso principalmente a questi due protocolli particolari perché la maggior parte degli AVR li supporta in modo nativo, senza aggiungere componenti aggiuntivi. Altrimenti, RS485 o CAN sarebbe una buona scelta.
edebill,

Se non sei limitato ai pacchetti a foro passante, allora ST ha i suoi microcontrollori STM32 e STM8 economici e potenti con CAN, NXP ha una gamma di microcontrollori LPC17xx e ce ne sono anche altri. CAN sta diventando sempre più comune (e conveniente) su molti microcontrollori.
DrAl,

1
Esistono davvero alcuni AVR con ricevitori CAN integrati, ma proprio come gli altri fornitori, è solo in un sottoinsieme limitato dei loro chip.
davr

1
Microchip ha alcuni PIC con CAN. microchip.com/wwwproducts/Devices.aspx?dDocName=en010302 . Devo ammettere che sono un po '"funky" da programmare, specialmente nelle librerie C18 / C30 di Microchip. Nella revisione del codice, abbiamo osservato alcuni codici di libreria che erano molto difficili da leggere a causa dei dettagli dell'implementazione: un buffer di trasmissione che viene utilizzato come buffer di ricezione, nomi di flag che sono in realtà l'opposto di ciò che rappresentano. Certamente non qualcosa che consiglierei a qualcuno nuovo nello sviluppo di microcontrollori.
J. Polfer,

2
CAN e RS-485 sono davvero mele e arance. CAN definisce il protocollo a livello di bit e lo strato elettrico fisico (PHY). RS-485 è solo una specifica di livello fisico, non specifica nulla sul protocollo. Dipenderebbe completamente da te trovare o implementare un protocollo reale in aggiunta a PHY RS-485. CAN è stato progettato per ambienti ad alto rumore, utilizzato principalmente nell'industria automobilistica e manifatturiera. Il suo protocollo è un sistema di passaggio dei messaggi piuttosto complesso e ha un overhead molto elevato (bassa velocità di dati effettiva) ma ha un'elevata integrità dei dati.
Segna

10

Diversi piedi non dovrebbero essere problematici, basta usare fili intrecciati se puoi. SPI è molto più facile da bufferizzare (se necessario) rispetto a I2C poiché i segnali SPI sono tutti unidirezionali, mentre i segnali I2C sono su linee condivise.

i microcontrollori AVR sono in grado di gestire le modalità slave I2C e SPI e le modalità master? (avresti bisogno di entrambi)


2
fili intrecciati ?? Non torcere MAI i dati I2C e le linee di clock! Con SPI questo è probabilmente un problema minore, ma non torcerei mai le linee del segnale se non fosse una coppia bilanciata, nel qual caso la torsione è una buona idea.
Wouter van Ooijen,

mai dire mai; Prenderei un accoppiamento capacitivo minore (a causa della torsione) tra dati + clock ogni giorno anziché un accoppiamento induttivo minore all'elettronica di potenza rumorosa (a causa della non torsione)
Jason S

4
Mi dispiace, sicuramente non sono d'accordo. Nello stato 1 le linee hanno un'impedenza piuttosto elevata. Visto fatto, visto fallire. L'opzione migliore è quella di avere linee di terra a bassa corrente tra o anche meglio su entrambi i lati delle linee I2C.
Wouter van Ooijen,

10

Per I2C su lunghe distanze potresti voler cercare alcune soluzioni "I2C bus repeater". Tenere presente che qualsiasi distanza massima che si potrebbe trovare per la comunicazione I2C o SPI si riferisce principalmente alla distanza totale del bus e non alla distanza tra due nodi in un bus.

Potresti voler esaminare RS485 per questo tipo di problemi. È un protocollo di bus seriale che comunica su linee differenziali, quindi quando si usano fili intrecciati, le probabilità di rumore sono ridotte al minimo. In questo modo è possibile raggiungere distanze molto lunghe. Lo svantaggio sarebbe che avresti bisogno di un ulteriore encoder RS485 (come un MAX485, non molto costoso) nel tuo circuito.


RS485 è sicuramente un buon modo per fare una cosa del genere.
Scott Murphy,

tieni presente che RS485 ha due aspetti diversi da RS232 che sono in qualche modo indipendenti: i livelli logici differenziali fisici e l'aspetto multimaster. Puoi scegliere + scegliere questi, abbiamo usato entrambi i traduttori LVDS e RS485 con UART (RS232) per punto-punto senza entrare nelle parti multidrop di RS485.
Jason S

2
a proposito RS485 non è un protocollo! definisce solo il livello fisico. Detto questo, puoi sicuramente usare SPI su RS485 !!! Sarebbe una soluzione accurata mantenere le comunicazioni in modalità SPI se necessario (suppongo che lo sia, potrebbe essere collegato a un ADC remoto o simile). Usando SPI su RS485 dovrai verificare che le velocità di risposta del ricetrasmettitore siano compatibili con i
datarati

8

Un vantaggio non ancora menzionato di SPI su I2C è che tutti i fili SPI sono unidirezionali e sono sempre guidati in alto o in basso. Ciò consente una comunicazione molto più veloce di quanto sia possibile con I2C, riduce la suscettibilità al rumore e consente l'utilizzo di semplici cancelli come ripetitori. Un'altra opzione utile è la semplice comunicazione asincrona (un filo per direzione). L'unico aspetto negativo che posso vedere per la comunicazione asincrona è che generalmente richiede che entrambe le parti siano "svegli", con un orologio stabile, per scambiare dati.

Per un mio progetto, ho usato un protocollo SPI leggermente modificato a 3 fili e ho trovato i risultati soddisfacenti. Mando i dati di visualizzazione bitmap (dove il danneggiamento occasionale dei dati non sarebbe un grosso problema) a 10 Mbps e altri dati a 2,5 Mbps senza difficoltà.


Questa è una risposta molto vecchia, ma diresti a quale distanza stavi inviando il tuo protocollo SPI modificato? (Questo è il punto della domanda ...)
Daniel Griscom,

@DanielGriscom: circa 3 piedi in genere, su cavi non terribilmente impressionanti, ma a volte più a lungo.
supercat

6

Mentre entrambi I2C e SPI sono progettati per i viaggi a breve distanza (pochi pollici), entrambi possono essere utilizzati su percorsi più lunghi con cavo adeguato e attenzione alla capacità complessiva del bus.

Mentre ho poca esperienza con SPI, I2C non è tremendamente difficile dato che devi sempre calcolare la dimensione corretta per il tuo resistore pull-up. Inoltre, ci sono buffer I2C dedicati ed economici che sono abbastanza facili da usare. Tuttavia, dovrai comunque utilizzare un resistore pull-up di dimensioni adeguate per la tua rete.

Ho usato I2C per collegarmi in rete tra due AVR a una distanza di 8 piedi, usando solo resistori pull-up e un cavo a spirale schermato di alta qualità.


devi stare attento con I2C con cavi multiconduttore, la capacità può rallentare significativamente il bus.
Jason S,

6

Come molti hanno suggerito, I2C e SPI sono meglio utilizzati per brevi distanze. Sebbene sia possibile implementare una soluzione con queste interfacce, ti consiglio caldamente di cercare una soluzione "più standard" diversa (ad es. Ethernet, RS485, CAN, ecc.). - Soprattutto se si prevede di utilizzare cavi per raggiungere la distanza di 6 piedi tra i microcontrollori.


6

Solo un FYI, l'interfaccia tra il telecomando wireless Nintendo Wii e il suo compagno Nunchuck utilizza I2C su un cavo lungo circa 3 piedi. Ci sono anche cavi di prolunga da 3 piedi che estendono la lunghezza totale a circa 6 piedi. Non è esattamente uguale all'impostazione (solo due dispositivi collegati insieme), ma è un esempio di I2C su un cavo in un prodotto di largo consumo.


4

Ho lavorato su un progetto che coinvolge circa 80 nodi basati su AVR in una rete a stella che comunica su I2C. Era un disastro totale e alla fine non ha funzionato. Ottenere aggiornamenti su tutti i nodi ha richiesto pochi secondi e una connessione difettosa avrebbe eliminato l'intera rete. L'ultima volta che ho parlato con il ragazzo che ha creato i nodi, ha detto che ha smesso di usare I2C per progetti come questo. Sfortunatamente non so perché specificamente I2C fosse inadeguato qui.


1
I2C è molto più lento di SPI ... potrebbe anche essere stato il modo in cui il tuo progetto ha gestito l'arbitrato in caso di collisioni ... o la capacità potrebbe essere stata abbastanza elevata con tutti quei nodi che hai dovuto usare solo una frequenza di clock lenta.
Jason S

2

Dovrebbe essere facile con quelle brevi distanze. Quello che potresti fare è capire cosa significano quelle distanze e il tuo cablaggio in termini di capacità e impedenza di linea e vedere che tipo di frequenze (tempi di salita / discesa) puoi attraversarle. Oltre un certo punto, è meglio trattarli come linee di trasmissione. Se sembra male, potresti effettivamente passare ad un'altra linea seriale come EIA-232 o 422. Ciò potrebbe significare un chip aggiuntivo su entrambe le estremità ma si estenderà lontano. Se hai davvero bisogno di andare veloce e lontano, avrai bisogno di qualcosa di più (Ethernet, non contare la radio o il laser :).


2

Se riesci a controllare la velocità del clock e non hai bisogno del trasferimento di dati ad alta velocità, dovresti provare a rallentare il clock. Ciò lo renderà meno suscettibile al rumore.

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.