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?