1、概述
TP位于硬件抽象层的上层,在AUTOSAR的结构里面位置如下
CanTp的协议着重需要查阅的ISO规范文档如下
《ISO 15765[1].2(2004)道路车辆——控制局域网络诊断——第2部分:网络层服务.pdf》
目前笔者使用的TP来讲CanTp与J1939TP居多一些,CanTp:ISO诊断(DCM),标准CAN总线上的大型PDU传输,J1939Tp: J1939诊断,大型PDU传输J1939驱动的CAN总线。
CanTp位于CanIf与PDUR之间,主要目的是对大于8字节的CAN I-PDU,大于64字节的CANFD I-PDU进行分段与重组。位置如下图。
CAN接口(Canlf)提供了平等的机制来访问CAN总线通道,而不管它的位置(uC内部/外部)。从CAN控制器的位置(片上/板上)提取ECU硬件布局和CAN驱动程序的数量。由于CanTp只处理传输协议帧(即SF, FF, CF和FC pdu),根据N-PDU ID, CAN接口必须将I-PDU转发给CanTp或PduR。
根据AUTOSAR的基本软件架构,CanTp提供以下服务:
传输方向的数据分割;
接收方向的数据重组;
数据流控制;
检测分段会话中的错误。
传输取消
接收取消
2、名词缩写
2.1、前缀含义
前缀符号缩写
前缀 | 描述 |
I- | 关联AUTOSAR COM交互层 |
L- | 关联CanIf,相当于逻辑链路层,上层是数据链路层下层为介质访问控制,介质其实就是硬件抽象 |
N- | 关联CanTp,可以认为是网络层,个人理解N代表多个 |
2.2、协议数据缩写
关联CanTp的缩写词, PDU是“协议数据单元”的缩写。PDU包含SDU和PCI。在传输端,PDU从上层传递到下层,下层将这个PDU解释为它的SDU。
缩写词 |
描述 |
CAN L-SDU |
属于CanIf模块,与N-PDU类似 |
CAN LSduId |
CanIf内独一无二的ID,用于引用L-SDU的路由属性,因此为了通过API与CanIf交互,上层可以引用CAN L-SDU的结构体以此进行数据传递 |
CAN N-PDU |
这是CANTP的PDU。它包含唯一标识符、数据长度和数据(协议控制信息加上整个N-SDU或其中的一部分)。 |
CAN N-SDU |
这是CANTP的SDU。在AUTOSAR体系结构中,它是来自PDU路由器的一组数据。 |
CAN N-SDU Info Structure |
这是一个CANTP内部常量结构,包含特定的CAN传输层信息,用于处理相关CAN N-SDU的发送、接收、分段和重组。 |
I-PDU |
这是AUTOSAR COM模块的PDU |
PDU |
在分层系统中,它指的是在给定层的协议中指定的数据单元。它包含该层(SDU)的用户数据以及可能的协议控制信息。X层的PDU为其下层X-1层的SDU,即(X)-PDU =(x-1)-SDU)。 |
PduInfoType |
该类型是指用于存储处理PDU(或SDU)收发基本信息的结构,即指向其在RAM中的有效载荷的指针及其长度(以字节为单位)。 |
SDU |
在分层系统中,这是指由给定层的服务用户发送的一组数据,并将其传输给对等服务用户,同时保持语义不变。 |
3、帧类别
参考《ISO 15765[1].2(2004)道路车辆——控制局域网络诊断——第2部分:网络层服务.pdf》
CanTp模块会对消息分段成四种类型的帧。分别是单帧(Single Frame,SF),首帧(FirstFrame,FF) ,连续帧(Consecutive Frame,CF),流控帧(Flow Control Frame,FC),区分4种帧的关键信息在于N_PCI字节的N_PCItype中,如上图。N_PCI对应有三个字节 N_PCItype仅仅占用第一个字节的高4bit。
3.1、单帧 SF NPCItype = 0
对于未分段的数据(一个CAN报文能发送完成) CanTp提供了协议的优化实现,将数据长度嵌入在PCI字节中,单帧一般是传输不分段数据和用于建立数据传输请求。SF-DL是单帧的数据场长度。在CAN 2.0通常寻址时,长度值小于7字节。如下 02中的0表示单帧2表示后面跟了两个字节
3.2、首帧 FF NPCItype = 1
首帧用于传递不能单帧传输数据的第一帧数据,接收方接收到首帧后,应返回流控帧告知接收能力,同时做好接收多帧的准备。FF_DL是首帧的数据场长度。在CAN2.0中长度值多达4095字节。
10 10 里面的 1表示首帧 010表示传输数据长度16字节
3.3、连续帧 CF NPCItype = 2
连续帧应该在首帧之后发送,接收字节一旦收到连续帧,应将全部数据组装完成,SN是连续的序号,范围是0-15,也就是0x00-0x0F。
当大于2F时候会怎样呢?如下图所示
3.4、流控帧 FC NPCItype = 3
流控帧的作用是调节连续帧的发送速率,流控帧应包含帧的控制信息:FS,BS,STmin。在收到首帧后就应返回流控帧,告知发送方当前接收状态以及接收能力。其中,BS(Block Size):发送的数据量。STmin(SeparationTime minimum):多帧间的最小间隔时间。FS(Flow Status):流状态。
BS:Block Size 发送的数据量,例如此处为0x0A,后面也就只能再最大发10个连续帧。假设此处BS为0表示可以一直发连续帧的。
STmin:多帧的最小时间间隔
FS:Flow Status 流状态
FS有三种状态
CTS:Continue To Send 继续发送状态
WAIT:等待
OVFLW:溢出
5、N_AI
N_AI参数用于标识消息发送者和接收者的源地址(N_SA)、目标地址(N_TA),以及消息的通信模型(N_TAtype)和可选的地址扩展名(N_AE)。
4、注意事项
当发送多个Segmented的时候,中间是有流控帧出现的,如下结构
假设单独的block时候,与3.3章节一样了,中间一直是连续帧,直到数据传递结束。
5、CanTp的时间参数
时间参数总图示如下
5.1、传输层时间参数
传输层 | BS | Block Size ECU发送流控帧后,Tester被允许发送连续帧最大帧数据,为0可以一直发。 |
STmin | ECU发送流控帧后,连续帧之间的最大时间间隔 |
5.2、网络层时间参数
以下时间参数一旦超过就会传输中断!!!
网络层 | N_As S均代表发送方,例如loader烧录的上位机 | 发送方从请求发送到发送完成的时间间隔,超过这个时间发送中断,一般为70ms。 举例上位机发03 22 F1 84 ECU响应10 01 62 F1 84 这段时间 |
N_Bs | 首帧发送成功的时间节点到流控帧接收成功的时间节点,也就是说从数据确认发送到收到流控帧的最大时间间隔,一般为150ms | |
N_Cs | 接收到流控帧到发送连续帧的最大时间间隔,此处注意不是STmin的含义,一般为50ms | |
N_Ar R代表接收方,例如loader烧录的ECU下位机 | 传输流控帧到发送方的时间,一般为70ms | |
N_Br | 接收到首帧到发送流控帧的时间,一般为50ms | |
N_Cr | 接受方成功发送流控帧到接收到连续帧的时间,一般为150ms |
5.3、会话层时间参数
会话层 | S3_Tester | 发送方维持非默认会话的最大时间 |
S3_Sever | 接收方未接受到任何诊断报文维持在非默认会话下的时间 |
5.4、应用层时间参数
应用层 | P2_Client | 发送方发送完请求消息后等待服务器响应超时的时间 |
P2*_Client | 发送方收到否定响应码为0x78的否定响应后等待接受方发送响应的增强型超时时间设置。 | |
P2_Sever | 接收方收到请求后发出响应的实际时间 | |
P2*_Sever | 接收方发送0x78否定响应到发出否定响应的实际时间。(此处很少用) | |
P3_ClientPyh | 发送方在收到物理寻址(phy)的肯定响应下允许发送下一条物理寻址请求的最小时间间隔 | |
P3_ClientFun | 发送方在收到物理寻址(phy)的肯定响应下允许发送下一条功能寻址(fun)的最小时间间隔 |