一种汽车CAN总线网关的报文收发方法及系统技术领域
本发明属于汽车电子技术领域,更具体的说是一种汽车CAN总线网关的报文收发
方法及系统。
背景技术
随着汽车电子部件的增多和智能化程度的提高,CAN总线系统已经成为汽车的重
要组成部分。根据功能划分、拓扑结构设计和实时性的不同要求,汽车一般会设计多个CAN
网络。CAN网络之间的信息交互由网关实现,网关包括多个CAN接口,接入不同的CAN网络,实
现报文的接收和转发。在所有的CAN网络节点中,从报文接收和发送的角度看,网关的负荷
是最高的。
CAN网络采用非破坏性仲裁方式竞争总线,任一节点可以在任意时刻向总线发送
数据,连接多个CAN网络的网关可能会在较短的时间内接收到大量报文,并需要在短时间内
转发大量需要路由的报文。进行周期报文的转发时,根据不同汽车厂家的要求,报文周期一
般需要保证在规定值的±10%以内,这对网关的实时性、准确性都提出了较高的要求。
出于成本节约和集成化的要求,汽车电子零部件都采用MCU内部的CAN控制器结合
物理层芯片实现CAN总线通信。低成本MCU的内部CAN控制器的硬件接收缓冲区和硬件发送
缓冲区很小,当CAN网络上短时间内出现大量报文时,如果未能及时读取硬件接收缓冲区中
的数据并清零标志位,便无法接收新的报文。当CAN网关短时间内需要转发大量报文时,如
果硬件发送缓冲区已满,但仍存在需要发送的报文时,如果未能及时转发报文,可能会造成
漏发报文或者周期不准确的错误。如果选用CAN控制器硬件接收缓冲区和硬件发送缓冲区
都比较大的MCU,会增加成本,影响经济效益和社会效益。
中国发明专利:一种控制器局域网络CAN总线报文的发送方法及装置(申请号:
201610064343.3),介绍了一种配置各个CAN节点的报文发送时段的方法,避免了因多个节
点同时发送报文导致总线竞争以及报文过于密集的现象。这种方法能够改善总线报文在时
间轴上的分布,降低对CAN控制器硬件缓冲区的要求,但是这种方法需要分析总线波特率、
网络内所有报文的优先级和周期,不仅需要每个CAN节点都实现这种方法,而且灵活性很
差,一旦由于网络拓扑的改变增加或减少了某个节点,便会影响整个设计。
中国发明专利:CAN总线网关控制器及CAN总线之间数据传输方法(申请号:
200710075363.1),采用周期性扫描数据缓冲区的方法判断是否有需要发送的数据包,在很
多情况下,不存在需要发送的数据包,这时仍然进行周期性扫描,会白白浪费嵌入式系统宝
贵的计算资源。另外,如果设置的扫描周期时间较长,会造成需要转发的短周期报文不满足
周期准确性要求,如果设置的扫描周期时间较短,会加大系统负荷。
发明内容
本发明的目的就是为了解决上述问题,提供一种汽车CAN总线网关的报文收发方
法及系统,以软件缓冲区配合CAN控制器的硬件缓冲区,设计软件缓冲区管理模块,通过与
硬件缓冲区的联动,能够实时地接收报文,保证报文不丢失,同时在CAN控制器硬件发送缓
冲区未满时及时将报文发送到总线上,不漏发报文,也不影响周期报文的周期准确性。
为了实现上述目的,本发明采用如下技术方案:
一种汽车CAN总线网关的报文收发方法,包括:
步骤(1):针对CAN报文的接收和发送分别定义软件接收缓冲区和软件发送缓冲
区,
所述软件接收缓冲区由报文接收中断服务程序和软件接收缓冲区管理子模块管
理;
所述软件发送缓冲区由报文发送函数、报文发送中断服务程序和软件发送缓冲区
管理子模块管理;
软件发送缓冲区管理子模块和软件接收缓冲区管理子模块组成软件缓冲区管理
模块;
步骤(2):在软件缓冲区管理模块中,若接收到信号,首先判断信号是否是接收到
新报文,若是则进入软件接收缓冲区管理子模块;如果否,则进入步骤(3);
步骤(3):进一步判断接收到的信号是否是硬件发送缓冲区未满,若是就进入软件
发送缓冲区管理子模块;若否就结束。
所述软件接收缓冲区和软件发送缓冲区均为结构体数组,结构体数组包括报文
ID、报文长度和报文数据。
软件接收缓冲区对应的结构体数组为接收数组;软件发送缓冲区对应的结构体数
组为发送数组。
接收数组和发送数组的长度根据CAN网络负载率进行设置,保证在CAN网络正常通
信的情况下,不会出现缓冲区溢出的情形。
数组元素通过索引进行寻址,接收数组和发送数组均分别包括两个索引:存入索
引和取出索引。将索引加一时,判断索引值是否等于数组长度,如果索引值等于数组长度,
将索引值置零。
所述步骤(2)进入软件接收缓冲区管理子模块后的步骤为:
步骤(201):判断存入索引是否等于取出索引,若是就结束;若否就进入步骤
(202);
步骤(202):读取接收数组中由取出索引标记的元素;
步骤(203):对报文进行处理,将取出的索引加一;判断取出索引是否等于数组长
度,若等于就将取出索引值置零,然后返回步骤(201);否则直接返回步骤(201)。
所述步骤(3)进入软件发送缓冲区任务管理子模块后的步骤为:
步骤(301):判断存入索引是否等于取出索引,若是就禁止报文发送中断,结束;若
否就进入步骤(302);
步骤(302):判断CAN控制器硬件发送缓冲区是否已满,若是就结束;若否就进入步
骤(303);
步骤(303):将发送数组中由取出索引标记的数组元素赋值到CAN控制器的寄存
器;将取出索引加一;判断取出索引值是否等于数组长度;若是就将取出索引置零,然后返
回步骤(301),若否就直接返回步骤(301)。
所述步骤(1)与步骤(2)之间还有步骤(10);所述步骤(10)包括:
步骤(101):当发送报文时,根据CAN控制器的寄存器判断硬件发送缓冲区是否已
满,若未满,则将待发送的报文填充到硬件发送缓冲区,CAN控制器自动完成报文发送任务;
若已满,则将待发送报文存入软件发送缓冲区,将存入索引加一,同时开启CAN报文发送中
断;若存入索引值等于接收数组的长度,则将存入索引值置零;
当CAN控制器成功发送报文后,触发报文发送中断,在CAN报文发送中断服务程序
中,向软件缓冲区管理模块发送硬件发送缓冲区未满信号;
步骤(102):当接收报文时,在CAN报文接收中断服务程序中,将CAN控制器硬件接
收缓冲区中的数据存入由存入索引寻址的软件接收缓冲区,向软件缓冲区管理模块发送接
收到新报文的信号,同时将存入索引加一,若存入索引值等于接收数组的长度,则将存入索
引值置零。
一种汽车CAN总线网关的报文收发系统,包括:
CAN控制器,所述CAN控制器与物理层芯片连接,所述物理层芯片与总线连接,所述
CAN控制器上有硬件接收缓冲区和硬件发送缓冲区;
MCU,设有软件接收缓冲区和软件发送缓冲区,所述软件接收缓冲区由报文接收中
断服务程序和软件接收缓冲区管理子模块管理;所述软件发送缓冲区由报文发送函数、报
文发送中断服务程序和软件发送缓冲区管理子模块管理;软件发送缓冲区管理子模块和软
件接收缓冲区管理子模块组成软件缓冲区管理模块;
在软件缓冲区管理模块中,若接收到信号,首先判断信号是否是接收到新报文,若
是则进入软件接收缓冲区管理子模块;如果否,则进一步判断接收到的信号是否是硬件发
送缓冲区未满,若是就进入软件发送缓冲区管理子模块;若否就结束。
当发送报文时,根据CAN控制器的寄存器判断硬件发送缓冲区是否已满,若未满,
则将待发送的报文填充到硬件发送缓冲区,CAN控制器自动完成报文发送任务;若已满,则
将待发送报文存入软件发送缓冲区,将存入索引加一,同时开启CAN报文发送中断;若存入
索引值等于接收数组的长度,则将存入索引值置零;
当CAN控制器成功发送报文后,触发报文发送中断,在CAN报文发送中断服务程序
中,向软件缓冲区管理模块发送硬件发送缓冲区未满信号;
当接收报文时,在CAN报文接收中断服务程序中,将CAN控制器硬件接收缓冲区中
的数据存入由存入索引寻址的软件接收缓冲区,向软件缓冲区管理模块发送接收到新报文
的信号,同时将存入索引加一,若存入索引值等于接收数组的长度,则将存入索引值置零。
本发明的有益效果:
1、可以选用CAN控制器硬件缓冲区较小的MCU,降低了汽车零部件的成本,提高了
经济效益和社会效益。
2、以中断方式触发报文缓冲区任务管理模块,能够保证数据的一致性和报文周期
的准确性。
3、当网络拓扑发生改变或者增减CAN网络报文时,不必修改本方法的设计,灵活性
很高。
4、可以适用于普通的CAN节点,具有很强的通用性。
附图说明
图1为本专利的整体工作流程图。
图2为本发明的软件缓冲区任务管理模块流程图。
图3为本发明的软件接收缓冲区任务管理模块流程图。
图4为本发明的软件发送缓冲区任务管理子模块流程图。
图5为本发明的软件与硬件连接示意图。
具体实施方式
下面结合附图与实施例对本发明作进一步说明。
如图1所示,
1、针对CAN报文的接收和发送分别定义软件接收缓冲区和软件发送缓冲区,建立
缓冲区管理模块,在CAN控制器中断服务程序中向缓冲区管理模块发送“接收到新报文”或
“硬件发送缓冲区未满”信号,在缓冲区管理模块中,处理软件接收缓冲区中的报文、发送软
件发送缓冲区中的报文。
2、软件接收缓冲区和软件发送缓冲区为结构体数组,结构体成员包括报文ID、报
文长度和报文数据。接收数组和发送数组的长度根据CAN网络负载率进行设置,保证在CAN
网络正常通信的情况下,不会出现缓冲区溢出的情形。
3、数组元素通过索引进行寻址,接收数组和发送数组各包括两个索引:存入索引
和取出索引。将索引加一时,如果索引值等于数组长度,将索引值置零。
4、在CAN报文接收中断服务程序中,将CAN控制器硬件接收缓冲区中的数据存入由
接收数组存入索引寻址的接收缓冲区位置,向缓冲区管理模块发送“接收到新报文”信号。
同时,将存入索引加一,如果存入索引值等于数组长度,将存入索引值置零。
5、当应用需要发送报文时,首先通过CAN控制器的寄存器判断硬件发送缓冲区是
否已满,如果未满,将待发送报文填充到硬件发送缓冲区,CAN控制器自动完成报文发送任
务。如果已满,将待发送报文存入由发送数组存入索引标记的软件发送缓冲区位置,将存入
索引加一,同时开启CAN报文发送中断。如果存入索引值等于数组长度,将存入索引值置零。
6、CAN控制器成功发送报文后,触发报文发送中断,在CAN报文发送中断服务程序
中,向缓冲区管理模块发送“硬件发送缓冲区未满”信号。
7、如图2所示,在缓冲区管理模块中,如果接收到的信号是“接收到新报文”,进入
软件接收缓冲区管理子模块,如果接收到的信号是“硬件发送缓冲区未满”,进入软件发送
缓冲区管理子模块。
8、如图3所示,软件接收缓冲区管理子模块的处理流程为:
步骤一:如果接收数组的存入索引等于取出索引,表示不存在未被处理的报文,进
入步骤四。否则,进入步骤二。
步骤二:读取接收数组中由取出索引标记的元素,根据报文ID、长度和数据进行相
应处理,进入步骤三。
步骤三:将取出索引加一,如果取出索引值等于数组长度,将取出索引置零。返回
步骤一。
步骤四:退出软件接收缓冲区管理子模块。
9、如图4所示,软件发送缓冲区任务管理子模块的处理流程为:
步骤一:如果发送数组的存入索引等于取出索引,表示不存在未被发送的报文,关
闭报文发送中断,进入步骤五,否则,进入步骤二。
步骤二:通过CAN控制器寄存器判断硬件发送缓冲区是否已满,如果已满,进入步
骤五,否则,进入步骤三。
步骤三:读取发送数组中由取出索引标记的元素,将报文ID、长度和数据赋值到
CAN控制器硬件发送缓冲区对应的寄存器,进入步骤四。
步骤四:将取出索引加一,如果取出索引值等于数组长度,将取出索引置零。返回
步骤一。
步骤五:退出软件发送缓冲区管理子模块。
10、在CAN控制器初始化程序中使能接收中断,CAN控制器以中断方式接收总线报
文。
11、当应用需要发送报文而CAN控制器硬件发送缓冲区已满时,开启报文发送中
断。在软件发送缓冲区任务管理子模块中将软件发送缓冲区中的待发送报文全部发送完
后,关闭报文发送中断。
如图5所示,为本发明的软件与硬件连接示意图。
上述虽然结合附图对本发明的具体实施方式进行了描述,但并非对本发明保护范
围的限制,所属领域技术人员应该明白,在本发明的技术方案的基础上,本领域技术人员不
需要付出创造性劳动即可做出的各种修改或变形仍在本发明的保护范围以内。