I'm testing the CAN peripheral on a BeagleBone.

I'll be using my homemade generic CAN driver to implement the physical layer and Thomas Wedemeyer's BB specific instructions.

The other device on the CAN BUS, playing the communication partner role, is a Microchip CAN BUS Analyser.


Like most microcontrollers that have a CAN peripheral on board, the Sitara on the BeagleBone doesn't have a physical bus driver.

That's something that needs to be implemented separately.

The CAN driver breakout board I made for an e14 roadtest uses a TCAN332DTCAN332D driver IC.

The CAN Bus analyser from Microchip uses their own MCP2551MCP2551 (this family is used in several Arduino shields).

Check Thomas' blog to see how the driver connects to the BeagleBone.


Test the CAN Bus


Take care that everything is wired up before starting the exercise. The driver has to be connected to the BeagleBone and to a functional CAN bus.

If your device isn't connected to a bus, not a lot will happen physically.

My "functional CAN Bus" is a single Microchip CAN Bus analyser. But any physically correct circuit will work, as long as the voltage levels are compatible with the CAN driver you use.

On a BB Black or Green,  the controller side CAN Rx is on P9.24  and CAN Tx on P9.26.


Once everything is wired, there are 3 activities:


1. Set the BeagleBone pins to CAN function

There are several ways to do that permanently. Thomas' article is very good, check there.

For this exercise, I chose to assign them to CAN function temporary, with the config-pin utility.


sudo config-pin p9.24 can
sudo config-pin p9.26 can


2. Enable the Linux interface

CAN is implemented as a network in Linux. You use similar utilities as when defining a TCP/IP network.


sudo ip link set can1 up type can bitrate 125000
sudo ifconfig can1 up


Again, Thomas' instructions describe a way to do this permanently.


3. Send and Receive Data

The BeagleBone has Linux CAN utilities installed by default these days.

These can be used to try out the CAN network from the BB side. Both for sending and receiving traffic.

You'll need to have something on the bus to play the other role. In this case I used the Microchip analyser. An Arduino MKR with a MKR CAN shield and example sketches works equally well.


cansend can1 5A1#
candump can1




The Logic and Physical Layer Signals


While doing this exercise, I captured some data on both sides of the BB driver.

The logic level has TX and RX signals separate. Both 3.3V logic signals. The physical layer is differential.


CAN data: logic layer - Tx and Rx lineCAN data: physical layer - differential CAN signal


I probed the HI and LO with a differential probe.