Hardware setup
Compatible boards
Any Arduino with SPI support works. The CS pin and SPI pins vary by board:
For ESP32, the MCP2515 runs at 3.3V — do not connect directly to a 5V MCP2515 module without a level shifter.
Required components
| Component | Recommended model |
|---|---|
| Microcontroller | |
| CAN module | MCP2515 + TJA1050 breakout board |
| Bus terminators | 2× 120 Ω resistor |
| Wiring | Twisted pair for CAN_H / CAN_L |
Wiring diagram
The MCP2515 communicates with the— Arduino over SPI. On the Arduino Mega, the hardware SPI pins are:
| Arduino Mega | MCP2515 module |
|---|---|
| 5V | VCC |
| GND | GND |
| pin 52 | SCK |
| pin 51 | |
| pin 50 | |
| pin 53 | CS |
| pin 2 | INT ( |
The
Wiring CS— Arduino Uno / Nano
Initialization code
Change SPI_CS_PIN to match your board:
cpp
#include <SPI.h>
#include <mcp_can.h>
const int SPI_CS_PIN = 53;10; // 53 for Mega, 10 for Uno/Nano
MCP_CAN CAN(SPI_CS_PIN);
void setup() {
while (CAN_OK != CAN.begin(MCP_ANY, CAN_250KBPS, MCP_8MHZ)) {
delay(100);
}
CAN.setMode(MCP_NORMAL);
}
MCP2515 oscillator
Most CAN.begin()parameters:MCP2515 modules come with an 8 MHz crystal. Some come with 16 MHz — check the crystal printed on your module and change the parameter accordingly:
MCP_ANY8 MHz
MCP_8MHZ
CAN_250KBPSMCP_8MHZMCP_16MHZ
Installing the library
Install mcp_can by Cory Fowler from the Arduino IDE library manager, or clone directly:
bash
cd ~/Documents/Arduino/libraries
git clone https://github.com/coryjfowler/MCP_CAN_lib
Important
Always place a 120 Ω resistor between CAN_H and CAN_L at each end of the bus. Without terminators, signal reflections will make the bus unstable.