UDS协议: 基于AUTOSAR架构的UDS服务软件实现

发布于 2023-2-15 15:39
浏览
0收藏

欢迎来到《UDS协议详解系列》的第5篇文章,从本文开始介绍基于CAN总线的UDS服务软件,与另一个《CAN通讯系列》一样,也是基于AUTOSAR架构。若有了解过CAN通讯系列文章,则可知有提到UDS服务的软件路径:CanDrv--CanIf--CanTp--PduR--Dcm,如下图1所示。

UDS协议: 基于AUTOSAR架构的UDS服务软件实现-汽车开发者社区

图1 AUTOSAR架构通讯模块,引自[1]


本质上,AUTOSAR架构的通讯功能是基于OSI参考模型来构建,即CAN Driver和CAN Interface模块对应数据链路层(Data Link Layer),CAN Transport模块对应网络层(Network Layer),Dcm模块对应应用层(Application Layer),如下图2所示。

UDS协议: 基于AUTOSAR架构的UDS服务软件实现-汽车开发者社区

图2 引自[2]


其实这些AUTOSAR模块就是OSI相对应层的标准协议的软件实现,而这些模块的AUTOSAR文档基本可看成是软件的说明文档。下面就通过对这些AUTOSAR文档的梳理,来大致介绍UDS服务的接收请求,请求处理和发送响应过程。

接收请求

基于CAN总线来实现UDS服务通讯,是指使用CAN ID进行接收和发送。一般使用2个CAN ID进行接收,一个对应物理寻址,另一个对应功能寻址;而发送则使用一个CAN ID即可。这里可先回顾下CAN通讯系列:menghuyouyou:CAN通讯系列--AUTOSAR架构的CAN通讯5 对于接收部分,不管是CAN通讯还是UDS服务都是在CAN Driver去访问硬件(寄存器),读取数据,然后通知CAN Interface。对于CAN通讯,再向上经PduR路由到COM模块;而UDS服务是先向上到CanTp处理,再向上经PduR路由到DCM模块,如下图3所示。

UDS协议: 基于AUTOSAR架构的UDS服务软件实现-汽车开发者社区

图3 UDS服务的接收请求过程


具体过程描述如下:


1.轮询模式时,BSW调度器周期性调用CAN Driver模块的Can_MainFunction_Read函数;


2.CAN Driver模块的Can_MainFunction_Read函数将访问CAN Controller(硬件)的寄存器,比如仲裁寄存器,数据寄存器和数据长度寄存器,读取这些寄存器的数据;


3.数据读取结束后,这时再调用CAN Interface模块的CanIf_RxIndication函数,这样数据从CAN Driver模块传给了上一层的CAN Interface模块;


4.CAN Interface模块识别到数据的CAN ID为UDS服务,则调用CanTp模块的CanTp_RxIndication函数,将数据传到CanTp模块;


5.CanTp模块接收数据后,先通过N_PCI类型来判断单帧传输(SF?)还是多帧传输(FF?CF?FC?);然后根据相应的类型去处理:(这里的依据是ISO15765-2协议)


  • 当接收到单帧(SF),需要确认DCM模块接收数据的buffer是否够用,够用则存入数据,再经PduR路由,调用Dcm_TpRxIndicaiton通知DCM模块。

UDS协议: 基于AUTOSAR架构的UDS服务软件实现-汽车开发者社区

  • 当接收到首帧(FF),需要先确认DCM模块发送数据的buffer是否够用,再确定流控帧的BS和STmin,最后直接请求发送流控帧。(注意:接收首帧后是不需要DCM模块处理,而是直接由CanTp模块来处理,因为接收首帧意味着要回流控帧,告诉发送方要怎么回续帧,属于网络层的内容)

UDS协议: 基于AUTOSAR架构的UDS服务软件实现-汽车开发者社区

  • 当接收到续帧(CF),可能存在如下3种情况:

UDS协议: 基于AUTOSAR架构的UDS服务软件实现-汽车开发者社区

UDS协议: 基于AUTOSAR架构的UDS服务软件实现-汽车开发者社区

  • 当接收到流控帧(FC),需要根据流控状态来确定是否继续发送续帧,当继续发送续帧时,也需要根据流控帧数据来更新续帧的发送配置(BS和STmin)。

UDS协议: 基于AUTOSAR架构的UDS服务软件实现-汽车开发者社区

6. DCM模块接收到CanTP的通知,会去判断请求是否允许。


注:CanTp模块其实应用接收数据做了很多操作,并非图3简单的示意向上通知,具体会在下篇文章进行介绍。

请求处理

当DCM模块允许处理请求后,当BSW调度器周期性调用Dcm_Mainfunction函数进行请求处理,这部分处理的内容其实就是对应的ISO14229协议。比如接收的数据是10 03,那么Dcm_Mainfunction就会去调用$10服务的相应函数,最终回复正响应10 03 00 32 01 F4,还是负响应 7F 10 xx。若参考AUTOSAR文档,其架构如下图4所示:

UDS协议: 基于AUTOSAR架构的UDS服务软件实现-汽车开发者社区

图4 DCM模块组成,引自[3]


这部分内容仅先了解它的功能是干什么的,不做具体介绍,将会在后面的文章展开。

发送响应

当DCM模块处理好了请求,总的来说,分为两个关键步骤:一个是DCM模块经PduR路由,将调用CanTp_Transmit函数更新网络层的配置;另一个是将通过BSW调度器调用CanTp模块的CanTp_MainFunction函数来发送数据。

UDS协议: 基于AUTOSAR架构的UDS服务软件实现-汽车开发者社区

图5 UDS服务的请求处理和响应发送过程


图5描述了数据发送的具体过程,即:


1.BSW调度器周期性调用DCM模块的Dcm_MainFunction函数,处理请求,响应数据暂存入DCM模块发送的buffer;


2.DCM模块处理完请求后将调用PduR模块的PduR_DcmTransmit函数,PduR模块经路由到CanTp模块,调用CanTp_Transmit函数,该函数将更新CanTp模块的相关传输参数配置;


3.然后再下个周期,BSW调度器周期性调用CanTp模块CanTp_MainFunction函数,该函数将调用CAN Interface模块的CanIf_Transmit函数,这样数据从CanTp模块传到了下层的CAN Interface模块;


4.CAN Interface模块再调用Can Driver模块的Can_Write函数,将数据写入相应的寄存器;


5.与CAN接收功能一样,Can_Write函数将访问仲裁,数据长度和数据寄存器,将数据写入。


图5也描述了数据发送后的确认过程,即:


1.BSW调度器周期性调用CAN Driver模块的Can_MainFunction_Write函数;


2.CAN Driver模块的Can_MainFunction_Write函数将访问CanController(硬件)有关寄存器,读取有关数据供向上层确认;


3.数据读取结束后,这时继续调用CAN Interface模块的CanIf_TxComfirmation函数,这样数据从CAN Driver模块传给了上层的CAN Interface模块;


4.CAN Interface模块再调用CanTp模块的CanTp_TxConfirmation函数,将数据传到CanTp模块;


5.CanTp模块再调用PduR模块的PduR_TxConfirmation函数,将数据传到PduR模块;


6.PduR模块路由到DCM模块,调用Dcm_TxConfirmation函数,确认发送状态。


Reference:

[1] AUTOSAR Layered Software Architecture

[2] ISO15765-3 Road vehicles - Diagnostics on Controller Area Networks(CAN) - Part3: Implementation of unified diagnostic services(UDS on CAN)

[3] Specification of Diagnostic Communication Manager.pdf


文章转载自公众号:汽车电子与软件


分类
标签
收藏
回复
举报
回复
相关推荐