4. CAN TP与PduR路由配置

CAN TP(Transport Protocol)位于CAN驱动与上层PDU Router之间,负责把长度超过8字节的诊断或网络管理报文拆分为多个CAN帧,并在接收端重组。MICROSAR中CanTp模块严格遵循ISO 15765-2,其配置核心是寻址格式、多帧时序参数和PduR路由表三部分。理解这三者的关系,才能让诊断请求从测试仪正确到达Dcm,并让响应原路返回。

一、ISO 15765-2寻址格式

ISO 15765-2定义了三种寻址方式:常规寻址(Normal Addressing)、常规固定寻址(Normal Fixed Addressing)和扩展寻址(Extended Addressing)。常规寻址下,CAN ID本身即隐含了源与目标,数据场首字节直接是PCI;常规固定寻址使用29位ID,把源地址和目标地址编码进ID中;扩展寻址则在数据场第一个字节放置目标地址(TA),PCI从第二个字节开始。

在MICROSAR CanTp配置中,寻址方式由CanTpAddressingFormat参数决定,可选CANTP_STANDARD、CANTP_EXTENDED、CANTP_MIXED等。以扩展寻址为例,物理请求帧的数据场结构为:[TA][PCI][Data...],其中TA为目标地址,例如0xDA表示诊断应用层。功能寻址(Functional Addressing)通常使用固定ID(如0x7DF),不携带TA,用于广播式请求。

寻址格式一旦确定,CanTp的Rx和Tx PDU必须成对配置。例如诊断请求使用扩展寻址、TA=0xDA,则响应也需使用扩展寻址、TA=0xDA(从ECU视角看,响应的TA是测试仪地址)。若寻址不匹配,会出现“请求能收到但响应发不出”或“PCI解析错误”的典型故障。

二、多帧传输与流控参数

当报文长度超过单帧容量(常规寻址7字节,扩展寻址6字节)时,进入多帧传输。发送方先发首帧(FF),接收方回送流控帧(FC),发送方再按块发送连续帧(CF)。ISO 15765-2的流控参数包括:

  • BS(Block Size):接收方允许发送方连续发送的CF数量,0表示不再发送FC,直到全部发完。
  • STmin:连续帧之间的最小间隔时间,单位ms,用于防止接收方缓冲溢出。
  • N_Bs、N_Cr、N_As、N_Ar:分别对应发送方等待FC、接收方等待CF、发送方等待ACK、接收方等待ACK的超时时间。

在MICROSAR中,这些参数在CanTp的CanTpChannel或CanTpRxNSdu/CanTpTxNSdu中配置。例如:

CanTpRxNSdu_0:
  CanTpRxNSduId = 0
  CanTpRxNSduRef = CanTpRxNSdu_0
  CanTpRxNSduTaType = CANTP_PHYSICAL
  CanTpRxNSduTa = 0xDA
  CanTpRxNSduBs = 8
  CanTpRxNSduStmin = 5
  CanTpRxNSduNBs = 1000
  CanTpRxNSduNCr = 1000

上述示例中,BS=8表示接收方每收到8个CF后回送一次FC;STmin=5ms表示发送方连续帧间隔至少5ms;N_Bs=1000ms表示发送方等待FC的最长时间。这些值需与对端测试仪或网关匹配,否则会出现“流控超时”或“连续帧丢失”。

多帧传输的典型时序为:发送方发出FF(含总长度),接收方在N_Bs内回FC(含BS和STmin),发送方按STmin间隔发送CF,接收方每收满BS个CF再回FC,直到全部数据接收完成。若接收方在N_Cr内未收到下一个CF,则终止接收并上报超时。

三、CanTp与PduR的PDU路由表配置

PduR(PDU Router)负责在CanIf、CanTp、Dcm、Com、Nm等模块之间路由PDU。CanTp的每个NSdu(网络层服务数据单元)都需要在PduR中建立路由路径。以诊断请求为例,路径为:CanIf Rx PDU → CanTp Rx NSdu → PduR → Dcm Rx PDU。响应路径为:Dcm Tx PDU → PduR → CanTp Tx NSdu → CanIf Tx PDU。

在MICROSAR配置工具中,PduR路由表通过PduRRoutingPath定义,每个路径包含源PDU、目标PDU和路由方向。例如:

PduRRoutingPath_DiagReq:
  PduRSourcePdu = CanTpRxNSdu_0
  PduRDestPdu = DcmRxPdu_0
  PduRDestPduRef = DcmRxPdu_0
  PduRRouteDirection = PDUR_ROUTE_RX

PduRRoutingPath_DiagResp:
  PduRSourcePdu = DcmTxPdu_0
  PduRDestPdu = CanTpTxNSdu_0
  PduRDestPduRef = CanTpTxNSdu_0
  PduRRouteDirection = PDUR_ROUTE_TX

网络管理报文的路由类似,但通常不经过CanTp,而是直接由CanIf路由到Nm。例如:CanIf Rx PDU → PduR → Nm Rx PDU。若NM报文也使用CanTp(如某些OEM要求),则需在CanTp中配置对应的NSdu,并在PduR中建立CanTp到Nm的路由。

四、诊断报文与网络管理报文的路由验证

配置完成后,需通过实际报文验证路由是否正确。验证方法包括:

  1. 诊断请求验证:用CANoe发送扩展寻址的物理请求帧(ID=0x7E0,数据场首字节TA=0xDA),观察Dcm是否收到并回复。若Dcm无响应,检查CanTp Rx NSdu的TA是否匹配、PduR路由是否指向Dcm。
  2. 多帧响应验证:发送长度超过7字节的诊断请求(如0x22读取VIN),观察ECU是否先回FF,再按BS和STmin发送CF。用CANoe的Trace窗口检查FC帧的BS和STmin是否与配置一致。
  3. 网络管理报文验证:发送NM报文(如0x500),观察Nm模块是否收到并触发网络管理状态机。若NM报文被CanTp拦截,检查PduR路由是否错误地指向了CanTp。
  4. 超时与错误处理:人为制造流控超时(如不回复FC),观察CanTp是否上报N_Bs超时,Dcm是否返回否定响应0x78或0x21。
验证时建议同时抓取CAN总线原始报文和CanTp模块的内部状态日志。MICROSAR的CanTp支持CanTp_GetRxNSduStatus等API,可在调试时读取当前NSdu状态,快速定位是寻址错误、流控参数不匹配还是PduR路由缺失。
CAN TP 多帧传输与 PduR 路由关系图 测试仪 / 发送方 诊断请求 0x22 F1 90 (VIN) 首帧 FF ID=0x7E0, TA=0xDA 连续帧 CF STmin=5ms, BS=8 流控帧 FC BS=8, STmin=5 CanTp 模块 Rx NSdu TA=0xDA, 扩展寻址 N_Bs=1000ms Tx NSdu TA=0xDA, 扩展寻址 N_Cr=1000ms 流控参数 BS=8, STmin=5ms N_As=1000ms 多帧重组/拆分 PduR 路由表 路由路径 1 CanTpRx → DcmRx 方向: RX 路由路径 2 DcmTx → CanTpTx 方向: TX 路由路径 3 CanIfRx → NmRx 方向: RX 路由路径 4 NmTx → CanIfTx 方向: TX Dcm / Nm 上层模块 诊断服务处理 / 网络管理状态机 路由验证:Trace + 状态日志 物理请求 FF/CF CF FC Rx NSdu Tx NSdu 状态 关键检查点:寻址格式匹配 · BS/STmin 与对端一致 · PduR 路由方向正确 · 超时参数覆盖实际网络延迟

实际工程中,最常见的路由故障是PduR路由路径缺失或方向错误。例如,诊断请求能到达CanTp,但PduR未配置CanTpRx到DcmRx的路径,Dcm就收不到请求;或者响应路径配置为RX方向,导致Dcm的响应无法发回CanTp。建议在集成阶段用CANoe的Diagnostic Console逐条验证每个诊断服务的请求与响应,并检查PduR的路由计数器(如PduR_RxIndication调用次数)是否与预期一致。

注意:扩展寻址下,功能寻址请求(如0x7DF)通常不携带TA,但CanTp仍需配置对应的功能寻址NSdu。若功能寻址NSdu缺失,ECU将无法响应广播式诊断请求,导致OBD扫描失败。