The CANSPI board is a nice integration of the MCP2515 CAN Bus Controller and the MCP2551 CAN Bus Transceiver. To interface with these boards I’m using an Arduino Nano and the Seeed Studio CAN Bus Shield Library.
Here are some photos of the configuration, including the switch position on the CANSPI being used:
The wiring diagram goes as follows:
1 2 3 4 5 6 7 8 9 10 11 12 |
Arduino / CANSPI D13 - SCK (P4) D12 - MISO (P5) D11 - MOSI (P6) D10 - CS D02 - INT VCC - RST 5v - VCC GND - GND |
There are two parts of Arduino code, the sender and the receiver. The following code sends a sample piece of CAN data. Attach a potentiometer to A0, and twist it to see the differences in data in the receive code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
//Send CAN data #include <mcp_can.h> #include <SPI.h> MCP_CAN CAN(10); // Set CS to pin 10 void setup() { Serial.begin(115200); START_INIT: if(CAN_OK == CAN.begin(CAN_500KBPS)) // init can bus : baudrate = 500k { Serial.println("CAN BUS Shield init ok!"); } else { Serial.println("CAN BUS Shield init fail"); Serial.println("Init CAN BUS Shield again"); delay(100); goto START_INIT; } } void loop() { // send data: id = 0x00, standrad flame, data len = 8, stmp: data buf unsigned char stmp[8] = {map(analogRead(0),0,1024,0,255), 1, 2, 3, 4, 5, 6, 7}; CAN.sendMsgBuf(0x00, 0, 8, stmp); delay(100); // send data per 100ms } |
The following prints all CAN data received to the serial monitor:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
//Receive CAN data #include <SPI.h> #include "mcp_can.h" unsigned char Flag_Recv = 0; unsigned char len = 0; unsigned char buf[8]; char str[20]; MCP_CAN CAN(10); // Set CS to pin 10 void setup() { Serial.begin(115200); START_INIT: if(CAN_OK == CAN.begin(CAN_500KBPS)) // init can bus : baudrate = 500k { Serial.println("CAN BUS Shield init ok!"); } else { Serial.println("CAN BUS Shield init fail"); Serial.println("Init CAN BUS Shield again"); delay(100); goto START_INIT; } } void loop() { if(CAN_MSGAVAIL == CAN.checkReceive()) // check if data coming { CAN.readMsgBuf(&len, buf); // read data, len: data length, buf: data buf Serial.print("ID: "); Serial.print(CAN.getCanId()); Serial.print(" / "); for(int i = 0; i<len; i++) // print the data { Serial.print(buf[i]); Serial.print(","); } Serial.println(); } } |
Twist the potentiometer and see the change in data to see that it’s all working:
Thanks for reading!
Hey,
I am using Atmega2560. I am using P5,P6,P7(MOSI,MISO,SCK). I am also using seedstudio library for the newer can-shield version. My CS (D9), I have not connected INT to any pin. I have the same code. But it does not work for me. Does it matter, what pin selection I make?
I got it working. Thanks