Publicado el 3 comentarios

Comunicación por modulo CAN MCP2515

MCP2515 es un controlador de red de área de controlador (Controller Area Network o CAN) que se utiliza comúnmente en sistemas embebidos para facilitar la comunicación entre dispositivos a través del protocolo CAN.

Años atrás, los coches tenían cientos y cientos de metros de cable, conectando cada interruptor directamente con, por ejemplo, las luces o la bocina. A medida que los automóviles se volvieran más complejos, esta simple lógica ya no funcionaría.

En 1986, Bosch introdujo el sistema de bus CAN, que resolvió este problema y abarató y facilitó la fabricación de automóviles. CAN es ahora el estándar de la industria y se utiliza en todo, desde automóviles y camiones hasta autobuses y tractores, e incluso aviones y barcos.

Saber cómo leer y analizar mensajes CAN en con un microcontrolador, permite obtener datos de un automóvil, como la temperatura del refrigerante, la posición del acelerador, la velocidad del vehículo y las rpm del motor, y utilizarlos en sus proyectos en el tablero.

El módulo de interfaz de bus CAN MCP2515 es la mejor solución para agregar conectividad CAN a un Microcontrolador con interfaz SPI. Este tutorial le mostrará cómo conectar el módulo MCP2515 a un Microcontrolador , pero primero, una introducción rápida al protocolo CAN.
Conceptos básicos del sistema de bus CAN

Una red de área de controlador (bus CAN) es un estándar de comunicaciones diseñado para permitir que los dispositivos del vehículo se comuniquen entre sí sin una computadora host.

Para comprender mejor el bus CAN, piense en su automóvil como un cuerpo humano. En este contexto, el bus CAN es el sistema nervioso.

Topología del bus CAN

La comunicación física se produce a través del mazo de cables del bus CAN, que consta de dos cables, CAN bajo y CAN alto. Ambos cables están trenzados firmemente para que la interferencia electromagnética afecte la señal en ambos cables de manera uniforme, minimizando así los errores.
puede par trenzado.

Los extremos más alejados del cable están terminados con resistencias de 120 ohmios. Debido a que el bus CAN es un bus de datos de alta velocidad, si el bus no está terminado, la señal se reflejará e interferirá con la siguiente señal de datos que baja por la línea, lo que podría interrumpir las comunicaciones.

La red CAN (Controller Area Network) típicamente utiliza dos cables para la transmisión de datos bidireccional: el cable CAN alto (CAN-High) y el cable CAN bajo (CAN-Low). Estos cables forman un par diferencial que permite la comunicación robusta y resistente a interferencias electromagnéticas.

La velocidad de comunicación en una red CAN puede variar. Los estándares CAN admiten velocidades de transmisión que van desde 50 Kbps (kilobits por segundo) hasta 1 Mbps (megabit por segundo). La elección de la velocidad dependerá de los requisitos específicos de la aplicación.

También es importante tener en cuenta que la distancia de la comunicación en una red CAN puede variar según la velocidad de transmisión. A velocidades más altas, la distancia efectiva de la comunicación puede ser más corta debido a la atenuación de la señal. Por ejemplo, como mencionaste, a 1 Mbps, la distancia típica puede ser de hasta 40 metros, mientras que a 50 Kbps, podría extenderse hasta 1000 metros.

Esquema del módulo de bus CAN MCP2515

Antes de ver el esquema del módulo, debe comprender un par de cosas sobre los circuitos integrados, es decir, MCP2515 y TJA1050.

MCP2515 IC es el controlador principal que internamente consta de tres subcomponentes principales: el módulo CAN, la lógica de control y el bloque SPI.

El módulo CAN es responsable de transmitir y recibir mensajes en el bus CAN. Control Logic maneja la configuración y operación del MCP2515 interconectando todos los bloques. El bloque SPI es responsable de la interfaz de comunicación SPI.

En cuanto al IC TJA1050, dado que actúa como interfaz entre el controlador CAN MCP2515 y el bus CAN físico, este IC es responsable de tomar los datos del controlador y transmitirlos al bus.

La siguiente imagen muestra el esquema del módulo CAN MCP2515 y muestra cómo MCP2515 IC y TJA1050 IC están conectados en el módulo.

Estructura del mensaje CAN:

  1. Campo de Encabezado (Header):
    • Inicio del Trama (SOF – Start of Frame): Es un bit dominante (0) que indica el inicio de la trama.
    • Campo de Arbitraje: Contiene la Identificación del Mensaje (ID) que determina la prioridad del mensaje. Los bits de menor valor tienen mayor prioridad.
    • Bit de Control: Indica si el mensaje es estándar o extendido.
    • Bit RTR (Remote Transmission Request): Indica si el mensaje es una solicitud de transmisión remota.
  2. Campo de Control: Contiene información sobre la longitud de los datos y otros bits de control.
  3. Campo de Datos (Data Field): Contiene los datos que se están transmitiendo. La longitud de este campo puede ser de 0 a 8 bytes.
  4. Campo de CRC (Cyclic Redundancy Check): Contiene bits de verificación de redundancia cíclica para garantizar la integridad de la trama.
  5. Campo de Confirmación (ACK): Después de la transmisión de la trama, los nodos receptores envían un ACK para confirmar que recibieron correctamente la trama.
  6. Campo de Separación entre Tramas (Interframe Space): Espacio entre tramas para distinguir entre tramas sucesivas.
  7. Campo de Fin de Trama (EOF – End of Frame): Indica el final de la trama.

Ahora bien: ¿Hace falta saber toda la estructura?

Podemos quedarnos con esto:

Formato del mensaje CAN:

En la comunicación CAN, los datos se transmiten en la red como un formato de mensaje particular. Este formato de mensaje contiene muchos segmentos, pero dos segmentos principales son los identificador y datos que ayuda a enviar y responder mensajes en el bus CAN.

Identificador o CAN ID:

El Identificador CAN (también conocido como CAN ID o PGN – Parameter Group Number) es crucial en la red CAN para identificar los mensajes y asignar prioridades. Aquí hay más detalles:

  1. Longitud del Identificador:
    • Puede tener una longitud de 11 bits (CAN estándar) o 29 bits (CAN extendido).
    • En CAN estándar, el identificador es de 11 bits y en CAN extendido, el identificador es de 29 bits.
  2. Prioridad:
    • En una red CAN, los mensajes con identificadores más bajos tienen mayor prioridad.
    • Los bits de menor valor en el campo de arbitraje del encabezado determinan la prioridad del mensaje.
  3. Tipos de Identificadores:
    • Estándar (11 bits): Utilizado para redes CAN estándar.
    • Extendido (29 bits): Se utiliza en redes CAN extendidas para manejar un mayor número de nodos y mensajes.
  4. Parameter Group Number (PGN):
    • En el contexto de J1939, un protocolo basado en CAN utilizado comúnmente en vehículos comerciales, el identificador se conoce como PGN.
    • El PGN se encuentra en los bits de mayor valor del identificador y agrupa mensajes relacionados.

Ejemplo de Identificador CAN estándar (11 bits): | ID10 | ID9 | ID8 | ID7 | ID6 | ID5 | ID4 | ID3 | ID2 | ID1 | ID0 |

Ejemplo de Identificador CAN extendido (29 bits): | ID28 | ID27 | ... | ID2 | ID1 | ID0 |

La combinación de identificador y bits de control en el campo de arbitraje ayuda a determinar qué mensaje tiene prioridad en el bus CAN, permitiendo una comunicación eficiente y organizada en entornos con múltiples nodos.

Datos:

los datos en un mensaje CAN representan la información real que se está transmitiendo desde un dispositivo a otro. Aquí están los detalles adicionales sobre los datos en un mensaje CAN:

  1. Campo de Datos:
    • Contiene los datos reales del sensor o control que se están transmitiendo.
    • La longitud de este campo puede variar de 0 a 8 bytes, dependiendo de la cantidad de datos que se estén enviando.
  2. Código de Longitud de Datos (DLC):
    • Indica la longitud de los datos en el campo de datos.
    • Puede tener un valor entre 0 y 8, lo que significa que el campo de datos puede contener entre 0 y 8 bytes de información.

Cables:

En sistemas CAN, se utilizan cables específicos para garantizar una transmisión de datos confiable y resistente a interferencias electromagnéticas. Aquí hay algunas características clave de los cables utilizados en redes CAN:

  1. Apantallamiento:
    • Los cables CAN suelen tener una capa de apantallamiento para proteger la señal de posibles interferencias electromagnéticas (EMI).
    • El apantallamiento ayuda a prevenir la entrada o salida de ruido electromagnético que podría afectar la integridad de las señales CAN.
  2. Pares Trenzados:
    • Los cables CAN suelen ser de par trenzado, lo que significa que hay dos conductores entrelazados a lo largo del cable.
    • La torsión de los pares ayuda a reducir la interferencia electromagnética entre los cables, mejorando la calidad de la señal.
  3. Impedancia Característica:
    • Los cables CAN están diseñados para tener una impedancia característica específica (generalmente 120 ohmios) para minimizar las reflexiones de la señal y garantizar una transmisión de datos adecuada.
    • La impedancia característica se mantiene constante a lo largo del cable para evitar distorsiones en la señal.
  4. Conectores:
    • Los conectores utilizados son generalmente del tipo macho-hembra y cumplen con estándares específicos.
    • Los conectores comunes incluyen conectores de 9 pines en aplicaciones automotrices y conectores de tipo D-sub en aplicaciones industriales.
  5. Longitud del Cable:
    • La longitud del cable CAN está limitada por la velocidad de transmisión y la calidad de la señal que se desea mantener.
    • En redes CAN estándar, la longitud máxima típica es de 40 metros, pero en aplicaciones específicas, como en vehículos, se pueden usar repetidores para extender la longitud total del bus CAN.
  6. Resistencia de Terminación:
    • Al final del bus CAN, se suelen colocar resistencias de terminación de 120 ohmios para evitar reflexiones de la señal y mejorar la integridad de la transmisión.

Es importante seleccionar cables adecuados y seguir las especificaciones recomendadas para garantizar un rendimiento confiable en las redes CAN. Las características específicas pueden variar según el entorno de aplicación, como automoción, industrial o sistemas embebidos.

Conexión con Placa de Desarrollo tipo Uno (Atmega328P)

Código para compilar con IDE:

Si bien ya vamos por la versión 2.veintipico, soy fan de la 1.8.19 ¿Por qué será?

Código para Transmitir

#include <SPI.h>
#include <mcp2515.h>

struct can_frame canMsg;
MCP2515 mcp2515(10);


void setup() {
  Serial.begin(115200);
  
  mcp2515.reset();
  mcp2515.setBitrate(CAN_125KBPS);
  mcp2515.setNormalMode();
  
  Serial.println("------- Escribir tecnología CAN ----------");
  Serial.println("ID  DLC   DATA");
}

void loop() {
  if (mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK) {
    Serial.print("El ID es: "); // print ID
    Serial.print(canMsg.can_id, HEX); // print ID
    Serial.print(", dlc:  "); 
    Serial.print(canMsg.can_dlc, HEX); // print DLC
    Serial.print(", mensaje: ");
    
    for (int i = 0; i<canMsg.can_dlc; i++)  {  // print the data
      Serial.print(canMsg.data[i],HEX);
      Serial.print(" | ");
    }

    Serial.println();      
  }
}

ver en github

Código para recibir:

#include <SPI.h>
#include <mcp2515.h>

struct can_frame canMsg1;
struct can_frame canMsg2;
MCP2515 mcp2515(10);


void setup() {
  canMsg1.can_id  = 0x0F6;
  canMsg1.can_dlc = 8;
  canMsg1.data[0] = 0x8E;
  canMsg1.data[1] = 0x87;
  canMsg1.data[2] = 0x32;
  canMsg1.data[3] = 0xFA;
  canMsg1.data[4] = 0x26;
  canMsg1.data[5] = 0x8E;
  canMsg1.data[6] = 0xBE;
  canMsg1.data[7] = 0x86;

  canMsg2.can_id  = 0x036;
  canMsg2.can_dlc = 8;
  canMsg2.data[0] = 0x0E;
  canMsg2.data[1] = 0x00;
  canMsg2.data[2] = 0x00;
  canMsg2.data[3] = 0x08;
  canMsg2.data[4] = 0x01;
  canMsg2.data[5] = 0x00;
  canMsg2.data[6] = 0x00;
  canMsg2.data[7] = 0xA0;
  
  while (!Serial);
  Serial.begin(115200);
  
  mcp2515.reset();
  mcp2515.setBitrate(CAN_125KBPS);
  mcp2515.setNormalMode();
  
  Serial.println("Ejemplo: Leer tecnología CAN");
}

void loop() {
  mcp2515.sendMessage(&canMsg1);
  mcp2515.sendMessage(&canMsg2);

  Serial.println("Messages sent");
  
  delay(1000);
}

ver en github

3 comentarios en “Comunicación por modulo CAN MCP2515

  1. En referencia a tu comentario de la versión 1.8.19,  importante tener en cuenta que, si bien hay razones válidas para quedarse con versiones antiguas, también hay beneficios en utilizar versiones más recientes.

  2. ¿cómo gestionarías eficientemente las interrupciones en un microcontrolador para asegurar una respuesta rápida a eventos críticos en una red CAN? MUCHAS GRACIAS

    1. Configuración de Interrupciones:

      • Asegúrate de haber configurado correctamente las interrupciones asociadas al MCP2515 en el microcontrolador. Verifica que las interrupciones estén habilitadas y configuradas para responder a eventos específicos de la red CAN, como la recepción de mensajes o cambios en el estado del MCP2515.

      Prioridades de Interrupción:

      • Si el microcontrolador permite la asignación de prioridades a las interrupciones, asigna prioridades más altas a las interrupciones críticas relacionadas con la comunicación CAN. Esto garantiza que se atiendan rápidamente cuando ocurran.

      Manejo Rápido de Eventos:

      • Dentro de la rutina de interrupción, realiza el manejo esencial de eventos de manera eficiente. Evita tareas prolongadas que podrían retrasar la respuesta a nuevas interrupciones.

      Buffer de Recepción Eficiente:

      • Implementa un sistema de buffer de recepción eficiente para manejar los mensajes entrantes. Esto minimiza la posibilidad de pérdida de mensajes y asegura que los datos críticos se procesen rápidamente.

      Optimización de Código:

      • Optimiza el código relacionado con la gestión de interrupciones. Esto puede incluir el uso de instrucciones optimizadas o la implementación de técnicas que reduzcan la latencia del código crítico.

      Pruebas y Optimización Iterativa:

      • Realiza pruebas exhaustivas para asegurarte de que la gestión de interrupciones sea efectiva. Realiza ajustes y optimizaciones iterativas según sea necesario, considerando el rendimiento en situaciones de carga pesada.

      Consideración del Consumo de Energía:

      • Si la aplicación tiene restricciones de consumo de energía, equilibra la eficiencia de la gestión de interrupciones con la necesidad de minimizar el consumo de energía en períodos de inactividad.
Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *