1、长春理工大学学报(自然科学版)Journal of Changchun University of Science and Technology(Natural Science Edition)Vol.46No.2Apr.2023第46卷第2期2023年4月收稿日期:2022-09-25基金项目:吉林省科技发展计划项目(20200602055ZP)作者简介:吴同晔(1998-),男,硕士研究生,E-mail:通讯作者:刘石(1986-),男,博士,副研究员,博士生导师,E-mail:吴同晔,等:CAN总线报文接收准确率的优化设计CAN 总线报文接收准确率的优化设计吴同晔,刘石,冯进良,黄伟(长
2、春理工大学光电工程学院,长春130022)摘要:在 CAN 总线中,由于其多个主线同时工作的特点导致一个节点发出报文后可以被多个节点或全部节点接收,因此系统会进行多次播报以及错误播报,这会增加接收报文的错误率,产生很多不必要的资源浪费。在基于 FPGA 通信系统的基础上设计了一个报文接收模块,来提高报文被多个节点接收的准确率。对 10 000 组数据进行通信仿真测试,结果表明相较一般的 CAN 总线,设计的模块将 CAN 总线报文接收准确率从 90%提高到了 99%,多次播报率则降低了 92.89%,错误播报率降低了 87.36%,验证了模块的可行性。关键词:CAN 总线;FPGA;报文接收模
3、块;准确率中图分类号:TH74文献标志码:A文章编号:1672-9870(2023)02-0114-06Research and Design ofCAN Bus Message Receiving about FPGAWU Tongye,LIU Shi,FENG Jinliang,HUANG Wei(School of Opto-Electronic Engineering,Changchun University of Science and Technology,Changchun 130022)Abstract:In CAN bus,because of the characteris
4、tics of multiple mainlines working at the same time,a message sent by anode can be received by multiple nodes or all nodes.Therefore,the system will broadcast many times and error broadcasts,which will improve the error rate of received messages and produce a lot of unnecessary waste of resources.Th
5、is paper de-signs a message receiving module based on FPGA communication system to reduce the error rate of messages received bymultiple nodes.The communication test of 10 000 sets of data shows that,compared with the general CAN bus,the mod-ule designed in this paper improves the CAN bus message re
6、ceiving accuracy from 90%to 99%,reduces the multiplebroadcast rate by 92.89%,and reduces the error broadcast rate by 87.36%,the feasibility of the module is verified.Key words:CAN bus;FPGA;message receiving module;accuracy rate现场总线是由电气行业发展而来的一种数据总线,目前常用的汽车总线技术主要有FlexRay、MOST、CAN 和 LIN,而 其 中 CAN(Cont
7、roller AreaNetwork)总线更是应用十分广泛。CAN 总线作为唯一一个被 ISO(国际标准化)组织认证的总线,有多主方式同时操作、取消了对节点地址和通信模块的编码等优秀性能。但 CAN 总线同样包 含 着 许 多 缺 点,如 传 统 CAN 总 线 以 单 片 机STM32 为主,但 STM32 已经满足不了现在高速率通信、高稳定性的需求1,并且由于取消了对节点地址和通信模块的编码,导致 CAN 总线在发出报文后可能会被多个节点甚至全部节点接收,造成多次播报或错误播报,增加了接收报文的错误率。因此迫切需要一种高速率通信、高稳定性、提高报文接收准确率的新型的 CAN 总线。近年来,
8、越来越多的学者投入到研究新型CAN 总线的设计中。例如,时旭等人2提出了一种基于 FPGA 的 CAN 总线通信系统的设计,将FPGA 芯片替换掉传统的单片机 STM32 芯片,提升了通信速度和稳定性,但未提出提高报文接收准确率的方法,并且占用 FPGA 内部资源过多;纪振平等人3提出一种新型的基于 FPGA 的CAN 总线控制器设计,将传统 CAN 总线中的组合逻辑设计改为时序逻辑设计,减少了 FPGA 内部资源的占用,但仍未提出如何解决 CAN 总线报文接收错误率过高的问题。针对报文接收错误率高这一问题,本文设计了一个报文接收模块,可以更准确、更有效率地传输数据。当一个节点发送报文时,首先
9、被 CAN总线接收,然后写入缓存区中。当状态寄存器检查完毕、缓存区释放时4,按照指令向缓存区读取报文。如果发送报文的节点需要指定节点进行接收,则报文接收模块不工作;如果发送报文的节点向任意节点发送报文时,报文接收模块会任选三个节点,当这三个节点其中的任意一个接收到发出的报文,那么报文接收模块中的D触发器就会向状态寄存器发送已接收信号,使状态寄存器 ALE 的状态锁存,缓存区关闭,之后不会再向其他节点发送已被接收的报文;反之如果三个节点没有接收,就向状态寄存器发送未接收信号,缓存区继续处于释放状态,重新选择三个节点接收报文,直到此报文被接收。与传统的 CAN 总线接收报文相比,本设计具有准确率更
10、高、减少重复接收报文的次数、减少资源浪费、专用性与集成度更高等特点。1报文发送和接收模块的原理1.1报文种类以及仲裁机制CAN 总线之所以应用如此广泛,最大特点之一就是取消了对通信模块和节点地址进行编码,因此 CAN 总线的节点可以有无数个,这也让CAN 总线拥有非常高的灵活性以及可操作性5。CAN 总线以报文的形式进行数据传输,这些报文通常定义为具有特定格式的数据流,他们的格式可以不相同6,但是有一定的限制。CAN 总线的报文传输种类有:过载帧、错误帧、远程帧、帧间隔以及数据帧。其中数据帧是最常见的报文种类。(1)数据帧:用于发送节点向接收节点传送数据的帧。(2)远程帧:用于发送节点向具有相
11、同 ID 的接收节点发送数据的帧。(3)错误帧:用于当检测出错误时向其他节点通知错误的帧。(4)过载帧:用于通知尚未做好接收数据准备的帧。(5)帧间隔:用于将数据帧及远程帧与之前传输的数据分隔开的帧。图 1 为最常见的数据帧内部结构。图 1最常见的数据帧内部结构如果总线处于闲置状态7,那么系统内多个节点的发送和接收工作就可以正常进行。但如果总线上的多个节点同时发送报文,则优先级标识符较高的报文单元可以首先发送报文。在CAN 总线的报文当中,二进制数值的高低决定了标识符传送的优先级,数值越小,则优先级越高。在解决总线上数据发送冲突问题时,采取的是非破坏性仲裁技术。当报文的发送过程出现冲突时,在不
12、影响其他模块工作的前提下8,逐一进行标识符优先级的确定。具有最低值标识符的报文指定为优先级最高。即有多个节点同时发出报文时,优先级高的节点获得仲裁资格,并继续发送数据,优先级低的节点仲裁失败放弃发送,先进行报文的接收工作。这种仲裁机吴同晔,等:CAN总线报文接收准确率的优化设计第2期115长春理工大学学报(自然科学版)2023年制会显著提高系统可靠性和稳定性,节约仲裁时间。1.2发送和接收报文流程在发送报文的时候,第一步首先要判断缓存区(ALE)是否处于锁定状态9。当 ALE 处于低电平时,即为锁存状态,此时的数据处于待命状态,无法被接收。当缓存区释放时,数据会以特定的格式发送到缓存区。发送报
13、文流程图如图2 所示。图 2发送报文流程图接收报文的过程同样需要判断缓存区的状态,这是与发送过程一致的步骤。但接收的流程除了对报文进行接收之外还要进行其他情况的处理。接收流程比发送流程要复杂一些,因为在处理接收报文的过程中,同时要对诸如总线关闭、错误报警、接收溢出等情况进行处理。只有在总线正常,没有错误报警,并且接收缓冲区中有新报文,才开始进行数据接收工作。对接收缓冲区的数据读取完毕后关闭 CAN 接收缓冲区。如图 3 为接收报文流程图。图 3接收报文流程图2整体结构与报文接收模块设计本文采用“自上而下”的设计方法10,将 CAN总线划分为三个主要模块:寄存器模块、数据处理模块以及位时序逻辑模
14、块。寄存器模块的主要功能是存储数据,比如 CAN 总线控制器的命令、状态、中断等信息,同时与数据处理模块和位时序逻辑模块之间保持着数据传输以及交流,保证信息的实时性;位时序逻辑模块主要是实现 CAN 总线对位同步的控制,负责监视串行CAN 总线输入,并处理与总线有关的时序问题;数据处理模块是一个控制数据流的序列发生器,与另两个模块相比更关键也更复杂,是三个模块中最主要的部分。三个子模块互相之间协调搭配,共同构成 CAN 总线。本文主要从数据处理模块展开,数据处理模块又划分为六个子模块,如图 4 所示为 CAN 总线的控制器结构。图 4CAN 总线的控制器结构数据处理模块在进行数据传输的同时还执
15、行仲裁、位填充、验收滤波、出错检测和错误处116理等功能。根据其功能,数据处理模块又可以划分为以下六个模块:验收滤波、接收模块、发送模块、错误管理、FIFO(First Input First Output)和 CRC 校验。各个模块之间相互配合共同组成数据处理模块。如图 5 所示为数据模块处理的功能结构。图 5数据模块处理的功能结构数据处理模块的主要特点之一就是采用多主方式工作。由于 CAN 总线取消了对节点地址和通信模块的编码,从而任意一个节点都可以随时向总线上的其他节点发送信息,所以很容易提高竞争冒险的风险,这也导致一个报文可以被多个节点接收或者全部节点接收,本文基于这个缺陷设计了一个报
16、文的接收模块,当缓存区中的报文被其他节点读取时,按照条件选择三个节点:如果发送报文的节点所发出的报文需要被指定节点接收,则报文接收模块不工作,处于复位状态;如果发送报文的节点对接收报文的节点没有指令,则报文接收模块会任选三 个 节 点,分 别 定 义 为 寄 存 器 node_1、寄 存 器node_2、寄存器 node_3,如图 6 所示为报文接收模块设计原理图。图 6报文接收模块设计原理图首先需要判断状态寄存器是否处于锁存状态,SJA1000 的状态寄存器为 ALE,当 ALE 为低电平时11,状态寄存器锁存,缓存区处于关闭状态;当 ALE 为高电平时,缓存区释放。节点在读取状态寄存器的报
17、文时,ALE 需要处于高电平状态,也就是使能端处于高电平。此时其他节点可以在缓存区中读取到报文。定义三个寄存器作为节点并设置高电平有效,将复位信号 sys_rst_n 设置为高电平有效,同时设计一个D触发器作为控制信号,当D触发器flag 信号为低电平时,输出信号有效。如果此时发送报文的节点指定某个或多个节点接收,则整个模块的状态表现为复位信号 sys_rst_n 低电平,即处于复位状态,报文接收模块不工作;而当寄存器状态显示为高电平时,表明已经接收了这个报文。三个寄存器通过或门连接,之间有任意一个为高电平,则D触发器输出为低电平,即 flag 信号显示为低电平;如果三个寄存器没有任何一个接收
18、,则D触发器为高电平,即 flag信号显示为高电平。当报文被三个节点中的任意一个接收时,flag 就会向状态寄存器发送关闭释放信号,使状态寄存器 ALE 锁存处于低电平;当三个节点都没接收时,flag 会向状态寄存器发送继续释放信号,重新选择三个节点进行接收报文的工作。3测试结果与比较3.1CAN 总线通信的功能验证信号传输原理:(1)发送过程:CAN 控制器将 CPU 发送来的报文转换为逻辑电平(包括逻辑 0 显性电平和逻辑 1 隐形电平),通过 TX 脚传递给 CAN 收发器。CAN 收发器接收逻辑电平之后,再将其转换为差分电平传送到 CAN 总线上。(2)接 收 过 程:CAN 收 发
19、器 将 CAN_H 和CAN_L 线12上传来的差分电平转换为逻辑电平传送回 CAN 控制器的 RX 脚,CAN 控制器再把该逻辑电平转化为相应报文发送到 CPU 上。加入报文接收模块后,CAN 总线能否正常发送和接收数据,对整体 CAN 总线的数据传输是否造成影响,需要进行测试13。本文采用软件canutils 对后续 CAN 总线进行测试。canutils 包内含 5 个独立的程序:cansend、candump、canconfig、吴同晔,等:CAN总线报文接收准确率的优化设计第2期117长春理工大学学报(自然科学版)2023年canecho、cansequence。cansend:往指
20、定的 CAN 总线接口发送指定的数据。candump:从 CAN 总线接口接收数据并以十六进制形式打印到标准输出,也可以输出到指定文件。canconfig:用于配置 CAN 总线接口的参数,主要是波特率和模式。canecho:把从 CAN 总线接口接收到的所有数据重新发送到 CAN 总线接口。cansequence:往指定的 CAN 总线接口自动重复递增数字,也可以指定接收模式并校验检查接收的递增数字。首先设置模式为停止,然后设置再启动。一般系统起来后都需要先配置 canutils,后续几个程序才能正常使用,如图 7 所示为配置 canutils。图 7配置 canutils打开两个终端,一个
21、进行 CAN0 设备的发送,一个进行 CAN1 设备的接收。在 CAN1 终端命令行输入 candump can1,意义是 CAN1 设备开始进行接收,进程为阻塞型,CAN1 设备将会一直接收发 来 的 CAN0 消 息 直 到 用 户 终 止,图 8 所 示 为CAN1 设备开始接收。图 8CAN1 设备开始接收在 CAN0 发 送 终 端 中 进 行 数 据 发 送,使 用cansend 命令,其格式为 cansend 。而发送的数据只能发送 16 进制,并且每次发送的数据为 8 个字节。任选 ID 为 123的 CAN 标准帧进行发送测试,波特率为 1 M,内容为 11 22 33 44
22、 55 66 77 88。如果数据传输无误,则会在 CAN1 接收终端接收到发送端发出的标准数据帧。结果表明,加入报文接收模块后的设计可以正常地进行发送接收信号,并且发送和接收之间并未发生错误,验证了此模块设计通信的可行性。图 9 为 CAN0 设备发送数据进行测试,图10 为 CAN1 设备接收数据成功。图 9CAN0 设备发送数据进行测试图 10CAN1 设备接收数据成功3.2报文接收模块的验证与资源占用本文采用 FPGA 所用经典软件 vivado 来进行仿真验证。将报文接收模块视为顶层文件,写入 top 模块中,并写好与之相对应的仿真文件。Run simulation 通过之后,观察波
23、形数据,如图 11所示为 vivado 验证数据的波形图。图 11vivado 验证数据的波形图验证一下模块的可行性。先给三个寄存器低 电 平 处 于 复 位 状 态,即 延 迟 20 ns,寄 存 器node_1、寄存器 node_2、寄存器 node_3 均处于低电平状态,D触发器 flag 信号处于高电平状态,此时三个寄存器都处于未接收的状态,等待信号的传输。若延迟 40 ns,给了一个输入信号,在时钟信号的作用下传入进寄存器中被 node_1 接收,寄存器 node_1 处于高电平状态,寄存器 node_2、寄存器 node_3 均处于低电平状态,则 flag 信号此时处于低电平状态,
24、状态寄存器 ALE 拉低,处于锁存状态,等待下一信号的到来。再延迟 40 ns,此时结束上一个状态,将节点node_1 重新拉低,可以看到D触发器 flag 随之拉高,重新回到复位的状态。仿真验证通过之后,检查一下报文接收模块118的资源占用情况。具体占用资源包括:查找表、寄存器、F7 选择器。从总体看报文接收模块在FPGA 消耗的资源都不是很高,说明该模块资源占用率低。FPGA 资源占用结果如表 1 所示。表 1FPGA 资源占用结果名称CAN总线报文接收模块查找表3792寄存器7014F7选择器90由表 1 可见,报文接收模块查找表占用两个,仅占 CAN 总线的 0.527 7%,报文接收
25、模块的寄存器占用 4 个,仅占 CAN 总线的 0.570 6%,所以加入报文接收模块并不会影响整体 CAN 总线的资源利用。3.3报文接收成功率对比结果均发送 10 000 组报文,将加入报文接收模块前后的成功率进行对比,成功率对比结果如表 2所示。表 2成功率对比结果名称加入报文接收模块前加入报文接收模块后成功/组9 0009 900多次播报/组47834错误播报/组52266成功率/%9099由表 2 可见,发送 10 000 组报文时,加入报文接收模块之后的成功组数比加入之前多 900组,成功率比加入模块前要高 9%,成功率从 90%提升到 99%,多次播报从 479 组降到 34 组
26、,降低了 92.89%,错误播报从 522 组降到 66 组,降低了87.36%,验证了报文接收模块的可行性。4结论本文对基于 FPGA 的 CAN 总线控制器,通过在数据处理中加入一段报文接收模块的代码进行设计。本设计的优点在于,相对于所有节点都可以接收,选择三个节点能大大减少资源的利用与消耗,节省成本。综合数据结果,CAN 总线报文多播或错播的问题得到了解决。加入这部分针对报文接收的模块后,虽然会增加查找表 0.527 7%的占用和寄存器 0.570 6%的占用,但加入此模块后会提高 9%的报文接收准确率,同时降低了 92.89%的多次播报率和 87.36%的错误播报率,验证设计可行。参考
27、文献1王子健.基于 FPGA FIFO 处理的多路 CAN 总线高速通信设计 J.计算机测量与控制,2015,23(2):558-560.2时旭,付成伟.基于 FPGA 的 CAN 总线通信系统的设计 J.现代电子技术,2015,38(22):59-61.3纪振平,王航.基于 FPGA 的 CAN 总线控制器设计J.沈阳理工大学学报,2019,38(4):30-34.4杨福宇.探讨 CAN 总线的抗干扰能力 J.单片机与嵌入式系统应用,2008(12):12-15.5SALUNKHE S S,PAL S,AGRAWAL A,et al.Energyoptimization for CAN bu
28、s and media controls in electricvehicles using deep learning algorithmsJ.The Journal of Supercomputing,2022,78(6):8493-8508.6周晓乐,慈彬彬,耿双利,等.基于 SJA1000 的 CAN总线通信的 FPGA 设计J.中国集成电路,2022,31(6):51-55+59.7 王莎,谭立波,郑宝文,等.基于 FPGA 的 CAN 总线通信系统 J.工业控制计算机,2018,31(8):1-2+5.8 王校伟.基于 DSP 和 FPGA 的 CAN 总线通信系统设计与实现J.电
29、子设计工程,2018,26(21):61-70+76.9 邓轲,陈伟,赵强,等.一种基于 CAN 总线的编码器采集电路设计J.航空计算技术,2020,50(5):120-123.10 张培坤,高伟,宋宗喜,等.基于 FPGA 的 CAN 总线通信节点设计 J.仪表技术与传感器,2010(12):68-70.11PINHO L M,VASQUES F.Reliable real-time communication in CAN networksJ.IEEE Transactions onComputers,2003,52(12):1594-1607.12刘志宏,翟耘萱,久元溦.FPGA 的星载 CAN 总线通信系统的设计 J.单片机与嵌入式系统应用,2021,21(2):35-38+43.13徐深,牛洪海,陈俊,等.CAN 总线数据发送优化方法研究及应用 J.自动化仪表,2020,41(11):101-104+110.吴同晔,等:CAN总线报文接收准确率的优化设计第2期119