【AUTOSAR】【CAN通信】CanTp

目录

一、介绍

二、功能说明

2.1 向上层提供的服务

2.1.1 初始化和关闭

2.1.2 发送请求

2.1.3 发送取消

2.2 向下层提供给下层的服务

2.2.1 传输确认

2.2.2 接收指示

2.3 内部行为

2.3.1 N-SDU接收

2.3.2 N-SDU传输

2.3.3 缓冲区策略

2.3.4 Tx和Rx数据流

2.3.5 CAN NSduId与CAN LSduId之间的关系

2.3.6 并发连接

2.3.7 N-PDU填充

2.3.8 意外N-PDU到达的处理

2.4 错误分类

2.4.1 开发错误

2.4.2 运行错误

三、API接口

3.1 API定义

3.2 回调通知


一、介绍

该规范定义了AUTOSAR基本软件模块CAN传输层(CanTp)的功能、API和配置。

CanTp是PDU路由器和CAN接口模块之间的模块。CAN TP模块的主要目的是在CAN FD的情况下,分段和重新组装超过8字节或超过64字节的CANI-PDU。PDU路由器将AUTOSAR COM和DCMI-PDU部署到不同的通信协议上。通过网络系统类型(例如CAN、LIN和Flex Ray)的路由取决于I-PDU标识符。PDU路由器还可以确定是否必须使用传输协议。最后,当没有速率转换时,该模块执行网关功能。

CanIf提供了相同的机制来访问CAN总线通道。从CAN控制器的位置(芯片/板载),提取ECU硬件布局和CAN驱动程序的数量。因为CanTp只处理传输协议帧(即SF、FF、CF和FCPDU),这取决于N-PDU ID,CAN接口必须将I-PDU转发给CanTp或PduR。

二、功能说明

这里提供了对CAN传输层功能的描述。它解释了提供给上层和下层的服务以及CAN传输层的内部行为。

CanTp模块提供用于分段、具有流量控制的传输等的服务,以及重新组合消息。它的主要用途是发送和接收信息其可以适合于也可以不适合于单个CAN帧。不适合单个邮件的邮件CAN框架被分割成多个部分,因此每个部分都可以在单个CAN帧。

2.1 向上层提供的服务

CanTp模块的服务接口主要可分为以下几种:

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

2.1.1 初始化和关闭

【规范】CanTp模块应具有两个内部状态,CANTP_OFF和CANTP_ON。

【规范】CanTp模块通电后应处于CANTP_OFF状态。

【规范】在状态CANTP_OFF中,CanTp应允许更新构建后的配置。

【规范】当CanTp已成功用CanTp_Init()初始化时,CanTp模块将变为内部状态CANTP_ON。

【规范】只有当CanTp处于CANTP_ON状态时,CanTp模块才能执行分段和重组任务。

【规范】函数CanTp_Init应初始化模块的所有全局变量,并将所有传输协议连接设置为CANTP_ON的子状态,该子状态中没有分段传输和分段接收(状态CANTP_RX_WAIT的Rx线程,状态CANTP_TX_WAIT的Tx线程)。

【规范】如果当CanTp模块处于全局状态CANTP_ON时调用,则CanTp_Init将模块返回到Idle状态(状态= CANTP_ON,但没有进行传输或接收。

【规范】当CanTp模块处于全局状态CANTP_ON时,如果调用CanTp_Init,则CanTp模块将丢失所有当前连接。

【规范】函数CanTp_Shutdown应正确停止CanTp模块

 

2.1.2 发送请求

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

【规范】函数CanTp_Transmit()应为异步的。

【规范】在接受传输请求后,如果N-SDU传输被完全处理(无论是否成功),CanTp模块应通知其上层。

2.1.3 发送取消

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

【规范】发射取消是由CanTp_CancelTransmit()。

【规范】在调用服务CanTp_CancelTransmit()后,将中止此连接上的传输。

2.2 向下层提供给下层的服务

根据AUTOSAR的通信堆栈规范,CAN传输层为CAN接口提供了以下两个回调函数:TxConfirmation()和CanTp_RxIndication()。

2.2.1 传输确认

【规范】当在最大时间(等于N_As)之后未收到传输确认时,CanTp模块应中止相应的会话。N-PDU在收到Tx确认与否之前,对其他并发会话仍然不可用。

【规范】对于确认调用,CanTp模块应提供CanTp_TxConfirmation()功能。

【规范】当CanTp_TxConfirmation()与结果E_NOT_OK.c一起调用时,CanTp应中止响应会话

2.2.2 接收指示

CanIf模块应调用接收指示功能,通知CanTp模块已接收到新的CAN N-PDU帧(即传输协议帧)。

【规范】对于接收指示,CanTp模块应提供CanTp_RxIndication()。

2.3 内部行为

CAN传输层的内部操作提供了基本的机制,以执行该模块的主要目的,即在单个CAN帧或多个CAN帧中传输消息。CAN传输层的整个行为将被事件触发,因此CanTp可以直接处理来自PDU路由器(分别为CAN接口)的N-SDU(分别为L-SDU)的传输。

2.3.1 N-SDU接收

【规范】当接收到SF或FF N-PDU时,CanTp模块应使用PduR_CanTpStartOfReception功能通知上层(PDU路由器)此接收。

【规范】当CanTp_RxIndication需要SF或FFN-PDU(指示通用连接)时,CanTp模块应存储元数据中包含的寻址信息,并将此信息用于与上层的连接、FCN-PDU的传输和CFN-PDU的识别。

2.3.2 N-SDU传输

上层通过调用CanTp_Transmit()来要求传输N-SDU。CanTp_Transmit()的参数描述了CAN NSduId和要发送的完整的Tx N-SDU长度。

2.3.3 缓冲区策略

由于CanTp没有缓冲能力,因此要传输的N-SDU有效负载不会在内部复制,接收到的N-PDU也不会在内部重新组装。CAN传输层直接工作在上层的内存区域(例如PduR、DCM或COM)。要访问这些内存区域,CAN传输层将使用PduR_CanTpCopyTxData()或PduR_CanTpCopyRxData()函数。

因此,为了保证数据的一致性,上层应该锁定这个内存区域,直到出现指示为止。当传输缓冲区被锁定时,上层不能在缓冲区区域内写入数据。当接收缓冲区被锁定时,CAN传输层并不能保证缓冲区的数据一致性。上层不应该在缓冲区中读取或写数据。

 

2.3.4 Tx和Rx数据流

流量控制用于调整发送方到接收方的能力。该传输协议的主要用途是点对点通信(即1到1的通信-物理寻址)。

【规范】CanTp模块应提供1到n个通信(即功能性寻址[1]),以功能的形式提供到SFn-pdu(并且只有SF NSDU)。

2.3.5 CAN NSduId与CAN LSduId之间的关系

描述了CAN NSduId和CAN LSdu Id之间存在的连接,以便使传输协议数据单元的传输和接收成为可能。

2.3.6 并发连接

CAN传输层能够同时管理多个连接(例如,可以同时接收一个UDS和一个OBD请求)。

2.3.7 N-PDU填充

保证完全兼容所有上层要求有关帧数据长度(例如OBD要求数据长度总是设置为8字节,然而UDS不),填充激活是可配置的预编译时间每N-SDU使用激活Rx N-SDU或CanTpTx激活激活Tx N-SDU。

2.3.8 意外N-PDU到达的处理

CAN传输层在意外的N-PDU到达时的行为在很大程度上取决于处理N-SDU的通信方向类型。

【规范】如果接收到意外的帧,CanTp模块应按照下表运行。此表指定了考虑当前CanTp内部状态(CanTp状态)的N-PDU处理。

 

2.4 错误分类

2.4.1 开发错误

2.4.2 运行错误

 

三、API接口

3.1 API定义

  1. CanTp_Init
  2. CanTp_GetVersionInfo
  3. CanTp_Shutdown
  4. CanTp_Transmit
  5. CanTp_CancelTransmit
  6. CanTp_CancelReceive
  7. CanTp_ChangeParameter
  8. CanTp_ReadParameter
  9. CanTp_MainFunction

3.2 回调通知

  1. CanTp_RxIndication
  2. CanTp_TxConfirmation

猜你喜欢

转载自blog.csdn.net/qq_42357877/article/details/129758597
今日推荐