CAN功能
CAN,全称为“Controller Area Network”,即控制器局域网,是国际上应用最广泛的现场总线之一。最初,CAN被设计作为汽车环境中的微控制器通讯,在车载各电子控制装置ECU之间交换信息,形成汽车电子控制网络。比如:发动机管理系统、变速箱控制器、仪表装备、电子主干系统中,均嵌入CAN控制装置。
i2C-MP15X-B底板的J28接线端子中已支持CAN信号。
i2C-MP15X-B底板位置 | 丝印 | 功能名称 | i2S-MP15X核心板位置 | i2S-MP15X核心板Pinout |
J28.6 | C1H | CAN1_TX | J2.101 | PB9 |
J28.7 | C1L | CAN1_RX | J2.36 | PI9 |
J28.9 | C2H | CAN2_TX | J1.51 | PB13 |
J28.10 | C2L | CAN2_RX | J1.49 | PB12 |
CAN2的功能与UART5功能有复用的情况,由JP9来控制。默认JP9断开为UART5功能,连接闭合后为CAN2功能。操作步骤如下
断开开发板电源,用跳线冒短接JP9
连接电源后,启动系统时选择对应包含有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:34