当前位置: 首页 > news >正文

AUTOSAR图解==>AUTOSAR_SWS_SAEJ1939TransportLayer

AUTOSAR SAE J1939 传输层详解

基于 AUTOSAR 规范的 J1939 传输协议模块分析

目录

  • 1. SAE J1939 传输层概述
    • 1.1 模块定位与功能
    • 1.2 J1939TP 在 AUTOSAR 中的位置
  • 2. J1939TP 模块架构
    • 2.1 架构概览
    • 2.2 接口说明
  • 3. J1939TP 状态机设计
    • 3.1 主要状态定义
    • 3.2 状态转换流程
  • 4. 传输协议分析
    • 4.1 CMDT 连接模式
    • 4.2 BAM 广播模式
  • 5. 配置结构
    • 5.1 配置类层次关系
    • 5.2 主要配置参数
  • 6. 总结

1. SAE J1939 传输层概述

1.1 模块定位与功能

SAE J1939 传输层(简称 J1939TP)是 AUTOSAR 通信栈中的一个关键组件,专门负责实现基于 SAE J1939 标准的传输协议功能。SAE J1939 是广泛应用于商用车辆和工业设备的通信协议,特别适合于复杂的车辆和机械系统。

J1939TP 模块的主要功能包括:

  • 支持大于 8 字节数据消息的分段与重组
  • 实现两种传输模式:广播公告模式(BAM)和连接模式数据传输(CMDT)
  • 处理传输协议控制消息,如 RTS(请求发送)、CTS(清除发送)和 ACK(确认)
  • 管理传输超时和错误处理
  • 提供标准化的 API 接口,方便上层应用调用

J1939TP 能够处理的最大数据量为 1785 字节,这远超过 CAN 帧的单包 8 字节限制,从而实现了大量数据的高效传输。

1.2 J1939TP 在 AUTOSAR 中的位置

在这里插入图片描述

上图展示了 J1939TP 在 AUTOSAR 分层架构中的位置和与其他模块的交互关系。从架构图中可以看出:

  1. 层次定位:J1939TP 位于 ECU 抽象层中的通信抽象部分,是连接上层通信服务和底层硬件抽象的桥梁

  2. 上行接口

    • 与 PDU 路由器(PduR)模块交互,接收上层应用的传输请求
    • 提供传输协议服务给诊断通信管理器(DCM)和 COM 模块
  3. 下行接口

    • 通过 CAN 接口(CanIf)发送和接收 CAN 消息
    • 不直接与 CAN 驱动交互,保持硬件抽象性
  4. 服务交互

    • 与开发错误跟踪器(Det)接口用于错误报告
    • 与诊断事件管理器(Dem)接口用于诊断事件处理

这种分层设计遵循 AUTOSAR 的模块化原则,使 J1939TP 能够独立于具体硬件实现,便于在不同平台间移植。


2. J1939TP 模块架构

2.1 架构概览

J1939TP 模块架构遵循 AUTOSAR 基础软件的标准结构,包含明确定义的组件、接口和行为。从架构上看,J1939TP 主要包括以下几个核心部分:

  1. 初始化组件:负责模块的初始化和反初始化
  2. 传输管理组件:处理数据传输请求和流程控制
  3. 接收管理组件:处理数据接收和重组
  4. 状态管理组件:维护各通道的状态机
  5. 调度组件:通过主函数周期性执行,处理超时监控

这些组件共同协作,确保 J1939 网络通信的可靠性和高效性。

2.2 接口说明

J1939TP 模块通过以下关键接口与其他模块交互:

  1. 与 PDU 路由器交互的上行接口

    • J1939Tp_Transmit:接收上层传输请求
    • PduR_J1939TpRxIndication:向上层指示接收完成
    • PduR_J1939TpTxConfirmation:向上层确认传输完成
    • PduR_J1939TpStartOfReception:通知上层开始接收
    • PduR_J1939TpCopyRxData:从 TP 复制接收数据到上层
    • PduR_J1939TpCopyTxData:从上层复制发送数据到 TP
  2. 与 CAN 接口交互的下行接口

    • CanIf_Transmit:向 CAN 接口发送数据
    • J1939Tp_RxIndication:接收 CAN 接口的数据指示
    • J1939Tp_TxConfirmation:接收 CAN 接口的传输确认
  3. 调度和管理接口

    • J1939Tp_MainFunction:周期性执行的主函数,由 OS 或 SchM 调用
    • J1939Tp_CancelTransmit:取消正在进行的传输
    • J1939Tp_CancelReceive:取消正在进行的接收
    • J1939Tp_ChangeParameter:动态更改连接参数

这些接口的设计遵循 AUTOSAR 的标准接口规范,确保了模块间的无缝集成和交互。


3. J1939TP 状态机设计

3.1 主要状态定义

在这里插入图片描述

J1939TP 模块实现了一个复杂的状态机来管理传输和接收过程。上图展示了 J1939TP 的状态转换图,主要包括以下状态:

  1. 未初始化状态 (J1939TP_UNINIT)

    • 模块未初始化,所有服务不可用
    • 这是模块启动时的初始状态
  2. 空闲状态 (J1939TP_IDLE)

    • 模块已初始化,可以处理传输和接收请求
    • 此状态下没有活动的传输或接收操作
  3. 传输状态:包含多个子状态,用于处理发送过程中的各个阶段

    • 等待 RTS 确认 (J1939TP_TX_WAIT_RTS_CONF):等待 RTS 消息的发送确认
    • 等待 CTS 接收 (J1939TP_TX_WAIT_CTS_RX):等待接收方发送的 CTS 消息
    • 等待数据确认 (J1939TP_TX_WAIT_DT_CONF):等待数据包的发送确认
    • 等待 ACK 接收 (J1939TP_TX_WAIT_ACK_RX):等待接收方的最终确认
    • 等待 BAM 确认 (J1939TP_TX_WAIT_BAM_CONF):等待 BAM 消息的发送确认
    • 等待 BAM 数据确认 (J1939TP_TX_WAIT_BAM_DT_CONF):等待 BAM 数据包的发送确认
  4. 接收状态:包含多个子状态,用于处理接收过程中的各个阶段

    • 等待数据包 (J1939TP_RX_WAIT_DT):等待数据包的接收
    • 等待 CTS 确认 (J1939TP_RX_WAIT_CTS_CONF):等待 CTS 消息的发送确认
    • 等待接收完成 (J1939TP_RX_PROCESSING):正在处理接收的数据

3.2 状态转换流程

状态机的转换由以下事件触发:

  1. 初始化触发的转换

    • J1939Tp_Init() 函数调用将状态从 UNINIT 转换到 IDLE
  2. 传输请求触发的转换

    • J1939Tp_Transmit() 函数调用根据传输模式(CMDT 或 BAM)将状态从 IDLE 转换到相应的传输等待状态
  3. 消息接收触发的转换

    • J1939Tp_RxIndication() 函数在接收到 RTS 或 BAM 消息时,将状态从 IDLE 转换到相应的接收状态
  4. 确认触发的转换

    • J1939Tp_TxConfirmation() 函数在消息发送确认后触发状态转换
    • 收到 CTS 消息后状态转换到数据发送状态
    • 收到 EndOfMsgACK 后转换回 IDLE 状态
  5. 超时或取消引起的转换

    • 通过 J1939Tp_MainFunction() 检测到超时
    • 通过 J1939Tp_CancelTransmit()J1939Tp_CancelReceive() 主动取消操作

这种状态机设计确保了 J1939TP 能够正确处理复杂的传输场景,包括正常流程和异常情况处理。


4. 传输协议分析

J1939TP 支持两种不同的传输模式:连接模式数据传输 (CMDT)广播公告模式 (BAM)。这两种模式针对不同的通信需求和场景。

4.1 CMDT 连接模式

在这里插入图片描述

CMDT 模式是一种点对点通信模式,建立发送方和接收方之间的连接,并包含确认机制。从上面的序列图中可以看出,CMDT 模式具有以下特点:

  1. 握手过程

    • 发送方发送 RTS (Request To Send) 消息,包含总消息大小、总包数和最大包数量
    • 接收方回复 CTS (Clear To Send) 消息,指示可接收的包数量和下一个包序号
    • 这种握手确保接收方已准备好接收数据
  2. 数据传输

    • 发送方根据 CTS 消息指示的数量发送数据包
    • 每个数据包都经过 CAN 接口传输到接收方
    • 每次发送的包数量由接收方通过 CTS 控制,实现流量控制
  3. 确认机制

    • 接收方在接收到所有数据包后发送 EndOfMsgACK (End of Message Acknowledgement) 消息
    • EndOfMsgACK 包含总消息大小、总包数和成功接收标志
    • 发送方收到 ACK 后向上层指示传输成功完成
  4. 缓冲区管理

    • 接收方通过 PduR_J1939TpStartOfReception 申请缓冲区
    • 接收方通过 PduR_J1939TpCopyRxData 复制接收到的数据
    • 发送方通过 PduR_J1939TpCopyTxData 获取待发送的数据

CMDT 模式适用于需要可靠传输的场景,特别是对数据完整性有高要求的应用,如诊断服务和参数配置。

4.2 BAM 广播模式

在这里插入图片描述

BAM 模式是一种广播通信模式,发送方向网络广播数据,不需要接收方确认。从上面的序列图中可以看出,BAM 模式具有以下特点:

  1. 无握手过程

    • 发送方直接发送 BAM (Broadcast Announce Message) 消息,包含总消息大小、总包数
    • 目标地址为全局广播 (0xFF),所有节点都可接收
    • 不需要接收方回复确认
  2. 单向数据流

    • 发送方按固定顺序依次发送所有数据包
    • 接收方只负责接收,不发送任何确认或控制消息
    • 发送方无法知道哪些节点接收了数据
  3. 固定时序

    • 数据包按顺序严格发送,不能改变顺序
    • 发送间隔由 J1939Tp 配置参数控制
    • 没有流控制机制,接收方必须能够接收所有数据包
  4. 传输完成

    • 发送完最后一个数据包即认为传输完成
    • 发送方向上层指示传输成功完成
    • 接收方向上层指示接收完成

BAM 模式适用于一对多通信场景,如状态广播、多节点参数更新等,其优势在于简化的通信流程和较高的传输效率,但代价是丧失了传输可靠性保证。

两种传输模式的选择取决于应用需求,AUTOSAR 允许根据配置参数选择合适的传输模式。


5. 配置结构

5.1 配置类层次关系

在这里插入图片描述

J1939TP 模块的配置采用 AUTOSAR 标准的层次化结构。上图展示了 J1939TP 的配置类图,包括以下核心配置类:

  1. J1939Tp:顶层配置容器,包含通用配置和特定配置集

    • 包含一个 J1939TpGeneral 类型的实例
    • 包含一个或多个 J1939TpConfig 类型的实例
  2. J1939TpGeneral:通用参数配置类,定义全局参数

    • 超时参数 (Timeout_N_As, Timeout_N_Bs, Timeout_N_Cr, Timeout_T1-T4)
    • 主函数周期 (J1939TpMainFunctionPeriod)
    • 开发错误检测开关 (J1939TpDevErrorDetect)
    • 最大通道和 PDU 数量限制
  3. J1939TpConfig:特定配置集合,定义一组完整的通道配置

    • 包含一个或多个 J1939TpRxPdu 和 J1939TpTxPdu 实例
    • 包含一个或多个 J1939TpRxChannel 和 J1939TpTxChannel 实例
    • 可选的节点地址配置
  4. 通道配置类

    • J1939TpRxChannel:接收通道配置,定义源地址、目标地址、PGN 等
    • J1939TpTxChannel:发送通道配置,定义源地址、目标地址、PGN 等
  5. PDU 配置类

    • J1939TpRxPdu:接收 PDU 配置,定义 PDU ID、引用和类型
    • J1939TpTxPdu:发送 PDU 配置,定义 PDU ID、引用、类型和寻址格式
  6. 枚举类型

    • J1939TpProtocolEnum:协议类型枚举,包括 BAM 和 CMDT 模式
    • J1939TpPduTypeEnum:PDU 类型枚举,包括 REVERSE、CM、DT 和 DIRECT
    • J1939TpAddressingFormatType:寻址格式枚举,包括标准、扩展和混合寻址

5.2 主要配置参数

J1939TP 的关键配置参数包括:

  1. 超时参数

    • J1939TpTimeout_N_As:CTS 等待超时
    • J1939TpTimeout_N_Bs:数据包等待超时
    • J1939TpTimeout_N_Cr:接收资源分配超时
    • J1939TpTimeout_T1:RTS 控制消息到 CTS 响应超时
    • J1939TpTimeout_T2:发送到接收确认超时
    • J1939TpTimeout_T3:包间隔超时
    • J1939TpTimeout_T4:最后一包到 EndOfMsgACK 超时
  2. 通道参数

    • J1939TpRxDa/J1939TpTxDa:目标地址
    • J1939TpRxSa/J1939TpTxSa:源地址
    • J1939TpRxPgn/J1939TpTxPgn:参数组号
    • J1939TpRxProtocolType/J1939TpTxProtocolType:协议类型(BAM 或 CMDT)
    • J1939TpRxBufferSize:接收缓冲区大小
    • J1939TpTxMaxPackets:最大包数量
    • J1939TpTxPacketSize:包大小
  3. 功能开关

    • J1939TpDevErrorDetect:开发错误检测开关
    • J1939TpVersionInfoApi:版本信息 API 开关
    • J1939TpDynamicBlockCalculation:动态块计算开关

这些配置参数通常通过 AUTOSAR 配置工具(如 ECU 配置工具)生成,并保存在配置头文件中供 J1939TP 模块初始化时使用。


6. 总结

AUTOSAR SAE J1939 传输层(J1939TP)是 AUTOSAR 通信栈中的一个重要组件,它实现了基于 SAE J1939 标准的传输协议功能。通过本文的分析,我们可以得出以下结论:

  1. 架构设计优势

    • 清晰的分层结构,符合 AUTOSAR 标准
    • 明确定义的接口,实现了模块间的松耦合
    • 状态机设计保证了传输过程的可靠性和正确性
  2. 功能特点

    • 支持多种传输模式(CMDT 和 BAM),适应不同通信需求
    • 有效处理大于 8 字节的数据传输(最多 1785 字节)
    • 提供完整的流控制和错误处理机制
  3. 配置灵活性

    • 完善的配置结构,支持丰富的参数调整
    • 通过配置可以适应不同的应用场景和硬件平台
    • 支持动态参数调整,提高运行时灵活性
  4. 主要应用场景

    • 商用车辆通信网络
    • 工程机械和农业设备通信
    • 需要可靠传输大量数据的分布式控制系统

J1939TP 模块充分利用了 AUTOSAR 架构的优势,提供了标准化的 J1939 传输协议实现,使应用开发人员能够专注于功能实现,而不必关心底层通信细节。在以 CAN 总线为基础的车辆网络中,J1939TP 为大数据量传输提供了可靠的解决方案。

相关文章:

  • 金仓数据库 KingbaseES 产品深度优化提案:迈向卓越的全面升级
  • 从字节码开始到ASM的gadgetinspector源码解析
  • cdh平台管理与运维最佳实践
  • ubuntu22.04 命令行修改静态ip
  • 连续帧点云目标检测结果展示,python实现
  • 唯创安全:从传统到智能,工厂智能叉车AI防撞系统解决方案
  • 论文阅读笔记——ZeroGrasp: Zero-Shot Shape Reconstruction Enabled Robotic Grasping
  • 【SAM2代码解析】training部分代码详解-训练流程
  • 基准指数选股策略思路
  • 从代码学习深度学习 - 微调 PyTorch 版
  • 工业相机——镜头篇【机器视觉,图像采集系统,成像原理,光学系统,成像光路,镜头光圈,镜头景深,远心镜头,分辨率,MTF曲线,焦距计算 ,子午弧矢】
  • BeeWorks Meet:私有化部署视频会议的高效选择
  • 【Linux】进程优先级和进程切换
  • 张 LLM提示词拓展16中方式
  • 线上图书借阅小程序源码介绍
  • 关于使用git init --bare 裸仓库的使用
  • 如何在奥维互动地图里加载星图云卫星地图
  • SiamFC 算法详解
  • Shell脚本-流程控制语句应用案例
  • 龙虎榜——20250425
  • 国家数据发展研究院在京正式揭牌
  • 政治局会议:创新推出债券市场的“科技板”,加快实施“人工智能+”行动
  • 国际观察|伦敦会谈“降级”凸显美国乌克兰政策窘境
  • 韩国称DeepSeek未经同意将用户数据传至境外,外交部回应
  • 吃饭睡觉打国米,如今的米兰把意大利杯当成宝
  • 全红婵、李宁亮相中国航天日论坛,体育和航天这一次紧密相连