Cómo verificar si el bus CAN es gratis o no

8

Leí muchas cosas relacionadas con el arbitraje de bus CAN, pero no respondí a mis preguntas.

Si un nodo ya está transmitiendo los datos en el bus y entre otro nodo quiere iniciar la transferencia de datos, ¿cómo sabrá ese "otro nodo" que el bus está ocupado?

Todos los documentos (que leí) tienen la condición de que ambos nodos inicien la transmisión simultáneamente y luego uno con el primer bit dominante obtendrá el bus, pero nadie explicó la condición que quiero saber.

    
pregunta Swanand

6 respuestas

10

La respuesta corta es que el nodo debe monitorear las líneas CAN para que estén inactivas durante un cierto tiempo antes de que intente transmitir. Por lo tanto, si otro nodo está transmitiendo, debe permanecer en silencio hasta que el otro nodo esté listo.

Un bus CAN se basa en la señalización diferencial. Las dos líneas, CAN-High (CAN +) y CAN-Low (CAN-), tienen el mismo potencial cuando el bus está inactivo. Para enviar bits, un transmisor CAN pone un voltaje diferencial en las líneas de aproximadamente 2 voltios.

Un transmisor CAN primero ve si el bus está inactivo y, si lo está, comienza a transmitir. Cómo funciona el arbitraje es que un transmisor monitorea el bus mientras está transmitiendo. La transmisión se realiza como se indicó anteriormente, ya sea manteniendo las dos líneas en el mismo potencial o en un potencial diferencial. Entonces, si el transmisor transmite un poco manteniendo las líneas en el mismo potencial (sic), pero ve que las dos líneas de transmisión tienen un potencial diferencial, eso significa que algún otro nodo está transmitiendo y el primer transmisor ha perdido el arbitraje. Entonces debe dejar de transmitir.

Cuando un nodo comienza a transmitir por primera vez, los bits transmitidos son los mismos hasta la dirección del nodo de transmisión que es obviamente diferente. Si dos nodos comienzan a transmitir juntos, se transmitirán juntos en sincronización hasta que se alcance la parte de la dirección. Cuando la dirección difiere, un nodo notará una diferencia potencial en las líneas, incluso cuando no está poniendo una en las líneas. Entonces sabe que ha perdido y tiene que volver a intentarlo. El nodo ganador continúa transmitiendo sin saber que otro nodo también estaba intentando. Por supuesto, esta lógica se extiende a más de dos nodos también.

Espero que esto ayude.

    
respondido por el Doc
7

Sé de dos maneras de resolverlo:

Primero, el controlador CAN siempre monitorearía el bus; cuando detecta un mensaje en el bus comienza el proceso de recepción. Ahora que está en el estado de recepción, sabe que el bus está en uso cuando se solicita una transmisión.

En segundo lugar, mediante el relleno de bits, el transceptor CAN no tendrá el mismo bit durante más de cinco ciclos (a menos que se detecte un error de bus, en cuyo caso verá hasta 12 bits dominantes en una fila). La excepción a esto es cuando no se transmite nada en el bus, cuando siempre se lee un bit pasivo. Un controlador recién iniciado podría escuchar el bus durante cinco ciclos antes de declararlo "probablemente libre".

No garantizo que estos sean los procesos reales, pero según mi conocimiento (limitado) de CAN, estos funcionarán.

    
respondido por el CoderTao
3

Como dice CoderTao: el controlador CAN está continuamente monitoreando el bus, para que sepa cuándo una transmisión ya está en progreso. Por lo tanto, el único momento en que puede ocurrir una colisión es cuando ambos nodos comienzan a transmitir "simultáneamente", dentro de un tiempo de bits entre sí (+ una pequeña cantidad de tiempo adicional para la propagación del bus). Por lo tanto, esos son los únicos casos que ha encontrado en los documentos :)

    
respondido por el Martin Thompson
2

La dirección de nodo determina la prioridad, las direcciones más bajas son de alta prioridad. La transmisión comienza con el nodo transmitiendo su dirección. Al mismo tiempo transmite, escucha. Digamos que los nodos tres y dos se transmiten al mismo tiempo. Como el último bit de la dirección, el nodo tres difunde un 1 y el nodo dos difunde un 0. Debido al 0, la línea de datos se arrastra al estado 0. El nodo tres ve que en lugar del 1 que emite, la línea es un 0 y deja de transmitir.

CAN se utilizó por primera vez en automóviles y camiones. Algunos sensores debían tener una prioridad mucho más alta que otros. Por ejemplo, el frenado antideslizante debía tener una prioridad más alta que el líquido de lavado del parabrisas bajo.

    
respondido por el Jim C
0

Un nodo particular inicia su transmisión solo después del período de INTERMISIÓN (esta duración también se denomina duración SUSPENDIDA, en este período se transmiten 3 bits recesivos al bus después de la transmisión de la trama DATA / REMOTE al bus. Esto indica que el BUS está en estado IDLE) porque, durante este período, ninguno de los nodos inicia la Transmisión. Una vez que el BUS se encuentra en IDLE STATE, el nodo que desea que se transmita el bus pasa al ARBITRAJE.

Después de la transmisión del espacio entre tramas al bus, los nodos presentes en la red CAN intentarán iniciar la transmisión. Por lo tanto, un nodo en particular sabe si el Bus está ocupado o no.

    
respondido por el Nagendra Pulaparthi
0

Hay cuatro elementos clave en la especificación CAN que permiten a los controladores CAN detectar el estado del bus inactivo:

  • La señalización AND conectada por cable hace posible que el bit dominante transmitido por uno de los nodos sea detectado por todos los demás nodos que transmiten el bit recesivo al mismo tiempo. Por lo tanto, si cualquier nodo que transmita un bit recesivo ve el estado dominante del bus, sabe que el bus está ocupado .

  • Relleno de bits se asegura de que no haya más de 5 bits consecutivos idénticos. Por sí mismo, el relleno de bits se utiliza para mantener la sincronización. Sin embargo, un efecto colateral es que no pueden ocurrir más de 5 bits recesivos consecutivos dentro de los bits de la trama hasta el delimitador CRC.

  • Fin de trama es una serie de 7 bits recesivos al final de una trama. No están rellenos de bits, por lo que los controladores pueden detectarlos fácilmente. Tenga en cuenta que el bus todavía no está inactivo durante este tiempo, ya que EOF se considera parte del marco.

  • Interframe space es una serie de 3 bits recesivos de intermedio entre las tramas, seguidas del estado inactivo del bus. No se permite que ningún nodo inicie una transmisión durante el intermedio, a menos que quieran enviar marcos error o overload . Además, el nodo que transmitió la última trama también debe enviar 8 bits recesivos suspender transmisión después del intermedio antes de iniciar otra transmisión. Este último requisito permite que otros nodos comiencen a enviar mensajes pendientes, por lo que ningún nodo puede "saturar el bus" indefinidamente.

De todo lo anterior, aquí se muestra cómo los nodos detectan el estado del bus inactivo:

  • Nodos de recepción simplemente espere 10 bits recesivos consecutivos , que incluye EOF e intermedio. Después de ese tiempo, consideran que el autobús está inactivo y pueden intentar iniciar su propia transmisión.

  • Nodo de transmisión envía 11 bits recesivos consecutivos después del EOF de la última trama que transmitió. Si ningún otro nodo inicia la transmisión durante este tiempo, considera que el bus está inactivo y puede intentar iniciar otra transmisión. Si se detecta un bit dominante durante este tiempo, el nodo se convierte en un receptor.

La información anterior más información adicional sobre la sincronización de bits se puede encontrar en la especificación CAN desarrollada por BOSCH .

    
respondido por el Maple

Lea otras preguntas en las etiquetas