Svantaggi quando si considera SPI o I2C?


117

Quali compromessi dovrei prendere in considerazione quando decido di utilizzare un'interfaccia SPI o I2C?

Questa scheda di accelerazione / giroscopio breakout è disponibile in due modelli, uno per ogni interfaccia. Uno dei due sarebbe più facile da integrare in un progetto Arduino?

http://www.sparkfun.com/products/11028

inserisci qui la descrizione dell'immagine


13
I2C e SPI hanno i loro punti di forza. L'I2C è più complesso da configurare, una volta stabile è possibile estenderlo facilmente (purché il cablaggio del bus non diventi troppo lungo o grande). SPI è facile da configurare .. puoi bitbang molto facilmente se necessario. L'espansione mangia I / O con tutte le selezioni di chip. Se ho il lusso di I / O e spazio per i connettori e non ho bisogno di autobus, andrei sempre con SPI.
Hans

In che modo I2C è più complesso? Ho usato entrambi i bus su diversi micro (PIC piccoli e ARM di dimensioni decenti) e in ogni caso la configurazione I2C era più semplice (cioè meno registri da scrivere). Semmai, SPI è più complesso a causa della polarità dell'orologio e delle opzioni di campionamento dei dati.
Armandas,

6
@Armandas - Assolutamente no! SPI ha 4 possibili modalità per la polarità di clock / dati e due di esse dominano: quasi tutti i dispositivi SPI aggiornano la loro uscita MISO sul fronte di discesa di un orologio e leggono il loro ingresso MOSI sul fronte di salita di un orologio. Puoi capire quale in pochi minuti guardando la scheda tecnica, e poi hai finito. Se scegli la modalità sbagliata per errore, la scoprirai rapidamente una volta che guarderai le tracce dell'oscilloscopio. Gli errori dei dati SPI sono rari e non ti bloccano in strani stati come fa I2C.
Jason S

6
Dico che I2c è molto più complesso perché una volta ho dovuto scrivere un driver I2C su un processore ARM. Ho seguito la macchina a stati dei documenti NXP, ed era lunga circa 20 stati. Mi ci è voluto un tempo decente per capire la conferma, quando l'ultimo byte viene letto / scritto, ecc. Non ho mai avuto nessuno di questi problemi con SPI, devo solo allineare l'orologio e i dati.
Hans

1
@JonL, beh, francamente, io sono l'unico ad aver fornito una risposta completa finora, dato che io sono l'unico a discutere la questione della particolare breakout board il PO vuole usare, e sottolineare che è non è disponibile in sia SPI che I2C, ma solo I2C - quindi deve usare I2C se vuole usare questa particolare scheda. Gli altri hanno trattato solo di quale interfaccia (SPI o I2C) è più facile da interfacciare, che ho anche coperto.
Tcrosley,

Risposte:


98

Sommario

  • SPI è più veloce.
  • I2C è più complesso e non così facile da usare se il microcontrollore non ha un controller I2C.
  • I2C richiede solo 2 linee.

I2C è un sistema di bus con dati bidirezionali sulla linea SDA. SPI è una connessione point-to-point con dati in entrata e in uscita su linee separate (MOSI e MISO).

Essenzialmente SPI è costituito da una coppia di registri a scorrimento, in cui si sincronizzano i dati in un registro a scorrimento mentre si sincronizzano i dati dall'altro. Di solito i dati vengono scritti in byte avendo ogni volta 8 impulsi di clock in successione, ma questo non è un requisito SPI. Puoi anche avere una lunghezza delle parole di 16 bit o addirittura 13 bit, se lo desideri. Mentre in I2C la sincronizzazione viene eseguita dalla sequenza di avvio in SPI, viene eseguita da SS andando in alto (SS è attivo in basso). Decidi te stesso dopo quanti impulsi di clock si tratta. Se si usano parole a 13 bit, SS bloccherà l'ultimo clock in bit dopo 13 impulsi di clock.
Poiché i dati bidirezionali si trovano su due linee separate, è facile da interfacciare.

SPI in modalità standard richiede almeno quattro linee: SCLK (serial clock), MOSI (Master Out Slave In), MISO (Master In Slave Out) e SS (Slave Select). In modalità bidirezionale sono necessarie almeno tre righe: SCLK (serial clock), MIMO (Master In Master Out) che è una delle linee MOSI o MISO e SS (Slave Select). Nei sistemi con più di uno slave è necessaria una linea SS per ogni slave, in modo che per slave si abbiano linee in modalità standard e linee in modalità bidirezionale. Se non lo si desidera, in modalità standard è possibile collegare in cascata gli slave collegando il segnale MOSI di uno slave al MISO di quello successivo. Ciò rallenterà la comunicazione poiché è necessario scorrere tutti i dati degli slave.N + 3 N + 2NN+3N+2

Come afferma Tcrosley, SPI può operare a una frequenza molto più elevata di I2C.

I2C è un po 'più complesso. Dal momento che è un autobus è necessario un modo per indirizzare i dispositivi. La comunicazione inizia con una sequenza di avvio unica: la linea dati (SDA) viene abbassata mentre l'orologio (SCL) è alto, per il resto i dati di comunicazione possono cambiare solo quando l'orologio è basso. Questa sequenza di avvio sincronizza ogni comunicazione.
Poiché la comunicazione include l'indirizzamento, sono necessarie solo due linee per qualsiasi numero di dispositivi (fino a 127).

modifica
È ovvio che la linea di dati è bidirezionale, ma vale la pena notare che questo vale anche per la linea di clock. Gli schiavi possono allungare l'orologio per controllare la velocità del bus. Ciò rende I2C meno conveniente per il cambio di livello o il buffering. (Le linee SPI in modalità standard sono tutte unidirezionali.)

Dopo l'invio di ciascun byte (indirizzo o dati), il destinatario deve confermare la ricezione inserendo un impulso di conferma su SDA. Se il tuo microcontrollore ha un'interfaccia I2C, questo verrà automaticamente curato. Puoi ancora bit-bang se il tuo microcontrollore non lo supporta, ma dovrai cambiare il pin I / O dall'output all'input per ciascun riconoscimento o leggere i dati, a meno che tu non usi un pin I / O per leggere e uno per la scrittura.

A 400kHz I2C standard è molto più lento di SPI. Esistono dispositivi I2C ad alta velocità che funzionano a 1 MHz, ancora molto più lento di SPI a 20 MHz.


7
Non ho ancora incontrato un microcontrollore che gestisce tutti i casi angolari di I2C necessari per gestire il corretto rilevamento degli errori e il recupero in un modo utilizzabile senza dover essere un esperto I2C. Ho sempre dovuto ricadere da una periferica I2C "intelligente" a un bitbanging temporaneamente per gestire il caso di mancato clock quando SDA è tenuto basso, il che è un dolore completo. /
Jason S

(ma +1 dato che sono d'accordo con il resto della tua risposta)
Jason S

Esistono persino dispositivi I2C che funzionano a 3,4 MHz, ma non sono sicuro che possano essere combinati con dispositivi più lenti (poiché tutti i dispositivi devono essere in grado di seguire l'indirizzamento del bus). Credo anche che i tempi di I2C a 3,4 MHz siano leggermente diversi.
Hans

@Hans - HS I2C sembra essere compatibile verso il basso con i più comuni dispositivi a 400 kbit. Francamente, (senza ricerche approfondite) non ho mai visto un microcontrollore che supporti HS (ancora), ecco perché non volevo menzionarlo.
Stevenvh

@stevenvh: Le implementazioni a due fili di alcuni controller (ad es. Cypress PSOC) richiedono che SCK sia basso per almeno uno o due cicli di un clock interno prima che si blocchino e non funzionino male. Non so perché non siano in grado di rilevare e allungare il clock di una condizione di avvio I2C senza un impulso di clock del sistema, ma tali comportamenti indicano che quando un chip di questo tipo viene eseguito a una bassa velocità di clock del sistema, tutte le transazioni I2C sul bus devono correre lentamente). Anche il funzionamento a 400Khz è troppo veloce per un PSOC a 3MHz.
supercat

39

(modifica: per essere chiari, molte delle seguenti preoccupazioni hanno a che fare con l'integrità del segnale causata dall'uso scheda-scheda dei dispositivi I2C / SPI, come sottolinea correttamente Olin.)

A meno che tu non abbia vincoli che ti spingano fortemente verso un minor numero di fili (avevamo un progetto con un connettore sigillato ermeticamente che ogni contatto aggiuntivo era piuttosto costoso), evita I2C quando possibile e attacca con SPI.

SPI è abbastanza facile da gestire su base hardware e software. Nell'hardware esistono due linee dati condivise, Master In Slave Out (MISO o SOMI) e Master Out Slave In (MOSI o SIMO), un clock condiviso generato dal master e una selezione di chip per dispositivo. La linea CS si abbassa, il clock scorre e si sposta essenzialmente nei bit di input e sposta i bit di output, fino al termine della transazione, a quel punto la linea CS diventa alta. Quando la loro linea CS è alta, i dispositivi slave non comunicano: ignorano le linee CLK e MOSI e mettono il loro pin MISO in uno stato ad alta impedenza per consentire a qualcun altro di usarlo.

Se si dispone di un microcontrollore che utilizza diversi dispositivi SPI e ha una periferica SPI integrata, inviare l'output CS del microcontrollore a un demultiplexer (ad esempio 74HC138) e controllare le linee degli indirizzi per selezionare il dispositivo tra le transazioni SPI; scrivi le parole in un registro per metterle in coda per l'output e le rileggi dopo che il pin CS è alzato in alto.

Poiché i segnali SPI sono tutti unidirezionali, possono essere bufferizzati, utilizzati attraverso una barriera di isolamento con isolatori digitali e possono essere inviati da scheda a scheda utilizzando driver di linea come LVDS. L'unica cosa di cui devi preoccuparti è il ritardo di propagazione di andata e ritorno, che limiterà la frequenza massima.


I2C è una storia completamente diversa. Sebbene sia molto più semplice dal punto di vista del cablaggio, con solo due fili SCL e SDA, entrambe queste linee sono linee bidirezionali condivise che utilizzano dispositivi a drenaggio aperto con un pullup esterno. Esiste un protocollo per I2C che inizia trasmettendo un indirizzo di dispositivo, in modo che possano essere utilizzati più dispositivi se ognuno ha il proprio indirizzo.

Dal punto di vista hardware, è molto difficile utilizzare I2C in sistemi che presentano rumori significativi. Per bufferizzare o isolare le linee I2C, devi ricorrere a circuiti integrati esotici - sì, esistono, ma non ce ne sono molti: ne abbiamo usato uno su un progetto e ci siamo resi conto che potresti usare un isolatore, ma non puoi usane due in serie - ha usato piccole cadute di tensione per capire da che parte era la parte trainante delle cose, e due cadute in serie erano due.

Le soglie del livello logico di I2C dipendono da Vcc, quindi è necessario fare molta attenzione se si utilizzano dispositivi 3V / 3.3V e 5V nello stesso sistema.

Qualsiasi segnale che utilizza un cavo di più di un piede o due deve preoccuparsi della capacità del cavo. La capacità di 100pf / metro non è fuori dall'ordinario per il cavo multiconduttore. Ciò comporta la necessità di rallentare il bus o utilizzare resistenze di pullup inferiori per essere in grado di gestire correttamente la capacità aggiuntiva e soddisfare i requisiti di tempo di salita.

Supponiamo quindi che tu abbia un sistema che ritieni di aver progettato bene e che tu possa affrontare la maggior parte dei problemi di integrità del segnale e che il rumore sia raro (ma ancora presente). Di cosa ti devi preoccupare?

Ci sono un sacco di condizioni di errore che devi essere preparato per gestire:

  • Il dispositivo slave non riconosce un byte particolare. È necessario rilevare questo, arrestare e riavviare la sequenza di comunicazioni. (Con SPI, di solito è possibile rileggere i dati inviati se si desidera assicurarsi che siano stati ricevuti senza errori.)

  • Stai leggendo un byte di dati da un dispositivo slave e il dispositivo è "ipnotizzato" a causa del rumore sulla linea dell'orologio: hai inviato gli 8 orologi necessari per leggere quel byte, ma a causa del rumore il dispositivo slave lo pensa ha ricevuto 7 orologi e sta ancora trasmettendo uno 0 sulla linea dati. Se il dispositivo avesse ricevuto l'ottavo clock, avrebbe liberato la linea di dati in modo che il master potesse alzare o abbassare la linea di dati per trasmettere un bit ACK o NACK, oppure il master poteva trasmettere una condizione di arresto (P). Ma lo slave mantiene ancora bassa la linea dati, aspettando invano un altro orologio. Se un master non è disposto a provare altri clock, il bus I2C sarà bloccato in deadlock. Mentre ho usato diversi microcontrollori che gestiscono le normali condizioni ACK / NACK,

  • Il caso davvero terribile è quando un master sta scrivendo dati su un dispositivo slave e un altro slave interpreta in modo errato l'indirizzo del dispositivo e pensa che i dati trasmessi siano destinati a questo. Abbiamo avuto dispositivi I2C (espansori I / O) che a volte hanno registri impostati in modo errato a causa di ciò. È quasi impossibile rilevare questo caso ed essere robusto al rumore, è necessario impostare periodicamente tutti i registri, in modo che se si verifica questo errore, almeno verrà risolto dopo un breve periodo di tempo. (SPI non ha mai questo problema - se ti capita di avere un problema tecnico sulla linea CS, non persisterà mai a lungo e non otterrai i dati accidentalmente letti dal dispositivo slave sbagliato.)

Molte di queste condizioni potrebbero essere gestite correttamente nel protocollo in caso di rilevamento di errori (codici CRC), ma pochi dispositivi dispongono di questo.


Trovo che devo creare software complessi nel mio dispositivo master I2C per gestire queste condizioni. A mio avviso, non ne vale la pena a meno che i vincoli sul cablaggio non ci costringano a utilizzare I2C e non SPI.


5
La tua antipatia religiosa per l'IIC non ha posto qui. Sia IIC che SPI sono bravi in ​​quello che fanno e ognuno ha il suo posto. La maggior parte delle obiezioni a IIC proviene da un uso inappropriato di esso. L'IIC dovrebbe essere considerato solo a bordo, sebbene venga utilizzato abitualmente nel settore degli alimentatori per il controllo di forniture intelligenti. Se ti ritrovi a desiderare buffer IIC, questa è una forte indicazione che IIC non è la soluzione giusta. Tuttavia, IIC funziona molto bene per i dispositivi a bassa velocità tutti sulla stessa scheda.
Olin Lathrop

2
Le soglie del livello logico di I2C dipendono da Vcc, quindi è necessario fare molta attenzione se si utilizzano dispositivi 3V / 3.3V e 5V nello stesso sistema . No, questo è sbagliato. Le soglie logiche IIC sono a tensioni fisse. Puoi banalmente mescolare sistemi a 5 V e 3,3 V tirando le linee a soli 3,3 V.
Olin Lathrop

5
Non è una antipatia religiosa di I2C, è una antipatia pratica di I2C. Hai ragione sul fatto che è molto più facile con i sistemi di bordo; Lo userò quando ha senso, ma aggiunge il costo del software e troppi ingegneri hardware attaccano un dispositivo I2C su una scheda senza discutere i compromessi che causano più mal di testa al software.
Jason S

3
IIC è un po 'più facile da implementare elettricamente e SPI forse un po' più facile nel firmware. Entrambi sono comunque piuttosto facili e diretti sotto entrambi gli aspetti.
Olin Lathrop,

2
@Olin - la soglia fissa da 1,5 V sembra essere stata utilizzata in passato, ma secondo l'ultima versione delle soglie specifiche sono effettivamente 0,3 Vcc e 0,7 Vcc. Questa citazione dalle specifiche menziona 1,5 V per dispositivi legacy.
Stevenvh

16

La scheda breakout per dispositivo su SparkFun è in realtà solo per la versione I2C (MPU-6500). La versione MPU-6000 ha entrambe le interfacce SPI e I2C sullo stesso chip e non vedo che SparkFun abbia una scheda con quel chip. Quindi credo che ti limiti ad usare I2C se vuoi usare quella particolare scheda. Ma avrei raccomandato di usare I2C comunque nella tua situazione per i seguenti motivi.

In generale, scoprirai che il bus I2C è più facile da usare dal punto di vista hardware rispetto al bus SPI. I2C è un bus a 2 fili (SCL / SDA):

SCL – Serial clock.
SDA – Serial data (bidirectional).

SPI è un bus a 4 fili (SCLK / MOSI / MISO / CS):

SCLK– Serial clock.
MOSI – Master-out, Slave-in. Data from the CPU to the peripheral.
MISO – Master-in, Slave out. Data from the peripheral back to the CPU.
CS – Chip select.

È possibile disporre di più dispositivi collegati a un bus I2C. Ogni dispositivo ha il proprio set di indirizzi integrato nel chip. L'indirizzo viene effettivamente trasmesso sul bus come primo byte di ogni comando (insieme a un bit di lettura / scrittura). Questo, insieme ad altri costi generali, richiede l'invio di più bit su un bus I2C rispetto a SPI per la stessa funzionalità.

Diverse classi di dispositivi (memoria, I / O, LCD, ecc.) Hanno intervalli di indirizzi diversi. Alcuni dispositivi, che vengono comunemente utilizzati più di una volta in un sistema (come l'espansore I / O PCF8574), utilizzano una o più linee di indirizzo (AD0-2 per PCF8574) che possono essere collegate in alto o in basso per specificare i bit bassi dell'indirizzo. L'MPU-6500 ha una di queste linee di indirizzo (AD0), quindi due di esse possono essere utilizzate nello stesso sistema.

Puoi anche avere più dispositivi su un bus SPI, ma ogni dispositivo deve avere una propria linea di selezione chip (CS). Pertanto, la descrizione a 4 fili è un termine improprio: si tratta in realtà di un'interfaccia a tre fili + un filo aggiuntivo per dispositivo. Non ho esperienza con la serie di schede Arduino, ma credo che questo renderebbe più difficile l'utilizzo di SPI su Arduino, poiché se aveste bisogno di molte linee di selezione dei chip questo inizierebbe a diventare ingombrante con le assegnazioni dei pin comuni utilizzate dai vari scudi .

Credo che la maggior parte delle schede Arduino funzionino a 5 volt, con alcune più recenti a 3.3v. L'MPU-6500 funziona a 3,3v. Se la tensione "alta" in ingresso minima per un bus I2C su una CPU 5v è 3v o inferiore, è possibile evitare problemi di conversione del livello fornendo semplicemente resistori pullup da 10K a 3,3v sulle linee SCL e SDA, poiché il bus è aperto- collettore. Assicurarsi che eventuali pullup interni a 5 v su una CPU siano disabilitati.

Tuttavia ho controllato il foglio dati per l'ATmega2560 (usando come esempio l'ADK 5v Arduino), e la sua tensione 'alta "in ingresso minima è 0,7 * Vcc, o 3,5v che è maggiore di 3,3 V. Quindi hai bisogno di una sorta di livello attivo conversione La TI PCA9306 , che richiede resistori di pullup su entrambi i lati 5v e 3,3v del chip, costa solo 78 centesimi in singole quantità.

Perché mai scegliere SPI su I2C? Principalmente perché SPI può essere eseguito molto più velocemente - fino a molti 10 di MHz in alcuni casi. I2C è generalmente limitato a 400 KHz. Ma questo non è davvero un problema per l'accelerometro MPU-6050/6000, poiché funziona a 400 KHz per I2C e solo 1 MHz per SPI - non c'è molta differenza.


3
Un altro motivo per scegliere SPI su I2C: tutte le linee sono unidirezionali, il che rende le cose come i cambi di livello un po 'più facili.
segna il

3
I2C è più facile di SPI ?! L'unica cosa su I2C che è più semplice è la connettività se puoi semplicemente collegare tutto insieme. In caso contrario, l'integrità del segnale è più dura in I2C e la solida implementazione del software è molto più dura in I2C.
Jason S

2
@JasonS, ho completato dozzine di progetti software incorporati utilizzando I2C e non ho mai incontrato i problemi di blocco citati nel tuo post. Posso capire che non ti piace a causa delle tue brutte esperienze. Attualmente ho un prodotto sul mercato che utilizza un DAC I2C per l'output audio, leggendo contemporaneamente il successivo buffer di dati da una scheda SD su SPI. Funziona alla grande. Non potevo usare SPI sia per il DAC che per la scheda SD poiché stavo ottenendo contese sul bus e l'audio si era rotto. Il micro (uno di fascia bassa) ha solo una SPI e una porta I2C.
Tcrosley,

1
Sono impressionato dal fatto che puoi trasmettere l'audio a un DAC I2C! (qual è la frequenza di clock massima?) Se si utilizzano circuiti integrati integrati con basse tirature, la probabilità di incorrere in un blocco è estremamente ridotta, ma esiste ancora. (Inoltre non ti imbatteresti mai in esso se stai solo scrivendo dati su I2C. Ti richiede di leggere da un dispositivo che è disposto ad aspettare per sempre quello che pensa sia un orologio mancante / extra.)
Jason S

1
@JasonS, l'audio è solo di qualità vocale, 8KHz - sto usando un interrupt 128 us per emettere ogni campione a 16 bit. L'I2C esegue anche il proprio interrupt. Il tempo libero viene utilizzato per leggere i dati dalla scheda SD. Un buon punto sul blocco non si verifica mai durante la scrittura. Tranne gli ADC, in genere ho usato I2C per i dispositivi di output. Tuttavia, sapevi che l'interfaccia di sola lettura (2 pulsanti, accelerometro e joystick) tra il telecomando Wii e Wii Nunchuck (che si trova su un cavo da 3 ') è I2C a 400 KHz? Molte informazioni sul Web riguardano l'hacking di questa interfaccia del dispositivo.
Tcrosley,

15

In generale, SPI è un bus più veloce - la frequenza di clock può essere in un intervallo di MHz. Tuttavia, SPI richiede almeno 3 linee per la comunicazione bidirezionale e una selezione slave aggiuntiva per ciascun dispositivo sul bus.

I2C richiede solo 2 linee, indipendentemente da quanti dispositivi hai (entro certi limiti, ovviamente). La velocità, tuttavia, è nell'intervallo di kHz (100-400kHz è tipico).

La maggior parte dei microcontrollori, al giorno d'oggi, ha il supporto hardware per entrambi i bus, quindi entrambi sono ugualmente semplici da usare.


4
@Jason: sembra che tu abbia qualche pregiudizio contro l'IIC, ma non è giusto dire altre persone a causa di ciò. Sia IIC che SPI sono "facili", ognuno con le proprie rughe. SPI ha bisogno di linee extra, che non può essere facile. IIC è un po 'più complicato, ma è comunque facile eseguire tutte le implementazioni del firmware, cosa che ho fatto più volte. Non ci vuole molto codice. Entrambi hanno il loro posto ed entrambi sono abbastanza facili da non essere un fattore per chiunque sappia cosa stanno facendo.
Olin Lathrop

5
@Jason: ho appena verificato, e il mio codice IIC generico per l' implementazione del firmware di IIC su PIC a 8 bit è solo 311 righe, e probabilmente oltre la metà di questi sono commenti. Ciò ti fornisce un'interfaccia procedurale al bus IIC a livello di routine per avviare, mettere, ottenere, interrompere, ecc. Un grosso problema. Un modulo che chiama per guidare una EEPROM semplice è di 272 righe, probabilmente di nuovo 1/2 commenti, e che include una gestione di alto livello come dati predefiniti, interfaccia di debug UART, ecc. Tutto ciò è così banale che discutere se ci vogliono 10 istruzioni in meno di SPI è inutile.
Olin Lathrop,

2
@Andrew Kohlsmith - I2C is designed for on-board applications.- Apparentemente i produttori di dispositivi I2C non sono d'accordo con te. Prendi il TMP100 . La pagina del prodotto afferma esplicitamente: The TMP100 and TMP101 are ideal for extended temperature measurement in a variety of communication, computer, consumer, environmental, industrial, and instrumentation applications.lo stesso vale per TMP75
Connor Wolf

5
@FakeName Sei errato; Ho trascorso 13 anni facendo elettronica di potenza industriale. (l'avvio e il monitoraggio di GRANDI mtors trifase è un ambiente MOLTO rumoroso) Non si tratta di SPI più affidabile, si tratta di progettare il sistema con tutte le modalità di guasto pianificate e contabilizzate e di avere opzioni di ripristino integrate nel sistema dove necessario. Non ho mai avuto un picco di rumore mai ucciso le mie comunicazioni I2C (o SPI del resto), ma non ho mai fatto affidamento esclusivamente sul controller I2C per fare tutto per me. È una questione di pianificazione e progettazione, non di un autobus migliore.
akohlsmith,

2
@akohlsmith: I2C single-master single-slave dovrebbe essere robusto con un master "bit-bang". Se ci sono più slave e due contemporaneamente vengono "confusi" in modi diversi, il bus potrebbe bloccarsi irrimediabilmente (ad es. Se due o più chip di memoria che sono pieni di zero pensano entrambi che il master stia cercando di leggerli, ma i loro contatori di bit sono fuori sincrono, allora ogni rilascerà SDA nei periodi in cui l'altro sta affermando, e nulla il master può fare la volontà di liberare il bus a meno che non può guidare un "alto" abbastanza potente da overdrive tutti gli slave.
Supercat

12

SPI può essere eseguito molto più velocemente di I2C (alcuni dispositivi SPI superano i 60 MHz; non so se le specifiche I2C "ufficiali" consentano dispositivi oltre 1 MHz). L'implementazione di un dispositivo slave che utilizza uno dei due protocolli richiede il supporto hardware, mentre entrambi consentono una facile implementazione di master "software bit-bang". Con un hardware relativamente minimo, è possibile costruire uno slave conforme a I2C che funzionerà correttamente anche se l'host può decidere arbitrariamente di ignorare il bus fino a 500us alla volta, senza la necessità di cavi di handshaking aggiuntivi. Un'operazione SPI affidabile, tuttavia, anche con il supporto hardware , richiede generalmente che si aggiunga un cavo di handshake, oppure che l'host "manualmente" aggiunga un ritardo dopo ogni byte pari al tempo di risposta nel caso peggiore dello slave.

Se avessi i miei druther, il supporto SPI dei controller conterrebbe alcune semplici funzioni extra per fornire trasferimenti di dati bidirezionali trasparenti a 8 bit tra i controller con capacità di handshaking e wake-up, utilizzando un totale di tre fili unidirezionali (Clock e MOSI [master -out-slave-in] dal master; MISO [master-in-slave-out] dallo slave). In confronto, la comunicazione efficiente e affidabile tra i microcontrollori con porte SPI "stock", quando entrambi i processori potrebbero essere ritardati indipendentemente per periodi di tempo arbitrari, richiede l'uso di molti più fili (Chip-Select, Clock, MISO e MOSI per iniziare con, oltre a una sorta di cavo di riconoscimento dallo slave. Se lo slave potrebbe iniziare in modo asincrono a disporre dei dati da inviare (ad es. perché qualcuno ha premuto un pulsante), è necessario utilizzare un altro cavo come "sveglia"

I2C non fornisce tutte le abilità che il mio SPI "migliorato" avrebbe, ma offre capacità di handshaking integrate che mancano all'SPI e in molte implementazioni può essere kludged per fornire anche il risveglio, anche se il master è un software bit-bang. Per la comunicazione tra processori, raccomanderei quindi fortemente I2C su SPI, tranne quando sono necessarie velocità più elevate di quelle che SPI è in grado di fornire e l'uso di pin extra è accettabile. Per le comunicazioni tra processori in cui è necessario un numero di pin basso, le UART hanno molto da consigliarle.


Esiste una versione ad alta velocità di I2C che consente 1MHz; I2C normale è 400kHz.
The Resistance

@TheResistance: so che il normale I2C era 400kHz, ma le versioni erano specificate fino a 1MHz. Quello che non so è se sono state specificate versioni più veloci.
supercat

Secondo le specifiche 400kbps (non kHz, ho usato lì le unità sbagliate) è Fast-mode, 1Mbps è Fast-mode Plus e c'è una modalità ad alta velocità fino a 3,4 Mbps. Ultra-veloce arriva fino a 5 Mbps, ma è unidirezionale.
The Resistance,

@TheResistance: grazie. Non avevo sentito parlare di quelle versioni successive. Cosa intendi esattamente con "unidirezionale"? So che la velocità della comunicazione SPI da slave a master può andare più veloce di quella da master a slave perché è garantito che lo slave ottenga il suo clock dopo il master, ma non sono sicuro di un concetto equivalente per I2C. Hai un linky?
supercat

Trova le specifiche qui . A pagina 23 si dice che Ultra-fast può essere usato per dispositivi che non inviano dati (solo scrittura), nemmeno ACK.
The Resistance,

8

Questa domanda è stata approfondita nelle eccellenti risposte qui, ma forse c'è un altro punto di vista su I 2 C che potrei offrire dal punto di vista di un produttore di chip.

L' interfaccia elettrica dell'I 2 C è un open collector . Ora respira e pensa alle implicazioni. Usando I 2 C, posso progettare un chip totalmente agnostico rispetto alla tensione operativa del bus. Tutto ciò che devo essere in grado di fare è abbassare la linea SDA se mi fa piacere farlo, e confrontare le tensioni di SCL e SDA con una tensione di soglia riferita a terra, che posso scegliere. E se lascio fuori le normali strutture di protezione high side e le sostituisco con altre strutture, posso creare un chip che può totalmente vivere la propria vita indipendente dal resto del sistema - SCL, SDA non alimentano mai corrente al mio chip e io certamente non alimenterà corrente a quei pin. Ecco perché è un bus così bello per orologi in tempo reale e altre cose a bassa potenza come quella.


4

Una cosa che non ho visto menzionato nelle altre risposte è che I2C supporta più master sullo stesso bus. Se è necessaria una comunicazione bidirezionale e non si desidera utilizzare un metodo basato sul polling, I2C eseguirà il lavoro.

Su distanze più lunghe, CAN ha le stesse capacità ed è più robusto. Ma CAN è un protocollo asincrono che richiede supporto hardware e un ricetrasmettitore, quindi potrebbe non essere un'opzione in un sistema a basso costo.


Un buon punto (su multi master), ho visto anche dispositivi SPI con pin di interruzione, mentre un dispositivo è ancora il master, entrambi possono istanziare la comunicazione (bidirezionale). Per i dispositivi remoti lì, ovviamente ci sono opzioni più solide e migliori (come CAN).
Paul,

0

Utilizzare il protocollo SPI e scrivere i bit direttamente sul dispositivo ogni volta che l'orologio di sincronizzazione è in aumento. Il circuito logico xnor può essere utilizzato per abbinare l'indirizzo "casalingo" da una memoria per selezionare il dispositivo desiderato come se fosse un dispositivo i2c.

L'i2c sta integrando il circuito autorial all'interno del formato del dispositivo, gli standard ... ecc. Sono complessi e diversi, con una SPI puoi usare una memoria SPI per visualizzare un video sullo schermo, ma non i2c.

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.