CAN,全称为“Controller Area Network”,即控制器局域网,是国际上应用最广泛的现场总线之一。最初,CAN被设计作为汽车环境中的微控制器通讯,在车载各电子控制装置ECU之间交换信息,形成汽车电子控制网络。比如:发动机管理系统、变速箱控制器、仪表装备、电子主干系统中,均嵌入CAN控制装置。

i2C-MP15X-B底板的J28接线端子中已支持CAN信号。

i2C-MP15X-B底板位置丝印功能名称i2S-MP15X核心板位置i2S-MP15X核心板Pinout
J28.6C1HCAN1_TXJ2.101PB9
J28.7C1LCAN1_RXJ2.36PI9
J28.9C2HCAN2_TXJ1.51PB13
J28.10C2LCAN2_RXJ1.49PB12

CAN2的功能与UART5功能有复用的情况,由JP9来控制。默认JP9断开为UART5功能,连接闭合后为CAN2功能。操作步骤如下

  1. 断开开发板电源,用跳线冒短接JP9

  2. 连接电源后,启动系统时选择对应包含有dualcan字符的启动项

传统CAN

标准数据帧收发

在系统中可以看到有两个CAN设备,can0和can1。

root@i2cmp15xbe:~# ifconfig -a
can0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          UP RUNNING NOARP  MTU:16  Metric:1
          RX packets:2 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:10
          RX bytes:9 (9.0 B)  TX bytes:4 (4.0 B)
          Interrupt:40

can1      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          UP RUNNING NOARP  MTU:16  Metric:1
          RX packets:1 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:10
          RX bytes:4 (4.0 B)  TX bytes:9 (9.0 B)
          Interrupt:42

使用杜邦线将两个CAN接口的信号,C1H与C2H相连,C1L与C2L相连。
配置两个CAN设备波特率为50Kbps,can0作为接收端,can1作为发送端。
配置can0,并使用candump命令在后台等待接收数据。

# ip link set can0 up type can bitrate 50000
# ifconfig can0 up
# candump can0 &

配置can1,并使用cansend命令发送CAN帧数据,ID为100,数据域为"01 02 03 04 05 06 07 08"。

# ip link set can1 up type can bitrate 50000
# ifconfig can1 up
# cansend can1 100#01.02.03.04.05.06.07.08

此时,当前串口上会显示如下信息,表示can0接收到了CAN帧数据。

can0  100   [8]  01 02 03 04 05 06 07 08

扩展数据帧收发

cansend can0 800#11.22.33.44.55.66.77.88 -e

远程帧收发

cansend can0 123#R7

CAN FD

配置启用CAN FD功能

将can0设备设置为500 kBit/s的仲裁比特率和4 MBit/s的数据比特率(对于具有比特率切换标志的帧):

root@pangu:~# ip link set can0 up type can bitrate 500000 dbitrate 4000000 fd on
[ 4098.096671] m_can 4400e000.can can0: bitrate error 0.3%
[ 4098.100573] m_can 4400e000.can can0: bitrate error 2.3%
[ 4098.112647] IPv6: ADDRCONF(NETDEV_CHANGE): can0: link becomes ready
root@pangu:~# ifconfig can0 up

发送标准数据帧
使用cansend命令对于CAN FD的数据帧的发送,命令参数如下

cansend <can_id>##<flags>{data}

参数说明

  • <can_id>表示CAN帧的ID

  • <flags>有两个参数- 0x1 : BRS(bit rate switch)

    • 0x2: error state indicator of the transmitting node

  • {data}表示数据域

 

下面是CAN FD来发送标准数据帧

# cansend can0 100##001.02.03.04.05.06.07.08.09.0a.0b.0c.0d.0e

下面是CAN FD来发送标准数据帧,并设置了flags选项

# cansend can0 123##311.22.33.44.55.66.77.88.99.aa.bb.cc.dd.ee.ff

接收数据帧

# candump -ta -x can1
 (1563261885.419733)  can1  RX B -  123  [16]  11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF 00

一个CAN-FD帧的数据域中可能存在的字节数量为1-8, 12, 16, 20, 24, 32, 48 ,64。所以,上面数据域超过12byte,但未超过16byte,所以接收到是16byte,末尾是0x00字节。

作者:SteveChen  创建时间:2024-09-18 16:33
最后编辑:SteveChen  更新时间:2024-09-18 16:34
上一篇:
下一篇: