DEENESPTFRRUARHIKOZHNL

CAN Transport Layer (CanTp)

ModulCanTp (CAN Transport Layer)
BSW-Modul-ID35
Standard-Header#include "CanTp.h"
SWS-SpezifikationAUTOSAR_SWS_CANTransportLayer.pdf
ClusterCAN

模块指南人工智能生成

将长报文分段为 CAN 帧,并利用流控制重组接收到的分段。
AI 生成 未审核 模型: claude-opus-5-5 · 推理强度: high · 温度: 不可控 · 提示词: 69cea53d1819 来源 未决问题(1)
因果锚点:R20-11 自 R20-11 起有效 为此规范版本重新合成。
译自德文指南gemini-3.8-flash-low · 2026-10-13 · 德文原文

将长报文分段为 CAN 帧,并利用流控制重组接收到的分段。

CAN Transport Layer 将无法装入单个 CAN 帧的报文进行分段,通过 Flow Control 控制数据流,并根据 ISO 15765-2 重组接收到的分段 [SWS_CanTp_00033]。它位于 PduR 与 CanIf 之间,没有专属的有效负载缓冲区,并通过上一层的复制服务按段复制发送和接收数据 [SWS_CanTp_00298]。它向上一层发送消息来结束每个接受的传输:成功时为 E_OK,超时或中止时为 E_NOT_OK。所有这一切均以 CanTp_Init 为前提;周期性 MainFunction 负责监控超时。

CanTp 即 CAN Transport Layer。它将长报文分段为 CAN 帧,控制数据流,并重组接收到的分段;在此过程中,只要规范未另作规定,它均遵循 ISO 15765-2 [SWS_CanTp_00033]。该模块位于 PduR 与 CanIf 之间,没有专属的有效负载缓冲区。它通过上一层的复制服务按段复制数据 [SWS_CanTp_00298] [SWS_CanTp_00216]。

kontext Nutzer DCM / Com (TP-Nutzer) PduR PduR Nutzer->PduR TP-Dienste CanTp CanTp PduR->CanTp CanTp_Transmit CanTp_CancelTransmit / CanTp_CancelReceive CanTp_ChangeParameter / CanTp_ReadParameter CanTp->PduR PduR_CanTpStartOfReception PduR_CanTpCopyRxData / PduR_CanTpCopyTxData PduR_CanTpRxIndication / PduR_CanTpTxConfirmation CanIf CanIf CanTp->CanIf CanIf_Transmit (SF, FF, CF, FC) Det DET CanTp->Det Det_ReportError Det_ReportRuntimeError CanIf->CanTp CanTp_RxIndication CanTp_TxConfirmation BswM BswM (Modusmanagement) BswM->CanTp CanTp_Init / CanTp_Shutdown Sched Schedule Manager (zyklischer Task) Sched->CanTp CanTp_MainFunction

上下文图:CanTp 到 PduR、CanIf、模式管理、Scheduler 和 DET 的接口。来源:[SWS_CanTp_00216],SWS CanTp 第17页

上电后,CanTp 处于 CANTP_OFF [SWS_CanTp_00168]。带有 CanTp_ConfigType [SWS_CanTp_00208] 的 CanTp_Init 将所有连接置于空闲状态 [SWS_CanTp_00030];之后 CANTP_ON 生效 [SWS_CanTp_00170]。CanTp_Shutdown 关闭所有连接且不通知任何人 [SWS_CanTp_00202] [SWS_CanTp_00200]。连接通道彼此独立工作,并具有各自的定时器 [SWS_CanTp_00122]。若某个发送通道被占用,CanTp 会以 E_NOT_OK 拒绝新请求 [SWS_CanTp_00123]。

发送时,CanTp_Transmit 仅评估长度(以及可能的 MetaData)[SWS_CanTp_00225]。根据长度,接下来是 SF 或分段会话 [SWS_CanTp_00232]。对于每个分段,CanTp 使用 PduR_CanTpCopyTxData 获取数据 [SWS_CanTp_00086],并在 FF 及每个块之后在 N_Bs 监控下等待 Flow Control [SWS_CanTp_00315]。解释:该调用仅通知已被接受;传输的结束则通过 PduR_CanTpTxConfirmation 异步到来 [SWS_CanTp_00176] [SWS_CanTp_00204]。 问题 (未决)

接收时,CanTp 首先通过 PduR_CanTpStartOfReception 请求一个缓冲区 [SWS_CanTp_00079]。随后它使用 PduR_CanTpCopyRxData 复制每个 CF [SWS_CanTp_00269]。若缓冲区紧张,CanTp 会在每次 MainFunction 运行中重新查询该缓冲区,并最多发送 WFTmax 个 FC(WAIT) [SWS_CanTp_00222] [SWS_CanTp_00223]。最后是 PduR_CanTpRxIndication [SWS_CanTp_00084]。周期性 CanTp_MainFunction 负责监控超时 [SWS_CanTp_00164]。

N-SDU 的分段接收CanIfCanTpPduRUse Case: First FrameCanTp_RxIndication(FF)N_Br gestartetPduR_CanTpStartOfReception(TpSduLength)BUFREQ_OK,可用缓冲区大小PduR_CanTpCopyRxData(FF-Daten)CanIf_Transmit(FC: CTS, BS, STmin)loop针对块中的每个 CFCanTp_RxIndication(CF)PduR_CanTpCopyRxData(6/7 Byte)BUFREQ_OK, Restpufferalt剩余缓冲区不足以容纳下一块N_Br 运行中CanTp_MainFunctionPduR_CanTpCopyRxData(长度 0, NULL_PTR)BUFREQ_OK, RestpufferCanIf_Transmit(FC: WAIT)最多 WFTmax 次Puffer ausreichendCanIf_Transmit(FC: CTS)Use Case: Letzter Consecutive FrameCanTp_RxIndication(letzter CF)PduR_CanTpCopyRxData()PduR_CanTpRxIndication(E_OK)

时序图:带有缓冲区协商和 Flow Control CTS/WAIT 的分段接收。来源:[SWS_CanTp_00269],[SWS_CanTp_00222],SWS CanTp 第38页

CanTp 以三种方式处理错误。它向 DET 报告开发错误并返回 E_NOT_OK [SWS_CanTp_00294]。超时等协议错误会中止会话,并通过 E_NOT_OK 传递给 PduR [SWS_CanTp_00205] [SWS_CanTp_00311]。这同样适用于通过 Cancel 服务根据请求进行的中止 [SWS_CanTp_00255] [SWS_CanTp_00263]。对于 Cancel 服务中的无效 ID,R20-11 要求使用 CANTP_E_PARAM_ID [SWS_CanTp_00254],而较新的发布版本则指明其他代码。

在 CAN 栈中的角色:PduR 与 CanIf 之间的传输协议

CanTp 即 CAN Transport Layer。它将无法装入单个 CAN 帧的报文划分为段,控制数据流,并重组接收到的分段(SWS CanTp 第24页,SWS CanTp 第17页)。其基础是 ISO 15765-2:只要规范未明确排除,该标准的各项建议均适用 [SWS_CanTp_00033]。CanTp 仅在状态 CANTP_ON 下执行分段和重组 [SWS_CanTp_00238]。

向上,CanTp 为 PduR 提供以下服务:CanTp_Transmit [SWS_CanTp_00212]、CanTp_CancelTransmit [SWS_CanTp_00246] 和 CanTp_CancelReceive [SWS_CanTp_00257]。CanTp 自身向上调用 PduR_CanTpStartOfReception、PduR_CanTpCopyRxData、PduR_CanTpCopyTxData、PduR_CanTpRxIndication 和 PduR_CanTpTxConfirmation,向下调用 CanIf_Transmit [SWS_CanTp_00216]。下层通过 CanTp_RxIndication 报告接收到的帧 [SWS_CanTp_00078],并通过 CanTp_TxConfirmation 报告发送确认 [SWS_CanTp_00076]。这两个函数必须能够在中断上下文中被调用 [SWS_CanTp_00235] [SWS_CanTp_00236]。较新的文档位置将调用方称为 L-SDU Router(LSduR)(SWS CanTp 第27页)。相比之下,R20-11 的 Requirements 则称其为 CAN Interface,例如 [SWS_CanTp_00031] 和 [SWS_CanTp_00335]。

CanTp 没有专属的有效负载缓冲区。它直接从上一层获取发送数据 [SWS_CanTp_00298],并将接收到的数据直接复制到上一层的存储器中(SWS CanTp 第35页)。由此对上一层产生了锁定时间(SWS CanTp 第35页):

  • 一旦 CanTp_Transmit 返回 E_OK,上一层就会锁定发送缓冲区,直到 PduR_CanTpTxConfirmation 到达。
  • 一旦上一层在 PduR_CanTpStartOfReception 上提供了 BUFREQ_OK,它就会锁定接收缓冲区,直到 PduR_CanTpRxIndication 到达。
kontext Nutzer DCM / Com (TP-Nutzer) PduR PduR Nutzer->PduR TP-Dienste CanTp CanTp PduR->CanTp CanTp_Transmit CanTp_CancelTransmit / CanTp_CancelReceive CanTp_ChangeParameter / CanTp_ReadParameter CanTp->PduR PduR_CanTpStartOfReception PduR_CanTpCopyRxData / PduR_CanTpCopyTxData PduR_CanTpRxIndication / PduR_CanTpTxConfirmation CanIf CanIf CanTp->CanIf CanIf_Transmit (SF, FF, CF, FC) Det DET CanTp->Det Det_ReportError Det_ReportRuntimeError CanIf->CanTp CanTp_RxIndication CanTp_TxConfirmation BswM BswM (Modusmanagement) BswM->CanTp CanTp_Init / CanTp_Shutdown Sched Schedule Manager (zyklischer Task) Sched->CanTp CanTp_MainFunction

上下文图:CanTp 位于 PduR 与 CanIf 之间。它由模式管理初始化,由 Scheduler 周期性触发,并向 DET 报告错误。来源:[SWS_CanTp_00216],[SWS_CanTp_00217],[SWS_CanTp_00164],SWS CanTp 第17页,Mode Management Guide 第54页

生命周期:CANTP_OFF、CanTp_Init 和独立的连接通道

CanTp 具有状态 CANTP_OFF 和 CANTP_ON [SWS_CanTp_00027]。上电后,该模块处于 CANTP_OFF [SWS_CanTp_00168];仅在该状态下才允许更新 Post-Build 配置 [SWS_CanTp_00169]。

CanTp_Init 接收指向 CanTp_ConfigType 的指针 [SWS_CanTp_00208] [SWS_CanTp_00340]。该函数初始化所有全局变量,并将每个连接置于空闲状态 CANTP_RX_WAIT 或 CANTP_TX_WAIT [SWS_CanTp_00030];之后 CANTP_ON 生效 [SWS_CanTp_00170]。环境必须在任何进一步使用之前调用 CanTp_Init [SWS_CanTp_00199]。在模式管理指南中,这由 NvM_ReadAll 之后的一个 BswM 规则接管(Mode Management Guide 第54页)。在 CANTP_ON 中再次调用会丢弃所有正在运行的连接并返回空闲状态 [SWS_CanTp_00273] [SWS_CanTp_00111]。

CanTp_Shutdown 关闭所有打开的连接,释放资源并设置 CANTP_OFF [SWS_CanTp_00202]。在此过程中,CanTp 不会向任何人通知中止的传输 [SWS_CanTp_00200](SWS CanTp 第58页)。

在 CANTP_ON 中同时运行多个连接 [SWS_CanTp_00096]:

lebenszyklus cluster_on CANTP_ON cluster_rx Rx-Verbindungskanal cluster_tx Tx-Verbindungskanal PowerUp Einschalten OFF CANTP_OFF (后构建配置可修改) PowerUp->OFF RXW CANTP_RX_WAIT OFF->RXW CanTp_Init (erfolgreich) TXW CANTP_TX_WAIT OFF->TXW CanTp_Init (erfolgreich) RXP CANTP_RX_PROCESSING RXW->RXP SF/FF empfangen RXP->RXW 未预期更多 N-PDU 或中止 TXP CANTP_TX_PROCESSING TXW->TXP CanTp_Transmit = E_OK TXP->OFF CanTp_Shutdown (无通知) TXP->TXW 传输结束 或中止

状态图:在 CanTp_Init 之后,接收通道和发送通道彼此独立地在 WAIT 和 PROCESSING 之间切换;CanTp_Shutdown 引导返回 CANTP_OFF。来源:[SWS_CanTp_00027],[SWS_CanTp_00030],[SWS_CanTp_00170],[SWS_CanTp_00202],SWS CanTp 第27页

发送:从 CanTp_Transmit 到确认

CanTp_Transmit 接收 TxPduId 和 PduInfoPtr [SWS_CanTp_00212]。若无 MetaData,CanTp 仅评估总长度 SduLength 且不访问数据缓冲区 [SWS_CanTp_00225] [SWS_CanTp_00299]。带有 MetaData 时,它还会为所有 SF、FF 和 CF 保存地址信息 [SWS_CanTp_00334]。若数据能装入一个 N-PDU,CanTp 会发送 SF,否则开启多帧会话 [SWS_CanTp_00232](SWS CanTp 第60页)。最大发送长度(TX_DL)由 EcuC 中的 PduLength 决定 [SWS_CanTp_00354]。解释:该调用仅同步通知请求是否被接受;实际的传输以异步方式进行 [SWS_CanTp_00176]。 问题 Q-b6d13590324e2906 (未决)接受之后,CanTp 无论如何都会通过 PduR_CanTpTxConfirmation 报告结束 [SWS_CanTp_00177] [SWS_CanTp_00204]。

对于每个分段(SF、FF、CF),CanTp 均调用 PduR_CanTpCopyTxData [SWS_CanTp_00086];在首次调用之前,定时器 N_Cs 处于运行状态 [SWS_CanTp_00167]。若上一层返回 BUFREQ_E_BUSY,CanTp 稍后重试 [SWS_CanTp_00184]。CanTp 始终将 Retry 参数设为 NULL,因为 ISO 15765-2 不支持重传 [SWS_CanTp_00272]。

在 FF 以及每个块的最后一个 CF 之后,CanTp 在 N_Bs 监控下等待 Flow Control 帧 [SWS_CanTp_00315]。接收端借助它放行更多 CF 或对其进行延迟 [SWS_CanTp_00282]。若会话成功结束,接下来是带有 E_OK 的 PduR_CanTpTxConfirmation [SWS_CanTp_00090]。50 字节示例(SWS CanTp 第37页)以及从 DCM 到 CanTp 的路径(SWS PduR 第104页)展示了相同的拉取过程。

N-SDU 的分段发送PduRCanTpCanIfUse Case: 触发CanTp_Transmit(TxPduId, PduInfoPtr)仅 SduLength(+ MetaData)E_OKN_Cs 运行中Use Case: First FramePduR_CanTpCopyTxData()BUFREQ_OKCanIf_Transmit(FF)CanTp_TxConfirmation(E_OK)N_Bs 运行中:等待 FCCanTp_RxIndication(FC: CTS, BS, STmin)loop针对块中的每个 CF(BS 帧,间隔 STmin)PduR_CanTpCopyTxData()BUFREQ_OKCanIf_Transmit(CF)CanTp_TxConfirmation(E_OK)每块之后重新等待 FC (N_Bs)Use Case: AbschlussPduR_CanTpTxConfirmation(E_OK)

时序图:CanTp 向 PduR 按段请求数据,在 FF 和每个块之后等待 Flow Control,最后以 E_OK 确认。来源:[SWS_CanTp_00212],[SWS_CanTp_00086],[SWS_CanTp_00315],[SWS_CanTp_00090],SWS CanTp 第73页

接收:缓冲区协商、Flow Control 与重组

在每个传入的 SF 或 FF 处,CanTp 均通过 PduR_CanTpStartOfReception 报告接收开始 [SWS_CanTp_00079]。可用缓冲区大小通过输出参数返回,且允许小于 N-SDU [SWS_CanTp_00080]。在出现 FF 时,CanTp 会预先启动定时器 N_Br [SWS_CanTp_00166]。只有当结果得出后,它才会发送 Flow Control;其内容取决于该结果 [SWS_CanTp_00064] [SWS_CanTp_00277]。接收会话的所有 FC 均携带相同的 BS 和 STmin 值 [SWS_CanTp_00067]。每个 FC 分别在 BS 个 Consecutive Frame 之后发送 [SWS_CanTp_00278]。

在每个 CF 之后,CanTp 使用 PduR_CanTpCopyRxData 交付有效负载,并在此过程中得知剩余缓冲区 [SWS_CanTp_00269]。在 CAN 2.0 中,每个 CF 为六或七个字节。若块中最后一个 CF 之后的剩余缓冲区不足以容纳下一个块,CanTp 会启动定时器 N_Br [SWS_CanTp_00325] [SWS_CanTp_00082]。只要该定时器处于运行状态:

会话结束时,无论成功与否,CanTp 都会调用 PduR_CanTpRxIndication [SWS_CanTp_00084]。在有无 Padding 的情况下,CanTp 仅将实际使用的数据字节向上传递 [SWS_CanTp_00116]。

N-SDU 的分段接收CanIfCanTpPduRUse Case: First FrameCanTp_RxIndication(FF)N_Br gestartetPduR_CanTpStartOfReception(TpSduLength)BUFREQ_OK,可用缓冲区大小PduR_CanTpCopyRxData(FF-Daten)CanIf_Transmit(FC: CTS, BS, STmin)loop针对块中的每个 CFCanTp_RxIndication(CF)PduR_CanTpCopyRxData(6/7 Byte)BUFREQ_OK, Restpufferalt剩余缓冲区不足以容纳下一块N_Br 运行中CanTp_MainFunctionPduR_CanTpCopyRxData(长度 0, NULL_PTR)BUFREQ_OK, RestpufferCanIf_Transmit(FC: WAIT)最多 WFTmax 次Puffer ausreichendCanIf_Transmit(FC: CTS)Use Case: Letzter Consecutive FrameCanTp_RxIndication(letzter CF)PduR_CanTpCopyRxData()PduR_CanTpRxIndication(E_OK)

时序图:带有缓冲区协商、逐块 Flow Control 以及缓冲区紧张时等待阶段的分段接收。来源:[SWS_CanTp_00079],[SWS_CanTp_00269],[SWS_CanTp_00222],[SWS_CanTp_00084],SWS CanTp 第76页

rxstart Ein CanTp_RxIndication: 接收到 SF 或 FF Kanal Kanal in CANTP_RX_PROCESSING? Ein->Kanal Art 带 MetaData 或 其他 N_AI? Kanal->Art 是 Sor PduR_CanTpStartOfReception() Kanal->Sor 不 Ign Frame ignorieren Art->Ign 是 Neu laufenden Empfang abbrechen, Frame als neuen Empfang behandeln Art->Neu nein (gleiche N_AI) Neu->Sor Erg 返回值? Sor->Erg NotOk 中止接收: 无 FC,无 PduR_CanTpRxIndication Erg->NotOk BUFREQ_E_NOT_OK Ovfl FF: FC(OVFLW) senden, abbrechen SF: abbrechen Erg->Ovfl BUFREQ_E_OVFL Typ Frame-Typ? Erg->Typ BUFREQ_OK Sf SF: Daten kopieren, PduR_CanTpRxIndication Typ->Sf SF Puf FF:缓冲区是否足以 容纳下一块? Typ->Puf FF Cts FC(CTS) senden Puf->Cts 是 Br N_Br starten, Puffer in MainFunction abfragen Puf->Br 不

活动图:CanTp 在传入 SF 或 FF 时如何根据通道状态和 PduR_CanTpStartOfReception 的结果作出决策。来源:[SWS_CanTp_00124],[SWS_CanTp_00337],[SWS_CanTp_00081],[SWS_CanTp_00318],[SWS_CanTp_00353],SWS CanTp 第67页

寻址、MetaData 与 Padding

功能寻址(1:n)仅允许用于 SF [SWS_CanTp_00092]。通过功能句柄进行的分段会话会被 CanTp 拒绝并报告 CANTP_E_INVALID_TATYPE [SWS_CanTp_00093](SWS CanTp 第39页)。在 Extended 或 Mixed Addressing 下,CanTp 根据首个数据字节中的 N_TA 或 N_AE 确定 N-SDU [SWS_CanTp_00095] [SWS_CanTp_00284] [SWS_CanTp_00283]。对于标识符的分配规则如下(SWS CanTp 第44页):

  • 每个 NSduId 恰好分配给一个 LSduId [SWS_CanTp_00035]。
  • FC 的 LSduId 与 N_TA 或 N_AE 一起恰好标识一个 NSduId [SWS_CanTp_00094]。
  • 仅在 Extended/Mixed Addressing 或存在 MetaData 的情况下,多个 N-SDU 才允许引用同一个 N-PDU [SWS_CanTp_00328]。

泛型连接使用 MetaData 工作。CanTp 保存来自 SF 或 FF 的地址信息 [SWS_CanTp_00330],将其转发给 PduR_CanTpStartOfReception [SWS_CanTp_00331],并以此检查随后的 CF [SWS_CanTp_00333]。若通道已在接收中,CanTp 将忽略带有 MetaData 的另一个 SF 或 FF [SWS_CanTp_00337]。

Padding 是按 N-SDU 激活的(SWS CanTp 第43页)。填充值为 CANTP_PADDING_BYTE [SWS_CanTp_00059]。对于有效负载最多为 8 字节的帧,规则如下:

若发送长度与任何有效的 DLC 均不匹配,CanTp 将填充至下一个更高的有效值 [SWS_CanTp_00351]。接收长度 RX_DL 由 CanTp 根据首次接收到的 CAN_DL 推导得出 [SWS_CanTp_00350]。

时间监控、运行时参数以及按请求中止

CanTp_MainFunction [SWS_CanTp_00213] 被周期性调用。它监控 N_As、N_Bs、N_Cs、N_Ar、N_Br、N_Cr 以及 STmin [SWS_CanTp_00164](SWS CanTp 第63页)。其节拍取决于 CanTpMainFunctionPeriod [SWS_CanTp_00300]。该值应与调用任务的周期时间相对应(SWS CanTp 第77页)。作为示例,时序分析提到了一个 5 ms 任务(TR Timing Analysis 第117页)。

两个服务在运行时访问某个 N-SDU 的接收参数 BS 和 STmin:CanTp_ChangeParameter 对其进行修改 [SWS_CanTp_00302],CanTp_ReadParameter 对其进行读取 [SWS_CanTp_00323]。仅当 CanTpChangeParameterApi = TRUE 时,才存在这两个服务(SWS CanTp 第61页)。BS 仅为一个最大值,CanTp 出于缓冲区原因可以低于该值 [SWS_CanTp_00091]。在正在运行的接收会话的 FF 与最后一个 CF 之间,CanTp 会以 E_NOT_OK 拒绝任何修改 [SWS_CanTp_00303] [SWS_CanTp_00304]。对于泛型连接,一项修改适用于所有连接 [SWS_CanTp_00338]。

正在运行的传输可以根据请求予以中止:

发生错误时的行为

开发错误。若检测功能处于激活状态,CanTp 会向 DET 报告错误并返回 E_NOT_OK [SWS_CanTp_00294] [SWS_CanTp_00217](SWS CanTp 第49页)。代码由 [SWS_CanTp_00293] 定义。典型情况:

发布版本之间的差异:对于 Cancel 服务中的无效 PduId,R20-11 要求使用 CANTP_E_PARAM_ID [SWS_CanTp_00254] [SWS_CanTp_00260]。较新的文档位置则指出应使用 CANTP_E_INVALID_TX_ID 或 CANTP_E_INVALID_RX_ID(SWS CanTp 第59页)。对于 R20-11,以 Requirement 为准。

运行时错误。它们被发送至 Default Error Tracer [SWS_CanTp_00352]:

协议错误。它们以向上一层发送 E_NOT_OK 的方式终止会话 [SWS_CanTp_00205]:

PduR 将否定确认转发给用户,例如转发给负责恢复的 DCM(Error Description 第29页,Error Description 第28页)。生产错误由 DEM 通过 FiM 处理 [SWS_CanTp_00291]。

abbruch cluster_tx Sendeseite cluster_rx Empfangsseite t1 PduR_CanTpCopyTxData = BUFREQ_E_NOT_OK TA Sendesitzung abbrechen t1->TA t2 N_Cs abgelaufen t2->TA t3 N_As abgelaufen t3->TA t4 N_Bs abgelaufen t4->TA t5 带 OVFLW 或无效 FS 的 FC t5->TA t6 Tx 填充时 FC 短于 8 字节 t6->TA t7 CanIf_Transmit(SF/FF/CF) = E_NOT_OK t7->TA t8 CanTp_TxConfirmation(E_NOT_OK) t8->TA t9 CanTp_CancelTransmit = E_OK t9->TA r1 N_Ar abgelaufen RA Empfangssitzung abbrechen r1->RA r2 N_Cr abgelaufen r2->RA r3 PduR_CanTpCopyRxData = BUFREQ_E_NOT_OK r3->RA r4 WFTmax FC(WAIT) erreicht r4->RA r5 Rx 填充时最后一个 CF 过短 r5->RA r6 CanIf_Transmit(FC) = E_NOT_OK r6->RA r7 CanTp_CancelReceive = E_OK r7->RA TC PduR_CanTpTxConfirmation(E_NOT_OK) TA->TC RC PduR_CanTpRxIndication(E_NOT_OK) RA->RC

活动图:所有中止原因在各个方向上最终都转化为向 PduR 发送的否定消息。来源:[SWS_CanTp_00205],[SWS_CanTp_00343],[SWS_CanTp_00355],[SWS_CanTp_00342],[SWS_CanTp_00223],[SWS_CanTp_00084],Error Description 第28页

进一步详细证据

基于 CanTp 规范摘录(R20-11)由 AI 生成的指南。唯有链接的 Requirements 具有约束力;来自其他发布版本的文档位置仅用于说明。

CAN Transport Layer (CanTp)

Provides segmentation and reassembly of CAN messages up to 4095 bytes (ISO 15765-2).

Funktionen — Übersicht

Typen — Übersicht

Funktionen & Typen — Detailansicht

函数 CanTp_Init [SWS_CanTp_00208] 📄 PDF

void CanTp_Init (const CanTp_ConfigType* CfgPtr);

This function initializes the Can Tp module.

AI 生成 未审核 模型: gemini-3.8-flash-medium · 推理强度: medium · 温度: 不可控 · 提示词: 62b706f68200 来源
译自德文指南gemini-3.8-flash-low · 2026-10-13 · 德文原文

同步且不可重入的函数 CanTp_Init 初始化 CanTp 模块 [SWS_CanTp_00208]。它通过参数 CfgPtr 接收指向 Post-Build 配置数据(CanTp_ConfigType)的指针,且没有返回值 [SWS_CanTp_00208]。模块环境必须强制调用 CanTp_Init,然后模块才能用于进一步的处理 [SWS_CanTp_00199]。

在初始化期间,模块的所有全局变量均被初始化,并且所有传输协议连接都被置于 CANTP_ON 的子状态,在该子状态下分段传输和分段接收均未处于活动状态 [SWS_CanTp_00030]。此时接收路径处于状态 CANTP_RX_WAIT,发送路径处于状态 CANTP_TX_WAIT [SWS_CanTp_00030]。成功执行后,模块切换到内部状态 CANTP_ON [SWS_CanTp_00170]。

如果在模块已处于全局状态 CANTP_ON 时调用 CanTp_Init,则该函数将模块重置为 Idle 状态,从而既没有发送过程也没有接收过程在运行 [SWS_CanTp_00111]。

如果开发错误检测(Development Error Detection)已启用,且 PDU Router 或 CAN Interface 尝试在调用 CanTp_Init 之前执行模块的函数(CanTp_GetVersionInfo 除外),则 CanTp 模块会报告错误 CANTP_E_UNINIT [SWS_CanTp_00031]。

该文本由人工智能基于规范生成。

实现者指南即将推出(复杂度 I2)

函数 CanTp_Shutdown [SWS_CanTp_00211] 📄 PDF

void CanTp_Shutdown (void);

This function is called to shutdown the Can Tp module.

AI 生成 未审核 模型: gemini-3.8-flash-medium · 推理强度: medium · 温度: 不可控 · 提示词: e5430e2cac5b 来源
译自德文指南gemini-3.8-flash-low · 2026-10-13 · 德文原文

用法与调用上下文

函数 CanTp_Shutdown 用于有序关闭整个 CanTp 模块([SWS_CanTp_00211])。该接口通过头文件 CanTp.h 提供,并具有服务 ID 0x02([SWS_CanTp_00211])。该调用为同步处理,不接受传入参数,也不返回返回值([SWS_CanTp_00211])。

状态转换与清理

执行时,CanTp_Shutdown 会关闭所有挂起的传输协议连接,释放所有已分配的资源,并将 CanTp 模块转入状态 CANTP_OFF([SWS_CanTp_00202])。中止行为的一个重要方面是,对于仍未完成的帧传输或帧接收过程,明确禁止向上一层触发任何通知([SWS_CanTp_00200])。

并发性与边界条件

该函数被指定为不可重入(Non Reentrant)([SWS_CanTp_00211])。因此,不得同时从不同的执行上下文或中断例程中调用该函数。该接口的功能范围内未指定具体的错误代码或发往错误管理的通知。

本使用说明基于 AUTOSAR Classic Release R20-11 规范自动生成。

实现者指南即将推出(复杂度 I1)

函数 CanTp_Transmit [SWS_CanTp_00212] 📄 PDF

Std_ReturnType CanTp_Transmit (PduIdType TxPduId, const PduInfoType* PduInfoPtr);

Requests transmission of a PDU.

AI 生成 未审核 模型: gemini-3.8-flash-medium · 推理强度: medium · 温度: 不可控 · 提示词: 7a5280a26edd 来源 未决问题(1)
译自德文指南gemini-3.8-flash-low · 2026-10-13 · 德文原文

使用

函数 CanTp_Transmit 用于请求通过 CAN 传输层传输 N-SDU [SWS_CanTp_00212]。待传输 PDU 的标识符(TxPduId)以及指向数据、长度和元数据的指针(PduInfoPtr)作为参数传递 [SWS_CanTp_00212]。该调用通过 E_OK 返回成功接受,或通过 E_NOT_OK 返回拒绝请求 [SWS_CanTp_00212]。虽然调用是同步确认的,但传输的处理是异步的 [SWS_CanTp_00176](解释:规范表中的“Synchronous”说明可能指的是请求的接收)。 问题 Q-df438ddaa4963aba (未决)

交互与 PDU 处理

对于带有元数据的 N-SDU,模块会存储地址信息(取决于寻址格式,如 Normal、Extended、Mixed 11 bit、Normal fixed 或 Mixed 29 bit),以便将其用于 SF-、FF- 和 CF-N-PDU 以及用于识别 FC-N-PDU [SWS_CanTp_00334]。如果不使用元数据,CanTp_Transmit 仅访问长度信息 SduLength 以准备 SF- 或 FF-PCI,而不使用 N-SDU 数据缓冲区 [SWS_CanTp_00225]。

错误处理与并发

  • 错误检查:如果启用了 DET 且 PduInfoPtr 为 NULL 指针,该函数将报告错误 CANTP_E_PARAM_POINTER 并直接返回,不执行进一步操作 [SWS_CanTp_00321]。
  • 通道占用:如果分配的通道处于 CANTP_TX_PROCESSING 状态,或者该 N-SDU 标识符的会话已在运行,则传输请求将被拒绝并返回 E_NOT_OK [SWS_CanTp_00123], [SWS_CanTp_00206]。
  • 可重入性:该服务对于不同的 PDU-ID 是可重入的,但对于相同的 PDU-ID 是不可重入的 [SWS_CanTp_00212]。

本说明由 AI 基于 AUTOSAR Classic R20-11 规范生成。

实现者指南即将推出(复杂度 I2)

函数 CanTp_CancelTransmit [SWS_CanTp_00246] 📄 PDF

Std_ReturnType CanTp_CancelTransmit (PduIdType TxPduId);

Requests cancellation of an ongoing transmission of a PDU in a lower layer communication module.

AI 生成 未审核 模型: gemini-3.8-flash-medium · 推理强度: medium · 温度: 不可控 · 提示词: f7624766b8a1 来源
译自德文指南gemini-3.8-flash-low · 2026-10-13 · 德文原文

同步函数 CanTp_CancelTransmit 请求中止下层通信模块中正在进行的 PDU 传输 [SWS_CanTp_00246],从而启动发送过程的取消 [SWS_CanTp_00274]。受影响 PDU 的标识符(TxPduId)作为参数传递 [SWS_CanTp_00246]。作为返回值,E_OK 指示目标模块成功执行了中止,而 E_NOT_OK 则指示被拒绝 [SWS_CanTp_00246]。

函数调用后,受影响连接上的传输将被中止[SWS_CanTp_00243]。如果中止成功执行,模块CanTp必须调用具有否定结果E_NOT_OK的确认PduR_CanTpTxConfirmation,以通知上层关于中止的信息[SWS_CanTp_00255]。

在启用开发错误检测(Development Error Detection)时,CanTp_CancelTransmit检查TxPduId的有效性:如果参数无效,将生成开发错误CANTP_E_PARAM_ID并返回E_NOT_OK[SWS_CanTp_00254]。如果为当前未处于传输过程中的 N-SDU 请求中止,模块向 Default Error Tracer(DET)报告运行时错误CANTP_E_OPER_NOT_SUPPORTED,并且同样返回E_NOT_OK[SWS_CanTp_00254]。

在并发性方面,该函数对于不同的 PDU-ID 是可重入的,但对于相同的TxPduId不得并发调用[SWS_CanTp_00246]。

本使用说明基于 AUTOSAR 规范自动创建。

实现者指南即将推出(复杂度 I2)

函数 CanTp_CancelReceive [SWS_CanTp_00257] 📄 PDF

Std_ReturnType CanTp_CancelReceive (PduIdType RxPduId);

Requests cancellation of an ongoing reception of a PDU in a lower layer transport protocol module.

AI 生成 未审核 模型: gemini-3.8-flash-medium · 推理强度: medium · 温度: 不可控 · 提示词: ccccdf72ba41 来源
译自德文指南gemini-3.8-flash-low · 2026-10-13 · 德文原文

函数CanTp_CancelReceive同步中止下层传输协议模块中正在进行的 PDU 接收[SWS_CanTp_00257]。它可通过头文件CanTp.h获取,并具有服务 ID 0x4c[SWS_CanTp_00257]。

使用和调用条件

通过输入参数RxPduId传递要中止的 PDU 的标识符[SWS_CanTp_00257]。该调用被同步处理,并被指定为不可重入(Non Reentrant)[SWS_CanTp_00257]。作为返回值,类型为Std_ReturnType的接口提供:

错误处理

在启用开发错误检测(Development Error Detection)时,该函数会验证参数RxPduId[SWS_CanTp_00260]:

  • 如果RxPduId的值无效,CanTp_CancelReceive将报告开发错误CANTP_E_PARAM_ID并返回E_NOT_OK[SWS_CanTp_00260]。
  • 如果为当前未处于正在进行的接收过程中的 N-SDU 请求中止,模块向 Default Error Tracer 报告运行时错误CANTP_E_OPER_NOT_SUPPORTED并返回E_NOT_OK[SWS_CanTp_00260]。

与相邻模块的交互

如果接收中止成功执行,CanTp 会调用带有通知结果E_NOT_OK的回调函数PduR_CanTpRxIndication,以通知上层关于中止的信息[SWS_CanTp_00263]。

本使用说明基于 AUTOSAR Classic R20-11 规范并自动生成。

实现者指南即将推出(复杂度 I1)

函数 CanTp_ChangeParameter [SWS_CanTp_00302] 📄 PDF

Std_ReturnType CanTp_ChangeParameter (PduIdType id, TPParameterType parameter, uint16 value);

Request to change a specific transport protocol parameter (e.g. block size).

AI 生成 未审核 模型: gemini-3.8-flash-medium · 推理强度: medium · 温度: 不可控 · 提示词: 2d391dbc31e8 来源
译自德文指南AI 生成gemini-3.8-flash-low · 2026-10-13 · 德文原文

同步函数CanTp_ChangeParameter用于在运行时更改特定的传输协议参数,例如块大小([SWS_CanTp_00302])。该服务通过头文件CanTp.h提供,接收 PDU 标识符(id)、参数标识符(parameter)以及要设置的新值(value)([SWS_CanTp_00302])。成功执行时,函数返回E_OK;如果更改失败或被拒绝,则返回E_NOT_OK([SWS_CanTp_00302])。

关于并发性和调用条件,适用以下规定:

  • 该接口采用不可重入(Non Reentrant)设计([SWS_CanTp_00302])。
  • 如果在调用时受影响的 N-SDU 已处于正在进行的接收过程中,CanTp_ChangeParameter会立即中止,返回E_NOT_OK且不改变参数值([SWS_CanTp_00304])。

对于通用连接存在特殊的交互:如果为带有 MetaData 的 N-SDU 调用该函数,则参数更改将应用于所有通用连接,并对所有后续接收过程生效([SWS_CanTp_00338])。

此使用说明是基于规范要求自动生成的。

实现者指南即将推出(复杂度 I1)

函数 CanTp_ReadParameter [SWS_CanTp_00323] 📄 PDF

Std_ReturnType CanTp_ReadParameter (PduIdType id, TPParameterType parameter, uint16* value);

This service is used to read the current value of reception parameters BS and STmin for a specified N - SDU.

AI 生成 未审核 模型: gemini-3.8-flash-medium · 推理强度: medium · 温度: 不可控 · 提示词: 949f6cb3df18 来源
译自德文指南gemini-3.8-flash-low · 2026-10-13 · 德文原文

使用

同步函数CanTp_ReadParameter用于读取指定接收 N-SDU [SWS_CanTp_00323]的接收参数BS(Block Size)或STmin(Separation Time minimum)的当前值。其声明可通过头文件CanTp.h获取[SWS_CanTp_00323]。

该接口具有以下参数:

  • id(in):接收到的 N-SDU 的标识符(类型PduIdType),为其读取接收参数[SWS_CanTp_00323]。
  • parameter(in):确定要读取的参数(类型为TPParameterType的BS或STmin)[SWS_CanTp_00323]。
  • value(out):指向uint16的指针,通过它提供读取出的参数值[SWS_CanTp_00323]。

作为返回值,函数提供Std_ReturnType;其中E_OK表示接受请求,E_NOT_OK表示拒绝[SWS_CanTp_00323]。

错误处理

如果开发错误检测(Development Error Detection)已启用,CanTp_ReadParameter将检查参数id和parameter的有效性[SWS_CanTp_00324]。如果这些参数之一无效,函数将报告开发错误CANTP_E_PARAM_ID并返回E_NOT_OK[SWS_CanTp_00324]。

并发性与限制

该函数被指定为不可重入(Non Reentrant)[SWS_CanTp_00323]。调用者必须避免对同一接口进行并行访问。

此文本由 AI 基于 AUTOSAR R20-11 的规范文档生成。

实现者指南即将推出(复杂度 I1)

函数 CanTp_MainFunction [SWS_CanTp_00213] 📄 PDF

void CanTp_MainFunction (void);

The main function for scheduling the CAN TP.

AI 生成 未审核 模型: gemini-3.8-flash-medium · 推理强度: medium · 温度: 不可控 · 提示词: 64a7b42182e1 来源 未决问题(1)
译自德文指南gemini-3.8-flash-low · 2026-10-13 · 德文原文

函数 CanTp_MainFunction 用作 CAN 传输协议(CAN TP)周期性调度的核心入口点 [SWS_CanTp_00213], [SWS_CanTp_00164]。它拥有服务 ID 0x06,具有签名 void CanTp_MainFunction(void),并通过头文件 SchM_CanTp.h 提供 [SWS_CanTp_00213]。它不接收任何参数且不返回返回值 [SWS_CanTp_00213]。

调用上下文与时间控制

根据所需的周期时间,该调用由 Schedule Manager 或 Free Running Timer 模块启动 [SWS_CanTp_00164]。在模块内部,CanTp_MainFunction 负责协议流程的时间监控和控制 [SWS_CanTp_00164]。具体而言,该函数参与以下定时器和时间条件的处理:

错误处理与并发

在有效载荷中未为此函数定义针对 DET 或 DEM 的具体错误码。解释:作为周期性调用的调度函数,CanTp_MainFunction 可能是不可重入的,并且需要一致的调用速率,以确保内部定时器的正确递减。 问题 Q-2fe22e31085abf49 (未决)

本段文本由人工智能基于 AUTOSAR 规范 R20-11 生成。

实现者指南即将推出(复杂度 I1)

函数 CanTp_RxIndication [SWS_CanTp_00214] 📄 PDF

void CanTp_RxIndication (PduIdType RxPduId, const PduInfoType* PduInfoPtr);

Indication of a received PDU from a lower layer communication interface module.

AI 生成 未审核 模型: gemini-3.8-flash-medium · 推理强度: medium · 温度: 不可控 · 提示词: 38e732456055 来源
译自德文指南gemini-3.8-flash-low · 2026-10-13 · 德文原文

用法与语义

同步函数 [SWS_CanTp_00214] 向 CAN 传输模块通报底层通信接口模块对 N-PDU 的接收。该调用传入接收到的 PDU 的标识(RxPduId),并通过指针 PduInfoPtr 传入长度(SduLength)、有效载荷数据(SduDataPtr)及相关元数据。该函数没有返回值。

并发与调用上下文

该函数对于不同的 PDU-ID 是可重入的,但对于相同的 PDU-ID 是不可重入的 [SWS_CanTp_00214]。CanTp_RxIndication 允许在中断上下文中调用,例如直接在 CAN 接收中断中调用 [SWS_CanTp_00235]。

通用连接时的相互协作

当针对带有元数据的单帧(SF)或首帧(FF)调用时,CanTp 会保存所包含的地址信息(例如在 Normal-fixed 或 Mixed-29 位寻址中的 N_SA 和 N_TA)。这些信息用于与上一层建立连接、发送流控制帧(FC)以及识别连续帧(CF)[SWS_CanTp_00330]。在后续的 CF 帧和接收到的 FC 帧中,CanTp 会根据保存的值检查元数据中的地址数据 [SWS_CanTp_00333]、[SWS_CanTp_00336]。

错误处理与填充

如果启用了 DET 且 PduInfoPtr 为 NULL 指针,则该函数报告错误 CANTP_E_PARAM_POINTER 并直接返回而不执行任何操作 [SWS_CanTp_00322]。如果针对有效载荷至多 8 字节的帧启用了填充检查(CanTpRxPaddingActivation 或 CanTpTxPaddingActivation 等于 CANTP_ON),则在发生长度错误时向 DET 报告运行时错误 CANTP_E_PADDING:

  • 带有 SduLength < 8 的 SF 将被拒绝 [SWS_CanTp_00345]。
  • 带有 SduLength != 8 的最后一个 CF 将通过 PduR_CanTpRxIndication() 携带 E_NOT_OK 中止正在进行的接收 [SWS_CanTp_00346]。
  • 接收到的带有 SduLength < 8 的 FC 将通过 PduR_CanTpTxConfirmation() 携带 E_NOT_OK 中止正在进行的传输 [SWS_CanTp_00349]。

本文本由 AI 生成,仅供参考。一切以 AUTOSAR 规范为准。

实现者指南即将推出(复杂度 I2)

函数 CanTp_TxConfirmation [SWS_CanTp_00215] 📄 PDF

void CanTp_TxConfirmation (PduIdType TxPduId, Std_ReturnType result);

The lower layer communication interface module confirms the transmission of a PDU, or the failure to transmit a PDU.

AI 生成 未审核 模型: gemini-3.8-flash-medium · 推理强度: medium · 温度: 不可控 · 提示词: 2541d17fed91 来源
译自德文指南gemini-3.8-flash-low · 2026-10-13 · 德文原文

CanTp 模块通过头文件 CanTp.h 提供同步回调函数 CanTp_TxConfirmation(服务 ID 0x40),以接收已发送 PDU 的确认调用 [SWS_CanTp_00076] [SWS_CanTp_00215]。通过此接口,底层通信接口模块报告 PDU 传输的成功发送或失败 [SWS_CanTp_00215]。

参数与返回值

该函数无返回值(void),并需要两个输入参数 [SWS_CanTp_00215]:

错误处理

如果以结果值 E_NOT_OK 调用 CanTp_TxConfirmation,CanTp 模块将中止关联的传输会话 [SWS_CanTp_00355]。

并发性与执行上下文

关于并发性,该函数对于不同的 PDU-ID 是可重入的,但对于相同的 PDU-ID 是不可重入的 [SWS_CanTp_00215]。它必须能够在中断上下文中调用,例如允许直接从 CAN 发送中断中调用 [SWS_CanTp_00236]。

此使用说明基于 AUTOSAR Classic Release R20-11 规范自动生成。

实现者指南即将推出(复杂度 I2)

Request a governed re-review of this record. The record is not changed immediately.

Record
AUTOSAR/AP/record/CP_MOD_CanTp
Status
unspecified
Version
AUTOSAR/AP/record/CP_MOD_CanTp@rel:R20-11#e0467276
Content hash
e0467276
Source
https://www.autosar.org/fileadmin/standards/R20-11/CP/AUTOSAR_SWS_CANTransportLayer.pdf#nameddest=SWS_CanTp_00208

初始化与状态

This function returns the version information of the Can Tp module.

void CanTp_GetVersionInfo (Std_VersionInfoType* versioninfo);
CanTp_Init 函数

This function initializes the Can Tp module.

void CanTp_Init (const CanTp_ConfigType* CfgPtr);

服务

Requests cancellation of an ongoing reception of a PDU in a lower layer transport protocol module.

Std_ReturnType CanTp_CancelReceive (PduIdType RxPduId);

Requests cancellation of an ongoing transmission of a PDU in a lower layer communication module.

Std_ReturnType CanTp_CancelTransmit (PduIdType TxPduId);

Request to change a specific transport protocol parameter (e.g. block size).

Std_ReturnType CanTp_ChangeParameter (PduIdType id, TPParameterType parameter, uint16 value);

This service is used to read the current value of reception parameters BS and STmin for a specified N - SDU.

Std_ReturnType CanTp_ReadParameter (PduIdType id, TPParameterType parameter, uint16* value);

This function is called to shutdown the Can Tp module.

void CanTp_Shutdown (void);

Requests transmission of a PDU.

Std_ReturnType CanTp_Transmit (PduIdType TxPduId, const PduInfoType* PduInfoPtr);

回调

Indication of a received PDU from a lower layer communication interface module.

void CanTp_RxIndication (PduIdType RxPduId, const PduInfoType* PduInfoPtr);

The lower layer communication interface module confirms the transmission of a PDU, or the failure to transmit a PDU.

void CanTp_TxConfirmation (PduIdType TxPduId, Std_ReturnType result);

周期性

The main function for scheduling the CAN TP.

void CanTp_MainFunction (void);

类型

Data structure type for the post - build configuration parameters.