The BeagleBone boards are equipped with CAN interfaces.
It is easy to configure the communication based on CANOpen using Codesys.
For the example I will use the BBB Industrial and BB AI-64.
The BBB is preconfigured with two CAN networks, so only can0 and can1 autostart shall be configured.
The BB AI-64 requires more as the CAN networks are not configured as default.
BBB Industrial CAN Configuration
Add following commands to the /etc/network/interfaces file:
auto can0
iface can0 inet manual
pre-up /sbin/ip link set can0 type can bitrate 50000 triple-sampling on restart-ms 100
up /sbin/ifconfig can0 up
down /sbin/ifconfig can0 down
auto can1
iface can1 inet manual
pre-up /sbin/ip link set can1 type can bitrate 50000 triple-sampling on restart-ms 100
up /sbin/ifconfig can1 up
down /sbin/ifconfig can1 down
BBAI64 CAN Configuration
BB AI-64 doesn’t have the CAN interface configured as default, so first we need setup DTS overlay for CAN.
Create two files:
BONE-CAN0.dts
/dts-v1/;
/plugin/;
/*
* Helper to show loaded overlays under: /proc/device-tree/chosen/overlays/
*/
&{/chosen} {
overlays {
BONE-CAN0.kernel = __TIMESTAMP__;
};
};
/* Change pinmux*/
&main_mcan0 {
pinctrl-names = "default";
pinctrl-0 = <
&P9_19_can_pin /* mcan0_rxd */
&P9_20_can_pin /* mcan0_txd */
>;
symlink = "bone/can/1";
status = "okay";
};
and BONE-CAN4.dts
/dts-v1/;
/plugin/;
/*
* Helper to show loaded overlays under: /proc/device-tree/chosen/overlays/
*/
&{/chosen} {
overlays {
BONE-CAN4.kernel = __TIMESTAMP__;
};
};
/* Change pinmux*/
&main_mcan4 {
pinctrl-names = "default";
pinctrl-0 = <
&P9_24_can_pin /* mcan4_rxd */
&P9_26_can_pin /* mcan4_txd */
>;
symlink = "bone/can/4";
status = "okay";
};
Copy the files to /opt/source/dtb-5.10-ti-arm64/src/arm64/overlays (the dir dtb-5.10-ti-arm64 may be different for different distributions).
Add the BONE-CAN0.dtbo and BONE-CAN4.dtbo to the /opt/source/dtb-5.10-ti-arm64/src/arm64/overlays/Makefile
In the terminal go to the /opt/source/dtb-5.10-ti-arm64 make and install CAN overlays.
debian@BeagleBone:~$ cd /opt/source/dtb-5.10-ti-arm64
debian@BeagleBone:/opt/source/dtb-5.10-ti-arm64$ make
debian@BeagleBone:/opt/source/dtb-5.10-ti-arm64$ sudo make install
Enable the CAN overlays adding to the /boot/firmware/extlinux/extlinux.conf
fdtoverlays /overlays/BONE-CAN0.dtbo /overlays/BONE-CAN4.dtbo
Add following commands to the /etc/network/interfaces file:
auto can0
iface can0 inet manual
pre-up /sbin/ip link set can0 type can bitrate 500000
up /sbin/ifconfig can0 up
down /sbin/ifconfig can0 down
auto can1
iface can1 inet manual
pre-up /sbin/ip link set can1 type can bitrate 500000
up /sbin/ifconfig can1 up
down /sbin/ifconfig can1 down
Restart BBB and BB AI-64, run the command ip a from terminal.
On both modules you should see information about CAN interfaces.
can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UP group default qlen 10
link/can
can1: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UP group default qlen 10
link/can
The connection diagram
So we have configured CAN interfaces. Now we shall connect the BBB and BB AI-64 with CAN transceivers. I’m using Waveshare CAN SN65HVD230 UART 3.3V TRANSCEIVERS.
Now we can check if the CAN connection works correctly. On BeagleBone Black we are using can0 interface. On BeagleBone Ai-64 can1 interface. So we try send CAN frame from BB AI-64 to BBB.
In terminal on BBB type candump can0. In terminal on BB AI-64 type cansend can1 123#DEADBEEF.
We have CAN interfaces working on both BeagleBone boards.
Codesys Configuration
Now we can try to configure the BeagleBone with Codesys.
The BeagleBone Black is configured as CANOpen Master, BeagleBone Ai-64 as Slave.
At the beginning we use PDOs to exchange data between CANOpen Master and Slave.
PDOs Configuration
The PDOs Master Configuration:
The PDOs Slave Configuration:
For the Master and Slave we will implement simple applications.
Now we can check how it works…
SDO Read
The PDOs exchange data all the time. To read data from Slave we can use SDOs read frunction.
On the Slave we map Codesys variable to CANOpen Object.
On Master we write simple program to read object 16#300B Index 16#04.
If you want to read more than 4 bytes of data (for example to read string) you can use CIA405.SDO_READ_DATA instead of CIA405.SDO_READ4.
Now we can check how it works.
SDO Write
To write data to the Slave we can use SDO write function.
On Master we write simple program to read object 16#300B Index 16#04.
If you want to write more than 4 bytes of data (for example for string) you can use CIA405.SDO_WRITE_DATA instead of CIA405.SDO_WRITE4.
Now we can check how it works.