文章目录
- Com(通信服务模块)
- PDU的定义和结构
- PDU的分类
- IPDU Mux 模块
- PDU R 模块(路由)
- Bus TP 模块
- BUS Interface
- CanIf模块
- LinIf模块
- 发送数据示例(CAN报文)
- 接收数据示例(CAN报文)
- 通信过程中路由选择的细节
- CAN诊断网络分层
- CAN诊断通信过程
- CAN TP 组帧和拆帧过程
- 举个栗子
AUTOSAR(Automotive Open System Architecture)通信服务是为了简化车内ECU(电子控制单元)之间的通信而设计的。它基于多种汽车通信协议(如CAN、LIN、FlexRay等),并定义了一系列模块来组成通信协议栈。
- Com(通信服务模块)
- 功能:管理和协调应用层之间的数据交换,处理信号的发送和接收。
- 特点:支持周期性和事件驱动的通信,能够与多种底层协议(如 CAN、LIN、Ethernet)集成。
- PduR(PDU 路由器)
- 功能:负责将 PDU(协议数据单元)从一个模块路由到另一个模块。
- 特点:提供多路复用和选择功能,将输入 PDU 分配给适当的接收方,以优化数据流。
- CanIf(CAN 接口模块)
- 功能:作为 CAN 网络的接口,管理 CAN 帧的发送和接收。
- 特点:支持 CAN 设备的初始化、数据传输和错误处理,同时与其他通信模块协同工作。
- LinIf(LIN 接口模块)
- 功能:提供与 LIN 网络的接口,处理 LIN 帧的发送和接收。
- 特点:支持 LIN 网络的多种功能,包括主从模式的管理和错误检测。
最底层MCAL:提供了底层通信的驱动,比如CAN发送接收驱动,Lin发送接收驱动
Com(通信服务模块)
AUTOSAR中的通信服务模块(Com模块)是AUTOSAR架构中非常重要的一部分。它主要负责在不同速率的总线网络之间进行数据交换,并为汽车控制单元(ECU)应用软件提供统一的通信环境。
以下是Com模块的一些关键功能和特点:
- 功能
- 数据交换:支持不同模块之间的数据交换,包括传感器数据、控制命令等。
- 信号处理:管理信号的发送和接收,包括信号的格式转换和处理。
- 信号调度:根据系统需求调度信号的发送,优化数据传输的时间和频率。
- 通信模式
- 发送和接收:支持周期性和事件驱动的通信模式,允许模块根据需要发送和接收数据。
- 数据变化通知:当信号值发生变化时,Com 模块可以通知相关的接收方,以实现即时更新。
- 支持的协议
- 多协议支持:Com 模块可以与多种底层通信协议集成,例如 CAN、LIN、FlexRay 和 Ethernet。
- 多路复用和选择:支持输入 PDU 多路复用(IPDU Mux),可以选择合适的信号源进行数据处理。
- 配置和可扩展性
- 可配置性:Com 模块的行为和参数在 AUTOSAR 系统描述文件(.arxml 文件)中配置,支持灵活的信号和通信管理。
- 模块化设计:通过模块化设计,可以根据具体应用需求进行定制和扩展。
- 错误处理
- 错误检测和管理:Com 模块可以检测通信错误,并提供相应的错误管理策略,以确保系统的可靠性。
- 接口
- 标准化接口:Com 模块提供标准化的接口,以便于与其他 AUTOSAR 模块(如 PduR、CanIf 等)进行交互和集成。
在AUTOSAR架构中,协议数据单元(Protocol Data Unit,PDU)是用于在不同层级之间传递数据的基本单位。PDU在AUTOSAR通信模型中负责封装和传递应用层数据,使得不同的模块和设备能够互相交换信息。
通信栈完整流程:
PDU的定义和结构
- 定义:PDU是在通信网络中传输的数据单元,包含了消息的有效载荷以及额外的控制信息¹²。
- 结构:PDU通常由两个主要部分组成:头部(Header)和有效载荷(Payload)。头部用于描述PDU的属性和参数,而有效载荷则携带了实际的数据内容²。
PDU的分类
根据功能和通信模式的不同,PDU可以分为以下几种类型:
-
L-PDU(Link Layer PDU):
- 数据链路层PDU:用于数据链路层的通信,包含ID、数据长度和数据¹。
-
N-PDU(Network Layer PDU):
- 网络层PDU:在网络层传输,包含网络层地址信息(N_AI)和协议控制信息(N_PCI),如单帧、首帧、连续帧和流控帧¹²。
-
I-PDU(Interaction Layer PDU):
- 交互层PDU:用于不同进程之间的数据传输,可以是周期性的或事件触发的²。
IPDU Mux 模块
在 AUTOSAR 中,IPDU Mux(Input Protocol Data Unit Multiplexer)模块用于管理和路由多种输入 PDU(协议数据单元)的接收和传输。它的主要作用是处理不同的信号和数据流,尤其是在具有多个信号源或多种数据格式的情况下
- 功能
- 信号选择:根据特定条件或标志,从多个输入 PDU 中选择一个进行处理。这个条件可以是消息的 ID、数据内容或其他控制信号。
- 路由管理:将接收到的输入 PDU 路由到相应的接收模块或应用层,以便进行进一步处理。
- 数据转换
- 数据格式转换:IPDU Mux 模块可以处理不同数据格式的输入 PDU,并将其转换为统一格式,以便于上层模块处理。
- 多路复用
- 资源优化:通过多路复用输入 PDU,可以有效利用网络带宽和资源,减少数据传输的冗余。
- 配置
- 可配置性:IPDU Mux 模块的配置通常在 AUTOSAR 系统描述文件(如 .arxml 文件)中定义,支持灵活的信号处理和路由策略。
- 应用场景
- 多种信号源:在车辆电子系统中,可能有多个传感器或控制单元发送相似或相关的数据。IPDU Mux 模块可以根据需要选择合适的信号进行处理。
PDU R 模块(路由)
PDU Router(PduR)模块是AUTOSAR架构中的关键组件,负责在不同通信网络之间传输和处理数据。它确保数据能够准确、高效地到达目的地。以下是PduR模块的一些主要功能和特点:
- 数据路由:
- 上层到下层:PduR模块将来自上层模块(如COM、DCM)的I-PDU传输到下层通信接口模块(如CanIf、LinIf)。
- 下层到上层:它也将来自下层模块的I-PDU传递到上层模块。
- 网关功能:
- PduR模块可以作为网关,将I-PDU从一个通信接口模块传输到另一个通信接口模块。
- 静态路由配置:
- I-PDU的路由是基于静态定义的I-PDU标识符执行的,路由路径在预编译阶段配置。
- 多播和单播:
- PduR支持I-PDU的单播(1:1)和多播(1:n)传输。
- 模块解耦:
- 通过PduR模块,上下层模块之间实现了解耦,增强了系统的灵活性和可维护性。
PduR模块在汽车通信架构中起到了桥梁作用,确保了不同模块之间的有效通信。
- 通过PduR模块,上下层模块之间实现了解耦,增强了系统的灵活性和可维护性。
Bus TP 模块
在AUTOSAR架构中,Bus Transport Protocol(Bus TP)模块主要负责在不同通信总线(如CAN、LIN、FlexRay等)上传输大于单帧容量的数据。以下是Bus TP模块的一些关键功能和特点:
- 多帧传输:
- 分段传输:当数据长度超过单帧容量时,Bus TP模块将数据分段为多个帧进行传输
- 重组数据:接收端的Bus TP模块负责将分段的帧重新组装成完整的数据包
- 流控制:
- 流控帧:Bus TP模块使用流控帧(Flow Control Frame)来管理数据传输的流量,确保发送端不会超出接收端的处理能力
- 错误检测和恢复:
- 错误检测:Bus TP模块能够检测传输过程中的错误,如帧丢失或顺序错误
- 错误恢复:在检测到错误时,Bus TP模块会触发重传机制,以确保数据的完整性
- 协议支持:
- ISO 15765-2:Bus TP模块通常基于ISO 15765-2标准,用于CAN总线的诊断通信
- 其他协议:也支持其他通信协议,如LIN和FlexRay
- 与其他模块的交互:
- PduR模块:Bus TP模块与PduR模块协作,确保数据能够正确路由到目标模块
- CanIf、LinIf等接口模块:Bus TP模块通过这些接口模块与物理总线进行通信
通过这些功能,Bus TP模块在确保大数据量可靠传输方面发挥了重要作用。
BUS Interface
是的,在AUTOSAR架构中,BUS Interface主要包括CAN Interface(CanIf)和LIN Interface(LinIf)模块。以下是这两个模块的详细介绍:
CanIf模块
- 位置和作用:
- CanIf模块位于底层CAN驱动(CanDrv)、CAN收发器(CanTrcv)和上层通信服务层(如PduR、CanNm、CanTp)之间
- 它提供了一个硬件独立的接口,用于管理不同的CAN硬件,如CAN控制器和CAN收发器
- 主要功能:
- 数据发送和接收:CanIf模块负责将上层模块的I-PDU传输到CAN总线,并接收来自CAN总线的I-PDU
- 控制器模式管理:CanIf模块可以控制CAN控制器的启动、停止和模式切换
- 错误处理和通知:CanIf模块能够处理CAN总线上的错误,并向上层模块发送错误通知
LinIf模块
- 位置和作用:
- LinIf模块作为硬件抽象接口层,屏蔽了下层LIN驱动的具体实现
- 它位于LIN驱动(LinDrv)和上层通信服务层(如PduR、LinTp)之间
- 主要功能:
- 数据传输:LinIf模块负责将上层模块的I-PDU传输到LIN总线,并接收来自LIN总线的I-PDU
- 诊断和唤醒:LinIf模块支持LIN总线的诊断功能和休眠唤醒机制
- 错误处理:LinIf模块能够检测和处理LIN总线上的错误,并向上层模块发送错误通知
发送数据示例(CAN报文)
在 AUTOSAR 通信服务中,发送 CAN 报文的具体流程可以概括为以下几个步骤:
- 准备数据
- 应用层准备数据:应用层或上层模块准备要发送的数据,并调用相应的接口进行发送。
- 填充 PDU:将数据填充到 PDU 中,包括必要的控制信息和数据有效载荷。
- 调用 PDU Router (PduR)
- 发送请求:应用层通过 PduR 调用发送接口(如
PduR_Send()
),请求发送数据。 - 路由选择:PduR 确定数据的目标(例如,CAN 或 LIN),并决定相应的传输协议(如 CanTp)。
- 调用 CanTp(如果需要)
- 分段处理:如果数据超过 CAN 帧的最大长度,PduR 将数据传递给 CanTp 进行分段处理。
- 发送分段 PDU:CanTp 将数据分段并发送每个数据块,控制每个块的传输状态和确认。
- 通过 CanIf 模块
- 调用 CanIf:PduR 或 CanTp 完成分段后,将每个数据段传递给 CanIf 模块。
- CAN 帧封装:CanIf 封装数据到 CAN 帧中,包括消息 ID 和其他控制信息。
- 通过 CAN 驱动发送
- 调用 CAN 驱动:CanIf 调用底层 CAN 驱动接口(如
CanIf_Transmit()
),将封装好的 CAN 帧发送到硬件。 - 硬件发送:底层驱动将 CAN 帧发送到 CAN 总线。
- 确认与反馈
- 接收确认:接收端的 CAN 控制器收到 CAN 帧后,发送确认信号,表明成功接收。
- 处理反馈:发送端的 CAN 驱动接收到确认后,通知 CanIf 模块,更新传输状态,并可以选择进行后续的处理(如发送下一个数据段)。
- 完成
- 通知应用层:一旦所有数据成功发送和确认,PduR 或相应的模块将返回结果给应用层,表明发送完成。
接收数据示例(CAN报文)
在 AUTOSAR 通信服务中,接收 CAN 报文的具体流程可以分为以下几个步骤:
- CAN 硬件接收
- 接收数据:CAN 控制器监测 CAN 总线,接收到一个完整的 CAN 帧。
- 存储数据:接收到的 CAN 帧数据被存储在硬件缓冲区中,等待处理。
- 调用 CAN 驱动
- 通知 CanIf:CAN 控制器通过中断或轮询方式通知 CAN 驱动(如 CanIf 模块)有新数据可用。
- 提取数据:CAN 驱动从硬件缓冲区提取接收到的 CAN 帧,并准备将其传递给上层模块。
- 通过 CanIf 处理
- 转发报文:CanIf 将接收到的 CAN 帧转发给 PduR 模块。
- 解封装 PDU:CanIf 解封装 CAN 帧,提取出有效载荷和其他控制信息。
- 调用 PDU Router (PduR)
- 路由选择:PduR 根据目标 PDU ID 和配置,确定数据的目的地,并将数据转发给相应的接收模块(如 CanTp 或应用层)。
- 分段处理:如果数据是通过 CanTp 进行的分段传输,PduR 会将数据传递给 CanTp 进行重组。
- 通过 CanTp(如果适用)
- 重组数据:CanTp 将接收到的分段数据进行重组,确保完整性。
- 发送到上层:完成重组后,CanTp 将完整的数据传递给 PduR。
- 通知应用层
- 调用应用接口:PduR 将最终的数据传递给应用层或上层模块,调用相应的接口(如
PduR_Receive()
)。 - 处理数据:应用层处理接收到的数据,执行相应的业务逻辑。
- 确认与反馈
- 发送确认:根据需要,应用层可以发送确认信息或反馈,确保数据已被成功处理。
通信过程中路由选择的细节
在 AUTOSAR 通信过程中,路由选择主要通过 PDU Router (PduR) 模块进行,具体步骤如下:
- PDU 定义
- 每个 PDU 在配置文件中定义,包括其 ID、数据长度和目标模块等信息。
- 接收报文
- 当接收到 CAN 报文时,CanIf 模块将其转发给 PduR。
- 查找路由表
- PduR 内部维护一个路由表,记录每个 PDU ID 和其对应的目标模块。
- PduR 使用接收到的 PDU ID 在路由表中查找,确定数据的接收目标。
- 转发数据
- 根据路由表中的配置,PduR 将数据转发给相应的接收模块(如应用层、CanTp 或其他通信模块)。
- 如果需要,PduR 还会处理数据的转换(例如,格式转换或数据分段)。
- 处理确认
- PduR 可能还会根据配置向发送方或其他模块发送确认信息,确保数据传输的可靠性。
CAN诊断网络分层
CAN 诊断的网络分层通常遵循 OSI 模型的分层结构,具体包括以下几个层次:
- 物理层
- 功能:负责数据的物理传输,包括电气信号的发送和接收。
- 实现:定义电缆类型、连接器和电气特性,确保信号在 CAN 总线上的稳定传输。
- 数据链路层
- 功能:负责帧的组装、传输和错误检测。
- 实现:使用 CAN 协议,定义帧格式、优先级、仲裁和错误处理机制。
- 网络层
- 功能:处理数据包的路由和传输,但在 CAN 网络中通常不明显。
- 实现:一般通过诊断会话管理和数据传输来实现,例如,UDS(统一诊断服务)通过网络层协议传输诊断消息。
- 传输层
- 功能:提供可靠的数据传输,确保数据的完整性和顺序。
- 实现:在诊断中,CAN 诊断服务(如 UDS)可以通过分段和重组功能来实现大数据块的传输。其中CAN Tp模块便是这个起作用。
- CanTp 处理以下内容:
- 数据分段:将较大的 PDU 分割成多个小的 CAN 帧进行传输。
- 数据重组:在接收端将分段的 CAN 帧重新组合为完整的数据块。
- 可靠性控制:实现数据传输的确认机制,确保数据的可靠接收。
- 会话层
- 功能:管理和控制会话的建立、维护和结束。
- 实现:通过会话管理服务(如启动会话、停止会话)来控制诊断服务的状态。
- 表示层
- 功能:负责数据格式化和转换,确保不同系统之间的数据能够理解。
- 实现:在诊断服务中,数据的编码和解码通常在此层进行。
- 应用层
- 功能:提供最终用户的接口,定义具体的诊断服务。
- 实现:实现具体的诊断功能,如故障代码读取、数据流监控、程序下载等。
在 AUTOSAR 中,通信报文和诊断报文的处理有所不同:
- 诊断报文
- 经过 CanTp:诊断报文(如 UDS 报文)通常会经过 CAN Transport Protocol (CanTp) 模块。由于诊断报文可能需要传输较大的数据块,CanTp 的分段和重组功能确保能够在 CAN 网络中可靠地传输这些数据。
- 通信报文
- 通常不经过 CanTp:常规的通信报文(例如,传感器数据、控制命令等)通常不需要分段,因此可以直接通过 CAN 控制器发送。通信报文的大小一般在 CAN 帧的限制范围内,不需要 CanTp 的处理。
- 例外情况:如果某些通信报文的数据量较大并需要分段,那么它们也可能经过 CanTp。
CAN诊断通信过程
在 AUTOSAR 和 CAN 诊断中,诊断请求帧和应答帧是用于实现诊断服务的基本消息类型。
发送方(通常是诊断工具或测试设备)向 ECU(电子控制单元)发送的请求消息。
请求特定的诊断服务或数据,例如读取故障码、执行诊断测试或请求实时数据流。
内容:
- 服务标识符 (Service ID):指示请求的具体服务类型。
- 数据字段:包含服务所需的参数和数据。
接收方(ECU)对诊断请求帧的回应消息。
提供请求中所要求的数据或服务的结果,例如返回读取到的故障码或执行结果。
内容:
- 服务标识符 (Service ID):与请求帧中的服务 ID 一致,表示这是对特定请求的回应。
- 数据字段:包含请求的结果、错误码或状态信息。
通过这两种帧,诊断工具与 ECU 之间能够实现有效的双向通信,从而获取故障信息和进行各种诊断服务。
CAN TP 组帧和拆帧过程
CAN诊断由发送端的请求和接收端的响应构成,诊断即为发送端与接收端数数据往来。有的诊断一条信息完成, 有的诊断信息需要多条信息完成。毕竟在诊断中,一条CAN消息只包含八个字节,对于一条CAN诊断信息的分段发送问题,就是网络层需要讨论的内容。
在 CANTP层,传输报文主要分为以下几类:
- 单帧报文 (Single Frame)
- 定义:用于传输较小的数据,整个数据在一个帧中发送。
- 特点:适用于数据长度在 CAN 帧大小限制内的情况,简单快速。
- 第一帧 (First Frame)
- 定义:用于开始传输较大数据块的第一部分。
- 特点:包含数据的长度信息和序列号,指示接下来会有多帧数据传输。
- 数据帧 (Data Frame)
- 定义:紧随第一帧后传输的数据部分。
- 特点:用于传输第一帧所指定的数据块的剩余部分,多个数据帧可以连续发送。
- 最后一帧 (Flow Control Frame)
- 定义:用于接收方控制数据流,告知发送方可以继续发送的状态。
- 特点:用于流量控制,指示发送方是否需要暂停或继续发送数据。
在 PCI(Protocol Control Information)中,包含 PDU 单元类型和消息字节长度,这两个字段对于 CAN Transport Protocol (CanTp) 的数据传输至关重要。具体理解如下:
- PDU 单元类型
- 定义:PDU 单元类型指示当前传输的消息的类型,通常包括不同的报文类型,如单帧报文、第一帧、数据帧或流控制帧。
- 功能:通过这一字段,接收方可以确定如何处理接收到的消息。例如:
- 如果是单帧报文,接收方直接读取数据。
- 如果是第一帧,接收方将准备接收后续的数据帧。
- 消息字节长度
- 定义:消息字节长度字段指示当前 PDU 中数据的有效字节数。
- 功能:接收方使用这一字段来了解需要处理的数据量。这对于后续的帧解析和数据重组非常重要,尤其是在处理多帧传输时,接收方需要根据字节长度来确保数据的完整性。
举个栗子
假设我们需要传输一个数据块,总长度为 150 字节。由于 CAN 帧的最大有效负载为 8 字节,CanTp 需要将这个数据块分成多帧进行传输。
数据块:0x01, 0x02, 0x03, ..., 0x96 // 共 150 字节
1.首先发送第一帧:
内容:
- PDU 单元类型:第一帧
- 数据长度:150 字节(0x96)
- 数据部分:0x01, 0x02, 0x03, …, 0x08 // 包含前 8 字节的数据
[PDU Type: First Frame | Length: 150 | Data: 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08]
2.发送后续数据帧
CanTp 会发送多个数据帧。每个数据帧将包含 8 字节数据。
数据帧 1(第二帧):
[PDU Type: Data Frame | Data: 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10]
数据帧 2(第三帧):
[PDU Type: Data Frame | Data: 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18]
数据帧 18(最后一帧):
[PDU Type: Data Frame | Data: 0x96]
3.发送流控制帧(可选)
在数据传输过程中,接收方可以发送流控制帧以控制数据流。例如,如果接收方需要处理时间,可以发送“暂停”指令。
4.重组数据
接收方在收到所有相关的数据帧后,会将它们重组为完整的数据块:
重组的数据块:0x01, 0x02, 0x03, ..., 0x96