Skip to content

Instantly share code, notes, and snippets.

@vasyl91
Created July 15, 2024 22:43
Show Gist options
  • Save vasyl91/e9edec2a6e6d4154158ef430203e26c5 to your computer and use it in GitHub Desktop.
Save vasyl91/e9edec2a6e6d4154158ef430203e26c5 to your computer and use it in GitHub Desktop.
// Based on example written by: Cory J. Fowler
#include <mcp_can.h>
#include <SPI.h>
unsigned long rxId;
unsigned long rxIdToBlock = 0x128; // in my case it is the same for every rxBlock
byte len;
byte rxBuf[8];
byte txBuf0[] = {0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55};
byte txBuf1[] = {0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA};
char msgString[128]; // Array to store serial string
MCP_CAN CAN0(9); // IN CAN0 interface usins CS on digital pin 9
MCP_CAN CAN1(10); // OUT CAN1 interface using CS on digital pin 10
#define CAN0_INT 3 //define interrupt pin for CAN0 recieve buffer
#define CAN1_INT 4 //define interrupt pin for CAN1 recieve buffer
// rxBuffers to block
const byte rxBlock1[] = {0xC2, 0xB0, 0x01, 0x02, 0x00, 0xC0, 0x04, 0x00};
const byte rxBlock2[] = {0xC4, 0xB0, 0x01, 0x02, 0x00, 0xC0, 0x04, 0x00};
const byte rxBlock3[] = {0xC6, 0xB0, 0x01, 0x02, 0x00, 0xC0, 0x06, 0x00};
const byte rxBlock4[] = {0xC0, 0xB0, 0x01, 0x02, 0x00, 0xC0, 0x06, 0x00};
void setup()
{
Serial.begin(115200);
pinMode(CAN0_INT, INPUT_PULLUP);
pinMode(CAN1_INT, INPUT_PULLUP);
// init CAN0 bus, baudrate: 250k@16MHz
if(CAN0.begin(MCP_ANY, CAN_250KBPS, MCP_16MHZ) == CAN_OK){
Serial.print("CAN0: Init OK!\r\n");
CAN0.setMode(MCP_NORMAL);
} else Serial.print("CAN0: Init Fail!!!\r\n");
// init CAN1 bus, baudrate: 250k@16MHz
if(CAN1.begin(MCP_ANY, CAN_250KBPS, MCP_16MHZ) == CAN_OK){
Serial.print("CAN1: Init OK!\r\n");
CAN1.setMode(MCP_NORMAL);
} else Serial.print("CAN1: Init Fail!!!\r\n");
SPI.setClockDivider(SPI_CLOCK_DIV2); // Set SPI to run at 8MHz (16MHz / 2 = 8 MHz)
CAN0.sendMsgBuf(0x1000000, 1, 8, txBuf0);
CAN1.sendMsgBuf(0x1000001, 1, 8, txBuf1);
}
void loop(){
CAN0.readMsgBuf(&rxId, &len, rxBuf); // Read data: len = data length, buf = data byte(s)
int block1 = memcmp(rxBlock1, rxBuf, len);
int block2 = memcmp(rxBlock2, rxBuf, len);
int block3 = memcmp(rxBlock3, rxBuf, len);
int block4 = memcmp(rxBlock4, rxBuf, len);
if (rxId != rxIdToBlock
&& len != sizeof (rxBlock1 || rxBlock2 || rxBlock3 || rxBlock4)
&& 0 != (block1 || block2 || block3 || block4)) {
CAN1.sendMsgBuf(rxId, 1, len, rxBuf); // Immediately send message out CAN1 interface
}
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:", 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.println();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment