I want to do CAN bus communication between 2 ESP32

I want to do CAN bus communication between 2 ESP32. I have seen several references, but because of my limited understanding of programming, I am confused.I use the mcp2515 module, with many references and libraries out there, but I chose to use this library mcp_can and I also use this program

// ESP32 CAN Receive Example - note added INPUT_PULLUP to CAN0_INT
//
// ESP32 connections
// MCP2515 INT to ESP32 GPIO22
// MCP2515 SCK to ESP32 GPIO18 CLK
// MCP2515  SI to ESP32 GPIO23 MOSI
// MCP2515  SO to ESP32 GPIO19 MISO
// MCP2515  CS to ESP32 GPIO5  CS
// MCP2515 GND to ESP32 GND
// MCP2515 VCC to ESP32 3.3V

#include <mcp_can.h>
#include <SPI.h>

long unsigned int rxId;
unsigned char len = 0;
unsigned char rxBuf[8];
char msgString[128];  // Array to store serial string

#define CAN0_INT 22  // for ESP32
MCP_CAN CAN0(5);     //

void setup() {
  Serial.begin(115200);
  delay(2000);
  Serial.println("\n\nESP32 CAN MCP2515 shield Send/Receive test - MCP2515 Initialize");
  // Initialize MCP2515 baudrate of 250kb/s and the masks and filters disabled.
  //  check crystal frequency!! e.g. Canbus shield is 16MHz MCP2515 is 8MHz
  if (CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ) == CAN_OK)
    Serial.println("CAN Receive - MCP2515 Initialized Successfully!");
  else
    Serial.println("Error Initializing MCP2515...");
  CAN0.setMode(MCP_NORMAL);         // Set operation mode to normal so the MCP2515 sends acks to received data.
  pinMode(CAN0_INT, INPUT_PULLUP);  // Configuring pin for /INT input *** added PULLUP ***
  Serial.println("MCP2515 Library CAN Send/Receive Example\n enter space to send a frame");
}

void loop() {
  // check for data received
  if (!digitalRead(CAN0_INT))  // If CAN0_INT pin is low, read receive buffer
  {
    CAN0.readMsgBuf(&rxId, &len, rxBuf);    // Read data: len = data length, buf = data byte(s)
    if ((rxId & 0x80000000) == 0x80000000)  // Determine if ID is standard (11 bits) or extended (29 bits)
      sprintf(msgString, "Extended ID: 0x%.8lX  DLC: %1d  Data: ", (rxId & 0x1FFFFFFF), len);
    else
      sprintf(msgString, "Standard ID: 0x%.3lX       DLC: %1d  Data:", rxId, len);
    Serial.print(msgString);
    if ((rxId & 0x40000000) == 0x40000000) {  // Determine if message is a remote request frame.
      sprintf(msgString, " REMOTE REQUEST FRAME");
      Serial.print(msgString);
    } else {
      for (byte i = 0; i < len; i++) {
        sprintf(msgString, "0x%.2X ", rxBuf[i]);
        Serial.print(msgString);
      }
      Serial.print((char *)&rxBuf+1);
    }
    Serial.println();
  }
  // transmit data when space entered on keyboard
  if (Serial.available()) {
    if (Serial.read() != ' ') return;
    static byte data[8] = { 0x00, 'E', 'S', 'P', '3', '2', 0, 0x08 };
    for (byte i = 0; i < 8; i++) {
      sprintf(msgString, " 0x%.2X", data[i]);
      Serial.print(msgString);
    }

    // send data:  ID = 0x100, Standard CAN Frame, Data length = 8 bytes, 'data' = array of data bytes to send
    byte sndStat = CAN0.sendMsgBuf(0x100, 0, 8, data);
    if (sndStat == CAN_OK) {
      Serial.println(" Message Sent Successfully!");
    } else {
      Serial.println(" Error Sending Message...");
    }
    data[0]++;  // increment first byte of data
  }
}

So far I'm still having problems with strange receivers. please give input on my problem

ESP32 already come with x1 CAN channel!

have a look at this you tube tutorial :wink:

Making a CAN Bus on a breadboard with two ESP32 microcontrollers!

all relevant material available on the video links.

hope that helps...

I've seen this reference before. in this reference it means can channel, namely pins 4 and 0 on the esp32 or is there something else? and dont need mcp2515 just tja1050?

have a look at using-two-esp32-boards-and-2-mcp2515-boards-to-communicate-over-can-not-receiving-anything
you can use a pair of MCP2515 modules or TWAI interface driving cjmcu-1051 (or similar) transceivers

off you asking me this question if you watch the youtube but anyway...

yes, that would be using the ESP32 pins assigned for CAN communication + the tja1050 as the CAN transceiver interface; you would not require to use and MCP2515 using this arrangement.

with your suggestion it has succeeded but there is still a little error I think in terms of electrical. I connect all the electrical with jumper cables and when reading while I press the cable and sometimes it works. currently I only short terminal j1 where there is a 120 resistor for CANH, CANL. is there anything else that needs to be added in terms of electrical wiring to smooth the transmit and receive?

sounds like you may have a poor connection
jumper cables between modules are a source of poor connections and intermittent problems
check each cable in turn and replace any which cause problems
the canbus should be terminated with a 120ohm resistor at each end - test between CANH and CANL with a multimeter should read 60ohms - there is usually a jumper on MCP2515 modules to connect the 120ohm resistor

Presumably (for testing and code development purposes) you can just cross connect the TWAI interface TX & RX pins between the two ESP32 devices?

never attempted that - always connected the ESP32s to transceivers then to other devices with CANBUS interfaces

i have tried it and it works thanks, i did not change the rx and tx pins in the program to 4 and 0 but still it as 21 22 like in example on website

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