Canbus on TX2/Linux
后续dbc载入并实现收发源代码及测试可看这篇文章:https://blog.csdn.net/hhlenergystory/article/details/81976696
TX2具有两个can设备,分别为can0和can1。这两个can设备自带can控制器和收发器,其原理图如下。
每个can设备都有rx和tx,其发送和接收都是ttl电平,即数字信号,而不是can_h和can_l的模拟信号。想将这两个设备相连进行收发,必须分别外接两个can收发器,转换成差分信号后进行传输,如图
如果将rx接tx这样相连并不能成功传送,会导致can设备由于错误过多而进入can-off状态
为了对can设备进行软件上的测试,可以将其设置成回环模式,进入回环模式的残设备会将发送的数据直接放入接收的buffer中,直接对软件进行测试。
- 加载can设备驱动
modprobe can
modprobe can_raw
modprobe mttcan
- 设置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
安装第三方开源app can-utils测试canbus
sudo apt-get install can-utils
使用应用程序进行测试
发送程序:
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
收发实际测试
- 载入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开机启动脚本中加入以上代码使其开机载入驱动模块。
完成后命令行输入ifconfig,可以看到can0和can1设备,说明设备已经启用
- 对TX2平台的can设备进行连线,将can0和can1组成网络,进行收发测试
Tx2的can设备与网络连线如下图所示,TX2的两个can设备引出的引脚为rx和tx为数字信号,需要外接can收发器之后才能将其接入网络
TX2can外设原理图如图下所示,将这两个设备加入网络只需连接rx和tx口,CAN_WAKE、CAN0_STBY和CAN1_STBY暂时不需要连接。同时TX2自带5伏VDD输出,可以给CAN收发器进行供电。
具体连线图如下所示,至此两个CAN设备已组成网络,系统中的can设备驱动也已载入并启用,接下来使用开源软件can-utils对其进行测试。
- 下载开源程序can-utils以对后续can总线进行测试(Linux必须联网)
命令行输入:
sudo apt-get install can-utils
输入后系统会自动进行下载和安装。
- 使用can-utils命令对can设备进行测试
首先先打开两个终端,一个进行can0设备的发送,一个进行can1设备的接收。
在一个终端中命令行输入candump can1,意义是can1设备开始进行接收,进程为阻塞型,can1设备将一直会接收发来的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,在另一个终端中可以看到收到的的消息:
后续通过can总线的编程模型实现dbc载入,和收发,canoe测试的具体实现以及源代码文章: