CAN_集成手册
目标
本集成手册用于指导客户进行通信栈集成,文档主要包括的内容为:通信栈集成指导。
由于各项目的需求不同,集成示例不会针对于特定的商业项目做详细讲解。
缩写词和术语
** 缩写词/术语** |
描述 |
BSW |
Basic Software 基础软件层 |
BswM |
Basic Software Mode Manager基础软件模式管理器 |
MCAL |
|
CANIF |
CAN Interface module CAN接口模块 |
CanSm |
CAN State Manager module CAN状态管理器模块 |
ComM |
Communication Manager module通信管理器模块 |
EcuM |
ECU State Manager module ECU状态管理器模块 |
SchM |
Scheduler Module调度程序模块 |
参考文档
[1]参考手册_CanIf.pdf
[2]参考手册_Com.pdf
[3]参考手册_EcuC.pdf
[4]参考手册_PduR.pdf
[5]参考手册_CanSM.pdf
Can通信栈集成
项目交付的内容为:Can通信栈源码和ORIENTAIS Configurator配置工具。通信栈细分为通信栈的各模块及其对应的配置工具模块。
通信栈各配置模块的功能介绍,参见表 4‑1通信栈各配置模块介绍。
使用通信栈源码和配置工具,进行通信栈的集成的步骤,参见表 4‑2 通信栈集成的步骤。
模 块名 |
功能 |
Can |
CAN驱动配置。(由mcal配置工具导入,详见章节5.2.1) |
CanIf |
CanIf模块主要处理上层模块与底层驱动的之间 PDU的传递,为上层模块提供统一的接口来管理不同的CAN硬件模块 |
EcuC |
用于辅助配置工具完成配置的模块。主 要提供Pdu的定义,其它模块通过关联EcuC中Pdu,相互关联起来。 |
PduR |
PDU Router主要为通讯接口模块(CANIF)、传输协议模 块、诊断通讯管理模块以及通讯模块提供基于I-PDU的路由服务。 |
Com |
COM模块主要提供I-PDU和信号相关管理功能 |
CanSM |
主要功 能是与通信硬件抽象层和系统服务层产生交互,为每一个CAN通信 总线定义一个总线相关的状态管理,并为相关的总线提供流控制。 |
步 骤 * |
操作 |
说明 |
1 |
ORIENTAIS Stuido配置工具 工程搭建和通信栈模块加载 |
若配置工具已经搭建 ,则仅需进行通信栈模块的加载操作。 |
2 |
模块配置及配置文件生成 |
NA |
3 |
代码集成 |
现有工程、 通信栈源代码和配置生成文件的集成。 |
4 |
验证测试 |
NA |
注意:通信栈集成之前,用户须确保已经有基础工程,且本通信栈相关的其他通信栈能正常工作。
新建ORIENTAIS Configurator配置工程及模块加载
安装ORIENTAIS Configurator软件后,双击软件图标打开软件。
菜单栏File🡪New🡪Project,新建工程。
在弹出的新建窗口中选择Autosar下的 [BSW Project],选择Next。
在弹出的窗口中输入工程名,选择Finish。
在弹出的窗口中选择Yes。
选择[Bsw_Builder],右键单击,选择New ECU Configuration。
图 4‑6 配置工程-6
在弹出的窗口中输入ECU名,然后选择Next。
在弹出的窗口中勾选需添加的模块,点击Finish。
新建工程如下所示,步骤⑦中添加的模块已经被加入到工程中。
模块配置及代码生成
模块配置
模块的具体配置,取决于具体的项目需求。该通信栈各模块配置项的详细介绍,参见表 4 3通信栈各模块配置参考文档。
** 模块** |
参考文档及其章节 |
说明 |
Can |
MCAL对应的Can配置手册 |
|
CanIf |
参考手册_CanIf.pdf |
|
PduR |
参考手册_PduR.pdf |
|
Com |
参考手册_Com.pdf |
|
CanSM |
参考手册_CanSM.pdf |
|
EcuC |
参考手册_EcuC.pdf |
|
ComM |
参考手册_ComM.pdf |
配置代码生成
在ORIENTAIS Stuido主界面左方,选择对应的通信栈,单击右键弹出Validate All和Generate All菜单。
选择Validate All对本通信栈各配置选项进行校验,没有错误提示信息即校验通过。若有错误信息,请按照错误提示修改。
选择Generate All,生成配置文件。右下角的Console窗口输出生成的配置文件信息。
将ORIENTAIS Configurator切换到Resource模式,即可查看生成的配置文件。
功能集成
代码集成
通信栈代码包括两部分:项目提供的通信栈源码和ORIENTAIS Configurator配置生成代码。通信栈集成包括通信栈源码(CAN、CanIf、PduR、ComM、CanSM等)、定时器源码和部分其他模块源码,具体文件见表4-4。
用户须将通信栈源码和章节4.2.2生成的源代码添加到集成开发工具的对应文件夹。通信栈集成的文件结构,见章节④。
表4-4通信栈源码文件
移库文件夹 |
移库文件 |
说明 |
ComM |
ComM.c、 ComM.h、 ComM_BusSM.h、 ComM_Com.h、 ComM_Dcm.h、 ComM _EcuMBswM.h、ComM_Internal.c、C omM_Internal.h、ComM_MemMap.h、 ComM_Nm.h |
通信栈源码 |
CanIf |
CanIf.c、 CanIf.h、 CanIf_Cbk.h 、CanIf_MemMap.h、CanIf_Types.h |
|
CanSM |
CanSM.c、 CanSM.h、 CanSM_BswM.h、 CanSM_Cbk.h、 CanSM_ComM.h、CanSM_MemMa p.h、CanSM_TxTimeoutException.h |
|
PDUR |
PduR_CanIf.h、 PduR_Com.h、P duR_Internal.c、PduR_Internal.h 、PduR_MemMap.h、PduR_Types.h、 PduR.c、 PduR.h |
|
Com |
Com.c、 Com.h、 Com_Cbk.h、Com_GwInternal.c、C om_Internal.c、Com_Internal.h、 Com_MemMap.h、Com_RxInternal.c 、Com_TxInternal.c、Com_Types.h |
|
SchM |
SchM.c、 SchM.h、 SchM_Com.h、 SchM_ComM.h、 SchM_CanIf.h、 SchM_PduR.h、 |
SchM部分源码 |
BswM |
BswM.c、 BswM.h、 BswM_CanSM.h、 BswM_ComM.h、 |
BswM部分源码 |
EcuM |
EcuM_Types.h、 EcuM.h、 |
EcuM部分源码 |
注意:通信栈集成之前,用户须确保已经有基础工程,且本通信栈相关的其他通信栈能正常工作。
集成注意事项
对于集成过程中,通信栈特殊要求和用户经常出现的问题,归类总结形成 表 4‑5通信栈集成约束清单。用户需逐一排查表中的约束项,以避免集成问题出现。
编 号 * |
类别* |
约束限制 |
** 1** |
中断 |
通信栈 有中断、轮询或混合三种工作模式。若选取中断或混合模 式,用户需在通信栈配置对应的中断并填充中断服务API。 |
** 2** |
堆栈 |
用户需确保为任务堆栈和中断堆栈分配足够的堆栈空间。 |
** 3** |
头文件 |
栈代码之后,用户需更新集成开发工具中的头文件路径。
|
** 4** |
初始化 |
以CAN通信为例,通信栈的初始化顺序为:Can_Init, CanIf_Init, PduR_Init, Com_Init,CanSM_Init。 |
** 5** |
周 期函数 |
Com_MainFunctionRx,Com_MainFunctionRouteSi gnals和Com_MainFunctionTx需要被周期性任务函数调用。 |
集成示例
本章节通过普通的CAN通信栈为例,向用户展示通信栈的集成过程。用户可以据此熟悉通信栈配置工具的配置过程,以及如何应用配置工具生成的配置文件。
为让用户更清晰的了解工具的使用,所用的配置均逐一手动完成。用户可以使用工具中的DBC导入功能,快速完成配置。DBC导入功能不属于本文档介绍范畴,具体操作请参照《ORIENTAIS Configurator DBC导入功能.pdf》。
注意:本示例不代表用户的实际配置情况,用户需要根据自己的实际需求,决定各个参数的配置。
集成目标
CAN报文需求:
报 文ID |
报文 名称 |
发 送 /接 收* |
发 送 模 式 |
报 文 周 期 |
报文 长度 |
工 作 模 式 |
0x100 |
CAN_Tx_Message1 |
发送 |
周期 |
50ms |
8字节 |
轮询 |
0x105 |
CAN_Tx_Message2 |
发送 |
触发 |
8字节 |
轮询 |
|
0x120 |
CAN_Rx_Message1 |
接收 |
NA |
100ms |
8字节 |
轮询 |
0x125 |
CAN_Rx_Message2 |
接收 |
NA |
8字节 |
轮询 |
CAN报文信号需求:
CAN_Tx_Message1(0x100)包含的信号
图 5‑2 集成示例-2
CAN_Rx_Message1(0x120) 包含的信号
CAN_Rx_Message1(0x125) 包含的信号
模块的配置
新建配置工程及模块加载操作,请参考本文档4.2章节。
Can模块配置
有多种工具可以用于配置mcal,本章介绍如何使用EB工具配置Can模块,但是只涉及到与通信栈中报文收发有关系的部分(主要是HardwareObeject),其余配置选项请参考EB工具的帮助手册进行配置。
打开EB工具,新建CAN模块后,在以下路径配置HardwareObject:
CAN模块🡪CanConfigSet🡪CanHardwareObject。
根据本次配置示例的目标,需要配置4个HardwareObject,如下图所示:
注意:HardwareObject定义的时候,必须接收报文放在发送报文前面。
完成EB配置后,生成Can模块的配置文件,替换工程中原有的Can模块的配置文件。
导出EB的配置文件。
将③导出的配置文件,导入到ORIENTAIS Configurator中。
导入后工程如下图所示:
CanIf模块配置
双击CanIf模块,打开CanIf模块的配置界面。
CanIfPublicCfg、CanIfPrivateCfg、CanIfDispatchCfg、CanIfTrcvDrvCfg标签页均保持默认值,不需要配置。
在CanIfInitCfg标签页下的容器[CanIfInitCfg]上,右边新建一个CanIfInitHohCfg对象。
CanIfCtrlDrvCfg配置。
[CanIfCtrlDrvCfg_0]的配置项CanIfCtrlDrvInitHohConfigRef需要关联到步骤③中创建的HOH对象。
[CanIfCtrlDrvNameRef]的配置项选Can。
CanIfCtrlCfg配置:
将默认生成的[CanIfCtrlCfg_0]名字改为[CanIfCtrlCfg_Controller0]。
参数CanIfCtrlCanCtrlRef,选择CanController_0。
可在容器[CanIfInitCfg]上右键,新建CanIfBufferCfg、CanIfInitHohCfg、CanIfRxPduCfg、CanIfTxPduCfg。
新建一个CanIfInitHohCfg,再在新建的容器[CanIfInitHohCfg_0]上右键新建2个CanIfHrhCfg和2个CanIfHthCfg。然后将新建的容器改为有意义的名字。
每个发送报文需要一个CanIfHrhCfg,每个接收报文需要一个CanIfHthCfg。
配置CanIfHrhCfg_Rx_Message1和CanIfHrhCfg_Rx_Message2。
配置CanIfHthCfg_Tx_Message1和CanIfHthCfg_Tx_Message2。
新建2个CanIfBufferCfg,并修改名字。每个发送报文需要建立一个CanIfBufferCfg。
新建2个CanIfRxPduCfg,并修改名字。每个接收报文需要在CanIf中配置对应的CanIfRxPduCfg。报文CAN_Rx_Message1对应的CanIfRxPduCfg参数配置如下:
参数名 |
设置值 |
说明 |
CanIfRxPduCanId |
0x120 |
报文ID(参照DBC) |
CanIfRxPduCanIdType |
STANDARD_CAN |
帧类型:标准帧 |
CanIfRxPduDlc |
8 |
报文长度 (参照DBC) |
CanIfRxP duUserRxIndicationUL |
PDUR |
CanIf 模块收到报文后通知PduR模块 |
CanIfRxPduHrhIdRef |
CanIfHr hCfg_Rx_Message1 |
关联到对 应的Hrh(本章节步骤⑧创建) |
CanIfRxPduRef |
CAN_Rx_Message1 |
关联到EcuC中定义的pdu,此 处命名规则为XXX(报文名) |
用同样的方法配置CanIfRxPduCfg_Rx_Message2
新建2个CanIfTxPduCfg,并修改名字。每个接收报文需要在CanIf中配置对应的CanIfTxPduCfg。报文CAN_Tx_Message1对应的CanIfTxPduCfg参数配置如下:
参数名 |
设置值 |
说明 |
CanIfTxPduCanId |
0x100 |
CAN ID |
CanIfTxPduCanIdType |
STANDARD_CAN |
帧类型:标准帧 |
CanIfTxPduType |
STATIC |
静态CAN ID |
CanIfTxPdu UserTxConfirmationUL |
PDUR |
报文发送成功确 认通知传递给PDUR模块 |
CanIfTxPduBufferRef |
C anIfHthCfg_Tx_Message1 |
关联到对应HtH |
CanIfTxPduRef |
CAN_Tx_Message1 |
关联到EcuC中的Pdu |
用同样的方法配置CanIfTxPduCfg_Tx_Message2
校验配置,无错误信息,即配置完成。
EcuC模块配置
双击EcuC模块,打开EcuC模块的配置界面。
右击EcucConfigSets新建EcucConfigSet,右击EcucConfigSet新建EcucPduCollections,右击EcucPduCollections新建EcucPduCollection,右击EcucPduCollections新建MetaDataTypes和Pdus,MetaDataTypes保持默认。
新建8个Pdu并修改名字,配置报文方向和报文长度。
注意:
此处配置pdu为两组,命名需要分开,方便后续配置需要使用。推荐规则为Com_XXX和XXX两种(XXX代表报文名)。
其他页面保持默认即可。
Com模块配置
双击Com模块,打开Com模块的配置界面。
ComSupportedIPduGroups填写数目,且与ComIPduGroup数量保持一致,其他配置选择默认。
选择ComConfig页面配置,新建目标数量的ComIPdu、ComIPduGroup、ComSignal并修改名称。
发送ComIPdu的属性配置如图。
接收ComIPdu的属性配置ComIPduDirection为RECEIVE和ComIPduGroupRef新建选择ComIPduGroup_Rx。
选中ComIPdu,配置发送ComIPdu的属性配置如图。
接收ComIPdu的属性配置ComIPduDirection为RECEIVE和ComIPduGroupRef新建选择ComIPduGroup_Rx。
注意:ComPduIdRef选择Com_XX的相应报文,此处对应EcuC的配置。
ComIPduSignalRef需要新建选择该报文所包含的所有信号。
在发送IPDU新建ComTxIPdu,配置ComMinimumDelayTime为0.005s,其他保持默认。
在接收IPDU中不需要新建ComTxIPdu。
在发送ComTxIPdu新建ComTxModeTrue,按照需求选择ComTxModeMode为周期、事件或者混合型发送模式此处为周期型发送,ComTxModeNumberOfRepetitions、ComTxModeRepetitionPeriod、ComTxModeTimeOffset和ComTxModeTimePeriod按照不同发送模式配置具体请参照需求设置。
选定信号后设置ComBitPosition、ComBitSize、ComSignalEndianness、ComSignalInitValue、ComSignalType和ComTransferProperty等参数。ComTransferProperty的配置,需要考虑与IPDU发送模式相配合从而实现相应的发送类型,此处为周期报文选择PENDING。
ComTimeBase配置保持默认。
PduR模块配置
双击PduR模块,打开PduR模块的配置界面,PduRGeneral保持默认配置。
打开PduRBswModules新建PduRBswModules_CanIf和PduRBswModules_Com,PduRBswModuleRef分别选择CanIf和Com,其他配置保持默认。
打开PduRRoutingTables新建一个PduRRoutingTable,再PduRRoutingTable中新建PduRRoutingPath如图。
找到并选中PduRDestPdu,配置右边PduRDestPduRef。
注意:
接收报文PduRDestPduRef选择Com_XXX(此处对应EcuC的配置);
发送报文PduRDestPduRef选择XXX(此处对应EcuC的配置);
如下图为发送报文配置目标pdu。
找到并选中PduRSrcPdu,配置右边PduRSrcPduRef。
注意:
接收报文PduRSrcPduRef选择XXX(此处对应EcuC的配置);
发送报文PduRDestPduRef选择Com_XXX(此处对应EcuC的配置);
如下图为发送报文配置源pdu。
CanSM模块配置
找到并选中CanSMManagerNetwork,配置右边CanSMComMNetworkHandleRef此配置与ComM模块关联。
找到并选中CanSMController,配置右边CanSMControllerId此配置与CanIf模块关联。
ComM模块配置
找到并添加ComMUser
修改ComMChannel,配置右边ComMBusType为COMM_BUS_TYPE_CAN
找到ComMNetworkManagement配置,ComMNmVariant设置为NONE
找到ComMUserPreChannels配置,将之前配置的user关联到channel
源代码集成
项目交付给用户的工程结构如下:
BSW目录,这个目录放置所有基础软件相关代码,除了MCAL、Config文件夹之外,均按bsw源码路径放置
ASW目录,存放应用代码
Config目录,存放mcal和bsw生成的动态代码。
MCAL目录,存放mcal的静态代码
通信栈源代码集成步骤如下:
将5.2章节中EB MCAL生成的CAN模块配置文件和ORIENTAIS Configurator生成的配置文件复制到Config/BSW_Config文件夹中。
将MCAL提供的CAN模块源码和项目提供的通信栈源代码文件复制到BS W和MCAL文件夹中。
通信栈调度集成
通信栈调度集成步骤如下:
通信栈调度集成,需要逐一排查并实现表 5‑5通信栈集成约束清单 所罗列的问题,以避免集成出现差错。
编译链接代码,将生成的elf文件烧写进芯片。
通信栈有关的代码,在下方的main.c文件中给出重点标注。
注意 : 本示例中,通信栈初始化的代码和启动通信的代码置于main.c文件,并不代表其他项目同样适用于将其置于main.c文件中。
#include <machine/wdtcon.h>
#include “Mcu.h”
#include “Port.h”
#include “Can_17_MCanP.h”
#include “CanIf.h”
#include “Com.h”
#include “PduR.h”
#include “ComM.h”
#include “CanSM.h”
#include “ComM_EcuMBswM.h”
int main(void)
{
/*Initialize ECUM Module*/
EcuM_Init(&EcuM_ConfigAlternative[0]);
/*Initialize FlsLoader*/
FlsLoader_Init(NULL_PTR);
/*Dem module Pre_Init*/
Dem_PreInit();
Can_17_MCanP_Init(&Can_17_MCanP_ConfigRoot[0]);
CanIf_Init(&CanIf_InitCfgSet);
PduR_Init(&PduR_PBConfigData);
Com_Init(&Com_PBConfigData);
CanSM_Init(&CanSM_Config);
Com_IpduGroupVector ipduGroupVector;
Com_SetIpduGroup(ipduGroupVector, ComIPduGroup_CAN_Rx,TRUE);
Com_SetIpduGroup(ipduGroupVector, ComIPduGroup_CAN_Tx,TRUE);
Com_ReceptionDMControl(ipduGroupVector);
Com_IpduGroupControl(ipduGroupVector,TRUE);
ComM_RequestComMode(ComMChannel_0, COMM_FULL_COMMUNICATION);
ComM_CommunicationAllowed(ComMUser_0, TRUE);
Gpt_EnableNotification(GptConf_GptChannel_Gpt_1ms);
Gpt_StartTimer(GptConf_GptChannel_Gpt_1ms, 100000);
/* infinite loop */
while (1)
{
if(Gpt_5msFlag == TRUE)
{
/* please insert your code here … */
uint64 u8_test = 0;
ComM_ModeType can_BusMode = COMM_NO_COMMUNICATION;
CanSM_MainFunction();
ComM_MainFunction_ ComMChannel_0();
ComM_GetCurrentComMode(ComMUser_0,&can_BusMode);
if (COMM_FULL_COMMUNICATION == can_BusMode)
{
Com_MainFunctionRx();
Com_MainFunctionRouteSignals();
/* Test Code */
if (TRUE == CAN_Rx_Message1_Signal1_Recevive_Flag)
{
CAN_Rx_Message1_Signal1_Recevive_Flag = FALSE;
Com_ReceiveSignal(CAN_Rx_Message1_Signal1,&u8_ComTest);
Com_SendSignal(CAN_Tx_Message1_Signal1,&u8_ComTest);
Com_ReceiveSignal(CAN_Rx_Message1_Signal2,&u8_ComTest);
Com_SendSignal(CAN_Tx_Message1_Signal2,&u8_ComTest);
Com_ReceiveSignal(CAN_Rx_Message1_Signal3,&u8_ComTest);
Com_SendSignal(CAN_Tx_Message1_Signal3,&u8_ComTest);
Com_ReceiveSignal(CAN_Rx_Message1_Signal4,&u8_ComTest);
Com_SendSignal(CAN_Tx_Message1_Signal4,&u8_ComTest);
}
if (TRUE == CAN_Rx_Message2_Signal1_Recevive_Flag)
{
CAN_Rx_Message2_Signal1_Recevive_Flag = FALSE;
Com_ReceiveSignal(CAN_Rx_Message2_Signal1,&u8_ComTest);
Com_SendSignal(CAN_Tx_Message2_Signal1,&u8_ComTest);
}
Com_MainFunctionTx();
}
}
return 1;
}
验证结果
根据集成目标,共配置了4个报文,其中1个周期发送报文,1个触发发送报文,还有2个与发送报文信号配置一致的接收报文。
系统启动后有一个报文发送(CAN_Tx_Message1),ID 0x100,周期50ms,初始化值和设置一致
本地发送一帧ID为0x120的报文(CAN_Rx_Message1)后,发送报文0x100(CAN_Tx_Message1)的值发生变化
本地发送一帧ID为0x125的报文(CAN_Rx_Message2)后,开发板发送一帧ID为0x105的报文(CAN_Tx_Message2)