canopen 初体验
设置主站can0
$ sudo ip link set can0 type can restart-ms 100
$ sudo ip link set can0 type can bitrate 500000 sample-point 0.875
$ sudo ip link set can0 type can berr-reporting on
$ sudo ifconfig can0 txqueuelen 1000
$ sudo tc qdisc add dev can0 root handle 1: pfifo
$ sudo ifconfig can0 up
设置 CAN 接口的自动重启时间(100 毫秒)
$ sudo ip link set can0 type can restart-ms 100
-
作用:设置 CAN 接口在总线关闭(bus-off)状态后,自动恢复的时间间隔。
-
restart-ms 100:表示 100 毫秒后自动尝试恢复通信。
-
适用场景:适用于 CAN 总线短暂异常时自动恢复,避免程序中断。
设置 CAN 接口的比特率和采样点
$ sudo ip link set can0 type can bitrate 500000 sample-point 0.875
-
作用:配置 CAN 总线的通信速率和采样点。
-
bitrate 500000:比特率为 500 kbit/s(CAN 总线通信速度)。
-
sample-point 0.875:采样点为总位时间的 87.5%,用于确定在位时间的哪个点采样信号。
-
注意:这两个参数必须与总线上的其他节点一致,否则无法通信。
启用错误报告功能
$ sudo ip link set can0 type can berr-reporting on
-
作用:启用 CAN 控制器的错误计数器报告功能。
-
用途:可以监控 CAN 总线上的通信错误(如错误帧数量),用于调试通信问题。
设置 CAN 接口的发送队列长度
$ sudo ifconfig can0 txqueuelen 1000
-
作用:设置 CAN 接口发送队列的长度为 1000 个数据包。
-
默认值通常为 10,增大该值可提升高负载下数据包不丢包的能力。
-
适用场景:适用于高频率 CAN 通信时防止发送缓冲区溢出。
添加排队规则(qdisc)为优先 FIFO 队列
$ sudo tc qdisc add dev can0 root handle 1: pfifo
-
作用:为 CAN 接口添加一个 优先级 FIFO(先进先出)排队规则。
-
pfifo:表示使用优先级队列的 FIFO 队列规则。
-
用途:用于控制 CAN 数据包的发送顺序,适用于实时性要求高的系统。
启动 CAN 接口
$ sudo ifconfig can0 up
- 作用:启动 can0 接口,使其进入工作状态。
candump调试can0
$ sudo candump can0
can0 701 [1] 7F
can0 701 [1] 7F
can0 701 [1] 7F
can0 701 [1] 7F
can0 701 [1] 7F
can0 701 [1] 7F
can0 701 [1] 7F
这是一个 CANopen 心跳(Heartbeat)帧。
逐项解析:
- can0: 接口
- 701: 11 位标准标识符 0x701 = 0x700 + 0x01
基址 0x700 表示功能码 0xE (NMT Error Control: Heartbeat / Node Guarding)
节点 ID = 0x701 & 0x7F = 0x01 - [1]: 数据长度 1 字节 (Heartbeat 固定 1 字节)
- 数据 7F: 表示该节点当前 NMT 状态
0x00 = Boot-up (只发一次)
0x04 = Stopped
0x05 = Operational
0x7F = Pre-operational ← 当前值
结论: 节点 1 处于 Pre-operational 状态,并按其对象 0x1017(Producer Heartbeat Time) 周期发送心跳。
CANFestival
如下日志为CANFestival的输出,GCIO是读取DI的信息。
$ sudo ./master can0
Starting on can0 with node id = 100to node : 0
Send_NMT cs :: 129
Master starting on can0
Node 1 state is now : Pre_operationalto node : 1
Send_NMT cs :: 1
Node 1 state is now : Operational
GCIO: 0x1
GCIO: 0x1
GCIO: 0x1
GCIO: 0x1
GCIO: 0x0
GCIO: 0x0
GCIO: 0x0
GCIO: 0x0
GCIO: 0x1