Domanda:
Comunicazione tra 2 diversi microcontrollori
Anton Stafeyev
2018-10-21 17:39:55 UTC
view on stackexchange narkive permalink

Il mio Arduino funziona a una velocità di clock di 16 MHz;un altro microcontrollore funziona a una velocità di clock di 13 MHz.Se invio l'uscita digitale direttamente da un pin di uscita del primo al pin di ingresso di quest'ultimo, si verificherà una perdita di dati e la trasmissione sarà danneggiata.

Domanda 1: come posso fare in modo che gli MCU trasmettano correttamente i dati senza danneggiarli?Devo sincronizzarli in qualche modo o dovrei usare un altro dispositivo nel mezzo come una sorta di buffer (o forse per inviare dati a una velocità inferiore)?

Domanda 2: se posso inviare dati a una velocità inferiore dall'MCU n. 1 all'MCU n. 2, ci sarà una differenza di fase che provocherebbe il danneggiamento dei dati?

Due risposte:
pipe
2018-10-21 18:05:07 UTC
view on stackexchange narkive permalink

Hai perfettamente ragione nella tua analisi del problema e ovviamente è risolto.

La soluzione è un protocollo seriale di tua scelta. Un microcontrollore di solito ha uno o più dei comuni protocolli di comunicazione inter-IC:

L'UART è "senza orologio", quindi ogni parte deve decidere una velocità di clock. La velocità è sufficientemente bassa affinché ogni ricevitore possa trovare i bit giusti e risolve il problema della "fase" inserendo bit extra che saranno sempre bassi o alti adiacenti a un po 'di polarità opposta.

SPI e I2C hanno un orologio oltre ai dati. Il ricevitore agirà solo sui dati quando l'orologio cambia. Di solito l'hardware si occupa di tutto. I2C ha un limite di velocità di clock standardizzato, mentre SPI non ha tale limite.

Tra questi, SPI è probabilmente il più facile da implementare in hardware discreto. Essenzialmente non è altro che un registro a scorrimento e può interfacciarsi direttamente con un numero di chip logici economici e comuni. Inoltre, non esiste un limite di velocità inferiore e il jitter non è un problema poiché è guidato esclusivamente dall'orologio, quindi è facile da implementare nel software su un processore lento.

guarderò come sono fatti questi protocolli e come l'hardware li gestisce.grazie tante.ma cosa succede se ho bisogno di comunicare con un dispositivo che mi sono fatto da solo che non ha soluzioni integrate.come risolverei i problemi di fasatura.anmd orologi
@AntonStafeyev Spero che la mia recente modifica alla risposta abbia aiutato con la tua domanda, altrimenti chiedimi di chiarire di nuovo!
Poiché SPI bidirezionale è in realtà un buffer circolare, è davvero abbastanza semplice da implementare.
Assicurati solo che le polarità dell'orologio / del bordo del campione corrispondano sui due dispositivi.
solo per assicurarmi di essere sulla strada giusta.ad esempio, voglio creare un chip che invierà i dati tramite il protocollo tcp.Collegherò quel chip ad arduino tramite protocollo SPI, il dispositivo Ethernet riceverà i dati -> lo memorizzerò nel buffer e quindi invierà il pacchetto su Ethernet a un PC, ad esempio.questo è il mio obiettivo a breve termine per ora.
@AntonStafeyev Sembra ragionevole, a parte il fatto che vuoi fare un _chip_ prima ancora di aver sentito parlare di protocolli seriali.Penso che tu debba iniziare più piccolo.:)
volevo dire se prendo un'altra scheda arduino e la trasformo nell'interfaccia di rete.quindi supporta la comunicazione tramite wifi ed ethernet.come fare un normale adattatore di rete per PC ma per arduino.
Maple
2018-10-22 00:20:34 UTC
view on stackexchange narkive permalink

I punti che fai sono assolutamente validi. Quello che ti manca sono alcuni dettagli che potresti ottenere leggendo di più sui protocolli di comunicazione. Eccone alcuni.

  1. La velocità di comunicazione deve essere sempre scelta dalla velocità massima required, non quella che può essere raggiunta.

La ragione di ciò è che con alcune eccezioni (ricetrasmettitori, buffer ecc.) i dati trasferiti devono essere ottenuti o elaborati in qualche modo. L'input dall'interfaccia umana funziona certamente in una dimensione temporale completamente diversa. E se il controller impiega diversi secondi per elaborare 1 MB di dati, sarebbe inutile trasferirlo a una velocità di 16 Mbps.

  1. Poiché il rapporto segnale / rumore diminuisce con la distanza, anche la larghezza di banda massima achievable diminuisce.

Esiste il termine "prodotto larghezza di banda-distanza" spesso utilizzato nella comunicazione. Questo è un altro motivo per cui le connessioni dirette da MCU a MCU raramente utilizzano velocità di dati così elevate.

  1. Nelle moderne MCU le velocità di comunicazione sono spesso indipendenti dagli orologi della CPU.

Ad esempio, gli MCU Xmega hanno clock delle periferiche che funzionano a 2 o anche 4 volte la velocità della CPU. Inoltre, i controller con interfacce USB spesso hanno i propri oscillatori.

  1. Vari protocolli di comunicazione sono ora supportati in hardware.

I protocolli sincroni come SPI (o I2C sul lato slave) hanno i loro segnali di clock provenienti dai diversi MCU. Quindi, l'hardware può utilizzare quell'orologio per spostare i dati da / verso il buffer e coinvolgere il processore solo alla fine di un messaggio. Gli MCU più avanzati con supporto DMA possono persino spostare i dati tra diverse periferiche o memorie senza coinvolgere affatto la CPU.

I protocolli asincroni come UART o CAN richiedono orologi sincronizzati. Iniziano a temporizzare al bit di inizio e quindi campionano gli ingressi una volta approssimativamente al punto di metà clock (UART) o fino a tre volte a circa il 75% dell'impulso di clock (CAN). Ovviamente l'integrità dei dati dipende dalla precisione del clock. Mentre i controller CAN possono regolare i loro clock utilizzando le informazioni sullo spostamento di fase, gli UART più semplici non possono farlo.

Una pratica comune per ottenere una migliore sincronizzazione UART consiste nell'usare cristalli con frequenze facilmente divisibili per comuni velocità di trasmissione seriale. Ad esempio, invece di eseguire i suddetti controller Xmega al loro massimo 32 MHz, è spesso possibile vederli con 14,7456 cristalli, in esecuzione a 29,5 MHz.

Indipendentemente dal protocollo, la combinazione di buffering hardware e trasferimenti DMA rende la larghezza di banda di trasferimento abbastanza indipendente dai clock della CPU.

  1. Infine, quando la velocità di comunicazione aumenta, è più comune vedere chip controller separati piuttosto che connessione diretta all'MCU.

Non solo, ma di solito è possibile vedere la connessione del bus parallelo tra MCU e ricetrasmettitori ad alta velocità come il display LAN o LVDS. Questo perché il throughput del bus di comunicazione diventa più veloce di quanto possa essere passato in seriale tramite un singolo pin MCU.

Hai menzionato Ethernet in uno dei tuoi commenti. Dovresti renderti conto che con velocità Ethernet di 1 Gbps nessun MCU a 16 MHz ha la possibilità di elaborare quella valanga di traffico. Per quelle velocità dovresti guardare a un hardware molto più capace, come quello usato in RPi, per esempio.

A proposito, questo ultimo punto è solo un'altra forma del punto n. 1, cioè se non puoi ridurre la velocità dei dati a qualcosa che il tuo MCU può gestire, ne consegue logicamente che hai bisogno di un processore più veloce per gestire il flusso di dati.

Grazie per la risposta.questo aiuta molto.ma come al solito 1 risposta crea mille domande.e credo che a pochi di loro si possa rispondere subito.poiché hai detto che l'MCU semplicemente non avrà abbastanza velocità per elaborare i dati che provengono da un'altra estremità, quale sarebbe una soluzione in generale se volessi inviare i dati del mio sensore al server remoto.Non ho davvero bisogno di ricevere nulla in cambio.e poiché è un server remoto, preferirei HTTP come strato finale di tutti i protocolli utilizzati.o addirittura potrebbe essere un flusso di dati UDP.
Bene, è facile.Ogni sensore ha le proprie velocità di acquisizione dati.La precisione spesso dipende da questa velocità, quindi è comune eseguirli più lentamente del possibile per ottenere una migliore precisione.D'altra parte hai un server, che ha anche la velocità massima dei dati definita dal protocollo e dalla capacità del server.Non solo, ma la disponibilità del server cambia con il carico, ovvero il numero di richieste simultanee che deve elaborare.Calcolare la velocità dati massima _desiderabile_ di un sensore e la velocità dati massima _disponibile_ di un server al massimo carico.Il minore dei due sarebbe la velocità dati target.
Dato che hai menzionato HTTP / UDP, devo sottolineare che l'intera domanda non è valida.Non stai solo comunicando tra due MCU.Stai comunicando su un ** canale di trasferimento noto **, che richiede velocità di trasmissione dati piuttosto elevate per gestire il ** sovraccarico del protocollo **.Indipendentemente dalla velocità di acquisizione dei dati, il controller deve gestire le buste dei pacchetti e praticamente l'intero stack TCP / IP.Il mio consiglio sarebbe quello di utilizzare alcuni dei moduli con controller ethernet / wifi integrati e tutto il software richiesto per questo.La lettura del sensore stesso sarebbe il minore dei tuoi problemi.
bene questo è il punto.un modulo con wifi o ethernet comunica tramite SPI all'MCU.e questo processo sta sollevando così tante domande che voglio inchiodare ogni singola parte entrando e uscendo :) tutto quello che chiedevo è la direzione e voi ragazzi me lo avete dato :)
In pratica ora so che mcu non sarà in grado di scrivere alla velocità richiesta da Ethernet, quindi se usassi qualcosa di simile a un microprocessore come la corteccia del braccio e impiantassi l'intera rete lì.avrei ancora bisogno di parlare tramite spi al mio minuscolo mcu.quindi quello era il seme della domanda.
È più comune vedere adattatori da USB a Ethernet che da SPI a Ethernet.Ma puoi certamente usare SPI per MCU più lenti come Arduino su ATmega.Notare che in questo caso MCU non elabora la comunicazione Ethernet effettiva.Come ho accennato al punto 5, un chip esterno come ENC28J60 fa la maggior parte del discorso, implementando livelli MAC e PHY e fornendo enormi buffer.
Maple è possibile invitarti all'app Discord per una chat se hai tempo.perché ho così tante domande ma la maggior parte delle cose che trovo su google è solo wiki copypaste)
Cerchiamo di [continuare questa discussione in chat] (https://chat.stackexchange.com/rooms/84758/discussion-between-maple-and-anton-stafeyev).
anno dopo mi sento così stupido per aver fatto questa domanda :)


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 4.0 con cui è distribuito.
Loading...