今天介绍PduR模块的下层模块—CANTP模块。
1 CANTP的位置和作用
CanTp是PduR和CANIf模块之间的模块,如图1所示。CANTp模块的主要作用是对CAN I-PDU进行分段和重新组装,使得I-PDU的长度不大于8个字节,对CAN FD而言,CAN I-PDU不大于64个字节。
PduR模块将AUTOSAR COM和 DCM的I-PDU部署到不同的通信协议上。通过I-PDU标识符路由到不同的网络系统类型(例如CAN、LIN和FlexRay)。PduR还决定是否必须使用传输协议。最后,在没有速率转换的情况下,实现网关功能。
CanIf提供了平等的机制来访问CAN总线通道,不管控制器芯片存在于内部还是外部。从CAN控制器的位置,提取ECU的硬件布局和CAN驱动器的数量。因为CanTp只处理传输协议帧(即SF、FF、CF和FC PDU),根据N-PDU ID, CANIf必须将I-PDU转发给CanTp或PduR,图1中也展示得也很清晰。
根据AUTOSAR BSW架构,CanTp提供以下服务:
-
数据在传输方向的分割;
-
按接收方向重新组装数据;
-
控制数据流;
-
检测错误分割会议。
-
传输取消
-
AUTOSAR决定将BSW模块规范建立在现有标准的基础上,所以,AUTOSAR CAN传输层规范是基于汽车领域最常用的国际标准ISO15765。ISO 15765描述了两个适用的CAN传输层规范:OEM增强型诊断:采用ISO 15765-2;OBD诊断:采用ISO15765-4。
虽然CAN传输协议主要用于车辆诊断系统,但它也被开发用于处理来自其他基于CAN的需要传输层协议系统的需求。
CanTp模块提供用于分割、流控传输和消息重新组装的服务。它的主要目的是发送和接收可能适合也可能不适合一个CAN帧的消息。不适合一个CAN帧的消息被分割成多个部分,这样每个部分都可以在一个CAN帧中传输。
2 连接和相互关系
在AUTOSAR架构中,传输协议将用于传输诊断(例如OBD和UDS协议)和AUTOSAR COMI-PDU。因此,CanTp模块能够同时处理多个连接,即多个分段并行会话。
同时连接的最大数量通过静态配置实现。这种配置对生成的代码的复杂性和资源消耗(CPU、ROM和RAM)有重要的影响,因为资源必须为并发访问保留,例如Rx和Tx状态机,用于处理N-PCI数据的变量等。
为了可以同时接收或发送I-PDU,每个N-SDU标识符将通过配置好的CanTp”连接通道“进行内部路由。由于“连接通道”不能从外部访问,所有传输N-SDU所需的信息都将链接到的N-SDU标识符,比如“连接通道”号、超时、寻址格式等。
根据元数据配置,N-SDU可以作为定义N_AI的特定连接,也可以作为通用连接,其中N_TA、N_SA和N_AE在运行时不同,而N_TAtype、MType和寻址格式是静态定义的。AUTOSAR通信栈支持周期模式和事件触发模式。因此,每个通信层都可以通过不同的机制接收来自下层的信息,并将信息传播到上层。
为了优化通信栈,AUTOSAR限制了CANTp的缓冲能力。因此,CanTp将N-SDU有效载荷直接从上层(DCM、COM或PDUR在1:1 TP路由的情况下)复制到CAN驱动程序,反之亦然。为了保证数据的一致性,上层会遵循以下规则:
图2 发送层的相互关系
在运行时,CAN传输模块必须具有管理传输连接所需的所有信息。因此,应该静态配置以下属性:
- CAN N-SDU的数目
- 每个CAN N-SDU的唯一标识符
- 每个CAN的通信方向N-SDU (Tx或Rx)
- 每个连接的寻址格式(普通、扩展、混合11位、普通固定或混合29位),根据寻址格式,另外:对于使用带有元数据的N-SDU的通用连接,可以省略静态寻址信息。
-
-
-
-
-
-
Mixed 29 bit:N_TA, N_SA, N_AE
关联的CAN L-SDU标识符,每个CAN N-SDU标识符,如果需要(多帧分割会话),CAN L-SDU标识符用于传输CAN FC N-PDU经典CAN帧和CAN FD帧
3 帧类型
CanTp提供四种帧类型对网络层数据进行解析。分别是单帧(Signle Frame),首帧(Frist Frame),连续帧(Consecutive Frame),流控帧(Flow Control)。
图3 四种帧类型
对于未分段的数据(一个CAN报文能发送完成)CanTp提供了协议的优化实现,将数据长度嵌入在PCI字节中,单帧一般是传输不分段数据和用于建立数据传输请求。
2.首帧
首帧用于传递不能单帧传输数据的第一帧数据,接收方接收到首帧后,应返回流控帧告知接收能力,同时做好接收多帧的准备。
3.连续帧
连续帧应在首帧之后发送,接收节点一旦收到连续帧,应将全部数据组装完成。
图4 发送多帧接口调用
图5 接收多帧接口调用
4.流控帧
流控帧的作用是调节连续帧的发送速率,流控帧应包含帧的控制信息:FS,BS,STmin。在收到首帧后就应返回流控帧,告知发送方当前接收状态以及接收能力。
其中,BS(Block Size):发送的数据量。
STmin(Separation Time Min):多帧间的最小间隔时间。
FS(Flow Status)有三种状态:
4 上下层服务
4.1 为上层提供的服务
CAN传输层使用PDUR的回调函数来复制传输数据,确认传输,发起接收,复制接收到的数据,指示接收到的消息,关键函数如下:
PduR_CanTpRxIndication()
PduR_CanTpStartOfReception ()
PduR_CanTpCopyRxData ()
PduR_CanTpCopyTxData ()
PduR_CanTpTxConfirmation()
初始化和关机
通信服务
CANTp模块有两个内部状态:CANTP_OFF和 CANTP_ON。
如图6中,下电后CANTp为CANTP_OFF状态,在该状态下,允许更新CANTp的配置。CANTp通过CanTp_Init()成功初始化后,状态切换到CANTP_ON。只有在CANTP_ON的状态下,可以对CAN I-PDU进行分段和重新组装。CanTp_Init()将对模块的所有全局变量进行初始化,并将所有传输协议连接设置为CANTP_ON的子状态,在这个子状态(状态为CANTP_RX_WAIT和CANTP_TX_WAIT)中,分段传输和分段接收都处于进行中。
如果启用了CanTp模块的开发故障检测,则在调用CanTp_Init函数之前,当PDUR或CAN接口层尝试使用任何函数(CanTp_GetVersionInfo除外)时,CanTp模块将引发一个错误(CANTP_E_UNINIT)。
如果全局状态是CANTP_ON,CanTp模块会被调用,CanTp_Init会返回默认状态(状态= CANTP_ON,但是传输和接收正在进行中)。如果在CanTp模块处于全局状态CANTP_ON时调用CanTp_Init,则CanTp模块将释放所有当前连接。函数CanTp_Shutdown将正常停止CanTp模块。
图6 CAN TP的生命周期
传输操作cantp_transmission()将允许上层使用CAN传输协议(分段、扩展地址格式等)请求数据传输。函数cantp_transmission()是异步的。接收到发送请求后,如果N-SDU传输完成(成功或失败),CanTp模块会通知到上层。
当然,CANTp允许上层取消正在进行的传输。比如,由于要接收其他更高优先级的诊断协议,CANTp可以取消诊断传输。这一特性通过静态配置参数CanTpTc来激活。发送取消通过调用cantp_canceltransmission()函数来触发。
在调用服务cantp_canceltransmission()之后,该连接上的传输将被中止。需要注意的是,PduR_CanTpTxConfirmation()函数在E_NOT_OK值时,传输将被取消。
4.2 为下层提供的服务
CAN传输层使用CAN接口的以下服务来传输CAN N-PDUs:
根据通信栈的AUTOSAR规范,CAN传输层向CAN接口提供以下两个回调函数:CanTp_TxConfirmation()和CanTp_RxIndication()。
CanIf模块调用传输确认函数,通知CAN传输层CanTp请求的CAN帧传输是否成功执行。L-PDU标识符与调用相关联,以便识别相应的传输。当超过最大时间(等于N_As)没有收到发送确认时,CanTp模块将中止相应的会话。在收到TxConfirmation之前,N-PDU对于其他并发会话仍然不可用,不管成功与否。
对于确认调用,CanTp模块应提供函数CanTp_TxConfirmation()。当使用结果E_NOT_OK调用CanTp_TxConfirmation()时,CanTp将中止corrensponding会话。
CanIf模块调用接收指示函数,通知CanTp模块接收到新的CAN N-PDU帧(即传输协议帧)。接收指示可以根据CanIf配置在中断服务(ISR)中执行。对于接收指示,CanTp模块应提供cantp_rxspecification()。
CAN传输层的内部操作,为了实现”在单个CAN帧或多个CAN帧中传输消息“的目标,提供了基本的机制来执行。CAN传输层的整个行为将被事件触发,这样CanTp就可以直接处理来自PDUR N-SDU的传输。
当接收到SF或FF N-PDU时,CanTp模块使用PduR_CanTpStartOfReception函数通知上层PDUR接收。上层将预留并锁定一个缓冲区来接收N-SDU。
CanTp使用PduR_CanTpStartOfReception()的参数TpSduInfoPtr向PduR提供FF/SF的内容。接收到的数据链路层数据长度(RX_DL)由CAN帧PDU(CAN_DL)的第一个有效载荷长度派生而来,具体:
- 对于小于或等于8字节的CAN_DL值,RX_DL值应该是8。
- 对于大于8字节的CAN_DL值,RX_DL值等于CAN_DL值。
5 API函数
关于CAN TP模块中的函数,这里就不展开介绍了,后续有机会串讲完整通讯过程时,再展开。主要的API函数包括:
-
CanTp_Init
-
CanTp_ GetVersionInfo
-
CanTp_Shutdown
-
CanTp_Transmit
-
CanTp_CancelTransmit
-
CanTp_CancelReceive
-
CanTp_ChangeParameter
-
CanTp_ReadParameter
-
CanTp_MainFunction
CanTp是AUTOSAR通信栈中负责网络解析的模块。从上到下,CANTp负责对CAN I-PDU进行分段和重新组装;从下到上,负责接收CanIf层传输的N-PDU数据解析成I-PDU数据,并传递给PDUR模块。CanTp只处理传输协议帧,即单帧,首帧,连续帧,流控帧。同时,CANTp层,只支持事件触发模式。
缩略词:
CAN Communication Matrix:CAN通信矩阵,用来描述完整的CAN网络,包括:涉及的CAN节点;CAN PDU的定义(ID和数据长度DLC);PDU的发送和接收信息。
Physical Channel:物理通道。代表CAN网络的接口,不同CAN硬件单元的不同物理通道可以访问不同的网络。
DCM:Diagnostic Communication Manager,诊断通信管理
COM IF:communicationinterface modules,通讯接口模块
Communication Transport:通讯传输
I-PDU Multiplexer:I-PDU多路复用
DLC:Data LengthCode,描述SDU长度的CAN信息。
I-PDU: Interaction Layer Protocol Data Units,交互层协议数据单元。
L-PDU:Data LinkLayer Protocol Data Unit,数据链接层的协议数据单元,包含标识符(ID), 数据长度(DLC)和数据(L-PDU)
L-SDU:Data LinkLayer Service Data Unit数据链接层服务数据单元,它其中的数据传输到L-PDU中。
N-SDU:CAN传输层的服务数据单元。其中的数据传输到N-PDU中。
PDU Router:协议数据单元路由。将I-PDU从一个模块传递到另外一个模块,PDU Router可以用于网关运行或内部路由。
I-PDU group:I-PDU组 是COM模块中相同方向(即发送或接收)的I-PDU的任意集合。
Dem:DiagnosticEvent Manager,诊断事件管理
作者简介:
Demu,传统汽车电控向智能驾驶转变的汽车人。从事发动机控制器系统工程师和软件工程师多年,有丰富的ECU系统和软件设计经验。欢迎大家一起留言交流,共同进步。