CanTp学习记录(待完善)

AUTOSAR CANTransportLayer详解

本学习笔记基于 R23-11 CP SWS AUTOSAR_CP_SWS_CANTransportLayer.pdf

AutoSar官方文档网址:Classic Platform AUTOSAR


一、导言和功能概述

CanTP位于PDU Router和CAN Interface module之间。CAN TP 模块的主要用途是分段和重新组装长度超过 8 字节的 CAN I-PDU 或长度超过 64 字节的 CAN FD。

根据 AUTOSAR 基本软件架构,CanTp 提供以下服务:

  • 传输方向的数据分段
  • 在接收方向重新组装数据
  • 数据流控制
  • 检测分段会议中的错误
  • 传输取消
  • 接收取消

尽管 CAN 传输协议主要用于车辆诊断系统,但它的开发也是为了满足其他基于 CAN 的系统对传输层协议的要求。

二、术语与缩略语

   

缩写含义
Prefix: Description:
I- 相对于AUTOSAR COM交互层
L-相对于CAN Interface 模块,它相当于逻辑链路控制(数据链路层的上部-下部称为媒体访问控制)
N-相对于CAN Transport 层,它相当于OSI网络层
Acronyms and abbreviations for CAN Transport Layer
AcronymDescription
PDU

在分层系统中,它指的是特定层协议中规定的数据单元。它包含该层的用户数据(SDU)以及可能的协议控制信息

X 层的 PDU 是其下层 X-1 的 SDU(即 (X)PDU = (X-1)SDU

SDU在分层系统中,这是指由给定服务的用户发送的一组数据
层,并传输给对等服务用户,同时保持语义不变
I-PDUThis is the PDU of the AUTOSAR COM module
CAN N-PDUThis is the PDU of the CAN Transport Layer. It contains a unique identifier, data length and data
(protocol control information plus the whole N-SDU or a part of it).
CAN N-SDUThis is the SDU of the CAN Transport Layer. In the AUTOSAR architecture, it is a set of data
coming from the PDU Router.

AbbreviationDescription
STmin发送方在两次 CF 传输之间的最短等待时间

三、基本概念

3.1 CAN Transport Layer connection(s)

在AUTOSAR架构的最终版本中,传输协议工具将用于传输诊断(例如OBD和UDS协 议)和AUTOSAR COM I-PDUs。因此,CanTp模块能够同时处理多个连接(即并行处理 多个分段会话)。

最大同时连接数是静态配置的。这种配置对生成代码的复杂性和资源消耗(CPU、ROM和RAM)有重要影响,因为必须为每个同时访问预留资源(例如,用于处理N-PCI数据的接收和发送状态机、变量等)。

为了使用户能够选择同时接收(或发送)哪些I-PDUs,每个N-SDU标识符将通过配置的CanTp “connection channel” 进行内部路由。由于“connection channel”不可从外部访问,所有必要的信息以传输N-SDU将与N-SDU标识符相关联(例如,“连接通道”编号、超时、寻址格式等)。

3.2 CAN Transport Layer交互

CanTp 上部接口为 PduR 模块提供全局访问,以发送和接收数据。这种访问是通过 CANN-SDU 标识符(CAN NSduId)实现的。CAN NSduId 是指由描述 CAN N-SDU 的属性组成的常量数据结构。每个 CAN N-SDU 的特定数据结构都可能包含以下属性: N-SDU(Tx或Rx)的类型,其寻址格式,此消息的L-SDU标识符或其他对实现有用的属性。

下图显示了 CanTp、PduR 和 CanIf 模块之间的交互。

 3.3 处理模式

AUTOSAR 通信栈支持轮询和事件触发两种模式。因此,每个通信层都可以从下层接收信息,并通过不同的机制将信息传播到上层。

对于CAN Transport Layer,仅支持事件触发模式

3.4 数据一致性

为了优化通信堆栈, AUTOSAR 限制了 CAN 传输层的缓冲容量。因此, CanTp 将 N-SDU 有效载荷直接从上层(DCM、COM 或 PDU 路由器-在 1:1 TP 路由的情况下)复制到 CAN driver ,反之亦然。因此,为了保证数据的一致性,上层将遵守以下 规则:

  • 在传输时,N-SDU数据有效载荷将保持不变,从传输请求到收到传输确认
  • 在接收时,从接收开始到接收指示,N-SDU数据访问将被锁定

3.5 静态配置

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

  • CAN N-SDU 的数量
  • 每个 CAN N-SDU的唯一标识符
  • 每个 CAN N-SDU的的通信方向(Tx或Rx)
  • 每个连接的寻址格式(normal, extended, mixed 11bit, normal fixed, or mixed 29 bit),并且根据寻址格式,

                – 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-SDU 与元数据结合使用的通用连接,可以省略静态寻址信息。

  • 每个连接的寻址格式(normal, extended or mixed),在extended寻址格式的情况下,为N_TA 值,在mixed格式的情况下为N_AE值
  •  每个CAN N-SDU标识符都对应一个相关的CAN L-SDU标识符,必要时(多个帧分段会话),CAN L-SDU标识符用于传输CAN FC N-PDU
  • 经典CAN帧和CAN FD帧

CAN Transport Layer 的配置可以在编译或构建后执行。

3.6 PDU Router services

CAN Transport Layer 使用 PDU Router 的回调功能来复制传输数据并确认传输,启动接收,复制接收到的数据并指示消息的接收:

  •  PduR_CanTpRxIndication
  •  PduR_CanTpStartOfReception
  •  PduR_CanTpCopyRxData
  •  PduR_CanTpCopyTxData
  •  PduR_CanTpTxConfirmation

3.7 CAN Interface services

CAN Transport Layer 使用CAN Interface 的以下服务进行传输 CAN N-PDUs:

  • CanIf_Transmit

四.功能规格

本节介绍CAN Transport Layer 的功能。解释了向上层和下层提供的服务以及CAN Transport Layer的内部行为。

CanTp 模块提供分段、流量控制传输和消息重组服务。其主要目的是发送和接收可能适合或不适合单个CAN帧的消息。不适合单个CAN帧的消息将被分割成多个部分,以便每个部分都可以在单个CAN帧中传输。

4.1向上层提供的服务

CanTp模块的服务接口可分为以下几大类:

  • 初始化和关闭
  • 通信服务

以下段落描述了每个服务类别的功能。

4.1.1 初始化和关闭

  • CanTp 模块应具有两种内部状态,CANTP_OFFCANTP_ON
  • 上电后CanTp模块应处于CANTP_OFF状态
  • 在状态CANTP_OFF中,CanTp 应允许更新构建后的配置
  • 当CanTp使用CanTp_Init()成功初始化时,CanTp模块将更改为内部状态 CANTP_ON
  • 只有当 CanTp 处于CANTP_ON状态时,CanTp 模块才应执行分段和重新组装任务
  • 函数CanTp_Init应初始化模块的所有全局变量,并将所有传输协议连接设置为 CANTP_ON 的子状态 , 其中分段传输和分段接收均未进行(Rx线程处于CANTP_RX_WAIT状态,Tx线程处于CANTP_TX_WAIT状态)
  • 如果为CanTp模块启用了开发错误检测,当PDU Router或CAN Interface在调用CanTp_Init函数之前尝试使用任何功能(除了CanTp_GetVersionInfo)时,CanTp模块应引发一个错误(CANTP_E_UNINIT)
  • 如果CanTp模块处于全局状态CANTP_ON时调用CanTp_Init函数,则该函数应将模块返回到空闲 Idle 状态(状态为CANTP_ON,但既不进行传输也不进行接收)
  • 如果在 CanTp 模块处于全局状态CANTP_ON时,调用 CanTp_Init,则 CanTp 模块将断开所有当前连接
  • 函数CanTp_Shutdown应正确停止CanTp模块

下图总结了上述所有要求:

4.1.2 传输请求

传输操作CanTp_Transmit()将允许上层请求使用CAN传输协议设施(如分段、扩展地址格式等)进行数据传输 。

  • 函数CanTp_Transmit()应为异步
  • 在传输请求被接受后,如果N-SDU传输被完全处理(成功与 否),CanTp模块将通知其上层

4.1.3 传输取消

传输取消功能允许上层取消正在进行的传输。

用例:由于接收到另一个具有更高优先级的诊断协议而取消诊断传输。

  • 此功能应通过静态配置(参数CanTpTc)来激活或停用
  • 传输取消由 CanTp_CancelTransmit()的调用触发
  • 在调用服务CanTp_CancelTransmit()后,此连接上的传输将中止

注意: Api PduR_CanTpTxConfirmation()应在值为 E_NOT_OK 的传输代码之后调用。 请注意,如果传输正在进行中,则会在接收方端生成超时错误。

4.2 向下层提供的服务

根据AUTOSAR通信栈的规范,CAN Transport Layer为CAN interface提供以下两个回调函数: CanTp_TxConfirmation()和CanTp_RxIndication()。

4.2.1传输确认

 CanIf模块应调用传输确认功能,以通知CAN Transport Layer CanTp请求的CAN帧传输是否成功执行。L-PDU标识符与呼叫相关联,以识别相应的传输。

  • 当在最大时间(等于N_As)后未收到传输确认时,CanTp模块应中止相应的会话。 在收到传输确认之前,无论成功与否,N-PDU对其他并发会话都不可用。
  • 对于确认调用,CanTp 模块应提供函数CanTp_TxConfirmation()
  • 当调用CanTp_TxConfirmation()函数并返回结果为E_NOT_OK时,CanTp应中止相应的会话

N_As:发送端CAN帧(任意N-PDU)的传输时间

4.2.2 接收指示

CanIf模块应调用接收指示功能,通知CanTp模块已接收到新的CANN-PDU帧(即传输协议帧)。根据CanIf的配置,接收指示可以在中断服务例程(ISR)上下文中执行。

  • 对于接收指示,CanTp 模块应提供 CanTp_RxIndication()

4.3 内部行为

CAN Transport Layer的内部操作提供了基本机制,以执行该模块的主要目的,即在单个CAN帧或 多个CAN帧中传输消息。 

CAN Transport Layer的整个行为将被 event 事件触发,因此CanTp可以直接处理来自PDU Router的N-SDU(或来自CAN Interface的L-SDU)的传输。 

4.3.1 N-SDU接收

  • 当接收到SF或FF N-PDU时,CanTp模块应使用以下方式通知上层(PDU Router) PduR_CanTpStartOfReception()函数

注意:上层将保留并锁定一个缓冲区,用于接收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值

 ISO frame overview table:

 当CanTp_RxIndication被调用用于一个具有元数据的SF(单帧)或FF(首帧)N-PDU时,CanTp模块应存储PDU元数据中包含的寻址信息,并使用这些信息来初始化与上层的连接,用于传输FC(流控制)N-PDU,以及识别CF(连续帧)N-PDU。元数据中的寻址信息取决于寻址格式:

  • Normal, Extended, Mixed 11 bit: none
  •  Normal fixed, Mixed 29 bit: N_SA(源网络地址), N_TA(目标网络地址)

当调用PduR_CanTpStartOfReception()进行通用连接(带有 MetaData 的N-SDU)时,CanTp 模块应通过 N-SDU 的MetaData转发提取的寻址信 息。元数据中的寻址信息 取决于寻址格式

05-29
<think>嗯,用户想了解汽车通信中的CANTP协议。首先,我需要回忆一下CANTP的基本概念和作用。根据之前的引用,CANTP是AUTOSAR标准中的传输层协议,用于CAN总线的数据传输。用户可能想知道它的工作原理、功能模块或者应用场景。接下来,我得考虑用户可能的背景。他们可能是汽车电子系统的开发人员,或者正在学习车载网络通信。需要解释清楚CANTP的结构,比如多帧处理、流控制这些术语,但不要用太专业的词汇,保持易懂。用户提到查找技术信息或解决方案,可能需要具体的实现细节,比如模块接口或配置方法。引用中提到了CanIf、PduR这些模块,还有DBC文件,这些都是相关组件,应该详细说明它们如何与CANTP交互。另外,用户可能遇到实际问题,比如大数据传输或错误处理,所以需要涵盖CANTP在这些方面的机制。例如,如何分割数据包,流控制的作用,以及错误检测和恢复的方法。 还要注意引用文献,确保信息准确。比如引用[1]和[2]详细介绍了CANTP的功能和应用场景,引用[3]提到CANdb++和CAPL工具,这些可能在配置和测试时会用到,需要提及。 最后,生成相关问题时要围绕CANTP的关键点,比如多帧传输、配置工具、诊断应用等,帮助用户进一步探索。确保回答结构清晰,分点说明,并附上相关代码示例或流程图,如果有的话。</think>### CANTP协议在汽车通信中的技术解析 CANTP(Controller Area Network Transport Protocol)是AUTOSAR标准中定义的传输层协议,主要用于解决CAN总线在传输大数据量时的分帧与重组问题。以下是其核心机制的详细说明: #### 一、基础架构与功能模块 1. **多帧传输机制** CANTP通过N_PDU(Network Protocol Data Unit)实现数据分帧,支持单帧(SF)和多帧(FF/CF)传输模式。当数据长度超过8字节时,自动触发多帧分割: $$N_{Payload} = \sum_{i=1}^{n} (CAN_{Frame_i} - PCI_{Header})$$ 其中PCI(Protocol Control Information)包含帧类型、序列号等信息[^1][^2]。 2. **流控制管理** 接收方通过流控制帧(FC)动态调整发送速率,包含以下参数: - $BS$(Block Size):允许连续发送的帧数 - $ST_{min}$(Separation Time):帧间最小间隔 ```c /* AUTOSAR标准流控制帧结构示例 */ typedef struct { uint8_t FlowStatus; // 0x0-继续发送,0x1-等待,0x2-溢出 uint8_t BS; uint8_t STmin; } CanTp_FlowControlType; ``` #### 二、关键技术实现 1. **时序控制算法** 采用动态时间戳比对机制处理网络延迟: $$T_{actual} = T_{send} + \alpha \cdot (CAN_{busload} / 100)$$ 其中$\alpha$为总线负载补偿系数[^2]。 2. **错误检测与恢复** - CRC校验覆盖所有多帧传输 - 超时重传机制(N_Ar/N_As时间参数) - 实现代码片段: ```c void CanTp_HandleTimeout() { if (++retryCount > N_Ar) { SendNegativeResponse(NRC_TIMEOUT); ResetConnection(); } } ``` #### 三、典型应用场景 1. **诊断通信(UDS/OBD)** 通过0x22(ReadDataByIdentifier)、0x2E(WriteDataByIdentifier)等服务实现ECU参数读写[^1]。 2. **软件刷写流程** 支持0x34(RequestDownload)、0x36(TransferData)等服务的多帧传输: ```mermaid graph TD A[Start RequestDownload] --> B{Size > 8Byte?} B -->|Yes| C[Send FF+CFs] B -->|No| D[Send SF] C --> E[Receive FlowControl] ``` #### 四、开发工具链集成 - **CANdb++配置**:定义N_PDU参数及映射关系 - **CANoe仿真**:使用CAPL脚本验证多帧传输时序 ```capl on message 0x701 { if (this.dlc == 8) { handleSingleFrame(this); } else { startMultiFrameProcess(this); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值