Cómo comprobar que el bus CAN es gratuito o no

8

Leí muchas cosas sobre el arbitraje del bus CAN, pero no respondió 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í) toman la condición de que ambos nodos están iniciando 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.

Swanand
fuente
1
Swanand, puede obtener mejores respuestas a sus preguntas si espera un poco más para aceptar la respuesta. Esta es una comunidad internacional, y algunos expertos pueden no ser capaces de responder instantáneamente.
W5VO
@ W5VO ¡Lo recordaré la próxima vez! Gracias por la sugerencia! :)
Swanand

Respuestas:

10

La respuesta corta es que el nodo debe monitorear las líneas CAN para que estén inactivas por un cierto tiempo antes de intentar transmitir. Entonces, si otro nodo está transmitiendo, debe permanecer en silencio hasta que el otro nodo haya terminado.

Un bus CAN se basa en 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. El funcionamiento del arbitraje es que un transmisor monitorea el bus mientras está transmitiendo. La transmisión se realiza como anteriormente manteniendo las dos líneas con el mismo potencial o con un potencial diferencial. Entonces, si el transmisor transmite un poco manteniendo las líneas al 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. Luego 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 obviamente son diferentes. 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 intentarlo de nuevo. El nodo ganador continúa transmitiendo sin saber que algún otro nodo también lo estaba intentando. Por supuesto, esta lógica se extiende a más de dos nodos también.

Espero que esto ayude.

Doc
fuente
1
¡Buena respuesta! Si no recuerdo mal, enviar un '0' es dominante sobre un '1', lo que resulta en el arbitraje ganador de la dirección más baja. Una característica clara de esto es que si el nodo perdedor se detiene cuando se supone que debe detenerse, no habrá corrupción de datos en el bus.
W5VO
Gran respuesta !! Estaría muy agradecido si pudiera aclarar esto: Digamos que los identificadores son "1011001" y "1000110" cuando se alcanza el tercer bit, el primer transmisor envía "1" y el segundo envía "0"; entonces, según el protocolo CAN, el bit dominante es 0 y sobrescribe el bit recesivo. Entonces ahora el Bus tiene "0"; el primer módulo detecta esto y detendrá la transmisión mientras que el segundo seguirá transmitiendo. ¿Es correcto mi entendimiento?
Febin Sunny
@FebinSunny Sí ... ¡Lo que dijiste es correcto!
Swanand
1
Esta respuesta no es "buena" ni "excelente". De hecho, está totalmente mal . Primero, el transmisor no "mantiene las dos líneas con el mismo potencial" para enviar bits recesivos. Simplemente deja de separar las líneas y las resistencias de terminación igualan el potencial. En segundo lugar, la dirección del nodo de transmisión no forma parte del campo de arbitraje en la especificación CAN, aunque algunos protocolos basados ​​en CAN de nivel superior sí la utilizan como parte de la identificación del mensaje. Tercero, nada de esto tiene nada que ver con la detección del bus inactivo
Maple, el
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, por 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 seguidos). La excepción a esto es cuando no se transmite nada en el bus, cuando siempre se lee un bit pasivo. Un controlador que acaba de comenzar podría escuchar el bus durante cinco ciclos antes de declarar "probablemente libre".

No garantizo que estos sean los procesos reales, pero basados ​​en mi conocimiento (limitado) de CAN, funcionarían.

CoderTao
fuente
Me gustó el segundo truco! ¡Eso es puramente lógico e increíble!
Swanand
2
Te estás perdiendo el punto principal del arbitraje de autobuses: que lo primero en un paquete CAN es la dirección.
W5VO
1
Esa no era realmente su pregunta; la pregunta era cómo un controlador determina si hay actividad en el autobús
CoderTao
@ Las tramas CAN de W5VO no tienen una dirección, a menos que algún protocolo de nivel superior la haga parte de la ID del mensaje.
Arce
@CoderTao mientras que el bit de relleno no es cómo controlador detecta inactividad del bus, que son correctos, ya que juega un papel importante en este proceso, por lo que los datos transmitidos no segura puede confundirse final de la trama
Arce
3

Como dice CoderTao: el controlador CAN está monitoreando continuamente el bus, por lo que sabe cuándo una transmisión ya está en progreso. Entonces, 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 has encontrado en los documentos :)

Martin Thompson
fuente
2

La dirección del 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 que transmite, escucha. Digamos que el nodo tres y dos transmite al mismo tiempo. Como último bit de la dirección, el nodo tres emite un 1 y el nodo dos emite un 0. Debido al 0, la línea de datos se baja al estado 0. El nodo tres ve que en lugar del 1 que transmite, 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 mayor que otros. Por ejemplo, el frenado antideslizante debía tener una prioridad más alta que el líquido de lavado del parabrisas bajo.

Jim C
fuente
Ya sé esto ... Mi pregunta no era sobre Arbitraje al inicio ... Era sobre la transmisión intermedia ...
Swanand
1

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 por cable permite que el bit dominante transmitido por uno de los nodos sea detectado por todos los demás nodos que transmiten bit recesivo al mismo tiempo. Entonces, si cualquier nodo que transmite un bit recesivo ve el estado dominante del bus, sabe que el bus está ocupado .

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

  • End-of-frame es una serie de 7 bits recesivos al final de un marco. No están rellenos de bits, por lo que pueden ser fácilmente detectados por los controladores. Tenga en cuenta que el bus aún no está inactivo durante este tiempo, ya que EOF se considera parte de la trama.

  • El espacio entre tramas es una serie de 3 bits de interrupción recesiva entre las tramas, seguido del estado inactivo del bus. Ningún nodo tiene permiso para iniciar una transmisión durante el intermedio, a menos que quieran enviar cuadros de error o sobrecarga . Además, el nodo que transmitió la última trama también debe enviar 8 bits de transmisión de suspensión recesiva 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 "acaparar el bus" indefinidamente.

De todo lo anterior, así es como los nodos detectan el estado del bus inactivo:

  • Los nodos receptores simplemente esperan 10 bits recesivos consecutivos , que incluyen EOF e intermedio. Después de ese tiempo, consideran que el autobús está inactivo y pueden intentar comenzar la transmisión por su cuenta.

  • El nodo transmisor envía 11 bits recesivos consecutivos después de 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 comenzar 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 el tiempo de bits se puede encontrar en la especificación CAN desarrollada por BOSCH.

Arce
fuente
Hay un bus con múltiples nodos activos. Se conecta un nuevo nodo cuando no había comunicación en curso. ¿Cómo sabrá este nuevo nodo que el bus está inactivo? Se transmiten 10 bits recesivos consecutivos cuando este nuevo nodo no estaba en la imagen.
Swanand
"Señalización cableada Y" significa que los bits recesivos no se "transmiten" como tales, significa que el nodo de transmisión no genera activamente potencial dominante. Pero se reciben , es decir, los nodos receptores toman muestras del bus a intervalos de bits y ven bits recesivos en la línea. Entonces, si este nuevo nodo muestrea el bus 10 veces y ve un bit recesivo cada vez que considera que el bus está inactivo.
Arce
No hay diferencia entre "10 bits recesivos consecutivos transmitidos cuando este nuevo nodo no estaba en la imagen" y el estado inactivo del bus después de eso. Si no hay comunicación, cualquier lectura del bus devolverá el bit recesivo ("1"). Por lo tanto, no importa cuándo comience el muestreo, durante o después del último bit dominante. Mientras el receptor vea 10 bits, puede comenzar a transmitir. Por cierto, nadie envía 10 bits. El último transmisor "envía" 11 bits recesivos, 3 intermedios + 8 suspendidos. Si el nodo de espera comienza a transmitir después del 10, el último transmisor pierde el arbitraje y cede el bus al nuevo nodo
Maple
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 DATOS / REMOTO al bus. Esto indica que el BUS está en estado inactivo), porque, durante este período, ninguno de los nodos inicia la transmisión. Después de que el BUS está en ESTADO INACTIVO, el nodo que desea la transmisión del bus pasa al ARBITRAJE.

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

Nagendra Pulaparthi
fuente
¿Qué pasa si va a ser la primera transmisión en el autobús? En ese caso no habrá ningún "Período de intermedio". Consulte la respuesta de @ Doc para más detalles.
Swanand