I bought this cheap shield (currently not being sold on eBay) hoping it was going to work but ended up not working out the box. I used coryjfowler’s MCP_CAN_lib library and stuck with the default CS pin #10 and INT pin #2. Here is an example of working code I used for Martin Vijoen’s CAN-BUS Super Sniffer:
#include <mcp_can.h>
#include <SPI.h>
#define CAN0_INT 2 // Set INT to pin 2
MCP_CAN CAN0(10); // Set CS to pin 10
INT32U canId = 0x000;
unsigned char len = 0;
unsigned char buf[8];
void setup()
{
Serial.begin(38400);
START_INIT:
// Initialize MCP2515 running at 16MHz with a baudrate of 500kb/s and the masks and filters disabled.
while(CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_16MHZ) != CAN_OK){
Serial.println("Error Initializing MCP2515...");
delay(1000);
}
Serial.println("MCP2515 Initialized Successfully!");
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
Serial.println("MCP2515 Library Receive Example...");
}
void loop()
{
if(!digitalRead(CAN0_INT))
{
CAN0.readMsgBuf(&canId, &len, buf);
Serial.print("<");
Serial.print(canId);
Serial.print(",");
for(int i = 0; i < len; i++)
{
Serial.print(buf[i]);
if (i != (len - 1) )
Serial.print(",");
}
Serial.print(">");
Serial.println();
}
}
What I had to do physically:
I soldered the headers onto the board since they come loose, I accidentally melted the plastic since I used a heat gun. I de-soldered the 8.000 MHz crystal and swapped it with a 16 MHz crystal since most of CAN libraries ideally use 16 MHz timing.

I also bridged the two exposed solder pads (in front of the green screw-down post, beneath the “CAN_L” letters) on the board to utilize the on-board 10 Ω resistor.

After doing all these you should be fine to use this shield on industrial/automotive applications for what ever you wish to accomplish.