TX2/Linux下can总线的接收与发送详解!

时间:2024-03-19 15:38:58

Canbus on TX2/Linux

后续dbc载入并实现收发源代码及测试可看这篇文章:https://blog.csdn.net/hhlenergystory/article/details/81976696

TX2具有两个can设备,分别为can0和can1。这两个can设备自带can控制器和收发器,其原理图如下。

TX2/Linux下can总线的接收与发送详解!

每个can设备都有rx和tx,其发送和接收都是ttl电平,即数字信号,而不是can_h和can_l的模拟信号。想将这两个设备相连进行收发,必须分别外接两个can收发器,转换成差分信号后进行传输,如图

TX2/Linux下can总线的接收与发送详解!

如果将rx接tx这样相连并不能成功传送,会导致can设备由于错误过多而进入can-off状态TX2/Linux下can总线的接收与发送详解!

为了对can设备进行软件上的测试,可以将其设置成回环模式,进入回环模式的残设备会将发送的数据直接放入接收的buffer中,直接对软件进行测试。

  1. 加载can设备驱动

modprobe can

modprobe can_raw

modprobe mttcan

  1. 设置can设备属性

设置波特率

ip link set can0 type can bitrate 500000 dbitrate 2000000 berr-reporting on fd on
ip link set can1 type can bitrate 500000 dbitrate 2000000 berr-reporting on fd on

设置成回环模式

ip link set can0 type can loopback on

ip link set can1 type can loopback on

开启can设备

ip link set up can0
ip link set up can1

  1.  

安装第三方开源app can-utils测试canbus

sudo apt-get install can-utils

  1.  

使用应用程序进行测试

发送程序:

cansend <can_interface> <can_frame>

e.g. cansend can0 123#abcdabcd

接收程序:

candump can_interface

e.g. candump can1

检测canbus的状态:

ip -details -statistics link show can0

ip -details -statistics link show can1

收发实际测试

  1. 载入can设备驱动,设置can设备并启用

modprobe can

modprobe can_raw

modprobe mttcan

ip link set can0 type can bitrate 500000 dbitrate 2000000 berr-reporting on fd on

ip link set can1 type can bitrate 500000 dbitrate 2000000 berr-reporting on fd on

ip link set up can0

ip link set up can1

可以在命令行中手动输入,也可以将这些代码写成脚本一键运行,或是在Linux开机启动脚本中加入以上代码使其开机载入驱动模块。

TX2/Linux下can总线的接收与发送详解!

完成后命令行输入ifconfig,可以看到can0和can1设备,说明设备已经启用

TX2/Linux下can总线的接收与发送详解!

 

  1. 对TX2平台的can设备进行连线,将can0和can1组成网络,进行收发测试

Tx2的can设备与网络连线如下图所示,TX2的两个can设备引出的引脚为rx和tx为数字信号,需要外接can收发器之后才能将其接入网络

TX2/Linux下can总线的接收与发送详解!

TX2can外设原理图如图下所示,将这两个设备加入网络只需连接rx和tx口,CAN_WAKE、CAN0_STBY和CAN1_STBY暂时不需要连接。同时TX2自带5伏VDD输出,可以给CAN收发器进行供电。

 

TX2/Linux下can总线的接收与发送详解!

 

具体连线图如下所示,至此两个CAN设备已组成网络,系统中的can设备驱动也已载入并启用,接下来使用开源软件can-utils对其进行测试。

TX2/Linux下can总线的接收与发送详解!

 

  1. 下载开源程序can-utils以对后续can总线进行测试(Linux必须联网)

命令行输入:

sudo apt-get install can-utils

输入后系统会自动进行下载和安装。

  1. 使用can-utils命令对can设备进行测试

首先先打开两个终端,一个进行can0设备的发送,一个进行can1设备的接收。

TX2/Linux下can总线的接收与发送详解!

在一个终端中命令行输入candump can1,意义是can1设备开始进行接收,进程为阻塞型,can1设备将一直会接收发来的can消息直到用户终止。

 

TX2/Linux下can总线的接收与发送详解!

 

在另一个终端中进行数据发送,使用cansend命令,其格式为

cansend <设备号> <要发送的消息>

    对于发送的消息can-utils对其进行了格式定义,只能以16进制发送,一次发送的内容为8字节,如下:

   123#1122334455667788    

发送一个标准数据帧,标识ID为123内容为0x1122334455667788

12345678#aabbccdd

发送一个扩展帧,标识ID为12345678,内容为0xaabbccdd

123#R7

发送一个远程帧,长度为7

在另一个终端中命令行输入cansend can0 123#1122334455667788

意义为:使用can0外设进行发送一个标准数据帧,标识符为123,内容为0x1122334455667788,在另一个终端中可以看到收到的的消息:

TX2/Linux下can总线的接收与发送详解!

后续通过can总线的编程模型实现dbc载入,和收发,canoe测试的具体实现以及源代码文章: