CAN communication between MCP2515 and Due with SN65HVD230 not running

Hi Community,

I'm trying to make a comunication running between 2 Arduino Mega and One Arduino Due.

The Megas are connecting to CAN about the MCP2515 and the Due with SN65HVD230.

Code on first MEGA:

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


uint32_t rxId;
byte len = 0;
byte rxBuf[8];

#define CAN0_INT 2                              // Set INT to pin 2
MCP_CAN CAN0(53);                               // Set CS to pin 10


void setup()
{
  Serial.begin(115200);
  
  // Initialize MCP2515 running at 16MHz with a baudrate of 500kb/s and the masks and filters disabled.
  if(CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_16MHZ) == CAN_OK)
    Serial.println("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);                            // Configuring pin for /INT input
}

void loop()
{
  if(!digitalRead(CAN0_INT))                         // If CAN0_INT pin is low, read receive buffer
  {
    CAN0.readMsgBuf(&rxId, &len, rxBuf);      //Can Daten lesen: rxId=Identifier,  len=Messagelänge, buf=Speicher der Message (Byte Array aus 8 Bytes)

	uint32_t CANBUSIdentifierIn = 0;
    
	if (rxId <= 2047)     
	{
		Serial.print("11 bit Identifier Binary: ");
		for (int i = 10; i >= 0; i--)
		{
			Serial.print(bitRead(rxId, i));
			bitWrite(CANBUSIdentifierIn, i, bitRead(rxId, i));
		}
		Serial.print(" Value: ");
		Serial.println(CANBUSIdentifierIn);
	}		
	else
	{
		Serial.print("29 bit Identifier Binary: ");				
		for (int i = 28; i >= 0; i--)
		{
			Serial.print(bitRead(rxId, i));
			bitWrite(CANBUSIdentifierIn, i, bitRead(rxId, i));
		}
		Serial.print(" Value: ");
		Serial.println(CANBUSIdentifierIn);
	}

	Serial.print("Recieved Data: ");
	for (int i = 0; i < len; i++)
	{
		Serial.print(" Byte[");
		Serial.print(i);
		Serial.print("]: ");
		Serial.print(rxBuf[i]);
	}
    Serial.println();
  }
}

Code on second MEGA:

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

uint32_t CANBUSModId = 0;
const byte CANBUSPackageTypeBroadcast = 0;
const byte CANBUSPackageTypeProgram = 1;
const byte CANBUSPackageTypeExecute = 2;
const byte CANBUSPackageTypeDataResponse = 3;
const byte CANBUSPackageTypeRequestData = 4;
const byte CANBUSPackageTypeDataTransmit = 5;

MCP_CAN CAN0(53);     //Cableselect Pin des MCP

void setup()
{
	Entropy.Initialize();	//Entropy Random Genrator initialize
	Serial.begin(115200);

	CANBUSModId = Entropy.random(1, 16777215);
	Serial.print("MyModID: ");
	Serial.println(CANBUSModId);

	// Initialize MCP2515 running at 16MHz with a baudrate of 500kb/s and the masks and filters disabled.
	if (CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_16MHZ) == CAN_OK) Serial.println("MCP2515 Initialized Successfully!");
	else Serial.println("Error Initializing MCP2515...");

	CAN0.setMode(MCP_NORMAL);   // Change to normal mode to allow messages to be transmitted
}

byte data[8] = {1, 2, 3, 4, 5, 6, 7, 8};

void loop()
{
	Serial.print("MyModID: ");
	Serial.print(CANBUSModId);
	Serial.print(" Binaric Value: ");
	for (int i = 23; i >= 0; i--)
	{
		Serial.print(bitRead(CANBUSModId, i));
	}
	Serial.print(" TypeOfSendPackage: ");
	Serial.print(CANBUSPackageTypeDataTransmit);
	Serial.print(" Binaric Value: ");
	for (int i = 4; i >= 0; i--)
	{
		Serial.print(bitRead(CANBUSPackageTypeDataTransmit, i));
	}
	Serial.println();

	uint32_t CANBUSIdentifierOut = BuildIdentifierPackage(CANBUSPackageTypeDataTransmit);
	Serial.print("Value Idenfier: ");
	Serial.print(CANBUSIdentifierOut);
	Serial.print(" Binaric Value: ");
	for (int i = 28; i >= 0; i--)
	{
		Serial.print(bitRead(CANBUSIdentifierOut, i));
	}
	Serial.println();


	// send CANDATA
	Serial.print("send CANDATA:");
	for (int i = 0; i < 8; i++)
	{
		Serial.print(" Byte[");
		Serial.print(i);
		Serial.print("]: ");
		Serial.print(data[i]);
	}
	Serial.println();
	byte sndStat = CAN0.sendMsgBuf(CANBUSIdentifierOut, 1, 8, data);
	if (sndStat == CAN_OK) {
		Serial.println("Message Sent Successfully!");
	}
	else {
		Serial.println("Error Sending Message...");
	}
	delay(1000);
}

uint32_t BuildIdentifierPackage(byte Type)
{

	if (Type < 32 && CANBUSModId < 16777216)
	{
		uint32_t TempNumber = 0;

		for (int i = 0; i < 24; i++)
		{
			bitWrite(TempNumber, i, bitRead(CANBUSModId, i));
		}
		for (int i = 24; i < 29; i++)
		{
			bitWrite(TempNumber, i, bitRead(Type, i - 24));
		}
		return TempNumber;
	}
}

Code on Due:

//Reads all traffic on CAN0 and forwards it to CAN1 (and in the reverse direction) but modifies some frames first.
// Required libraries
#include "variant.h"
#include <due_can.h>

//Leave defined if you use native port, comment if using programming port
//#define Serial SerialUSB

void setup()
{

	Serial.begin(115200);
	Serial.println("Setup begin");
	delay(3000);
	// Initialize CAN0 and CAN1, Set the proper baud rates here
	Can0.begin(CAN_BPS_500K);
	Can1.begin(CAN_BPS_500K);
	//Can0.watchFor();  

	Serial.println("Setup complete.");
}

void sendData()
{
	Serial.begin(115200);
	CAN_FRAME outgoing;
	outgoing.id = 0x400;
	outgoing.extended = false;
	outgoing.priority = 4; //0-15 lower is higher priority

	outgoing.data.s0 = 0xFEED;
	outgoing.data.byte[2] = 0xDD;
	outgoing.data.byte[3] = 0x55;
	outgoing.data.high = 0xDEADBEEF;
	Can0.sendFrame(outgoing);

}

void loop() {
	CAN_FRAME incoming;
	static unsigned long lastTime = 0;

	if (Can0.available() > 0) {
		Can0.read(incoming);
		//Can1.sendFrame(incoming);
		Serial.print("CAN0 incoming Identifier: ");
		Serial.println(incoming.id);
	}
	if (Can1.available() > 0) {
		Can1.read(incoming);
		//Can0.sendFrame(incoming);
		Serial.print("CAN1 incoming Identifier: ");
		Serial.println(incoming.id);
		//Serial.print{"Data: "};
		//Serial.print{incoming.data};
	}

	if ((millis() - lastTime) > 1000)
	{
		lastTime = millis();
		//sendData();//not running, Arduino freezes
	}
}
  • The two MEGAS can talk to each other without any issues
  • The Due freezes when it tries to send data
  • The Due can't recieve any data

Does someone have an idea why the Due is not running in this CAN network?

due_can.h has been mentioned a few times on the Due part of this forum.
Perhaps they might be able to help.
https://forum.arduino.cc/index.php?board=87.0