¿Qué es el MCP2515?
El MCP2515 es un controlador independiente del protocolo Controller Area Network (CAN) desarrollado por Microchip. Implementa completamente la especificación CAN 2.0B, ofreciendo una solución fiable, flexible y rentable para la comunicación por bus CAN en sistemas embebidos mediante una interfaz SPI de alta velocidad.
Especificaciones técnicas principales del MCP2515
- Protocolo CAN: Cumple CAN 2.0B
- Bitrate máximo: 1 Mbps
- Interfaz con MCU: SPI (hasta 10 MHz)
- Voltaje: 2.7V - 5.5V
- Corriente típica: 5 mA (activo), 1 µA (en espera)
- Búferes de recepción: 2
- Búferes de transmisión: 3
- Filtros / Máscaras: 6 / 2
- Temperatura de operación: -40°C a +125°C
Diagrama de arquitectura interactivo
Pasa el cursor sobre un módulo para ver los detalles
Aspecto físico y pinout del MCP2515
Una foto del chip y un diagrama de su configuración de pines.
Circuito integrado MCP2515 | Foto de Microchip

Diagrama de pines del controlador CAN independiente MCP2515
Cómo funciona internamente
El MCP2515 simplifica la comunicación CAN para microcontroladores que no tienen un módulo CAN nativo. Actúa como intermediario, gestionando las tareas complejas del protocolo CAN para que la MCU solo tenga que enviar y recibir datos mediante la interfaz SPI. El reloj interno del MCP2515 se sincroniza con el bus, y su hardware dedicado gestiona la temporización de bit, la comprobación de errores y el almacenamiento en búfer, reduciendo significativamente la carga de procesamiento de la MCU y liberándola para otras tareas.
Guía para principiantes y aficionados
Esta sección te guía a través de las conexiones de hardware básicas y la programación para usar el MCP2515 con Arduino o ESP32.
Conexión de hardware y cableado
Aquí tienes un diagrama de cableado típico para conectar un módulo MCP2515 a un Arduino Uno. Recuerda que se requieren dos resistencias de terminación de 120Ω en cada extremo físico del bus CAN.

Diagrama de cableado que muestra cómo conectar un Arduino Uno a un módulo CAN basado en MCP2515
Pinout del módulo MCP2515:
- VCC: Alimentación (5V)
- GND: Tierra
- CS: Chip Select para SPI (p. ej., Arduino D10)
- SO: Salida de datos SPI (MISO, p. ej., Arduino D12)
- SI: Entrada de datos SPI (MOSI, p. ej., Arduino D11)
- SCK: Reloj SPI (p. ej., Arduino D13)
- INT: Interrupción (opcional, p. ej., Arduino D2)
- CAN_H / CAN_L: Líneas alta/baja del bus CAN
Software: envío y recepción
Los siguientes fragmentos de código muestran cómo enviar y recibir un mensaje simple usando la librería mcp2515.
Inicialización y envío
#include <mcp2515.h>
#include <SPI.h>
#define CAN_INT 2
#define CS_PIN 10
MCP2515 mcp2515(CS_PIN);
void setup() {
Serial.begin(115200);
SPI.begin();
if (mcp2515.reset() != MCP2515::ERROR_OK) {
Serial.println("Error al inicializar MCP2515");
while(1);
}
if (mcp2515.setBitrate(CAN_125KBPS) != MCP2515::ERROR_OK) {
Serial.println("Error al configurar el bitrate");
while(1);
}
}
void loop() {
CanMessage msg;
msg.id = 0x123;
msg.data[0] = 0xAA;
msg.data_length_code = 1;
mcp2515.sendMessage(&msg);
Serial.println("¡Mensaje enviado!");
delay(1000);
}Recepción de un mensaje
#include <mcp2515.h>
#include <SPI.h>
#define CS_PIN 10
MCP2515 mcp2515(CS_PIN);
void setup() {
// ... (igual que arriba)
}
void loop() {
CanMessage msg;
if (mcp2515.readMessage(&msg) == MCP2515::ERROR_OK) {
Serial.print("ID de mensaje recibido: 0x");
Serial.print(msg.id, HEX);
Serial.print(", Datos: ");
Serial.println(msg.data[0], HEX);
}
delay(10);
}Explicación de funciones
mcp2515.reset(): Inicializa el chip a un estado conocido. Es crucial para asegurar que el MCP2515 esté listo para configurarse; actúa como un reinicio por software de la lógica interna. Debe ser la primera función llamada tras el constructor.
mcp2515.setBitrate(): Configura la velocidad del bus CAN. Recibe una constante predefinida como CAN_125KBPS o CAN_500KBPS y calcula los valores correctos de los registros de temporización (CNF1, CNF2, CNF3) para coincidir con el bitrate objetivo y la frecuencia del oscilador, garantizando que todos los nodos puedan comunicarse de forma fiable.
Sondeo vs. interrupciones
La función loop() en el código de recepción usa sondeo (polling) al llamar repetidamente a mcp2515.readMessage(). Es sencillo, pero puede ser ineficiente porque la MCU invierte mucho tiempo comprobando si hay mensajes nuevos incluso cuando no los hay. Un método más eficiente es usar un enfoque basado en interrupciones. Conectando el pin INT del MCP2515 a un pin de interrupción de la MCU, el chip puede avisar a la MCU solo cuando llega un mensaje nuevo, permitiendo que la MCU haga otras tareas mientras espera.
Para ingenieros profesionales
Un análisis más profundo de la integración del MCP2515 en proyectos profesionales, comparaciones de rendimiento y cálculos de parámetros clave.
MCP2515 vs. controlador CAN nativo
Compara el MCP2515 con controladores CAN integrados (p. ej., en un STM32) para ayudar en la selección de tecnología.
Calculadora de temporización de bit
Una temporización de bit precisa es crucial para una red CAN estable. Esta herramienta te ayuda a calcular rápidamente los valores de los registros CNF1/2/3 para tu configuración específica.
Resultados del cálculo:
Aplicaciones prácticas y solución de problemas
Explora casos de estudio reales y aprende a diagnosticar y resolver problemas comunes con el MCP2515.
Casos de estudio
Proyecto de automatización industrial
Comunicación CAN en tiempo real entre múltiples nodos de sensores y un controlador central para transmitir datos ambientales en una fábrica inteligente. El MCP2515 se emparejó con un microcontrolador STM32 para cumplir requisitos exigentes de velocidad y fiabilidad. Se resolvieron problemas de ruido en la alimentación y configuración incorrecta de filtros.
Comunicación con ECU automotriz
Desarrollo de una herramienta de diagnóstico personalizada para el bus CAN de un vehículo. La herramienta utiliza MCP2515 para leer y enviar mensajes de diagnóstico a varias ECUs (unidad de control del motor, ABS). Este proyecto requirió gestionar tramas CAN estándar y extendidas, así como prioridades de mensajes para registro de datos en tiempo real.
Red de sensores para agricultura inteligente
Red distribuida de sensores de humedad del suelo, temperatura y luz desplegada en una granja. Cada nodo usa un MCP2515 para comunicarse con una pasarela central. El bajo consumo y la robustez del MCP2515 fueron críticos para nodos a batería y comunicación a larga distancia en esta aplicación.
Guía interactiva de solución de problemas
Posibles causas:
- Interferencia por ruido en la alimentación.
- Faltan resistencias de terminación de 120Ω en los extremos del bus.
- Desajuste de baud rate entre nodos de la red.
Soluciones:
- Añade más condensadores de desacoplo cerca de los pines VCC y GND.
- Asegura una resistencia de 120Ω en cada extremo físico del bus.
- Comprueba y unifica la configuración del baud rate en todos los nodos.
Posibles causas:
- Filtro o máscara de recepción mal configurados, filtrando todos los mensajes.
- El MCP2515 ha entrado en estado "Bus-Off" debido a demasiados errores.
- Cableado incorrecto, especialmente las líneas MISO/MOSI.
Soluciones:
- Desactiva temporalmente los filtros para probar conectividad.
- Revisa los registros de contadores de error y realiza un reset por software o hardware si es necesario.
- Verifica cuidadosamente las conexiones de pines del bus SPI.
Posibles causas:
- El pin CS (Chip Select) de SPI está mal configurado o no se está controlando correctamente.
- La velocidad del reloj SPI excede la especificación del MCP2515 (10MHz).
- Voltaje de alimentación inestable o insuficiente.
Soluciones:
- Confirma que el pin CS en el código coincide con el hardware y usa un osciloscopio para verificar niveles lógicos.
- Reduce la frecuencia del reloj SPI de la MCU.
- Asegura una alimentación estable y limpia para el MCP2515.




