跳转至

CAN

CAN (Controller Area Network) 总线,即控制器局域网总线,是一种有效分布式控制或实时控制的串行通信网络。

Rockchip 平台拓展引脚 CAN 信息如下:

Warning

Rockchip 拓展引脚上的 CAN 为芯片原生接口,使用时需外接 CAN 收发器模块。

主板 SOC 拓展引脚 CAN 收发器
K1 RK3568 CAN X2 N
K1B RK3568 N N
K1Mini RK3568 CAN X2 N
K3 RK3562 N N
K3B RK3562 N N
K7 RK3576 CAN X1 N
K7C RK3576 CAN X1 N
K7S/F RK3576 N N
K8 RK3588 CAN X1 N
K8D RK3588S2 CAN X1 N
K11C RK3566 N N

AllWinner 平台拓展引脚 CAN 信息如下:

主板 SOC 拓展引脚 CAN 收发器
K2B H618 N N
K2C H618 N N
K4B T113 N N
K5C A133 N N
K9 T527 CAN X2 Y
K10B A733 N N

DTS 节点配置

Rockchip

下面为 Rockchip 平台 CAN 设备 0 节点配置示例:

&can0 {
      pinctrl-names = "default";
      pinctrl-0 = <&can0m2_pins>;
      status = "okay";
};

Allwinner

Note

在 AllWinner T527 平台的设备树源文件(DTS)中,CAN设备对应的节点名称定义为“awlink”。需注意的是,“awlink”仅为该CAN设备节点的命名标识,其实际功能、硬件属性与CAN设备完全一致,二者本质为同一设备,仅存在称呼上的差异,无功能区别。

下面为 T527 平台 CAN_0 设备节点配置示例:

awlink0: awlink@0x0{
          #address-cells = <1>;
          #size-cells = <0>;
          compatible = "allwinner,t527-awlink";
          device_type = "awlink0";
          awlink-pin = <1>;
          id = <0>;
          status = "okay";
};

下面为 T527 平台 CAN_1 设备节点配置示例:

awlink1: awlink@0x1{
          #address-cells = <1>;
          #size-cells = <0>;
          compatible = "allwinner,t527-awlink";
          device_type = "awlink1";
          awlink-pin = <0>;
          id = <1>;
          status = "okay";
};

驱动文件

RK3568/RK3588 平台 CAN 总线驱动路径如下:

drivers/net/can/rockchip/rockchip_canfd.c

RK3562 平台 CAN 总线驱动路径如下:

drivers/net/can/rockchip/rk3562_canfd.c

RK3576 平台 CAN 总线驱动路径如下:

drivers/net/can/rockchip/rk3576_canfd.c

AllWinner T527 平台 CAN 总线驱动路径如下:

// Android
longan/bsp/drivers/awlink/sunxi_awlink.c
// Debian 11
bsp/drivers/awlink/sunxi_awlink.c

查询当前 CAN 设备

查询当前网络设备:

ifconfig -a

Rockchip 平台操作示例

console$ ifconfig -a
...
can0      Link encap:UNSPEC    Driver rk3576_canfd
          NOARP  MTU:16  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 
          collisions:0 txqueuelen:10 
          RX bytes:0 TX bytes:0 
          Interrupt:63 
...

Allwinner 平台操作示例

console$ ifconfig -a
...
awlink0: flags=128<NOARP>  mtu 16
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 10  (UNSPEC)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 27

awlink1: flags=128<NOARP>  mtu 16
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 10  (UNSPEC)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 28 
...

CAN 配置

Rockchip

关闭 CAN:

ip link set can0 down

设置 can0 为 500Kbps 的比特率,并关闭 CAN FD 模式:

ip link set can0 type can bitrate 500000 fd off

设置 can0 仲裁段 1M 波特率,数据段 3M 波特率,启动 CAN FD 模式:

ip link set can0 type can bitrate 1000000 dbitrate 3000000 fd on

查看 can0 配置信息:

ip -details link show can0

启动 CAN:

ip link set can0 up

Allwinner

Tip

下文将以 CAN_0 节点为例进行说明,该节点对应DTS文件中的 awlink0 节点(即 CAN_0 节点的设备树命名为 awlink0 )。

关闭 CAN:

ip link set awlink0 down

设置awlink0异常时10ms重启:

ip link set awlink0 type can restart-ms 10

设置awlink0的比特率为1 Mbps/s,且开启回环:

ip link set awlink0 type can bitrate 1000000 loopback on

设置队列深度:

ip link set awlink0 qlen 300

查看 can0 配置信息:

ip -d -s link show awlink0

启动 CAN:

ip link set awlink0 up

CAN 发送

以节点 can0 为例:

发送(标准帧,数据帧,ID:123,date:DEADBEEF):

cansend can0 123#DEADBEEF

发送(标准帧,远程帧,ID:123):

cansend can0 123#R

发送(扩展帧,数据帧,ID:00000123,date:DEADBEEF):

cansend can0 00000123#12345678

发送(扩展帧,远程帧,ID:00000123):

cansend can0 00000123#R

CAN 接收

以节点 can0 为例:

开启打印,等待接收:

candump can0