Site Information

 Loading... Please wait...


CAN Bus Prototyping With Arduino Uno - The MCP2515 Library

Posted by Wilfried Voss on

This post is part of a series about Controller Area Network (CAN Bus) Prototyping With the Arduino Uno.

As with any serial networking controller, the essential functions are:

  1. Initialization
  2. Read Data
  3. Write Data
  4. Check Status

In case of the MCP2515 library, these functions are represented by:

  1. Initialization: CAN0.begin
  2. Read Data: CAN0.readMsgBuf incl. CAN0.checkReceive, CAN0.getCanId
  3. Write Data: CAN0.sendMsgBuf
  4. Check Status: CAN0.checkError

Function Calls

Function:           CAN0.begin

Initializes the CAN controller and sets the speed (baud rate)

CAN_5KPS … CAN_1000KPS (See mcp_can_dfs.h)

Return Code:
CAN_OK = Initialization okay
CAN_FAILINIT = Initialization failed

Function:           CAN0.checkReceive

Check if message was received


Return Code:
CAN_MSGAVAIL = Message available
CAN_NOMSG = No message

Function:           CAN0.readMsgBuf

Read the message buffer

nMsgLen returns the message length (number of data bytes)
nMsgBuffer returns the actual message

Return Code:

Function:           CAN0.getCANId

Retrieves the ID of the received message


Return Code:
m_nID = Message ID

Function:           CAN0. sendMsgBuf

Send a message buffer

id = Message ID
ext = CAN_STDID (11-bit ID) or CAN_EXTID (29-bit ID)
len = Number of data bytes (0…8)
buf = Message buffer

Return Code:

Function:           CAN0.checkError

Checks CAN controller for errors


Return Code:
CAN_OK = Status okay

There are further functions, among others, for message filtering and settings masks, and they are worth being checked out for more sophisticated functions, but they are not necessary for simple CAN communication tasks.


The implementation of the MPC2515 library is fairly easy: Open Arduino, create a new file, then use the menu items Sketch->Add File… to include the following files to the project:

  • mcp_can.cpp
  • mcp_can.h
  • mcp_can_dfs.h

In the Arduino project file add the following on top:

#include "mcp_can.h"
#include <SPI.h>

Let me repeat here: The Seeed Studio CAN Bus shield has been undergoing some hardware changes to become compatible with systems such as the Arduino Mega 2560. The version 1.0 will work with the Arduino Uno, while all higher versions also work with the Mega 2560. This will also affect the code of the Arduino projects, specifically the line “MCP_CAN CAN0(10);” in the main module selecting the CS pin. That line must change to “MCP_CAN CAN0(9);” for all CAN bus shield versions above 1.0.

You are now ready to go. The following chapters will describe how to implement the function calls.

CAN Bus Prototyping With Arduino Uno - Arduino CAN Shields

This post is part of a series about Controller Area Network (CAN Bus) Prototyping With the Arduino Uno. Since Controller Area Network (CAN) is predominantly targeted at industrial solutions (versus the vastly more popular USB for non-industrial use such as home and lab), there aren’t too many choices available in the market. Through some research (i.e. browsing) I found two very similar [...]

Read More »

A Brief Introduction to the ARM Cortex M3 Processor

This post is part of a series on CAN Bus and SAE J1939 Prototyping with the ARM Cortex M3 processor.  The ARM Cortex-M is a group of 32-bit RISC ARM processor cores licensed by ARM Holdings. The cores are intended for microcontroller use, and consist of the Cortex-M0, M0+, M1, M3, M4, and M7. The  ARM Cortex-M3 processor is very [...]

Read More »