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