¿Por qué mi transceptor CAN no recibe mensajes a menos que haya un retraso prolongado en el arranque o que haya un analizador de bus conectado?

8

Estoy usando una MCU de 16 bits, PIC24HJ64GP504 , para escribir una aplicación basada en CAN . Básicamente, es la comunicación entre mi tarjeta y otro nodo lo que continuamente continúa enviando datos a mi tarjeta utilizando CAN a 1 Mbit / s. Estoy configurando el módulo ECAN en mi PIC24 para que funcione a 1 Mbit / s. He escrito el código de tal manera que durante los primeros 10 ms, el módulo ECAN aceptará todos los mensajes que vienen del otro lado, y después de eso, he reconfigurado el módulo ECAN para aceptar solo aquellos mensajes con ID de mensaje 0x13.

Ahora viene el problema. El otro nodo y mi placa se encienden en el mismo instante. El otro nodo comienza a transmitir mensajes después de 40 ms o menos después del encendido. Pero no puedo recibir ningún mensaje de él en mi tablero. Ahora, si enciendo mi tarjeta primero, le doy algo de tiempo para que reconfigure el módulo ECAN con nuevos filtros y se calme y luego encienda el otro nodo, entonces todo funciona perfectamente.

Ahora, la parte más extraña. Si tengo un analizador de bus CAN conectado entre mi placa y el otro nodo e incluso si enciendo ambos nodos al mismo tiempo, todo funciona bien ... no hay necesidad de encender mi primero el tablero He intentado esto con tres analizadores de bus diferentes de diferentes fabricantes y obtuve los mismos resultados.

Para mí, parece que durante la reconfiguración del módulo ECAN, toma un tiempo para establecerse. Y con la introducción del analizador de bus en el bus, esta vez se corta de modo que todo funciona perfectamente. Pero no estoy seguro de cuál es exactamente el problema.

He estado luchando con este problema durante los últimos siete días.

PS: Hoy comprobé con un alcance y descubrí que si el otro nodo comienza a transmitir después de 170 ms después del encendido, todo funciona bien. Antes de eso, mi dispositivo no recibirá ningún mensaje a menos que el analizador de bus esté conectado. La peor parte es que no puedo retrasar la transmisión del otro nodo, el firmware de ese nodo es propietario.

También leí en un foro hoy que CAN necesita la resistencia de 120 en el nodo para que funcione (aunque mi nodo no tiene uno y funciona bien, siempre y cuando haya un tiempo para establecerse después de la reconfiguración). Sospecho que la introducción del analizador de bus de alguna manera cambia algunos parámetros eléctricos de la red, de modo que el tiempo que tarda mi nodo en establecerse después de la reconfiguración se reduce. Pero no estoy seguro ... :(

    
pregunta Mayuresh

3 respuestas

9

¿"Leyó en un foro" en algún lugar que el bus CAN necesita resistencias? En serio !!?

Esto es una parte integral de su diseño. Si va a utilizar CAN, debe comprenderlo, lo que significa leer la documentación pertinente.

Spearson tiene razón, pero por la razón equivocada. Un bus CAN diferencial como es probable que tenga (no dijo qué chip de interfaz está utilizando, pero probablemente tenga un bus CAN diferencial estándar impulsado por algo como un MCP2551 en cada nodo) requiere una resistencia entre las líneas. Esto se debe a que el estado recesivo es señalado por las dos líneas que se juntan pasivamente, y que el estado dominante se separa activamente. Las resistencias entre las líneas en ese sentido son equivalentes a una resistencia pullup en una línea de colector abierto. Sin algo que une las líneas cuando nada conduce el autobús, el autobús no funciona.

Las resistencias también funcionan como terminadores, como lo señaló Spearson. Generalmente se usa par trenzado para las dos líneas de autobús. Esto tiene una impedancia de alrededor de 120. Este tipo de bus CAN diferencial se define para tener 60 Ω entre las líneas como un conjunto para que pueda implementarse con 120 en cada una para terminar el bus y evitar reflexiones.

    
respondido por el Olin Lathrop
4

En la operación CAN normal, un nodo repetirá su transmisión hasta que sea ACK'd o se haya excedido el recuento de errores. Cuando tenga el analizador CAN conectado a la red, emitirá el bit ACK cuando detecte la trama desde su primer nodo, lo que hará que la transmisión sea exitosa. Si está utilizando el Microchip CAN BUS BUS Analyzer puede configurarlo en modo de "solo escucha", lo que significa que no emitirá ningún ACK, por lo que no afectará a la red. Por lo tanto, debería poder ver el cuadro CAN repetido en la pantalla del analizador hasta que el segundo nodo emita un ACK o el primer nodo deje de transmitir debido a un recuento de errores.

El bit de ACK será establecido por un nodo receptor (si la trama está completa y correcta) independientemente de cualquier filtrado de direcciones.

Lo más probable es que su primer nodo esté alcanzando un estado de error debido a que la trama no se ACK. Debería detectarlo en el software utilizando el registro CiINTF. También puede configurar el PIC para emitir interrupciones por condiciones de error utilizando el registro CiINTE.

Si su alcance no descodifica marcos CAN, pruebe el analizador Saleae Logic . Descodificará el cuadro CAN y mostrará el bit ACK / Error. Ha sido mucho más confiable que el analizador CAN de Microchip.

    
respondido por el Erik
3

Hay una ranura ACK (dos bits) en un marco CAN. Si un nodo A está transmitiendo los datos y hay otros cinco nodos en el bus, después de la transmisión, el nodo que reciba la trama colocará el bit dominante en la ranura ACK. Esto indica que el mensaje fue transmitido exitosamente. De lo contrario, los controladores CAN lo consideran como un error en el bus.

Cuando agrega un analizador CAN, envía ACK al transmisor. El transmisor piensa que el bus es bueno y sigue transmitiendo. En la ausencia de un analizador CAN, cuando reconfigura su controlador CAN, el transmisor no recibe un ACK y piensa que hay un error en el bus, por lo que deja de transmitir.

Espero que hayas entendido.

Asegúrate de que ACK esté recibiendo correctamente. También intente no apagar completamente su receptor CAN mientras realiza la reconfiguración.

Otro truco (no estoy seguro de que funcione siempre) es enviar un DLC cero y un marco de ID cero después de la reconfiguración. Esto le dirá al nodo transmisor que el bus está activo y comenzará a transmitir.

Nota: una resistencia de 120 Ω es una ¡DEBE !!! . Una resistencia de terminación es LA cosa importante en CUALQUIER bus.

    
respondido por el Swanand

Lea otras preguntas en las etiquetas