目录
2.3.5 CAN NSduId与CAN LSduId之间的关系
一、介绍
该规范定义了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定义
- CanTp_Init
- CanTp_GetVersionInfo
- CanTp_Shutdown
- CanTp_Transmit
- CanTp_CancelTransmit
- CanTp_CancelReceive
- CanTp_ChangeParameter
- CanTp_ReadParameter
- CanTp_MainFunction
3.2 回调通知
- CanTp_RxIndication
- CanTp_TxConfirmation