AUTOSAR通信篇—CANTP模块

CANTP模块是AUTOSAR通信栈的一部分,负责CAN总线上的数据分段和重组,处理单帧、首帧、连续帧和流控帧。它在PduR和CANIf之间工作,管理多个连接并支持事件触发模式。CANTP的职责包括数据传输、流量控制和错误检测,其功能和服务直接影响到CAN网络上的数据交换效率和可靠性。

今天介绍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还决定是否必须使用传输协议。最后,在没有速率转换的情况下,实现网关功能。

                     图1    CAN TP在BSW通信中的位置

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通信栈支持周期模式和事件触发模式。因此,每个通信层都可以通过不同的机制接收来自下层的信息,并将信息传播到上层。

对于CANTp层,只支持事件触发模式。

为了优化通信栈,AUTOSAR限制了CANTp的缓冲能力。因此,CanTp将N-SDU有效载荷直接从上层(DCM、COM或PDUR在1:1 TP路由的情况下)复制到CAN驱动程序,反之亦然。为了保证数据的一致性,上层会遵循以下规则:

  • 在传输时,从发送请求到收到发送确认,N-SDU数据的有效载荷将保持不变;

  • 在接收时,从接收开始到接收指示被接收,N-SDU数据访问将被锁定。

                              图2  发送层的相互关系

在运行时,CAN传输模块必须具有管理传输连接所需的所有信息。因此,应该静态配置以下属性:

  • CAN N-SDU的数目

  • 每个CAN N-SDU的唯一标识符

  • 每个CAN的通信方向N-SDU (Tx或Rx)

  • 每个连接的寻址格式(普通、扩展、混合11位、普通固定或混合29位),根据寻址格式,另外:对于使用带有元数据的N-SDU的通用连接,可以省略静态寻址信息。

    • Normal:none

    • Extended:N_TA

    • Mixed 11 bit:N_AE

    • Normal fixed:N_TA, N_SA

    • Mixed 29 bit:N_TA, N_SA, N_AE

  • 每个连接的寻址格式(普通、扩展或混合),如果是扩展寻址格式,则为N_TA值,如果是混合寻址格式,则为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  四种帧类型

1. 单帧

对于未分段的数据(一个CAN报文能发送完成)CanTp提供了协议的优化实现,将数据长度嵌入在PCI字节中,单帧一般是传输不分段数据和用于建立数据传输请求。

2.首帧

首帧用于传递不能单帧传输数据的第一帧数据,接收方接收到首帧后,应返回流控帧告知接收能力,同时做好接收多帧的准备。

3.连续帧

连续帧应在首帧之后发送,接收节点一旦收到连续帧,应将全部数据组装完成。

                       图4  发送多帧接口调用

                         图5  接收多帧接口调用

4.流控帧

流控帧的作用是调节连续帧的发送速率,流控帧应包含帧的控制信息:FS,BS,STmin。在收到首帧后就应返回流控帧,告知发送方当前接收状态以及接收能力。

其中,BS(Block Size):发送的数据量。

STmin(Separation Time Min):多帧间的最小间隔时间。

FS(Flow Status)有三种状态:

  • FC.CTS:continue to send, the authorization to continue

  • FC.WAIT:the request to continue to wait

  • FC.OVFLW:buffer overflow

4  上下层服务

4.1  为上层提供的服务

CAN传输层使用PDUR的回调函数来复制传输数据,确认传输,发起接收,复制接收到的数据,指示接收到的消息,关键函数如下:

    PduR_CanTpRxIndication()

    PduR_CanTpStartOfReception ()

    PduR_CanTpCopyRxData ()

    PduR_CanTpCopyTxData ()

    PduR_CanTpTxConfirmation()

CanTp模块的服务接口主要分为两大类:

  初始化和关机

   通信服务

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:

    CanIf_Transmit ()      

根据通信栈的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中。

SF:Single Frame,单帧

FF:First Frame,首帧

CF:ConsecutiveFrame,连续帧

N-PDU:CAN传输层的网络协议数据单元。

N-SDU:CAN传输层的服务数据单元。其中的数据传输到N-PDU中。

PDU Router:协议数据单元路由。将I-PDU从一个模块传递到另外一个模块,PDU Router可以用于网关运行或内部路由。

I-PDU group:I-PDU组 是COM模块中相同方向(即发送或接收)的I-PDU的任意集合。

Dem:DiagnosticEvent Manager,诊断事件管理

<think>好的,我现在需要处理用户关于AUTOSAR CP CanTP模块中SWS_CanTp_00081需求的解释请求。首先,我需要确认用户提到的需求的具体内容,但用户可能没有直接提供SWS_CanTp_00081的详细描述。根据提供的引用资料,特别是引用[2]中提到了SWS_CanTp_00078,这涉及到CanTp_RxIndication函数。可能SWS_CanTp_00081是相关的另一个需求,但需要进一步推断。 接下来,我需要查阅相关的AUTOSAR规范文档,但用户提供的引用中并没有直接提到SWS_CanTp_00081。不过,引用[3]提到CanTp规范基于ISO 15765-2,这可能与分段传输相关。CanTP模块负责处理CAN传输协议,包括数据的分段和重组,因此SWS_CanTp_00081可能与传输确认或数据接收有关。 考虑到引用[2]讨论的是接收显示函数CanTp_RxIndication,SWS_CanTp_00081可能涉及传输确认函数,比如CanTp_TxConfirmation,这在引用[1]的API列表中有提到。TxConfirmation通常用于通知上层传输完成或失败,这可能对应需求中的流控处理或传输状态管理。 此外,引用[1]的API规范中提到了CanTp_Transmit函数,用于发送数据,而CanTp_TxConfirmation是回调函数,用于确认传输完成。因此,SWS_CanTp_00081可能规定了在数据传输完成后必须调用TxConfirmation,以确保通信的可靠性和状态更新。 需要确认需求编号与功能之间的对应关系,可能需要假设SWS_CanTp_00081涉及传输确认机制。同时,结合ISO 15765-2的分帧和流控,该需求可能要求正确处理多帧传输的确认,确保数据完整性和顺序。 总结起来,用户的问题可能围绕CanTP模块在数据传输完成后的确认机制,以及如何通过API函数实现这一需求。需要根据提供的引用和AUTOSAR标准,解释该需求的目的、实现方式和相关API函数的作用。</think>### AUTOSAR CP CanTp模块SWS_CanTp_00081需求解释 根据AUTOSAR规范,**SWS_CanTp_00081**需求与CanTp模块的**流控(Flow Control)机制**相关,具体涉及**多帧数据传输的接收端行为**。以下是详细解释: --- #### **需求背景** CanTp模块遵循ISO 15765-2标准,负责CAN总线上长数据的分段传输与重组[^3]。在**多帧传输场景**中,接收端需通过流控帧(Flow Control Frame)控制发送端的数据速率和块大小,以避免缓冲区溢出。 --- #### **SWS_CanTp_00081核心内容** 需求描述通常包括以下要点(需结合规范原文): 1. **流控帧处理** 接收端在收到首帧(First Frame, FF)或连续帧(Consecutive Frame, CF)后,应通过流控帧向发送端反馈以下信息: - **Block Size**:允许连续发送的帧数量。 - **Separation Time**:发送帧之间的最小时间间隔。 - **流控状态**(如继续发送、等待或溢出)。 2. **触发条件** 当接收端缓冲区可用空间足够时,需主动发送流控帧以允许发送端继续传输;若缓冲区不足,则发送流控帧要求暂停传输[^2]。 3. **动态参数调整** 支持通过`CanTp_ChangeParameter`接口动态修改流控参数(如块大小),以适应不同网络负载[^1]。 --- #### **实现方式** 1. **API函数关联** - 接收端通过`CanTp_RxIndication`接收CAN帧,触发流控逻辑[^2]。 - 发送流控帧时,可能调用`CanTp_Transmit`接口[^1]。 - 传输状态通过回调函数`CanTp_TxConfirmation`通知上层[^1]。 2. **代码逻辑示例** ```c void CanTp_RxIndication(PduIdType RxPduId, const PduInfoType* PduInfo) { if (is_flow_control_needed(RxPduId)) { FlowControlParams params = calculate_flow_control(); PduInfoType flow_control_pdu = build_flow_control_frame(params); CanTp_Transmit(FLOW_CONTROL_PDU_ID, &flow_control_pdu); // 发送流控帧 } } ``` --- #### **相关引用** - **流控机制**:基于ISO 15765-2的分段传输规则,确保数据可靠性和实时性[^3]。 - **API设计**:`CanTp_Transmit`和`CanTp_RxIndication`是实现流控的关键接口。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值