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.
Respuestas:
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.
fuente
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.
fuente
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 :)
fuente
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.
fuente
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.
fuente
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.
fuente