基于Linux平台的CAN-FD技术探索

2019-09-10 07:22彭国文陈剑栋张林
现代信息科技 2019年16期
关键词:总线

彭国文 陈剑栋 张林

摘  要:CAN-FD是由Bosch主导开发的新一代总线技术,它在传统的CAN2.0的基础上提高了总线网络通信带宽和数据吞吐量,将广泛用于替代传统的CAN2.0总线网络。目前越来越多运行Linux操作系统的ARM处理器配置了CANFD控制器,因此对Linux平台的CAN-FD技术进行探索至关重要。本文将从CAN-FD技术与传统CAN2.0的总线的异同出发,介绍Linux平台下CANFD技术的配置细节,及SocketCAN编程接口。

关键词:总线;CAN-FD;Linux;SocketCAN

中图分类号:TP393;TP273      文献标识码:A 文章编号:2096-4706(2019)16-0059-03

Abstract:CAN-FD is a new generation bus technology led by Bosch,which improves the communication bandwidth and data throughput of the bus network on the basis of the traditional CAN2.0,and will be widely used to replace the traditional CAN2.0 bus network. At present,more and more ARM processors running Linux operating system are equipped with CAN-FD controller,so it is very important to explore the CANFD technology of Linux platform. This paper will start from the similarities and differences between CAN-FD technology and traditional CAN2.0 bus,introduce the configuration details of CAN-FD technology under Linux platform,and SocketCAN programming interface.

Keywords:bus;CAN-FD;Linux;SocketCAN

0  引  言

隨着当今工业的发展,尤其是在CAN总线运用较多的汽车领域,总线通讯的数据量越来越大,但由于传统CAN总线最高传输速度为1Mbit/s,这就使得CAN总线在传输速率和带宽方面越来越力不从心。为了满足日益增长的高带宽需求,CAN-FD应运而生。CAN-FD(CAN with Flexible Data-Rate)继承了CAN总线的主要特征,提高了CAN总线得到网络通信带宽,改善了错误帧漏检率,同时可以保持网络系统大部分软硬件,特别是物理层不变。目前越来越多高端处理器携带CAN-FD控制器,Linux作为广泛使用的操作系统,对新出现的高端处理器有很好的平台支持。Linux自3.6版本内核起引入了对CAN-FD的支持,这为拥有CAN-FD接口的新设备研发带来很大的便利。本文将先介绍CAN-FD技术,通过与传统的CAN2.0进行对比,可以清晰地了解CAN-FD的技术优势,接着介绍Linux平台的CAN-FD总线配置细节、测试工具及应用程序开发流程。

1  CAN-FD技术简介

CAN-FD是由Bosch公司于2012年发布的新一代总线技术,CAN-FD继承了传统CAN总线的绝大多数特性,如同样的物理层、双线串行通讯协议、分布式实时控制、可靠的错误处理和检测机制等。2015年6月30日,国际标准化组织(ISO)已经正式认可CAN-FD技术,并通过了ISO 11898-1作为CAN-FD的国际标准草案。与传统的CAN相比,CAN-FD主要升级了以下几方面。

1.1  更高的传输波特率

CAN-FD支持数据段选择高波特率进行传输。它可将原CAN总线控制场中的BRS位(位速率转换开关)到ACK场(总线确认场)之前(含CRC,即循环冗余校验分界符,主要包含数据段部分)的位采用最高达5M的可变速率传输,其余的仲裁段部分保留为原CAN总线速率。这两种速率各有一套位时间定义寄存器,使用时须配置仲裁段波特率及数据段波特率。

1.2  更高效的数据段

传统CAN2.0总线仅支持DLC(数据场长度)最大为8个字节的数据场,而CAN-FD对数据场的长度做了很大的扩充,DLC最大支持64个字节,在DLC小于等于8字节时与原CAN2.0总线是一样的,大于8字节时则有一个非线性的增长。CAN-FD可支持的DLC有:0~8、12、16、24、32、48、64。

1.3  更可靠的CRC校验

在传统的CAN2.0总线中,由于填充规则对CRC产生干扰,造成错帧漏检率未达到设计意图。CAN-FD对CRC算法做了升级,将填充位加入多项式的运算,主要作为格式检查。考虑数据长度变化区间很大,CRC也会根据区间生成两种校验算法,当帧长小于210位时,使用CRC_17位算法,当帧长大于210位、小于1023位时,使用CRC_21位算法。

2  Linux系统CAN-FD操作

Linux系统自3.6版本后引入CAN-FD的支持,用户可以通过uname -r命令查看当前内核版本以确定是否已支持CAN-FD。

2.1  接口配置

与传统CAN接口配置类似,Linux系统中CAN-FD同样采用ip命令对接口进行配置,ip命令在传统CAN接口的基础上为CAN-FD接口增加了多个选项,常见选项及含义说明如表1所示。

以下示例用于设置CAN-FD控制器采用500K仲裁波特率和4M的数据波特率:

$ ip link set can0 up type can bitrate 500000 sample-point 0.75dbitrate4000000 dsample-point 0.8 fd on

设置后可通过以下命令查看控制器的状态:

$ ip-details link show can0

输出状态中包含了控制器状态、仲裁段波特率、数据段波特率及各类错误计数。

2.2  CAN-FD测试工具包

can-utils是Linux Socket CAN子系统提供的一个用户层工具包,它由多个实用程序组成,为CAN/CAN-FD网络的测试提供便利,can-utils常用测试程序如表2所示。

candump命令可以用来接收、过滤CAN、CAN-FD报文,输出方式可以选择输出到标准输出或文件。candump的默认方式为输出到标准输出,如果candump启动时携带-l参数,数据将以文件方式保存至当前目录,文件名格式为candump-YYYY-MM-DD_HHMMSS.log。以下命令演示了接收can0的数据并保存至文件的使用方法:

candump -l can0

cansend命令用于发送单帧CAN/CAN-FD报文,该命令对发送CAN帧、CAN-FD帧、远程帧有不同的格式要求,以下命令演示发送各种类型数据帧。

cansend can0 00F#00.11.22.33       # 发送标准帧,帧ID为3个16进制字符

cansend can0 001234EF#00.11.22.33.44.55.66.77       # 发送扩展帧,帧ID为8个16进制字符

cansend can0 00F#R3            # 发送标准远程帧,数据为3个字节

cansend can0 00F##0.00.11.22.33.44.55.66    # 发送CAN-FD标准帧,#后0为CAN-FD标识位

cansend can0 00F##0.00.11.22.33.44.55.66.77.88.99.AA.BB   #发送CAN-FD数据帧,数据段位12个字节。

canplayer用于回放一个数据文件,数据文件一般由candump生成,canplayer程序运行时会根据数据文件的接口设备、帧数据、间隔进行数据发送,通过以下命令演示canplayer的使用方法:

canplayer -I candump-2018-12-16_034811.log

cangen命令是CAN/CAN-FD总线流量测试工具,它可以设置发送间隔、数据帧ID增长规则、数据增长等参数,实现对总线流量多维测试的目的。以下命令演示cangen各種参数的用法:

cangen can0 -v -v       #默认间隔,发送随机标准帧

cangen can0 -g 4 -I 42A -L 1 -D i -v -v    #间隔为4ms,发送帧42A,长度为1,数据递增

cangen can0 -g 0 -i -x       #总线满载,并忽略写-ENOBUFS错误。

3  Linux系统CAN-FD编程

Linux内核在2.6.xx版本引入SocketCAN子系统,由于当时CAN-FD还未正式发布,初期版本的SocketCAN子系统只支持传统CAN控制器,在后续的3.6版本内核中,SocketCAN子系统在原来的基础上加入了CAN-FD的支持。初期版本SocketCAN中使用struct can_frame结构体来表示传统CAN帧,而由于CAN-FD的数据段长度最多可支持64个字节,传统的CAN帧结构体struct can_frame已不再适合CAN-FD的使用。因此在新版本SocketCAN中为CAN-FD帧建立的新的结构体struct canfd_frame。

SocketCAN接口编程跟传统网络Socket编程很类似,需要先建立套接字,然后根据接口名称构建接口地址并进行绑定,完成套接字建立后,应用程序可以通过使用带SIOCGIFMTU参数的ioctl的系统调用查询该控制器支持的最大MTU值来确定控制器CAN-FD发送接收能力,如果最大MTU值为CANFD_MTU,表示当前控制器具备CAN-FD功能,否则只为传统CAN控制器。

套接字完成bind操作后,即可进行读写操作。在CAN- FD模式下进行读操作时,控制器既可以接收传统CAN帧,也可以接收CAN-FD帧,这需要读操作在返回数据时进行判断,如果读出的字节数等于CANFD_MTU,表示当前读取帧为CAN-FD帧,如果读出的字节数不等于CAN_MTU,表示当前读取的帧为传统CAN帧。发送操作则根据写入长度来判断操作帧为传统CAN帧还是CAN-FD帧,当写入长度为CANFD_MTU时,表示写入帧为CAN-FD帧,否则为传统CAN帧。CAN-FD的SocketCAN编程流程如图1所示。

4  结  论

CAN-FD技术是传统CAN2.0总线的最新升级,它能在保持物理层不变的情况下,极大地提高总线带宽,保证数据的实时性。本文针对CAN-FD新技术在Linux平台下如何进行配置和测试进行介绍,并着重介绍了CAN-FD应用开发的流程。

参考文献:

[1] 周立功.项目驱动——CAN-bus现场总线基础教程 [M].北京:北京航空航天大学出版社,2012.

[2] 周立功.嵌入式Linux开发教程(上册) [M].北京:北京航空航天大学出版社,2016.

[3] 周立功.嵌入式Linux开发教程(下册) [M].北京:北京航空航天大学出版社,2016.

作者简介:彭国文(1986-),男,汉族,广东兴宁人,软件工程师,工学学士,研究方向:工业通讯。

猜你喜欢
总线
关于CAN总线的地铁屏蔽门控制思路论述
Q&A热线
PCI9030及其PCI总线接口电路设计