107-Arduino-MCP2515

Arduino library for controlling the MCP2515 in order to receive/transmit CAN frames.

95
15

<a href="https://107-systems.org/"><img align="right" src="https://raw.githubusercontent.com/107-systems/.github/main/logo/107-systems.png" width="15%"></a>
:floppy_disk: 107-Arduino-MCP2515

<a href="https://opencyphal.org/"><img align="right" src="https://raw.githubusercontent.com/107-systems/.github/main/logo/opencyphal.svg" width="25%"></a>
Arduino Library Badge
Compile Examples
Check Arduino
Check keywords.txt
General Formatting Checks
Spell Check
Build Status

<p align="center"> <a href="https://github.com/107-systems/l3xz"><img src="https://raw.githubusercontent.com/107-systems/.github/main/logo/l3xz-logo-memento-mori-github.png" width="30%"></a> <a href="https://github.com/107-systems/viper"><img src="https://github.com/107-systems/.github/raw/main/logo/viper.jpg" width="30%"></a> </p>

Arduino library for controlling the MCP2515 in order to receive/transmit CAN frames. This library is prepared to interface easily with libcanard for using Cyphal on Arduino via 107-Arduino-Cyphal.

This library works for

Example

#include <SPI.h>
#include <107-Arduino-MCP2515.h>
/* ... */
static int const MKRCAN_MCP2515_CS_PIN = 3;
static int const MKRCAN_MCP2515_INT_PIN = 7;
/* ... */
void onReceiveBufferFull(uint32_t const timestamp_us, uint32_t const id, uint8_t const * data, uint8_t const len)
{
 Serial.println(id, HEX);
}
void onTransmitBufferEmpty(ArduinoMCP2515 * this_ptr)
{
 /* You can use this callback to refill the transmit buffer via this_ptr->transmit(...) */
}
/* ... */
ArduinoMCP2515 mcp2515([](){ digitalWrite(MKRCAN_MCP2515_CS_PIN, LOW); },
 [](){ digitalWrite(MKRCAN_MCP2515_CS_PIN, HIGH); },
 [](uint8_t const d) -> uint8_t { return SPI.transfer(d); },
 micros,
 onReceiveBufferFull,
 onTransmitBufferEmpty);
/* ... */
void setup()
{
 Serial.begin(9600);
 while(!Serial) { }

 SPI.begin();
 pinMode(MKRCAN_MCP2515_CS_PIN, OUTPUT);
 digitalWrite(MKRCAN_MCP2515_CS_PIN, HIGH);

 pinMode(MKRCAN_MCP2515_INT_PIN, INPUT_PULLUP);
 attachInterrupt(digitalPinToInterrupt(MKRCAN_MCP2515_INT_PIN), [](){ mcp2515.onExternalEventHandler(); }, FALLING);

 mcp2515.begin();
 mcp2515.setBitRate(CanBitRate::BR_250kBPS_16MHZ); // CAN bitrate and clock speed of MCP2515
 mcp2515.setNormalMode();
}

void loop()
{
 uint8_t const data[8] = {0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD, 0xBE, 0xEF};
 mcp2515.transmit(1 /* id */, data, 8 /* len */);
 delay(100);
}

Repository

10
107-systems

107-systems/107-Arduino-MCP2515

Created

January 3, 2020

Updated

May 24, 2025

Language

C++

Category

System Tools