UDSOnCan_集成手册
目标
本集成手册用于指导客户进行诊断栈集成,文档主要包括的内容为:诊断栈集成指导、基于普通应用的集成示例讲解、项目集成特殊说明。
由于各项目的需求不同,集成示例不会针对于特定的项目做详细讲解。
缩写词和术语
** 缩写词/术语** |
描述 |
BSW |
Basic Software |
MCAL |
Microcontroller Abstraction Layer |
CanIf |
CAN Interface module |
CanSm |
CAN State Manager module |
ComM |
Communication Manager module |
PduR |
PDU Router module |
Dcm |
Diagnostic Communication Manager |
Dem |
Diagnostic Event Manager |
CanTp |
CAN Transport Layer |
NvM |
NVRAM Manager |
参考文档
[1]参考手册_CanIf.pdf
[2]参考手册_PduR.pdf
[3]参考手册_CanSM.pdf
[4]参考手册_DCM.pdf
[5]参考手册_Dem.pdf
[6]参考手册_CanTp.pdf
[7]参考手册_EcuC.pdf
[8]ODX file导入操作说明.docx
诊断栈集成
项目交付的内容为:诊断栈源码和ORIENTAIS Configurator配置工具。诊断栈细分为诊断栈的各模块及其对应的配置工具模块。
模 块名 |
功能 |
Can |
CAN驱动配置。(由MCAL工具导入) |
CanIf |
CanIf模块主要处理上层模块与底层驱动的之间 PDU的传递,为上层模块提供统一的接口来管理不同的CAN硬件模块 |
EcuC |
用于辅助配置工具完成配置的模块。主 要提供Pdu的定义,其它模块通过关联EcuC中Pdu,相互关联起来。 |
PduR |
PDU Router主要为通讯接口模块(CANIF)、传输协议模块(CAN TP、J1939 TP)、诊断通讯管理模块(DCM、J1939DCM)以及通讯模块(C OM、LDCOM)以及IPDUM、SECOC等模块提供基于I-PDU的路由服务。 |
CanTp |
CANTP模块实现依据ISO15 765-2标准规范中定义的CAN总线数据在传输层的数据接收发送功能 |
Dcm |
依据ISO15765-3和ISO14229-1标 准描述,实现诊断请求报文的解析,响应(正响应和负响应)与执行 |
Dem |
实现诊断故障的存储与管理功能 ,提供API接口供其他模块读取DTC和对应的冻结帧数据和扩展数据 |
步 骤 * |
操作 |
说明 |
1 |
ORIENTAIS Configurator配置工具 工程搭建和诊断栈模块加载 |
若配置工程已经搭建 ,则仅需进行诊断栈模块的加载操作。 |
2 |
模块配置及配置文件生成 |
进行基础的诊断栈配置 |
3 |
代码集成 |
现有工程、 诊断栈源代码和配置生成文件的集成。 |
4 |
验证测试 |
用CAN报文监测工具收发诊断报文 |
注意:诊断栈集成之前,用户须确保已经有MCAL层可以跑通的基础工程,且诊断栈相关的其他功能栈如通信栈、网络管理栈、NvM栈能正常工作。
新建ORIENTAIS Configurator配置工程及模块加载
安装ORIENTAIS Configurator软件后,双击软件图标打开软件。
图4.1-1
菜单栏File🡪New🡪Project,新建工程。
图4.1-2
在弹出的新建窗口中选择Autosar下的 [BSW Project],选择Next。
图4.1-3
在弹出的窗口中输入工程名,选择Finish。
选择[Bsw_Builder],右键单击,选择New ECU Configuration,在弹出的窗口中选择并填写对应的Ecu名称。
图4.1-5
注意: 可选择的Ecu可能随项目的不同而不同
选择新建的Ecu,右键单击,选择“Add Module选项”。
图4.1-6
在弹出的选项框中勾选相应模块,点击“Finish”。
图4.1-7
新建工程如下所示,上一步中添加的模块已经被加入到工程中。
图4.1-8
模块配置及生产代码
模块配置
** 模块** |
参考文档及其章节 |
说明 |
Can |
MCAL对应的Can配置手册 |
|
CanIf |
参考手册_CanTp.pdf |
|
PduR |
参考手册_PduR.pdf |
|
NvM |
参考手册_NvM.pdf |
|
CanTp |
参考手册_CanTp.pdf |
|
Dcm |
参考手册_Dcm.pdf |
|
Dem |
参考手册_Dem.pdf |
配置代码生成
在ORIENTAIS Configurator主界面左方,选择对应的诊断栈,单击右键弹出Validate All和Generate All菜单。
图4.2.2-1
选择Validate All对本诊断栈各配置选项进行校验。
选择Generate All,生成配置文件。右下角的Console窗口输出生成的配置文件信息。
图4.2.2-2
点击config文件夹,即可查看生成的配置文件。
图4.2.2-3
功能集成
代码集成
诊断栈代码包括两部分:项目提供的诊断栈源码和ORIENTAIS Configurator配置生成代码。诊断栈集成包括诊断栈源码(CANIF,CANSM,PDUR,CANTP,COMM,DCM,DEM等)、定时器源码和部分其他模块源码,具体文件见表4-4。
用户须将诊断栈源码和章节4.2.2生成的源代码添加到集成开发工具的对应文件夹。诊断栈集成的文件结构,见章节5.3。
表4-4诊断栈源码文件
移库文件夹 |
移库文件 |
说明 |
ComM |
ComM.c、ComM.h、 ComM_BusSM.h、 ComM_Com.h、 ComM_Dcm.h、 ComM_BswM.h、 ComM_EcuM.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、PduR_Internal.c 、PduR_Internal.h、PduR_MemMap. h、PduR_Types.h、PduR.c、PduR.h |
|
CanTp |
CanTp.c、CanTp.h、 CanTp_Cbk.h 、CanTp_MemMap.h、CanTp_Types.h |
|
FreeRTimer |
FreeRTimer.c、FreeRTimer.h |
定时器源码 |
Dcm |
Dc m.c、Dcm.h、Dcm_Cbk.h、DcmDsd、 DcmDsl、DcmDsp、Dcm_Include.h、 Dcm_Internal.h、Dcm_MemMap.h、 Dcm_Types.h、 |
Dcm部分源码 |
Dem |
Dem.c、Dem_CfgEnum .h、Dem_CfgTypes.h、Dem_Dcm.c、 Dem_Dcm.h、DemEventDebounce.c、 Dem_EventMemory.c、Dem_EventQue ue.c、Dem_ExtendedData.c、Dem_F reezeFrame.c、Dem_Internal.c、D em_MemMap.h、Dem.h、Dem_Types.h |
Dem部分源码 |
注意:诊断栈集成之前,用户须确保已经有基础工程,且本诊断栈相关的其他功能栈能正常工作。
集成注意事项
对于集成过程中,诊断栈特殊要求和用户经常出现的问题,归类总结形成 表 4‑5诊断栈集成约束清单。用户需逐一排查表中的约束项,以避免集成问题出现。
编 号 * |
类别* |
约束限制 |
** 1** |
中断 |
通信栈 有中断、轮询或混合三种工作模式。若选取中断或混合模 式,用户需在通信栈配置对应的中断并填充中断服务API。 |
** 2** |
堆栈 |
用户需确保为任务堆栈和中断堆栈分配足够的堆栈空间。 |
** 3** |
头文件 |
添加 诊断栈代码之后,用户需更新集成开发工具中的头文件路 径。调用诊断栈API的源文件,需要包含诊断栈的头文件。 |
** 4** |
初始化 |
以CAN通信为例,诊断栈的初始化顺序为:Can_Init, CanI f_Init,PduR_Init,CanSM_Init,CanTp_Init,Dcm_Init |
** 5** |
周 期函数 |
Dcm_MainFunction,Dem_MainFun ction和CanTp_MainFunction需要被周期性任务函数调用。 |
集成示例
本章节通过普通的CAN诊断栈为例,向用户展示诊断栈的集成过程。用户可以据此熟悉诊断栈配置工具的配置过程,以及如何应用配置工具生成的配置文件。
为让用户更清晰的了解工具的使用,所用的配置均逐一手动完成。
注意:本示例不代表用户的实际配置情况,用户需要根据自己的实际需求,决定各个参数的配置。
集成目标
CAN报文需求:
报 文ID |
报文 名称 |
发 送 /接 收* |
发 送 模 式 |
报 文 周 期 |
报文 长度 |
工 作 模 式 |
0x723 |
CAN_DiagReqPhy |
接收 |
触发 |
8字节 |
中断 |
|
0x7ff |
CAN_DiagReqFun |
接收 |
触发 |
8字节 |
中断 |
|
0x623 |
CAN_DiagResp |
发送 |
触发 |
8字节 |
中断 |
模块的配置
新建配置工程及模块加载操作,请参考本文档4.2章节。
Can模块配置
配置诊断协议栈之前需要使用MCAL工具配置Can模块,但是只涉及到与诊断栈中报文收发有关系的部分(主要是HardwareObeject),具体配置选项请参考MCAL工具的帮助手册进行配置。
EcuC模块配置
新建9个PDU,分别用于CanIf、CanTp、Dcm。
图5.2.2-1
为每个PDU配置length(根据项目不同配置不同的Pdu长度)。
图5.2.2-2
图5.2.2-3
注意:Dcm Pdu长度必须与/Dcm/DcmConfigSet/DcmDsl/DcmDslBuffer里面配置的Dcm Tx、RxBuffer长度一致
CanIf模块配置
新建Hoh。
图5.2.3-1
分别新建至少1个接收诊断报文,1个发送诊断报文。
图5.2.3-2
分别新建2个接收诊断PDU,1个发送诊断PDU,UL选择CanTp,并选择在EcuC中配置的CanIf对应的PDU。
图5.2.3-3
图5.2.3-4
图5.2.3-5
图5.2.3-6
PduR模块配置
在PduRBswModules中添加CanTp、Dcm。
图5.2.4-1
添加3个PduRRoutingPath,PduRRouteType配置为TP。
图5.2.4-2
配置诊断功能寻址请求(FuncReq)、物理寻址请求(PhysReq)、响应(Resp)的路由路径。诊断请求的PduRRoutingPath的PduRSrcPdu选择CanTp对应的PDU,PduRDestPDU选择Dcm对应的PDU。诊断响应的PduRRoutingPath的则相反。
图5.2.4-3
图5.2.4-4
CanTp模块配置
CanTpGeneral的配置如下。
图5.2.5-1
添加1个CanTpChannel,CanTpChannelMode配置为FULL_DUPLEX全双工,并添加2个CanTpRxNSdu,1个CanTpTxNSdu,分别对应功能、物理寻址请求及响应。
图5.2.5-2
为每个NSdu配置相关参数,并且选择EcuC中对应的CanTp的PDU。
图5.2.5-3
图5.2.5-4
图5.2.5-5
为每个NSdu配置关联的CanIf对应的PDU,注意功能寻址请求NSdu不需要配置发送流控帧的CanTpTxFcNPdu,物理寻址请求需要配置发送流控帧的CanTpTxFcNPdu,响应的NSdu需要配置接收流控帧的CanTpRxFcNPdu,如下图所示。
图5.2.5-6
图5.2.5-7
图5.2.5-8
Dcm模块配置
DcmGeneral配置
图5.2.6-1
配置DcmDsl,先配置Dcm Tx、RxBuffer及其length,需要与EcuC中Dcm对应的Pdu Length的值保持一致。
图5.2.6-2
配置DcmDslProtocol,选择Protocol、Buffer、ServiceTable。
图5.2.6-3
配置DcmDslMainConnection,选择Dcm通信的ComMChannel,并新建2个DcmDslProtocolRx,1个DcmDslProtocolTx。
图5.2.6-4
为每个DcmDslProtocolRx、DcmDslProtocolTx添加Dcm对应的PDU及寻址类型。
图5.2.6-6
配置DcmDsdServiceTable,添加所需的服务及子服务,及其寻址方式、会话访问限制、安全级访问限制。
图5.2.6-7
配置DcmDspSession,SessionLevel与10服务的子服务对应,P2及P2Star时间参数根据需求进行配置。
图5.2.6-8
图5.2.6-9
配置DcmDspSerurity,SecurityLevel与27服务的子服务对应,如2701、2702对应level1,2705、2706对应level3。
图5.2.6-10
配置DcmDspRoutines,其中DcmDspCommonAuthorizationRef配置为每个Routine的会话访问限制与安全级访问限制。
图5.2.6-11
Routine下的3个容器分别对应3101、3102、3103的子服务功能,可按需求选择配置,并且可在容器中配置子服务的IN/OUT参数类型及长度。
图5.2.6-12
配置DcmDspComControl,此项用于配置28服务控制通信的ComM channel。
图5.2.6-13
配置DcmDspDidInfos,此项为每个Did配置22服务可读或2E服务可写,以及相关的会话访问限制、安全级访问限制。
图5.2.6-14
图5.2.6-15
配置DcmDspDatas,为每个Did配置DcmDspDataUsePort、类型、长度(bit为单位),并按需求选择上一步配置的DcmDspDidInfos。
图5.2.6-16
配置DcmDspDid,配置Did的DcmDspDidIdentifier及DcmDspDidInfos。
图5.2.6-17
配置DcmDspSignal,选择上一步DcmDspDatas中添加的配置。
图5.2.6-18
Dem模块配置
根据需求配置DemGeneral,相关配置项的意义可参考AutoSAR标准或Dem参考手册。
图5.2.7-1
图5.2.7-2
图5.2.7-3
配置DemDataElementClass,其中可配置DemInternalDataElement(Dem内部数据)及DemExternalCSDataElement(外部CS接口获取数据)。
图5.2.7-4
图5.2.7-5
图5.2.7-6
配置扩展数据Extended Data,需要配置DemExtendedDataRecordClass以及DemExtendedDataClass,如下图所示添加相应的配置。
图5.2.7-6
配置冻结帧Freeze Frame,需要配置DemDidClass、DemFreezeFrameClass、DemFreezeFrameRecNumClass以及DemFreezeFrameRecordClass,如下图所示添加相应的配置。
图5.2.7-7
图5.2.7-8
图5.2.7-9
图5.2.7-10
配置DemPrimaryMemory,配置Event存储的最大数量,一般与DTC数量保持一致,若DTC数量太大,可考虑采用Displacement策略,减少此存储数量。
图5.2.7-11
配置DemDTCAttribute,选择上面几步配置中添加的配置项。
图5.2.7-12
配置DemDebounceCounterBasedClass
图5.2.7-13
配置DemDebounceTimeBasedClass
图5.2.7-14
配置DemDTC,添加DTC Value,并选择DemDTCAttribute。
图5.2.7-15
配置DemEventParameter,选择Event类型、关联的DTC及操作循环等,并可根据需求配置是否添加Debounce以及Debounce Base。
图5.2.7-16
图5.2.7-17
源代码集成
诊断栈源代码集成步骤如下:
在MCAL工程的基础上,同步5.2.1章添加的Can模块配置文件。
从基线中取出4.3.1章中相关的源代码添加到工程中。
将在4.2.2章中ORIENTAS配置生成的诊断相关配置文件添加到工程中。
添加相关头文件目录。
诊断栈调度集成
诊断栈调度集成步骤如下:
集成CanTp_Callout.c中CanTp_ResetTime、CanTp_GetTimeSpan函数。
集成Dcm_Callout.c中Dcm_ResetTime、Dcm_GetTimeSpan函数。CanTp_Callout.c集成源码如下(若无TM模块,使用FreeRTimer中的接口):
图5.4-1
Dcm_Callout.c集成源码如下(本工程集成OS相关接口,如果项目中无OS,可使用FreeRTimer中的接口):
图5.4-2
图5.4-3
诊断栈调度集成,需要逐一排查并实现表 4‑5诊断栈集成约束清单 所罗列的问题,以避免集成出现差错。
#include “main.h”
#include “Can.h”
#include “CanIf.h”
#include “Com.h”
#include “PduR.h”
#include “Dcm.h”
#include “CanTp.h”
#include “Dem.h”
int main(void)
{
CanIf_Init(&CanIf_InitCfgSet);
PduR_Init(&PduR_PBConfigData);
CanTp_Init(&CanTp_Config);
Dcm_Init(&Dcm_Cfg);
Dem_PreInit();
Dem_Init(&DemPbCfg);
Dem_SetOperationCycleState((uint8)DemOperationCycle_IGON_ID,
DEM_CYCLE_STATE_START );
Dcm_ComM_FullComModeEntered(0);
while (1)
{
if(Flag_1_ms == true)
{
Flag_1_ms = false;
}
if(Flag_5_ms == true)
{
CanTp_MainFunction();
Flag_5_ms = false;
}
if(Flag_10_ms == true)
{
Dcm_MainFunction();
Dem_MainFunction();
Flag_10_ms = false;
}
}
}
编译链接代码,将生成的elf文件烧写进芯片。
验证结果
根据集成目标,共配置了3个报文,其中2个接收报文分别为诊断物理寻址及诊断功能寻址,1个发送报文为诊断响应。
图5.5-1