CanTp功能详述(二)


在“CanTp功能详述(一)”中介绍了CanTp提供给上层与下层的服务,以及其内部行为中的N-SDU接收与N-SDU发送。本文继续介绍CanTp的其他内部行为以及错误分类,包括:

  • 缓冲策略
  • 协议参数设置服务
  • 发送与接收数据流
  • CAN NSduId和CAN LSduId的关系
  • 并发连接
  • N-PDU填充
  • 处理意外到达的N-PDU

内部行为

缓冲策略

因为CanTp没有缓冲能力,所以要发送的N-SDU有效载荷不会在内部复制,收到的N-PDU也不会在内部重新组装。
CAN传输层直接在上层的存储区域上工作(例如:PduR、DCM、COM)。为了访问这些内存区域,CAN传输层使用PduR_CanTpCopyTxData()或PduR_CanTpCopyRxData()函数。
因此,为了保证数据一致性,上层应该锁定该内存区域,直到出现指示。
当发送缓冲区被锁定时,上层不能在缓冲区内写入数据。当接收缓冲区被锁定时,CAN - T传输层不能保证缓冲区的数据一致性。上层既不能读也不能写缓冲区中的数据。发送与接收缓冲器锁定示意图如下:
在这里插入图片描述
假设上层模块在调用PduR_CanTpStartOfReception()并返回BUFREQ_OK时锁定了缓冲区,或者当CanTp_Transmit()返回E_OK时,应该保持缓冲区锁定,直到确认或指示(PduR_CanTpTxConfirmation()或PduR_CanTpRxIndication()调用)发生。
下图提供了一个示例,以总结使用CAN 2.0帧发送长度为50字节的帧的过程:
在这里插入图片描述

  1. PduR请求传输50个数据字节;
  2. CanTp向PduR请求载荷数据, 发送第一帧(首帧);
  3. CanTp将剩余的有效载荷数据按连续帧序列发送,上层在每个CF上复制6或7个有效载荷数据字节;
  4. CanTp确认载荷数据的传输。

下图是N-SDU接收49字节的示例;上层报告25个字节作为可用的Rx缓冲区:
在这里插入图片描述

  1. CanIf用CanTp_RxIndication()通知新的接收, CanTp将此通知转发给PduR;
  2. PduR返回可用缓冲区大小为25字节,CanTp向发起者发送FlowControl CTS;
  3. CanTp向PduR提供接收到的每一帧的数据,并监控剩余的缓冲区大小。在连续第二帧之后,剩余的缓冲区大小不够下一个块(两个连续帧);
  4. CanTp通过调用PduR_CanTpCopyRxData(),以0作为数据长度和NULL_PTR作为数据,向PduR请求剩余的缓冲区大小,并向发起者发送FlowControl Wait。直到下一个块有足够的缓冲区可用为止;
  5. 当缓冲区大小最终足够下一个块时,CanTp将向发起者发送一个FlowControl CTS,并继续接收下一个连续帧块;
  6. 在复制完块的最后一个连续帧后,剩余的缓冲区对于下一个块来说太小了,因此CanTp再次发送等待帧并监视剩余的缓冲区大小;
  7. 当最后一个区块的缓冲区可用时,CanTp将继续接收;
  8. CanTp通过调用PduR_CanTpRxIndication()通知PduR接收结束。
协议参数设置服务

CanTp模块应支持ISO 15765-2规范中提出的可选原语,用于通过应用动态设置某些传输协议内部参数,如STmin、BS。
BS值只是一个最大值。由于缓冲区长度的原因,CAN传输层可以在配置的最大值范围内调整BS值。

发送与接收数据流

下图显示了未分段报文传输分段报文传输的示例。
未分段报文传输

分段报文传输
流控帧用于调整发送方以适应接收方的能力,这种传输协议的主要用途是点对点通信(即1对1通信-物理寻址)。
CanTp模块提供1对n通信(即功能寻址),以功能的形式到SF N-PDUs(仅SF N-SDU)。
配置工具将检查是否只有SF N-PDUs配置了功能寻址属性。
如果多个分段会话发生(在接收方和发送方),并且该句柄的通信类型是功能性的,CanTp模块将拒绝该请求并报告运行时错误代码CanTp.CANTP_E_INVALID_TATYPE给为DET(开发错误跟踪器)。

CAN NSduId和CAN LSduId的关系

一个CAN NSduId只能与一个CAN LSduId相连,该CAN LSduId用于传输SF、FF、FC和CF帧。然而,如果消息被配置为使用扩展或混合寻址格式,CanTp模块必须用N_TA(在扩展寻址的情况下)或N_AE(在混合寻址的情况下)值填充每个传输段(SF, FF和CF)的第一个字节。因此,CAN NSduId也可能与N_TA或N_AE值相关。
FC协议数据单元通过授权或延迟后续CF N-PDUs的传输,使接收方有可能控制发送方的数据流。
对于扩展寻址格式,FC的第一个数据字节也包含N_TA值或N_TA和N_TAtype值的唯一组合; 对于混合寻址格式,FC的第一个数据字节包含N_AE值。因此,FC帧的CAN NSduId与其N_TA值(例如N_AI)或N_AE值相结合,只能识别一个CAN NSduId。
在接收方向,每个(SF, FF或CF)传输协议数据单元的第一个数据字节值将用于确定相关的N-SDU。因此,CanTp模块在接收扩展寻址N-PDU时,需要提取N_TA值来建立相应的N-SDU。对于与N_AE值相关的混合寻址模式应有相同的过程。
NSduId和LSduId之间可能存在的链路如下图:
在这里插入图片描述

并发连接

CAN传输层能够同时管理多个连接(例如:可以同时接收一个UDS和一个OBD请求)。
可以在CanTp模块中配置并发连接。
连接通道仅用于CanTp内部使用,因此它们不能从外部访问。
所有必要的信息(通道号,定时参数…)在CAN传输层模块中配置。
每个N-SDU静态链接到一个连接通道, 这个连接通道表示一个内部路径,用于发送或接收N-SDU, 连接通道连接到一个或多个N-SDU。
每个连接通道都独立于其他连接通道, 这意味着连接通道使用自己的资源,如内部缓冲区、定时器或状态机。
CanTp模块将N-SDU路由到正确配置的连接通道。
CanTp模块不能同时接收或发送具有相同标识符的N-SDU,否则无法将接收到的帧分配到正确的连接。仅当特定连接(不使用MetaData)使用时,此要求由配置强制执行,因为每个N-SDU仅链接到一个连接通道。如果用户希望将特定的连接通道只分配给一个N-SDU,则在配置过程中只能将该连接通道分配给一个N-SDU。
如果一个连接通道被分配给多个N-PDUs,那么资源在不同的N-PDUs之间共享,如果没有可用的连接通道,CAN传输层将拒绝传输或中止接收。
连接通道的数量不能直接配置。这将由配置工具在配置过程中通过分析N-SDU/Channel路由表来确定。
如果配置的传输连接通道正在使用中(状态CANTP_TX_PROCESSING), CanTp模块将拒绝链接到该通道的新传输请求。为了拒绝传输,当上层使用CanTp_Transmit()函数请求传输时,CanTp返回E_NOT_OK。
当收到不带Metadata的SF或FF N-PDU时,并且对应的连接通道当前正在接收相同的连接(状态CANTP_RX_PROCESSING,相同的N_AI), CanTp模块将中止正在进行的接收,并将接收到的帧作为新接收的开始处理。当在活动的连接通道上收到另一个连接(不同的N_AI)不带MetaData的SF或FF N-PDU时,忽略该SF或FF。
当收到带有MetaData(表示通用连接)的SF或FF N-PDU,且对应的连接通道当前正在接收时,忽略该SF或FF。
当一个Tx N-PDU被不同通道上的两个或多个不同连接使用时,对该N-PDU的访问应使用TxConfirmation进行序列化。如果一个Rx N-PDU使用扩展或混合寻址,或者当它具有MetaData时,则该Rx N-PDU只能在两个或两个以上不同的连接通道上使用。
注:根据帧格式(CAN FD或CAN 2.0), CAN FD和CAN帧将被CanIf映射到不同的PDUs上,因此,可以区分CAN FD和经典CAN通信。

N-PDU填充

为了保证与所有上层关于帧数据长度的要求完全兼容(例如OBD要求数据长度始终设置为8字节,而UDS没有),填充激活可以在每个N-SDU的预编译时配置,通过使用CanTpRxPaddingActivation用于Rx N-SDU或CanTpTxPaddingActivation用于Tx N-SDU。
在填充和不填充模式下,CanTp模块只将使用过的数据字节传输到上层。
填充字节的值可以通过配置参数CANTP_PADDING_BYTE进行配置。
如果Rx N-SDU使用的帧载荷<= 8 (CAN 2.0帧或小的CAN FD帧),且CanTpRxPaddingActivation等于CANTP_ON,则CanTp只接受该N-SDU的SF Rx N-PDUs或最后的CF Rx N-PDUs,长度为8字节(即PduInfoPtr.SduLength = 8)。
如果Rx N-SDU使用的帧载荷<= 8 (CAN 2.0帧或小CAN FD帧),且CanTpRxPaddingActivation等于CANTP_ON,则CanTp通过调用CanTp_RxIndication()方式接收一个属于该N-SDU的长度小于8字节的SF Rx N-PDU(即PduInfoPtr.SduLength < 8),CanTp将拒绝接收。运行时错误码CanTp.CANTP_E_PADDING应该报告给默认错误跟踪器DET。
如果Rx N-SDU使用的帧载荷<= 8 (CAN 2.0帧或小的CAN FD帧),且CanTpRxPaddingActivation等于CANTP_ON,并且CanTp通过CanTp_RxIndication()方式接收到属于该N-SDU的最后一个CF Rx N-PDU,长度小于8字节(即PduInfoPtr. SduLength != 8), CanTp将通过调用PduR_CanTpRxIndication()终止正在进行的接收,结果为E_NOT_OK。运行时错误码CanTp.CANTP_E_PADDING应该报告给DET。
如果Rx N-SDU的CanTpRxPaddingActivation等于CANTP_ON,则CanTp模块发送长度为8字节的FC N-PDUs, N-PDU中未使用的字节用CANTP_PADDING_BYTE更新。
如果Tx N-SDU使用的帧载荷<= 8 (CAN 2.0帧或小的CAN FD帧),并且CanTpTxPaddingActivation等于CANTP_ON,则CanTp将通过调用CanIf_Transmit()传输SF Tx N-PDU或属于该Tx N-SDU的最后一个CF Tx N-PDU(长度为8字节)。.N-PDU中未使用的字节更新为CANTP_PADDING_BYTE。
如果某个Tx N-SDU的CanTpTxPaddingActivation等于CANTP_ON,并且在传输过程中,通过调用CanTp_RxIndication(),收到该Tx N-SDU的FC N-PDU,且该FC长度小于8字节时,CanTp模块将调用PduR_CanTpTxConfirmation()并返回E_NOT_OK,从而终止传输会话。运行时错误码CanTp.CANTP_E_PADDING应该报告给DET。
如果通过CanIf_Transmit()传输的数据长度不匹配可能的DLC值(0…)8、12、16、20、24、32、48或64),CanTp将使用下一个更高的有效DLC进行传输,并将未使用的字节初始化为CANTP_PADDING_BYTE的值。
原理:ISO 11898-1:2015 DLC值从9到15分配给CAN帧有效载荷长度高达64字节的非线性离散值。为了防止传输未初始化的数据,当要传输的N_PDU长度不等于ISO 11898-1:2015 DLC表中定义的离散长度值之一时,对于DLC值大于8的CAN帧数据必须填充。对于DLC值从9到15,应该只使用强制填充。
下图表示ISO帧结构:
在这里插入图片描述

处理意外到达的N-PDU

CAN传输层对意外到达的N-PDU的行为很大程度上取决于处理N-SDU的通信方向类型。
接收到的N-PDU包含与接收或发送相同的地址信息(N_AI),这些信息可能在接收到N-PDU时处理。
如果接收到异常帧,CanTp模块将按照下表进行处理,该表描述了考虑CanTp当前内部状态的N-PDU处理方式。
在这里插入图片描述
表中的空闲代表 CANTP_ON.CANTP_RX_WAIT 与CANTP_ON.CANTP_TX_WAIT。

错误分类

对于错误和异常,CanTp模块不修改其当前模块状态,而应简单地报告错误事件。
在错误产生的情况下,诊断事件管理器Dem模块(通过功能抑制管理器)将执行适当的操作(例如:进行状态修改)。

开发错误

在这里插入图片描述

运行时错误

在这里插入图片描述
如果任务因As, Bs, Cs, Ar, Br, Cr 超时而终止,则CanTp模块将引发开发错误CanTp.CANTP_E_RX_COM(在接收操作的情况下)或CanTp.CANTP_E_TX_COM(在传输操作的情况下)。如果任务因任何其他协议错误而终止,CanTp模块将引发运行时错误码CanTp.CANTP_E_COM到DET。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值