RK3562 xenomai实时CAN使用说明
文章目录
- [RK3562 xenomai实时CAN使用说明](#RK3562 xenomai实时CAN使用说明)
-
- 一、实时CAN驱动
-
- [1. RTCAN DTS节点配置](#1. RTCAN DTS节点配置)
- [2. 内核配置](#2. 内核配置)
- [3. 驱动文件](#3. 驱动文件)
- [二、xenomai CAN工具介绍](#二、xenomai CAN工具介绍)
-
- [1. rtcanconfig](#1. rtcanconfig)
- [2. rtcansend/rtcanrecv](#2. rtcansend/rtcanrecv)
- [3. can_rtt](#3. can_rtt)
- [4. /proc/rtcan目录](#4. /proc/rtcan目录)
- [三、xenomi CAN通信测试](#三、xenomi CAN通信测试)
-
- [1. 加载驱动](#1. 加载驱动)
- [2. 查看can设备信息](#2. 查看can设备信息)
- [3. 配置 CAN 接口](#3. 配置 CAN 接口)
- [4. CAN 与 CAN 通信](#4. CAN 与 CAN 通信)
- [5. CAN RTT测试](#5. CAN RTT测试)
- [四、RTCAN 编程接口](#四、RTCAN 编程接口)
- [五、CAN 常见问题排查](#五、CAN 常见问题排查)
-
- [1. 无法收发回环模式测试:](#1. 无法收发回环模式测试:)
- [2. 概率性不能收发](#2. 概率性不能收发)
- [附:Linux CAN 通信测试工具 (非xenomai rtcan)](#附:Linux CAN 通信测试工具 (非xenomai rtcan))
- [附:CAN 比特率和采样点计算](#附:CAN 比特率和采样点计算)
- 附:开源canopen协议栈
- 参考文档
作者: 沐多 wsg1100
出处: https://www.cnblogs.com/wsg1100/
版权:本文版权归作者所有
备注:若对外发布,未经作者同意,必须保留此段声明;必须在文章中给出原文连接。
本文为xenomai can使用说明,基于rk 3562描述,其他平台类似,希望对你使用xenomai can有所帮助!
基于 Xenomai RTDM(实时驱动模型)开发RK3562 CAN 设备驱动程序,以实现实时 CAN 通信。该xenomai RTCAN框架提供了一个类似于标准 SocketCAN 接口的实时接口。Xenomai 还提供了一些用户空间工具,用于简单的接口测试。以下对加载 CAN 驱动程序、配置接口以及使用 Xenomai 提供的命令行工具进行通信进行介绍。
一、实时CAN驱动
1. RTCAN DTS节点配置
Linux 驱动已经与 CAN 接口关联,若不修改设备树compatible
,在使用时需要卸载标准 Linux 驱动或解除该设备的驱动绑定。
这里rk3562 xenomai 实时CAN驱动使用修改compatible
属性"rockchip,rk3562-can-rt"来匹配,修改can设备节点,将compatible
属性重新设置,方便xenomai crk3562can驱动加载时匹配。若不修改,则匹配Linux(非实时)驱动。
可以选择修改底层dtsi arch/arm64/boot/dts/rockchip/rk3562.dtsi
来修改所有bsp,或修改具体板级dts arch/arm64/boot/dts/rockchip/tl3562-evm.dts
,这里选择修改板级dts,若未使用tl3562-evm.dts,则修改具体使用的dts。
diff
--- a/arch/arm64/boot/dts/rockchip/tl3562-evm.dts
+++ b/arch/arm64/boot/dts/rockchip/tl3562-evm.dts
@@ -187,12 +187,14 @@ fiq-debugger {
};
&can0 {
+ compatible = "rockchip,rk3562-can-rt";
pinctrl-names = "default";
pinctrl-0 = <&can0m2_pins>;
status = "okay";
};
&can1 {
+ compatible = "rockchip,rk3562-can-rt";
pinctrl-names = "default";
pinctrl-0 = <&can1m1_pins>;
status = "okay";
2. 内核配置

3. 驱动文件
驱动文件所在位置:drivers/xenomai/can/rockchip/rtcan_rk3562_can.c。
编译后将使用新设备树的内核镜像与xeno_rk3562_can.ko
安装到板子。
二、xenomai CAN工具介绍
xenomai官方未RTCAN提供了一个系统工具rtcanconfig
和两个测试工具 rtcansend
和 rtcanrecv
,一个demo can_rtt
;
1. rtcanconfig
rtcanconfig与Linux ifconfig命令类似,是 Xenomai 的一部分,用于配置 CAN 控制器。但仅限于用于配置rtcan接口波特率、start\up,系统必须运行一个合适的 Xenomai 支持的内核,并加载相应的模块(CAN)。
-
rtcanconfig安装位于
/usr/xenomai/sbin/
-
源码位于
xenomai/utils/can/rtcanconfig.c
在线文档说明:https://doc.xenomai.org/v3/html/man1/rtcanconfig/index.html

示例:配置rtcan 波特率
shell
rtcanconfig rtcan0 --baudrate=125000 start
2. rtcansend/rtcanrecv
rtcanrecv - Xenomai 工具,用于接收 CAN 消息。
rtcansend- Xenomai 工具,用于发送CAN 消息。
- 安装位于
/usr/xenomai/bin/
- 源码位于
xenomai/utils/can/rtcansend.c
、xenomai/utils/can/rtcanrecv.c
rtcanrecv 在线文档:https://doc.xenomai.org/v3/html/man1/rtcanrecv/index.html
rtcansend在线文档:https://doc.xenomai.org/v3/html/man1/rtcansend/index.html
shell
$ /usr/xenomai/bin/rtcansend -h
用法:/usr/xenomai/bin/rtcansend <can-interface> [Options] <can-msg>
<can-msg> 最多可以包含 8 个字节,用空格分隔的列表表示
选项:
-i, --identifier=ID CAN 标识符(默认 = 1)
-r --rtr 发送远程请求
-e --extended 发送扩展帧
-l --loop=COUNT 发送 COUNT 次消息
-c, --count 消息计数存储在 data[0-3] 中
-d, --delay=MS 延迟时间(以毫秒为单位)(默认 = 1ms)
-s, --send 使用 send 而不是 sendto
-t, --timeout=MS 超时时间(以毫秒为单位)
-L, --loopback=0|1 开启或关闭本地环回
-v, --verbose 详细输出
-p, --print=MODULO 每隔 MODULO 条消息打印一条
-h, --help 显示此帮助信息
$ /usr/xenomai/bin/rtcanrecv -h
用法:/usr/xenomai/bin/rtcanrecv [<can-interface>] [选项]
选项:
-f --filter=id:mask[:id:mask]... 应用过滤器
-e --error=mask 接收错误消息
-t, --timeout=MS 超时时间(单位:毫秒)
-T, --timestamp 包含绝对时间戳
-R, --timestamp-rel 包含相对时间戳
-v, --verbose 显示详细信息
-p, --print=MODULO 每隔 MODULO 条消息打印一次
-h, --help 显示此帮助信息
3. can_rtt
can_rtt 测试demo,程序会周期性发送 CAN 消息,并将当前时间戳复制到数据负载中。在接收端,该时间戳会与当前时间进行比较,以确定往返时间。抖动值会定期被打印出来,一定程度上用于测试rtcan收发实时性,显示单位us。
通过使用不同的消息ID启动程序,可以同时进行多个测试。此外,也可以在远程系统上使用该程序作为简单的中继器,以回发收到的CAN消息。
安装位于/usr/xenomai/demo/
,使用说明如下
shell
root@RK3562-Tronlong:/usr/xenomai/demo# ./can_rtt --help
usage: can_rtt [options] <tx-can-interface> <rx-can-interface>:
-r, --repeater Repeater, send back received messages
-i, --id=ID CAN Identifier (default = 0x1)
-c, --cycle Cycle time in us (default = 10000us)
测试原理:
线程 A:发送线程周期发送报文
- 周期唤醒 :通过
clock_nanosleep
按设定周期(cycle)唤醒(基于CLOCK_MONOTONIC
单调时钟,不受系统时间调整影响); - 生成时间戳 :读取当前
CLOCK_MONOTONIC
时间戳(记为 T1); - 构造 CAN 报文 :报文 ID 为指定
can_id
,数据域填入时间戳 T1(8 字节); - 发送报文:通过 TX Socket 将报文发送到 CAN 总线;
线程 B:接收线程处理报文并计算 RTT
- 接收报文:通过 RX Socket 监听 CAN 总线,接收目标 CAN ID 的报文;
- 生成接收时间戳 :读取当前
CLOCK_MONOTONIC
时间戳(记为 T2); - 计算 RTT:往返时间 = T2 - T1(T1 从报文数据域中解析);
- 更新 RTT 统计:
- 最小 RTT(rtt_min):取当前 RTT 与历史最小值的较小值;
- 最大 RTT(rtt_max):取当前 RTT 与历史最大值的较大值;
- 总 RTT(rtt_sum):累加当前 RTT;
https://doc.xenomai.org/v3/html/xeno3prm/can-rtt_8c-example.html
详细测试看后面章节。
4. /proc/rtcan目录
通过上面的rtcanconfig
可以发现,与Linux ifconfig
不同,xenomai CAN收发信息不能使用rtcanconfig
查看,那我们要查看目前系统rtcan数量和相关信息该如何查看呢?
只能通过proc文件系统查看信息,位于proc目录/proc/rtcan/
下.
shell
root@RK3562-Tronlong:/proc/rtcan# tree
.
|-- devices
|-- rtcan0
| |-- filters
| `-- info
|-- rtcan1
| |-- filters
| `-- info
|-- sockets
`-- version
/proc/rtcan/version
查看xenomai can的版本。
shell
root@RK3562-Tronlong:/proc/rtcan# cat version
RT-Socket-CAN 0.90.2
/proc/rtcan/devices
/proc/rtcan/devices
中保存了当前的系统中rtcan设备及其相关信息:

- Name:rtcan设备名,命令行操作和socket编程时需要
- Baudrate:设置的波特率
- State:设备当前状态,active表示已经up/start;stopped表示已经down/stop
- TX_Counter、RX_Counter、Errors表示设备收、发及错误的计数
/proc/rtcan/rtcanX
/proc/rtcan/rtcanX
目录为各个设备的详细信息
-
filters: 用户设置的filters
-
info:设备详细信息,包括设备名、时钟频率、Bit-time、收发计数等等

sockets
用于查看当前已打开can设备的信息,使用rtcanrecv打开rtcan0,其信息如下。
shell
root@RK3562-Tronlong:~# rtcanrecv rtcan0 &
root@RK3562-Tronlong:~# cat /proc/rtcan/sockets
Name___________ Filter ErrMask RX_Timeout_ns TX_Timeout_ns RX_BufFull TX_Lo
rtcan0 1 0x00000 infinite infinite 0 0
三、xenomi CAN通信测试
1. 加载驱动
加载rk3562 Xenomai 实时 CAN 驱动。
shell
root@RK3562-Tronlong:~# insmod xeno_rk3562_can.ko # 或modprobe xeno_rk3562_can
[ 50.654284] RTcan: RT-Socket-CAN 0.90.2 - (C) 2006 RT-Socket-CAN Development Team
[ 56.556506] RTcan: registered rtcan0
[ 56.556542] rtcan_rk3562_can ff600000.can: rtcan_rk3562 at 0x00000000bed74afe, irq 59, clock 297000000 Hz
[ 56.557054] RTcan: registered rtcan1
[ 56.557082] rtcan_rk3562_can ff610000.can: rtcan_rk3562 at 0x000000003fd4339b, irq 60, clock 297000000 Hz
[ 56.557634] pwm-backlight backlight: supply power not found, using dummy regulator
root@RK3562-Tronlong:~# lsmod
Module Size Used by
xeno_rk3562_can 24576 0
xeno_can 32768 1 xeno_rk3562_can
...
2. 查看can设备信息
shell
root@RK3562-Tronlong:~# cat /proc/rtcan/devices
Name___________ _Baudrate State___ TX_Counter RX_Counter ____Errors
rtcan0 undefined stopped 0 0 0
rtcan1 undefined stopped 0 0 0
此时系统中有2个rtcan设备。
3. 配置 CAN 接口
在实时 CAN 驱动加载后,可以使用 rtcanconfig
工具来配置比特率和模式。
root@RK3562-Tronlong:~# rtcanconfig rtcan0 --baudrate=500000 start
[ 158.098591] rtcan_rk3562_can_set_mode: state CAN_MODE_START
[ 158.098592] rtcan_rk3562_can_mode_start: state STOPPED
[ 158.098594] rtcan_rk3562_can_start MODE=0x00008001, INT_MASK=0x00000000
4. CAN 与 CAN 通信
创龙rk3562 EVM开发板有4路CAN,其中2路为RK3562控制器引出,另外2路通过spi CAN控制器扩展。
4.1 两路RTCAN之间通信
为测试RT CAN通信,可将rk3562两路RTCAN直连,进行收发测试
使用 rtcansend
通过rtcan0发送 CAN 事务。
root@somimx6-xenomai:~# rtcansend rtcan0 -v -i 0x0 0x82 0x1 0x55 0x77
interface rtcan0
s=3, ifr_name=rtcan0
<0x000> [4] 82 01 55 77
Cleaning up...
使用 rtcanrecv
通过rtcan1接收 CAN 事务。
root@somimx6-xenomai:~# rtcanrecv rtcan0 -v
interface rtcan0
s=3, ifr_name=rtcan0
4.2 RTCAN与SPI扩展CAN之间通信
也可将RTCAN与SPI CAN链接进行通信,SPI CAN使用Linux标准CAN 通信测试工具操作,在此不再赘述。

5. CAN RTT测试
将2路RTCAN直连,然后使用can_rtt测试,测试程序绑定到隔离核CPU3, 默认1ms周期一帧。

shell
root@RK3562-Tronlong:~#rtcanconfig rtcan0 --baudrate=750000 start
root@RK3562-Tronlong:~#rtcanconfig rtcan1 --baudrate=750000 start
root@RK3562-Tronlong:~# cat /proc/rtcan/devices
Name___________ _Baudrate State___ TX_Counter RX_Counter ____Errors
rtcan0 750000 active 0 0 0
rtcan1 750000 active 0 0 0
root@RK3562-Tronlong:~# /usr/xenomai/demo/can_rtt rtcan0 rtcan1 --cpu-affinity=3
1 3
RX rxsock=3, ifr_name=rtcan1
TX txsock=4, ifr_name=rtcan0
Round-Trip-Time test rtcan0 -> rtcan1 with CAN ID 0x1
Cycle time: 10000 us
All RTT timing figures are in us.
Messages RTTlast RTT_avg RTT_min RTT_max Overruns
100 167 167 165 173 0
200 170 168 164 173 0
300 166 168 164 174 0
400 174 169 164 183 0
500 168 169 164 183 0
600 166 168 164 183 0
700 169 168 164 183 0
800 166 168 164 183 0
900 170 169 164 183 0
1000 170 168 164 183 0
...
99600 166 168 164 191 0
99700 169 169 164 191 0
99800 171 168 164 191 0
99900 167 168 164 191 0
100000 167 168 164 191 0
100100 170 169 164 191 0
...
187500 172 169 164 191 0
187600 166 169 164 191 0
187700 166 169 164 191 0
187800 168 169 164 196 0
187900 168 171 164 196 0
188000 170 168 164 196 0


打印说明:
- Messages RTCAN收发消息数
- RTTlast 当前打印最后一次往返时间us
- RTT_avg 平均往返时间us
- RTT_min 最小往返时间us
- RTT_max 最大往返时间us
- Overruns 周期超时次数(发送耗时超过发送周期)
综上,波特率750000下,rk3562 rtcan收发往返抖动 191-164 = 27us(包括软硬件抖动)。
以下是周期300us的一些数据,仅供参考
shell
root@RK3562-Tronlong:~# /usr/xenomai/demo/can_rtt rtcan0 rtcan1 --cpu-affinity=3 -c 300
3 5
RX rxsock=3, ifr_name=rtcan1
TX txsock=4, ifr_name=rtcan0
Round-Trip-Time test rtcan0 -> rtcan1 with CAN ID 0x1
Cycle time: 300 us
All RTT timing figures are in us.
Messages RTTlast RTT_avg RTT_min RTT_max Overruns
3333 166 167 163 173 0
6666 167 167 163 173 0
9999 168 167 163 175 0
13332 165 167 163 175 0
16665 165 167 163 175 0
19998 164 167 163 175 0
...
11585508 165 167 161 188 0
11588841 165 167 161 188 0
11592174 168 168 161 188 0
11595507 168 168 161 188 0
11598840 168 168 161 188 0
11602173 169 168 161 188 0
四、RTCAN 编程接口
xeomai rtcan编程接口与普通Linux can编程无异,均为posix socket接口,简单总结如下。
- 头文件
shell
#include <rtdm/can.h>
- 核心函数接口
(1) 接收端:
- socket(PF_CAN, SOCK_RAW, CAN_RAW); //创建socket
- namecpy(ifr.ifr_name, "rtcan0"); //告诉驱动can接口的名字
- ret = ioctl(s, SIOCGIFINDEX, &ifr); //获取驱动的接口index
- setsockopt(s, SOL_CAN_RAW, CAN_RAW_ERR_FILTER, &err_mask, sizeof(err_mask)); //如果需要过滤设置过滤规则
- recv_addr.can_family = AF_CAN;
recv_addr.can_ifindex = ifr.ifr_ifindex; //设置CAN 地址族 - bind(s, (struct sockaddr *)&recv_addr, sizeof(struct sockaddr_can)); //绑定
- recvmsg(s, &msg, 0); //接收数据
(2) 发送端:
-
socket(PF_CAN, SOCK_RAW, CAN_RAW); //创建socket
-
ioctl(s, SIOCGIFINDEX, &ifr); //获取驱动接口index
-
namecpy(ifr.ifr_name, "rtcan0"); //告诉驱动接口名字
-
to_addr.can_family = AF_CAN; //设置CAN 地址族
to_addr.can_ifindex = ifr.ifr_ifindex;
-
setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, NULL, 0); //设置过滤规则
-
bind(s, (struct sockaddr *)&to_addr, sizeof(to_addr)); //绑定
-
send(s, (void *)&frame, sizeof(can_frame_t), 0); //发送数据
接口函数 | 功能描述 | 关键参数 / 注意事项 |
---|---|---|
socket(PF_CAN, SOCK_RAW, CAN_RAW) |
创建 RT-CAN 通信 socket(实时 socket,区别于 Linux 普通 socket) | - PF_CAN :CAN 协议族(固定值); - SOCK_RAW :原始套接字(直接操作 CAN 帧); - CAN_RAW :RAW 模式(支持标准 / 扩展 ID) |
ioctl(sock, SIOCGIFINDEX, &ifr) |
获取 CAN 网卡的接口索引(绑定 socket 需用索引,而非网卡名) | - SIOCGIFINDEX :IO 控制命令,用于获取网卡索引; - struct can_ifreq ifr :存储网卡名和索引,需先赋值ifr.ifr_name (如 "can0") |
setsockopt(sock, SOL_CAN_RAW, CAN_RAW_FILTER, ...) |
配置 CAN 接收过滤规则(仅接收指定 ID 的 CAN 帧) | - 接收端:需传入struct can_filter 数组(指定can_id 和can_mask ,如仅接收 ID=0x1 的帧); - 发送端:可传入NULL 禁用过滤(仅发送,不接收) |
bind(sock, (struct sockaddr*)&addr, sizeof(addr)) |
将 socket 绑定到指定 CAN 接口(通过接口索引关联) | - struct sockaddr_can addr :CAN 地址结构,需赋值addr.can_family=AF_CAN 和addr.can_ifindex (接口索引) |
send(sock, &frame, sizeof(struct can_frame), 0) |
发送 CAN 帧(实时发送,无阻塞) | - 需传入struct can_frame (CAN 帧结构,包含 ID、数据长度、数据); - 返回值:成功返回帧长度,失败返回 - 1(如EBADF 表示 socket 无效) |
recv(sock, &frame, sizeof(struct can_frame), 0) |
接收 CAN 帧(实时接收,无阻塞) | - 功能与send 对应,接收后frame 存储收到的 CAN 帧数据; - 返回值:同send ,失败返回 - 1 |
close(sock) |
关闭 RT-CAN socket,释放资源 | - 需在程序退出或线程终止时调用,避免资源泄漏;- 信号处理(如SIGINT )中需主动关闭 socket |
- 关键数据结构
数据结构 | 用途 | 核心成员 |
---|---|---|
struct can_frame |
表示一个完整的 CAN 帧(发送 / 接收的最小单位) | - can_id :CAN 标识符(标准 ID 11 位 / 扩展 ID 29 位,可带CAN_EFF_FLAG 等标志); - can_dlc :数据长度(0-8 字节,符合 CAN 2.0 标准); - data[8] :CAN 帧数据(最多 8 字节) |
struct can_ifreq |
用于 IO 控制(获取 CAN 接口索引) | - ifr_name[IFNAMSIZ] :CAN 网卡名(如 "can0"、"can1"); - ifr_ifindex :输出参数,存储获取到的接口索引 |
struct sockaddr_can |
CAN socket 的地址结构(绑定 socket 时使用) | - can_family :地址族,固定为AF_CAN ; - can_ifindex :CAN 接口索引(通过ioctl 获取); - (可选)can_addr :预留字段,通常无需赋值 |
struct can_filter |
CAN 接收过滤规则(筛选指定 ID 的帧) | - can_id :目标 CAN ID(如 0x1); - can_mask :掩码(如 0x3FF,仅匹配can_id 的有效位,0 表示不关心) |
五、CAN 常见问题排查
以下来及rk官方指南《Rockchip_Developer_Guide_Can_CN.pdf》。
1. 无法收发回环模式测试:
启动can后,io输入命令开启回环自测(基地址根据实际dts启动的can配置):
shell
io -4 0xff600000 0x8415
注:rk3562 CAN外设地址为CAN0 FF600000、CAN1 FF610000。
回环模式下,rtcansend后rtcanrec可以接收,说明控制器工作正常。这种状态下,只要检查:IOMUX是否正确;硬件连接是否正确;终端120欧姆电阻有没有接入;转换芯片是否正常。
2. 概率性不能收发
先确认比特率是否是精准的,在使用rtcanconfig
命令配置rtcan波特率时,可以看到rtcan当前的实际比特率以及配置信息。如果比特率偏差会造成收发异常,需要根据比特率调整输入时钟,以分到精准的比特率。

附:Linux CAN 通信测试工具 (非xenomai rtcan)
canutils是常用的CAN通信测试工具包,内含 5 个独立的程序:canconfig、candump、canecho、cansend、cansequence。这几个程序的功能简述如下:
canconfig
用于配置 CAN 总线接口的参数,主要是波特率和模式。
candump
从 CAN 总线接口接收数据并以十六进制形式打印到标准输出,也可以输出到指定文件。
canecho
把从 CAN 总线接口接收到的所有数据重新发送到 CAN 总线接口。
cansend
往指定的 CAN 总线接口发送指定的数据。
cansequence
往指定的 CAN 总线接口自动重复递增数字,也可以指定接收模式并校验检查接收的递增数字。
ip
CAN波特率、功能等配置。注意:busybox里也有集成了ip工具,但busybox里的是阉割版本。不支持CAN的操作。故使用前请先确定ip命令的版本(iproute2)。
-
查询当前网络设备
shellifconfig -a
-
CAN启动
关闭CAN:
shellip link set can0 down
设置比特率500KHz:
shellip link set can0 type can bitrate 500000
打印can0信息:
shellip -details -statistics link show can0
启动CAN:
shellip link set can0 up
-
CAN发送
发送(标准帧,数据帧,ID:123,date:DEADBEEF):
shellcansend can0 123#DEADBEEF
发送(标准帧,远程帧,ID:123):
shellcansend can0 123#R
发送(扩展帧,数据帧,ID:00000123,date:DEADBEEF):
shellcansend can0 00000123#12345678
发送(扩展帧,远程帧,ID:00000123):
shellcansend can0 00000123#R
-
CAN接收
开启打印,等待接收:
shellcandump can0
附:CAN 比特率和采样点计算
目前CAN架构根据输入频率和比特率自动计算。采样点的规则按照CIA标准协议:
c/*kernel/drivers/can/rtcan_raw_dev.c*/ /* Use CIA recommended sample points */ if (bitrate > 800000) sampl_pt = 750; else if (bitrate > 500000) sampl_pt = 800; else sampl_pt = 875;
比特率计算公式(详细原理可以百度,这里只介绍芯片配置相关):
shellBitRate = clk_can / (2 * (brq + 1) / ((tseg2 + 1) + (tseg1 + 1) + 1))
Sample = (1 + (tseg1 + 1)) / (1 + (tseg1 + 1) + (tseg2 + 1))
brq、tseg1、tseg2 见CAN的TRM中BITTIMING寄存器。
附:开源canopen协议栈
canfestival是一个成熟且知名的canopen协议栈,支持单片机,Windows,linux,xenomai,vxwroks等多个平台,详见官网 https://canfestival.org/code
参考文档
- https://www.cnblogs.com/wsg1100/p/12833126.html#12--查看实时核信息
- https://doc.xenomai.org/v3/html/man1/rtcanconfig/index.html
- https://doc.xenomai.org/v3/html/man1/rtcansend/index.html
- https://doc.xenomai.org/v3/html/man1/rtcanrecv/index.html
- 创龙tlrk3562-EVM《评估板测试手册 .pdf》
- rk官方指南《Rockchip_Developer_Guide_Can_CN.pdf》