Created
July 15, 2024 22:43
-
-
Save vasyl91/e9edec2a6e6d4154158ef430203e26c5 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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