Come verificare che il bus CAN sia gratuito o meno


8

Ho letto molte cose sull'arbitrato del CAN bus, ma non ha risposto alle mie domande.

Se un nodo sta già trasmettendo i dati sul bus e tra un altro nodo desidera avviare il trasferimento dei dati, come farà quel "altro nodo" a sapere che il bus è occupato?

Tutti i documenti (che ho letto) presuppongono che entrambi i nodi inizino la trasmissione simultaneamente e quindi uno con il primo bit dominante otterrà il bus ma nessuno ha spiegato la condizione che voglio conoscere.


1
Swanand, potresti ottenere risposte migliori alle tue domande se aspetti ancora un po 'per accettare la risposta. Questa è una comunità internazionale e alcuni esperti potrebbero non essere in grado di rispondere immediatamente.
W5VO,

@ W5VO Lo ricorderò la prossima volta! Grazie per il suggerimento! :)
Swanand,

Risposte:


10

La risposta breve è che il nodo deve monitorare le linee CAN per rimanere inattive per un certo tempo prima di tentare di trasmettere. Pertanto, se un altro nodo sta trasmettendo, deve rimanere in silenzio fino a quando l'altro nodo non viene eseguito.

Un bus CAN si basa sulla segnalazione differenziale. Le due linee, CAN-High (CAN +) e CAN-Low (CAN-), hanno entrambe lo stesso potenziale quando il bus è inattivo. Per inviare bit, un trasmettitore CAN inserisce una tensione differenziale sulle linee di circa 2 volt.

Un trasmettitore CAN vede prima se il bus è inattivo e, se lo è, inizia a trasmettere. Come funziona l'arbitrato è che un trasmettitore controlla il bus mentre sta trasmettendo. La trasmissione avviene come sopra mantenendo le due linee allo stesso potenziale o ad un potenziale differenziale. Quindi se il trasmettitore trasmette un po 'mantenendo le linee allo stesso potenziale (sic), ma vede che le due linee di trasmissione hanno un potenziale differenziale, ciò significa che qualche altro nodo sta trasmettendo e il primo trasmettitore ha perso l'arbitrato. Deve quindi interrompere la trasmissione.

Quando un nodo inizia a trasmettere per la prima volta, i bit trasmessi sono gli stessi fino all'indirizzo del nodo trasmittente che sono ovviamente diversi. Se due nodi iniziano a trasmettere insieme, trasmetteranno insieme in sincronia fino a raggiungere la parte dell'indirizzo. Quando l'indirizzo differisce, un nodo noterà una potenziale differenza sulle linee anche quando non ne inserisce una sulle linee. Quindi sa di aver perso e deve riprovare. Il nodo vincente continua a trasmettere senza sapere che anche qualche altro nodo ci stava provando. Naturalmente, questa logica si estende anche a più di due nodi.

Spero che questo possa essere d'aiuto.


1
Buona risposta! Se ricordo bene, l'invio di uno "0" è dominante su uno "1", il che si traduce nell'arbitrato vincente dell'indirizzo più basso. Una caratteristica chiara di ciò è che se il nodo perdente si interrompe quando dovrebbe fermarsi, non ci sarà corruzione dei dati sul bus.
W5VO,

Bella risposta !! Ti saremo molto grati se potessi chiarire questo: diciamo che gli identificatori sono "1011001" e "1000110" quando viene raggiunto il terzo bit il primo trasmettitore sta inviando "1" e il secondo sta inviando "0"; così come per protocollo CAN il bit dominante è 0 e sovrascrive il bit recessivo. Quindi ora il bus contiene "0"; il primo modulo lo rileva e interromperà la trasmissione mentre il secondo continuerà a trasmettere. La mia comprensione è corretta ??
Febin Sunny,

@FebinSunny Sì ... Quello che hai detto è corretto!
Swanand,

1
Questa risposta non è né "buona" né "eccezionale". In realtà, è totalmente sbagliato . Innanzitutto, il trasmettitore non "mantiene le due linee allo stesso potenziale" per inviare bit recessivi. Smette semplicemente di separare le linee e le resistenze di terminazione equalizzano il potenziale. In secondo luogo, l'indirizzo del nodo trasmittente non fa parte del campo di arbitrato nelle specifiche CAN, sebbene alcuni protocolli basati su CAN di livello superiore lo utilizzino come parte dell'ID messaggio. Terzo, nessuno di questi ha a che fare con il rilevamento del bus inattivo
Maple,

7

Conosco due modi per risolverlo:

Innanzitutto, il controller CAN controlla sempre il bus; quando rileva un messaggio sul bus inizia il processo di ricezione. Ora che si trova nello stato di ricezione, sa che il bus è in uso quando viene richiesta una trasmissione.

In secondo luogo, per riempimento di bit, il ricetrasmettitore CAN non avrà lo stesso bit per più di cinque cicli (a meno che non venga rilevato un errore del bus, nel qual caso vedrai fino a 12 bit dominanti di fila). L'eccezione a ciò è quando non viene trasmesso nulla sul bus, quando viene sempre letto un bit passivo. Un controller appena avviato potrebbe ascoltare il bus per cinque cicli prima di dichiarare "probabilmente libero".

Non garantisco che questi siano i processi effettivi, ma basati sulla mia (limitata) conoscenza della CAN, questi funzionerebbero.


Mi è piaciuto il secondo trucco! È logico e fantastico!
Swanand,

2
Ti manca il punto principale dell'arbitrato del bus: che la prima cosa in un pacchetto CAN è l'indirizzo.
W5VO,

1
Non era proprio la sua domanda; la domanda era come un controller determina se c'è attività sul bus
CoderTao

@ I frame CAN W5VO non hanno un indirizzo, a meno che un protocollo di livello superiore non lo faccia parte dell'ID del messaggio.
Acero

@CoderTao mentre il bit stuffing non è il modo in cui il controller rileva il bus inattivo, hai ragione nel fatto che svolge un ruolo importante in questo processo, assicurandoti che i dati trasmessi non possano essere confusi con la fine del frame
Maple

3

Come dice CoderTao - il controller CAN controlla continuamente il bus, quindi sa quando è già in corso una trasmissione. Quindi l'unica volta in cui può verificarsi una collisione è quando entrambi i nodi iniziano a trasmettere "simultaneamente" - entro un breve periodo di tempo l'uno dall'altro (+ una piccola quantità di tempo aggiuntivo per la propagazione del bus). Quindi questi sono gli unici casi che hai trovato nei documenti :)


2

L'indirizzo del nodo determina la priorità, mentre gli indirizzi più bassi sono prioritari. La trasmissione inizia con il nodo che trasmette il suo indirizzo. Allo stesso tempo, trasmette, ascolta. Diciamo che il nodo tre e due trasmettono contemporaneamente. Come ultimo bit dell'indirizzo, il nodo tre trasmette un 1 e il nodo due trasmette uno 0. A causa dello 0, la linea di dati viene ridotta allo stato 0. Il nodo tre vede che invece di 1 trasmette, la linea è uno 0 e smette di trasmettere.

CAN è stato utilizzato per la prima volta in auto e camion. Alcuni sensori dovevano avere una priorità molto più alta di altri. Ad esempio, la frenata antiscivolo doveva avere una priorità più alta rispetto al liquido lavacristallo basso.


Lo so già ... La mia domanda non riguardava l'arbitrato all'inizio ... Era tra una trasmissione e l'
altra

1

Esistono quattro elementi chiave nelle specifiche CAN che consentono ai controller CAN di rilevare lo stato del bus inattivo:

  • La segnalazione AND cablata consente di rilevare il bit dominante trasmesso da uno dei nodi da tutti gli altri nodi che trasmettono contemporaneamente il bit recessivo. Quindi, se un nodo che trasmette bit recessivo rileva lo stato dominante del bus, sa che il bus è occupato .

  • Il bit stuffing assicura che non vi siano più di 5 bit consecutivi identici. Di per sé, il bit stuffing viene utilizzato per mantenere la sincronizzazione. Tuttavia, un effetto collaterale di ciò è che non possono verificarsi più di 5 bit recessivi consecutivi all'interno dei bit del frame fino al delimitatore CRC.

  • End-of-frame è una serie di 7 bit recessivi alla fine di un frame. Non sono pieni di bit, quindi possono essere facilmente rilevati dai controller. Si noti che il bus non è ancora inattivo durante questo periodo, poiché EOF è considerato parte del frame.

  • Lo spazio interframe è una serie di 3 bit di intervallo di recessione tra i frame, seguiti dallo stato di inattività del bus. Nessun nodo è autorizzato ad avviare una trasmissione durante l'intervallo, a meno che non vogliano inviare frame di errore o sovraccarico . Inoltre, il nodo che ha trasmesso l'ultimo frame deve anche inviare 8 bit di trasmissione di sospensione recessivi dopo l'intervallo prima di iniziare un'altra trasmissione. Quest'ultimo requisito consente ad altri nodi di iniziare a inviare messaggi in sospeso, quindi nessun nodo può "bloccare il bus" indefinitamente.

Da tutto quanto sopra, ecco come i nodi rilevano lo stato del bus inattivo:

  • I nodi di ricezione semplicemente aspettano 10 bit recessivi consecutivi , che include EOF e intervallo. Dopo quel tempo considerano il bus inattivo e possono tentare di iniziare la trasmissione da soli.

  • Il nodo di trasmissione invia 11 bit recessivi consecutivi dopo l'EOF dell'ultimo frame trasmesso. Se nessun altro nodo avvia la trasmissione durante questo periodo, considera il bus inattivo e può tentare di iniziare un'altra trasmissione. Se durante questo periodo viene rilevato un bit dominante, il nodo diventa un ricevitore.

Le informazioni di cui sopra e ulteriori informazioni sulla temporizzazione dei bit sono disponibili nella specifica CAN sviluppata da BOSCH.


C'è un bus con più nodi attivi. Un nuovo nodo viene inserito quando non è in corso alcuna comunicazione. In che modo questo nuovo nodo saprà che il bus è inattivo? 10 bit recessivi consecutivi vengono trasmessi quando questo nuovo nodo non era in figura.
Swanand,

"Segnalazione AND cablata" significa che i bit recessivi non vengono "trasmessi" in quanto tali, significa che il nodo trasmittente non genera attivamente potenziale dominante. Ma vengono ricevuti , ovvero i nodi di ricezione campionano il bus a intervalli di bit e vedono bit recessivi sulla linea. Quindi, se questo nuovo nodo campiona il bus 10 volte e vede il bit recessivo ogni volta che considera il bus inattivo.
Acero

Non vi è alcuna differenza tra "10 bit recessivi consecutivi trasmessi quando questo nuovo nodo non era in figura" e lo stato inattivo del bus successivo. In assenza di comunicazione, qualsiasi lettura del bus restituirà il bit recessivo ("1"). Quindi non importa quando inizi il campionamento, durante o dopo l'ultimo bit dominante. Finché il ricevitore vede 10 bit, può iniziare a trasmettere. A proposito, nessuno invia 10 bit. L'ultimo trasmettitore "invia" 11 bit recessivi, 3 intervalli + 8 sospensioni. Se il nodo in attesa inizia a trasmettere dopo il decimo, l'ultimo trasmettitore perde l'arbitrato e restituisce il bus al nuovo nodo
Maple,

0

Un nodo particolare inizia la sua trasmissione solo dopo il periodo INTERMISSIONE (questa durata è anche chiamata SOSPESA, in questo periodo 3 bit recessivi vengono trasmessi al bus dopo la Trasmissione del frame DATA / REMOTE al bus. Ciò indica che il BUS è nello stato IDLE), poiché durante questo periodo nessuno dei nodi avvia la trasmissione. Dopo che il BUS è in stato di inattività, il nodo che desidera il bus per la trasmissione entra in ARBITRATION.

Dopo la trasmissione dello spazio tra i frame al bus, i nodi presenti nella rete CAN proveranno ad avviare la trasmissione. Quindi, un nodo particolare sa se il bus è occupato o no.


E se, sarà la prima trasmissione sul bus? In tal caso non ci sarà alcun "Periodo di intervallo". Consultare la risposta di @ Doc per i dettagli.
Swanand
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.