10. Bus CAN

10.2. Acceso al medio CSMA/CR

En CAN (Controller Area Network) el control de acceso al medio es uno de los aspectos más interesantes, porque varios nodos comparten el mismo bus y pueden intentar transmitir al mismo tiempo.  CAN utiliza un método de acceso al medio basado en CSMA/CR, que suele describirse como:

Carrier Sense Multiple Access with Collision Resolution
Acceso múltiple con detección de portadora y resolución de colisiones.

La idea general es esta:

  1. Todos los nodos escuchan el bus antes de transmitir.
    Si el bus está ocupado, esperan. Si está libre, pueden comenzar a transmitir.

  2. Varios nodos pueden comenzar a transmitir simultáneamente.
    Esto es perfectamente posible en CAN.

  3. En lugar de considerar esa situación como una colisión destructiva, como ocurría en Ethernet clásico con CSMA/CD, CAN realiza una arbitraje bit a bit.

La clave está en que CAN define dos estados lógicos:

  • Bit dominante = 0
  • Bit recesivo = 1

El bus funciona de manera semejante a una operación lógica AND: si un nodo transmite 1, pero otro transmite 0, en el bus aparece un 0 dominante.

Por ejemplo, imaginemos que tres nodos quieren transmitir mensajes cuyos identificadores comienzan así:

Nodo A:  0 1 0 1 ...
Nodo B:  0 1 1 0 ...
Nodo C:  0 1 0 0 ...

Todos comienzan simultáneamente.

Primer bit:

A = 0
B = 0
C = 0
Bus = 0

Todos continúan.

Segundo bit:

A = 1
B = 1
C = 1
Bus = 1

Todos continúan.

Tercer bit:

A = 0
B = 1
C = 0
Bus = 0

Aquí ocurre algo importante.

El nodo B transmitió un 1 recesivo, pero al leer el bus observa un 0 dominante.

Entonces B sabe:

"Otro nodo tiene mayor prioridad que yo."

Por lo tanto, B deja inmediatamente de transmitir.

A y C continúan.

En el siguiente bit:

A = 1
C = 0
Bus = 0

Ahora A transmitió 1, pero leyó 0.

Por lo tanto, A pierde el arbitraje y deja de transmitir.

Finalmente:

Nodo C

continúa transmitiendo el mensaje completo.

¿Qué determina la prioridad?

El arbitraje se realiza principalmente utilizando el identificador CAN.

Como el 0 es dominante:

El identificador numéricamente más pequeño tiene mayor prioridad.

Por ejemplo:

ID = 0x100
ID = 0x200
ID = 0x500

El mensaje con:

0x100

tendrá mayor prioridad que 0x200 y 0x500.

Esto no significa que exista un nodo físicamente "más importante"; la prioridad pertenece al mensaje, concretamente a su identificador.


Lo especialmente importante: no se destruye la trama

Esta es una diferencia fundamental con otros mecanismos de acceso.

En Ethernet clásico con CSMA/CD, si dos estaciones transmitían simultáneamente, la colisión destruía las tramas:

Transmisión simultánea
        ↓
     Colisión
        ↓
Se abortan ambas tramas
        ↓
Esperan
        ↓
Retransmiten

En CAN ocurre:

Transmisión simultánea
        ↓
Arbitraje bit a bit
        ↓
Los nodos de menor prioridad abandonan
        ↓
El nodo ganador continúa

Por eso se dice que CAN utiliza:

arbitraje no destructivo.

La trama ganadora no necesita retransmitirse, porque nunca fue corrompida.


¿Cómo sabe un nodo que perdió?

Un transmisor CAN hace dos cosas simultáneamente:

Transmite un bit
        +
Lee el estado real del bus

Por ejemplo:

Transmite:    1
Lee bus:      0

Como:

1 = recesivo
0 = dominante

el nodo comprende que otro transmisor está imponiendo el nivel dominante.

Entonces pierde el arbitraje.

Pero si transmite:

0

y lee:

0

no sabe todavía si está solo o si otro nodo está transmitiendo exactamente lo mismo.

Por eso el arbitraje continúa bit a bit hasta que queda un único ganador.


Un detalle muy importante para explicarlo en Redes

CAN no realiza realmente una detección de colisión como Ethernet CSMA/CD.

El término más preciso es:

Collision Resolution — resolución de colisiones.

En realidad, la transmisión simultánea forma parte del funcionamiento normal del protocolo.

Podrías representarlo así:

                 BUS CAN libre
                       │
                       ▼
             Varios nodos transmiten
                       │
                       ▼
              Campo de arbitraje
                       │
           Comparación bit a bit
                       │
              ┌────────┴────────┐
              │                 │
        Bit dominante       Bit recesivo
           enviado              enviado
              │                 │
              │          ¿lee dominante?
              │                 │
              │                Sí
              │                 ▼
              │          Pierde arbitraje
              │                 │
              │          Deja de transmitir
              │
              ▼
        Sigue compitiendo
              │
              ▼
         Nodo ganador
              │
              ▼
      Transmite trama completa

Resumiendo:

CAN utiliza un mecanismo CSMA/CR con arbitraje no destructivo bit a bit. Los nodos escuchan el medio y pueden comenzar a transmitir simultáneamente. Durante el campo de arbitraje comparan el bit transmitido con el estado real del bus. Debido a que el bit 0 es dominante y el bit 1 recesivo, el mensaje con el identificador numéricamente menor gana el acceso al medio, mientras que los demás nodos abandonan la transmisión y esperan una nueva oportunidad.

Y conceptualmente hay una consecuencia muy importante: este mecanismo hace que CAN sea determinista respecto de la prioridad.

No gana el nodo que "tuvo suerte" con un tiempo de espera aleatorio, sino el mensaje que posee la prioridad establecida mediante su identificador.