Perché il mio ricetrasmettitore CAN non riceverà messaggi a meno che non ci sia un lungo ritardo di avvio o un analizzatore di bus collegato?


8

Sto usando un MCU a 16 bit, PIC24HJ64GP504 , per scrivere un'applicazione basata su CAN. Fondamentalmente è la comunicazione tra la mia scheda e un altro nodo che continua continuamente a inviare dati alla mia scheda utilizzando CAN a 1 Mbit / s. Sto configurando il modulo ECAN nel mio PIC24 per funzionare a 1 Mbit / s. Ho scritto il codice in modo tale che per i primi 10 ms il modulo ECAN accetti tutti i messaggi che arrivano dall'altra parte, e successivamente ho riconfigurato il modulo ECAN per accettare solo quei messaggi con ID messaggio 0x13.

Ora ecco che arriva il problema. L'altro nodo e la mia scheda sono accesi nello stesso istante. L'altro nodo inizia a trasmettere messaggi dopo circa 40 ms dopo l'accensione. Ma non riesco a ricevere alcun messaggio dalla mia bacheca. Ora, se accendo prima la mia scheda, concedo del tempo per riconfigurare il modulo ECAN con nuovi filtri e sistemarsi e quindi accendere l'altro nodo, quindi tutto funziona perfettamente.

Ora la parte più strana .. Se ho un analizzatore di bus CAN collegato tra la mia scheda e l'altro nodo e anche se accendo entrambi i nodi allo stesso tempo, tutto funziona bene ... non è necessario accendere prima la mia scheda. Ho provato questo con tre diversi analizzatori di bus di diversi produttori e ho ottenuto gli stessi risultati.

A me sembra che durante la riconfigurazione del modulo ECAN, ci voglia del tempo per sistemarsi. E con l'introduzione dell'analizzatore del bus nel bus, questa volta viene in qualche modo abbreviato in modo che tutto funzioni perfettamente. Ma non sono sicuro di quale potrebbe essere esattamente il problema.

Ho avuto problemi con questo problema negli ultimi sette giorni.

PS: Oggi ho verificato con un ambito e ho scoperto che se l'altro nodo inizia a trasmettere dopo 170 ms dopo l'accensione, allora tutto funziona perfettamente. Prima di ciò, il mio dispositivo non riceverà alcun messaggio da esso a meno che l'analizzatore del bus non sia collegato. La parte peggiore è che non riesco a ritardare la trasmissione dell'altro nodo, il firmware di quel nodo è proprietario.

Oggi ho anche letto in un forum che CAN ha bisogno del resistore da 120 Ω sul nodo per farlo funzionare (anche se il mio nodo non ne ha uno e funziona benissimo, a condizione che abbia il tempo di sistemarsi dopo la riconfigurazione). Sospetto che l'introduzione dell'analizzatore di bus modifichi in qualche modo alcuni parametri elettrici della rete in modo tale che il tempo impiegato dal mio nodo per stabilizzarsi dopo la riconfigurazione sia ridotto. Ma non sono sicuro.. :(


1
Puoi darci link a tutti i prodotti che stai utilizzando. Ciò consente di formulare risposte concrete più facilmente.
Kortuk,

Sei in grado di apportare modifiche alla tua scheda o stai aspettando / sperando in una soluzione puramente software?
Vicatcu,

Sei sicuro che l'altro nodo continui a trasmettere, anche se il tuo nodo non è attivo e funzionante? Alcune implementazioni CAN utilizzano un contatore di errori e, se questo trabocca (ad esempio a causa della mancata ricezione di nodi), il nodo di trasmissione si arresta.
Programmatore

Risposte:


9

"Leggi su un forum" da qualche parte che il bus CAN ha bisogno di resistori? Sul serio!!?

Questa è parte integrante del tuo design. Se si intende utilizzare CAN, è necessario capirlo, il che significa leggere la documentazione pertinente.

Spearson ha ragione ma per la ragione sbagliata. Un bus CAN differenziale come probabilmente hai (non hai detto quale chip di interfaccia stai usando, ma probabilmente hai un bus CAN differenziale standard guidato da qualcosa come un MCP2551 su ciascun nodo) richiede una resistenza tra le linee. Questo perché lo stato recessivo è segnalato da due linee passivamente unite e lo stato dominante da esse viene attivamente separato. Le resistenze tra le linee in questo senso sono l'equivalente di una resistenza di pullup su una linea di collettori aperta. Senza qualcosa che unisce le linee quando nulla guida l'autobus, l'autobus non funziona.

I resistori funzionano anche come terminatori, come ha sottolineato Spearson. In genere si utilizza la coppia intrecciata per le due linee del bus. Ciò ha un'impedenza di circa 120 Ω. Questo tipo di bus CAN differenziale è definito per avere 60 Ω tra le linee come un pull-together in modo che possa essere implementato con 120 Ω su ciascuna per terminare il bus ed evitare riflessi.

 


A cosa si riferisce "spearson"? Un utente di nome "spearson" che ha lasciato un commento (da allora cancellato o l'utente ha cambiato il nome dello schermo?)? Un libro (nome dell'autore)?
Peter Mortensen,

@peter: apparentemente sì.
Olin Lathrop,

4

Nel normale funzionamento CAN, un nodo ripeterà la sua trasmissione fino a quando non viene ACK o il conteggio degli errori non viene superato. Quando l'analizzatore CAN è collegato alla rete, emetterà il bit ACK quando rileva il frame dal primo nodo, rendendo la trasmissione riuscita. Se si utilizza l'analizzatore CAN BUS Microchip, è possibile configurarlo in modalità "solo ascolto", il che significa che non emetterà alcun bit ACK, quindi non influisce sulla rete. Quindi dovresti essere in grado di vedere il frame CAN ripetuto sul display dell'analizzatore fino a quando il secondo nodo non emette un ACK o il primo nodo smette di trasmettere a causa del conteggio degli errori.

Il bit ACK verrà impostato da un nodo ricevente (se il frame è completo e corretto) indipendentemente da qualsiasi filtro di indirizzo.

Molto probabilmente il tuo primo nodo sta raggiungendo uno stato di errore a causa del frame ACK. È necessario rilevarlo nel software utilizzando il registro CiINTF. È inoltre possibile configurare il PIC per emettere interruzioni per condizioni di errore utilizzando il registro CiINTE.

Se l'oscilloscopio non decodifica i frame CAN, provare l' analizzatore di logica Saleae . Decodificherà il frame CAN e mostrerà il bit ACK / Error. È stato molto più affidabile dell'analizzatore Microchip CAN.


3

C'è uno slot ACK (due bit) in un frame CAN. Se un nodo A sta trasmettendo i dati e ci sono altri cinque nodi sul bus, dopo la trasmissione qualunque nodo riceva il frame inserirà il bit dominante nello slot ACK. Ciò indica che il messaggio è stato trasmesso correttamente. Altrimenti i controller CAN lo considerano un errore sul bus.

Quando si aggiunge un analizzatore CAN, invia ACK al trasmettitore. Il trasmettitore pensa che il bus sia funzionante e continua a trasmettere. In assenza di un analizzatore CAN, quando si riconfigura il controller CAN, il trasmettitore non riceve un ACK e pensa che ci sia un errore sul bus, quindi smette di trasmettere.

Spero che tu abbia capito il punto.

Assicurarsi che ACK stia funzionando correttamente. Cerca anche di non spegnere completamente il ricevitore CAN mentre esegui la riconfigurazione.

Un altro trucco (non sono sicuro che funzionerà sempre) è quello di inviare un DLC zero e zero frame ID dopo la riconfigurazione. Questo dirà al nodo del trasmettitore che il bus è attivo e inizierà la trasmissione.

Nota: una resistenza da 120 Ω è DEVE !!! . Una resistenza terminale è LA cosa importante su QUALSIASI bus.


Il trucco di inviare un DLC zero e un frame ID zero dopo l'inizializzazione è in realtà già negli standard, noto come messaggio di avvio. Il suo ID è uguale al battito cardiaco (0x700 + ID nodo) e ha un singolo DLC di 1. Gli strumenti dell'analizzatore dovrebbero riconoscerlo.
BullBoyShoes, il
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.