Datasheet & Pinout: MCP2515 CAN Bus Modul

🚗 MCP2515 CAN bus modul (TJA1050)

Lyt med på bilens hemmelige netværk! CAN-bus er nervesystemet i biler, maskiner og industri. Modulet har en MCP2515 CAN-controller (snakker SPI med din Arduino) og en TJA1050 transceiver (snakker elektrisk med bussen). Perfekt til eget dashboard, dataopsamling eller et lukket netværk mellem flere mikrocontrollere.

🛒 Køb MCP2515 CAN bus modulet 📄 MCP2515 datasheet (Microchip)

⚡ Hurtige specifikationer

Parameter Værdi
CAN-controller Microchip MCP2515 (CAN 2.0B, op til 1 Mbit/s)
Transceiver TJA1050 (kræver 5V: ca. 4,75–5,25V)
Interface SPI + interrupt-pin
Krystal Typisk 8 MHz (læs teksten på krystallen – nogle moduler har 16 MHz)
Terminering 120 Ω via jumper (J1)
Forsyning 5V

📌 Pinout

Pin Navn Funktion Forbindes til
1 INT Interrupt – går LOW når der er en ny besked D2 (UNO/Nano)
2 SCK SPI clock D13
3 SI SPI data ind (MOSI) D11
4 SO SPI data ud (MISO) D12
5 CS Chip select D10
6 GND Stel GND
7 VCC Forsyning 5V
Skrue H CAN High CAN-H (OBD2 pin 6)
Skrue L CAN Low CAN-L (OBD2 pin 14)

📏 Rækkefølgen INT–SCK–SI–SO–CS–GND–VCC er den mest udbredte på de blå moduler, men læs altid silketrykket.

🔌 Sådan forbinder du den

MCP2515 Arduino UNO/Nano ESP32
VCC 5V 5V / VIN (TJA1050 skal have 5V)
GND GND GND
CS D10 GPIO 5
SO (MISO) D12 GPIO 19 – via level shifter (SO er 5V når modulet kører 5V)
SI (MOSI) D11 GPIO 23
SCK D13 GPIO 18
INT D2 GPIO 4 (valgfri)

Mellem to moduler: H til H, L til L, og jumperen på begge (en terminering i hver ende).

💻 Eksempelkode

Installér biblioteket CAN af Sandeep Mistry via Library Manager. Det bruger CS = D10 og INT = D2 som standard. Sketchen lytter og printer alle beskeder:

#include <CAN.h>

void setup() {
  Serial.begin(115200);
  while (!Serial);

  CAN.setClockFrequency(8E6);     // 8 MHz krystal (skift til 16E6 hvis der staar 16.000 paa den)

  if (!CAN.begin(500E3)) {        // 500 kbit/s - almindelig hastighed i biler
    Serial.println("CAN start fejlede!");
    while (1);
  }
  CAN.observe();                  // kun lytte - sender ingen ACK/fejl paa bussen
  Serial.println("Lytter paa CAN-bussen...");
}

void loop() {
  int stoerrelse = CAN.parsePacket();
  if (stoerrelse) {
    Serial.print("ID 0x");
    Serial.print(CAN.packetId(), HEX);
    Serial.print(" : ");
    while (CAN.available()) {
      Serial.print(CAN.read(), HEX);
      Serial.print(" ");
    }
    Serial.println();
  }
}

💡 KompoNemt-tip fra værkstedet

  • Jumperen J1 er en 120 Ω termineringsmodstand. CAN skal termineres i begge ender af kablet. På bilens OBD2-stik er der allerede terminering – fjern jumperen der. På bordet mellem to Arduinoer skal den sidde på begge moduler.
  • Forkert hastighed kan forstyrre bilen. Brug listen-only (CAN.observe()) mens du finder den rigtige bitrate (typisk 500 kbit/s, nogle biler 250 kbit/s).
  • Krystallen er den klassiske faldgrube: koden skal vide, om den er 8 eller 16 MHz. Forkert = ingen beskeder eller volapyk.
  • OBD2 pin 6 og 14 er standard-CAN på de fleste nyere biler (ældre biler kan bruge andre protokoller). Pin 16 er 12V fra batteriet – hold den langt væk fra dit 5V-modul!

🔧 Fejlfinding

  • "CAN start fejlede": Tjek SPI-ledningerne (SO/SI byttet om er klassikeren), CS-pin og 5V på VCC.
  • Ingen beskeder: Forkert bitrate eller forkert krystalfrekvens i koden. Prøv 250E3 og 500E3.
  • Virker med to moduler på bordet, men ikke i bilen: H og L byttet om, eller bilens CAN sidder ikke på OBD2 pin 6/14.
  • ESP32 opfører sig mærkeligt: SO sender 5V tilbage til en 3.3V-pin – brug en level shifter.

Sidder du fast? Skriv til os – vi hjælper gerne.