MCP2515 CAN network

Hello, I'm Pieter Reynebeau and I'm a student at Thomas More University in Geel (Belgium). I am making a tractor implement management (TIM) for my bachelor's thesis. In order to pass my bachelor's thesis, I would like to read the CAN bus of a tractor. For this I would like to use an MCP2515. I already found several programs online but so far I can't get 2 MCP2515 modules to communicate with each other. If this succeeds, the reading of the CAN bus of the tractor should be successful. I used the schematic and setup below:

The scheme and program comes from: arduino - MCP2515 CAN Transceivers can' t go higher than 125kbps - Electrical Engineering Stack Exchange

Does Anyone have an idea about what I'm doing wrong? I keep getting the message that my signal is being sent but not received. Because I've already tested several systems and don't see any real problems, I suspect it's my circuit. Or that the arbitration here blocks the CAN bus for one reason or another. Thank you in advance Pieter Reynebeau

Hello my friend
Where is the code so that we know where the error is?

The code for te sending MCP2515 is this:

// demo: CAN-BUS Shield, send data
// loovee@seeed.cc


#include <SPI.h>

/*SAMD core*/
#ifdef ARDUINO_SAMD_VARIANT_COMPLIANCE
    #define SERIAL SerialUSB
#else
    #define SERIAL Serial
#endif


#define CAN_2515
// #define CAN_2518FD

// the cs pin of the version after v1.1 is default to D9
// v0.9b and v1.0 is default D10

// Set SPI CS Pin according to your hardware
// For Wio Terminal w/ MCP2518FD RPi Hat:
// Channel 0 SPI_CS Pin: BCM 8
// Channel 1 SPI_CS Pin: BCM 7
// Interupt Pin: BCM25
// *****************************************
// For Arduino MCP2515 Hat:
// SPI_CS Pin: D9

#ifdef CAN_2518FD
#include "mcp2518fd_can.h"
const int SPI_CS_PIN = 10;
const int CAN_INT_PIN = 2;
mcp2518fd CAN(SPI_CS_PIN); // Set CS pin
#endif

#ifdef CAN_2515
#include "mcp2515_can.h"
const int SPI_CS_PIN = 10;
const int CAN_INT_PIN = 2;
mcp2515_can CAN(SPI_CS_PIN); // Set CS pin
#endif                              // Set CS pin

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

#ifdef CAN_2518FD
    while (0 != CAN.begin((byte)CAN_500K_1M)) {            // init can bus : baudrate = 500k
#else
    while (CAN_OK != CAN.begin(CAN_500KBPS)) {             // init can bus : baudrate = 500k
#endif        
        SERIAL.println("CAN BUS Shield init fail");
        SERIAL.println(" Init CAN BUS Shield again");
        delay(100);
    }
    SERIAL.println("CAN BUS Shield init ok!");
}

unsigned char stmp[8] = {0, 0, 0, 0, 0, 0, 0, 0};
void loop() {
    // send data:  id = 0x00, standrad frame, data len = 8, stmp: data buf
    stmp[7] = stmp[7] + 1;
    if (stmp[7] == 100) {
        stmp[7] = 0;
        stmp[6] = stmp[6] + 1;

        if (stmp[6] == 100) {
            stmp[6] = 0;
            stmp[5] = stmp[6] + 1;
        }
    }

    CAN.sendMsgBuf(0x00, 0, 8, stmp);
    delay(100);                       // send data per 100ms
    SERIAL.println("CAN BUS sendMsgBuf ok!");
}

// END FILE

And the code for te recieving module is:

// demo: CAN-BUS Shield, receive data with check mode
// send data coming to fast, such as less than 10ms, you can use this way
// loovee, 2014-6-13


#include <SPI.h>
/*SAMD core*/
#ifdef ARDUINO_SAMD_VARIANT_COMPLIANCE
    #define SERIAL SerialUSB
#else
    #define SERIAL Serial
#endif

#define CAN_2515
// #define CAN_2518FD

// the cs pin of the version after v1.1 is default to D9
// v0.9b and v1.0 is default D10

// Set SPI CS Pin according to your hardware
// For Wio Terminal w/ MCP2518FD RPi Hat:
// Channel 0 SPI_CS Pin: BCM 8
// Channel 1 SPI_CS Pin: BCM 7
// Interupt Pin: BCM25
// *****************************************
// For Arduino MCP2515 Hat:
// SPI_CS Pin: D9

#ifdef CAN_2518FD
#include "mcp2518fd_can.h"
const int SPI_CS_PIN = 10;
const int CAN_INT_PIN = 2;
mcp2518fd CAN(SPI_CS_PIN); // Set CS pin
#endif

#ifdef CAN_2515
#include "mcp2515_can.h"
const int SPI_CS_PIN = 10;
const int CAN_INT_PIN = 2;
mcp2515_can CAN(SPI_CS_PIN); // Set CS pin
#endif                           

void setup() {
    SERIAL.begin(115200);

#ifdef CAN_2518FD
    while (0 != CAN.begin((byte)CAN_500K_1M)) {            // init can bus : baudrate = 500k
#else
    while (CAN_OK != CAN.begin(CAN_500KBPS)) {             // init can bus : baudrate = 500k
#endif
        SERIAL.println("CAN BUS Shield init fail");
        SERIAL.println(" Init CAN BUS Shield again");
        delay(100);
    }
    SERIAL.println("CAN BUS Shield init ok!");
}


void loop() {
    unsigned char len = 0;
    unsigned char buf[8];

    if (CAN_MSGAVAIL == CAN.checkReceive()) {         // check if data coming
        CAN.readMsgBuf(&len, buf);    // read data,  len: data length, buf: data buf

        unsigned long canId = CAN.getCanId();

        SERIAL.println("-----------------------------");
        SERIAL.print("Get data from ID: 0x");
        SERIAL.println(canId, HEX);

        for (int i = 0; i < len; i++) { // print the data
            SERIAL.print(buf[i], HEX);
            SERIAL.print("\t");
        }
        SERIAL.println();
    }
}

/*********************************************************************************************************
    END FILE

I got htis code also from the website: arduino - MCP2515 CAN Transceivers can't go higher than 125kbps - Electrical Engineering Stack Exchange

I also used other programs and libraries, but here too I couldn't read anything on the CAN bus, so I wonder if I'm missing something in the circuit. Or is this circuit correct? The Arduino program is perfectly compilable. Maybe I did forget a part.

Kind regards Pieter Reynebeau

How to you really have it wired up? A real schematic or picture would be useful, even a hand drawn schematic. That picture shows one module and then a mirror of the module so CAN_H is always the top connection. That is not how real-life works. The code also mentions differences between ver1 and 1.1 so what version do you have? Please provide a link you your module.

I am now using this setup as shown in the photo. I am using version V1.0 because I connected the CAN module to pin 10 of the receiver. I use a Elegoo Mega2560 and a Arduino Nano ATMEGA328.

Kind regards Pieter Reynebeau

Can't tell a single thing from that distant photo. How are we suppose to know where all those wires are going?

Dear blh64

It is connected according to the picture at the top of the topic.


I will send more detailed photos .






I measured the 3 resistors and together they come out at 120 ohms. These resistors are connected to the 2 pins J1. I found on the internet that the bus termination should be placed here.

last you see my connecting wires from the CAN high with the CAN low

Kind regards Pieter Reynebeau

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.