> 技术文档 > AUTOSAR进阶图解==>AUTOSAR_SWS_FlexRayInterface

AUTOSAR进阶图解==>AUTOSAR_SWS_FlexRayInterface


AUTOSAR FlexRay接口详解

AUTOSAR协议栈中FlexRay通信接口模块解析

目录

  • 1. FlexRay接口概述
  • 2. FlexRay架构
  • 3. 状态管理
  • 4. 通信流程
  • 5. 关键接口API
  • 6. 总结

1. FlexRay接口概述

FlexRay接口(FrIf)是AUTOSAR通信栈的一部分,作为一个标准化模块,它为上层AUTOSAR服务层提供了统一的访问方式,封装了底层FlexRay驱动程序的复杂性。FlexRay接口模块支持多CC(通信控制器)配置、PDU路由和总线镜像等高级功能,确保了数据传输的高可靠性和确定性。

FlexRay接口的主要功能包括:

  • 实现与FlexRay驱动(Fr)模块的交互
  • 提供状态和模式管理
  • 支持多通信控制器配置
  • 实现PDU(协议数据单元)路由
  • 支持总线镜像功能
  • 提供全局时间同步
  • 错误处理与报告

FlexRay接口(FrIf)模块配合FlexRay驱动(Fr)和FlexRay状态管理器(FrSM)模块,共同构成了AUTOSAR中完整的FlexRay通信栈。


2. FlexRay架构

2.1 FlexRay接口架构图

在这里插入图片描述

2.2 架构解释

上图展示了AUTOSAR中FlexRay通信相关模块的整体架构。该架构按照AUTOSAR的分层设计理念组织,从上至下依次为:

  1. 应用层

    • 包含各种软件组件(SWC),这些组件需要通过FlexRay网络进行通信
    • 应用组件通过RTE与底层通信栈交互,而不直接操作通信接口
  2. 运行时环境(RTE)

    • 作为应用层和基础软件之间的中间层
    • 提供标准化接口,实现应用与通信服务之间的映射
  3. 服务层

    • COM模块:负责信号管理,将应用信号转换为PDU
    • PDU Router:负责PDU路由,将PDU传递给正确的通信接口
  4. 通信栈

    • FlexRay Interface (FrIf):提供对FlexRay通信的统一接口
    • FlexRay Driver (Fr):直接操作FlexRay通信控制器硬件
    • FlexRay State Manager (FrSM):管理FlexRay通信的状态
    • FlexRay Transceiver Driver (FrTrcv):控制FlexRay收发器
  5. 硬件层

    • FlexRay通信控制器:实现FlexRay协议的硬件控制器
    • FlexRay收发器:连接控制器与物理FlexRay总线

通信数据流为:应用组件通过RTE将数据传递给COM模块,COM将信号打包为PDU,通过PDU Router路由到FrIf。FrIf通过Fr驱动将数据写入FlexRay通信控制器硬件,最终通过收发器发送到FlexRay物理总线上。

2.3 相关代码示例

/* FlexRay接口模块初始化配置结构体 */typedef struct { uint8 FrIfConfigId;  /* 配置ID */ uint8 FrIfControllerCount; /* 控制器数量 */ const FrIf_ControllerType* FrIfController; /* 控制器配置指针 */ const FrIf_JobListType* FrIfJobList; /* 作业列表配置 */ boolean FrIfGlobalTimeSyncEnable; /* 是否启用全局时间同步 */ uint16 FrIfMaxChannelCount; /* 最大通道数 */} FrIf_ConfigType;/* FlexRay控制器配置 */typedef struct { uint8 FrIfCtrlIdx;  /* 控制器索引 */ uint8 FrIfHwCtrlIdx; /* 硬件控制器索引 */ uint8 FrIfClusterIdx; /* 集群索引 */ uint8 FrIfCycle;  /* 周期 */ boolean FrIfIsTxConfirmationEnabled; /* 是否启用发送确认 */ boolean FrIfBusOffRecoveryEnabled; /* 是否启用总线恢复 */} FrIf_ControllerType;/* 初始化函数示例 */void FrIf_Init(const FrIf_ConfigType* ConfigPtr){ if (ConfigPtr == NULL_PTR) { /* 报告错误:无效参数 */ return; } /* 初始化内部数据结构 */ FrIf_State = FRIF_STATE_INIT; /* 遍历并配置所有控制器 */ for (uint8 i = 0; i < ConfigPtr->FrIfControllerCount; i++) { /* 获取当前控制器配置 */ const FrIf_ControllerType* ctrl = &ConfigPtr->FrIfController[i]; /* 初始化控制器状态 */ FrIf_CtrlState[ctrl->FrIfCtrlIdx] = FRIF_CTRLIDX_STATE_READY; /* 配置控制器参数 */ Fr_Init(ctrl->FrIfHwCtrlIdx); }}

3. 状态管理

3.1 FlexRay接口状态图

在这里插入图片描述

3.2 状态管理解释

FlexRay接口模块的状态管理是确保FlexRay通信正常工作的关键部分。上图展示了FlexRay接口的状态转换流程:

  1. 初始状态转换

    • UNINITREADY:通过调用FrIf_Init()函数初始化模块
    • READYSTARTUP:通过调用FrIf_StartupRequest()请求启动通信
  2. 正常运行状态

    • STARTUPONLINE:当FlexRay成功启动并同步到网络时
    • ONLINE:此状态下可以正常发送和接收数据帧
    • ONLINE_PASSIVE:当发生通信错误时进入此状态,保持接收功能但限制发送
  3. 异常处理状态

    • STARTUPOFFLINE:当启动失败时进入离线状态
    • ONLINEHALT_REQHALT:请求暂停通信并等待当前传输完成
    • 任何活动状态 → OFFLINE:通过FrIf_OfflineRequest()请求离线
  4. 低功耗管理

    • OFFLINELOW_POWER:通过FrIf_LowPowerRequest()请求进入低功耗模式
    • OFFLINEWAKEUP:通过FrIf_WakeupRequest()从低功耗状态唤醒
    • WAKEUPSTARTUP:唤醒完成后重新启动通信
  5. 模块终止

    • READYUNINIT:通过FrIf_DeInit()终止模块运行

状态转换由FlexRay状态管理器(FrSM)控制,确保FlexRay通信在不同工作条件下的稳定性和可靠性。

3.3 相关代码示例

/* FlexRay接口状态类型定义 */typedef enum { FRIF_STATE_UNINIT = 0, /* 未初始化状态 */ FRIF_STATE_READY, /* 就绪状态 */ FRIF_STATE_STARTUP, /* 启动状态 */ FRIF_STATE_WAKEUP, /* 唤醒状态 */ FRIF_STATE_ONLINE, /* 在线状态 */ FRIF_STATE_ONLINE_PASSIVE, /* 在线被动状态 */ FRIF_STATE_HALT_REQ, /* 暂停请求状态 */ FRIF_STATE_HALT, /* 暂停状态 */ FRIF_STATE_OFFLINE, /* 离线状态 */ FRIF_STATE_LOW_POWER /* 低功耗状态 */} FrIf_StateType;/* 控制器状态请求函数示例 */Std_ReturnType FrIf_StartupRequest(uint8 FrIf_CtrlIdx){ Std_ReturnType result = E_NOT_OK; /* 检查是否已初始化 */ if (FrIf_State == FRIF_STATE_UNINIT) { Det_ReportError(FRIF_MODULE_ID, 0, FRIF_STARTUP_REQUEST_ID, FRIF_E_NOT_INITIALIZED); return E_NOT_OK; } /* 检查控制器索引是否有效 */ if (FrIf_CtrlIdx >= FRIF_MAX_CONTROLLER) { Det_ReportError(FRIF_MODULE_ID, 0, FRIF_STARTUP_REQUEST_ID, FRIF_E_INV_CTRL_IDX); return E_NOT_OK; } /* 检查控制器当前状态 */ if (FrIf_CtrlState[FrIf_CtrlIdx] == FRIF_CTRLIDX_STATE_READY || FrIf_CtrlState[FrIf_CtrlIdx] == FRIF_CTRLIDX_STATE_HALT || FrIf_CtrlState[FrIf_CtrlIdx] == FRIF_CTRLIDX_STATE_OFFLINE) { /* 配置FlexRay驱动 */ result = Fr_AllowColdstart(FrIfConfig.Controller[FrIf_CtrlIdx].FrHwCtrlIdx); if (result == E_OK) { /* 更新状态 */ FrIf_CtrlState[FrIf_CtrlIdx] = FRIF_CTRLIDX_STATE_STARTUP; } } else { /* 控制器状态不允许启动 */ result = E_NOT_OK; } return result;}

4. 通信流程

4.1 FlexRay通信序列图

在这里插入图片描述

4.2 通信流程解释

上图展示了FlexRay通信的三个主要阶段及其详细流程:

  1. 初始化阶段

    • 应用层通过FrSM请求进入全通信模式
    • FrSM调用FrIf_StartupRequest()来启动FlexRay通信
    • FlexRay驱动配置通信控制器
    • 配置完成后,状态通过各层返回给应用层
  2. 数据发送流程

    • 应用调用Com_SendSignal()发送数据
    • COM模块通过PDU Router将数据传递到FlexRay接口
    • FlexRay接口根据配置选择发送模式:
      • 立即发送:直接调用Fr_TransmitTxLPdu()写入硬件缓冲区
      • 触发式发送:先存入内部缓冲区,等待硬件在指定时间点触发发送
  3. 数据接收流程

    • 硬件接收到数据后通知FlexRay驱动
    • FlexRay驱动调用回调函数Fr_RxLPduIndicator()
    • FlexRay接口将数据通过PDU Router传递给COM模块
    • COM模块通知应用数据已到达
    • 完成接收处理后清除相关标志

整个通信流程体现了AUTOSAR的分层设计理念,每层都有明确的职责,实现了硬件与应用的解耦。FlexRay接口在其中起到了承上启下的关键作用,管理数据传输并处理协议细节。

4.3 相关代码示例

/* PDU信息结构体 */typedef struct { PduIdType FrIfTxPduId; /* PDU ID */ uint8* FrIfSduPtr; /* 数据缓冲区指针 */ PduLengthType FrIfSduLength; /* 数据长度 */} FrIf_PduInfoType;/* 发送函数示例 */Std_ReturnType FrIf_Transmit(PduIdType FrIfTxPduId, const PduInfoType* PduInfoPtr){ Std_ReturnType result = E_NOT_OK; /* 参数检查 */ if (PduInfoPtr == NULL_PTR) { Det_ReportError(FRIF_MODULE_ID, 0, FRIF_TRANSMIT_ID, FRIF_E_PARAM_POINTER); return E_NOT_OK; } if (FrIfTxPduId >= FRIF_MAX_TX_PDUS) { Det_ReportError(FRIF_MODULE_ID, 0, FRIF_TRANSMIT_ID, FRIF_E_PARAM_PDU_ID); return E_NOT_OK; } /* 获取PDU配置 */ const FrIf_TxPduConfigType* txPduConfig = &FrIf_ConfigPtr->FrIfTxPduConfig[FrIfTxPduId]; uint8 ctrlIdx = txPduConfig->FrIfCtrlIdx; /* 检查控制器状态 */ if (FrIf_CtrlState[ctrlIdx] != FRIF_CTRLIDX_STATE_ONLINE) { return E_NOT_OK; /* 控制器不在线 */ } /* 根据配置选择发送模式 */ if (txPduConfig->FrIfTxMode == FRIF_TXMODE_IMMEDIATE) { /* 立即发送模式 */ Fr_LpduType lpduData; lpduData.lpduLength = PduInfoPtr->SduLength; lpduData.lpduDataPtr = PduInfoPtr->SduDataPtr; result = Fr_TransmitTxLPdu(  txPduConfig->FrIfHwChannelRef,  txPduConfig->FrIfHwLpduRef,  &lpduData); } else { /* 触发式发送模式 - 存入内部缓冲区 */ if (txPduConfig->FrIfBufferSize >= PduInfoPtr->SduLength) { /* 拷贝数据到内部缓冲区 */ for (uint16 i = 0; i < PduInfoPtr->SduLength; i++) { FrIf_TxBuffer[FrIfTxPduId][i] = PduInfoPtr->SduDataPtr[i]; } FrIf_TxBufferLength[FrIfTxPduId] = PduInfoPtr->SduLength; FrIf_TxBufferState[FrIfTxPduId] = FRIF_BUFFER_READY; result = E_OK; } else { /* 缓冲区大小不足 */ result = E_NOT_OK; } } return result;}/* 接收回调函数示例 */void Fr_RxLPduIndicator(uint8 FrCtrlIdx, uint16 FrLpduIdx){ /* 查找对应的FrIf PDU配置 */ uint16 frIfPduIdx = 0xFF; for (uint16 i = 0; i < FrIf_ConfigPtr->FrIfRxPduCount; i++) { if (FrIf_ConfigPtr->FrIfRxPduConfig[i].FrIfHwLpduRef == FrLpduIdx && FrIf_ConfigPtr->FrIfRxPduConfig[i].FrIfCtrlIdx == FrCtrlIdx) { frIfPduIdx = i; break; } } /* 如果找到配置,处理接收数据 */ if (frIfPduIdx != 0xFF) { const FrIf_RxPduConfigType* rxPduConfig = &FrIf_ConfigPtr->FrIfRxPduConfig[frIfPduIdx]; /* 获取PDU数据 */ Fr_LpduType lpduData; Std_ReturnType result = Fr_ReceiveRxLPdu(  rxPduConfig->FrIfHwChannelRef,  rxPduConfig->FrIfHwLpduRef,  &lpduData); if (result == E_OK) { /* 准备PDU信息 */ PduInfoType pduInfo; pduInfo.SduDataPtr = lpduData.lpduDataPtr; pduInfo.SduLength = lpduData.lpduLength; /* 调用上层回调函数 */ PduR_FrIfRxIndication(rxPduConfig->FrIfRxPduId, &pduInfo); } }}

5. 关键接口API

FlexRay接口模块提供了一系列标准化的API,用于实现与其他模块的交互。以下是主要API的概述:

5.1 初始化与状态控制API

API函数 功能描述 FrIf_Init() 初始化FlexRay接口模块,配置所有控制器 FrIf_DeInit() 复位FlexRay接口模块到未初始化状态 FrIf_StartupRequest() 请求启动FlexRay通信 FrIf_OfflineRequest() 请求FlexRay控制器进入离线状态 FrIf_HaltRequest() 请求FlexRay控制器暂停通信 FrIf_WakeupRequest() 请求从低功耗状态唤醒FlexRay控制器 FrIf_LowPowerRequest() 请求FlexRay控制器进入低功耗状态 FrIf_GetState() 获取FlexRay控制器当前状态

5.2 数据传输API

API函数 功能描述 FrIf_Transmit() 发送FlexRay PDU FrIf_CancelTransmit() 取消PDU发送请求 FrIf_GetTxLPduParameter() 获取发送LPDU参数 FrIf_GetRxLPduParameter() 获取接收LPDU参数 FrIf_TransmitReleaseRxBuffer() 释放接收缓冲区 FrIf_GetTxConflictState() 获取发送冲突状态

5.3 全局时间同步API

API函数 功能描述 FrIf_GetGlobalTime() 获取当前全局时间 FrIf_SetGlobalTime() 设置全局时间 FrIf_GetAbsoluteTimer() 获取绝对定时器值 FrIf_GetCycleLength() 获取通信周期长度

5.4 诊断与配置API

API函数 功能描述 FrIf_GetVersionInfo() 获取模块版本信息 FrIf_GetClusterConfig() 获取集群配置信息 FrIf_GetControllerConfig() 获取控制器配置信息 FrIf_EnableBusOffRecovery() 启用总线关闭恢复功能 FrIf_DisableBusOffRecovery() 禁用总线关闭恢复功能 FrIf_GetChannelStatus() 获取通信通道状态

6. 总结

AUTOSAR FlexRay接口(FrIf)作为标准通信中间件,在AUTOSAR架构中扮演着关键角色:

6.1 主要功能价值

  • 抽象硬件差异:屏蔽不同FlexRay硬件控制器的差异,提供统一接口
  • 支持多控制器:支持在一个ECU中使用多个FlexRay控制器
  • 增强通信可靠性:提供错误处理和恢复机制
  • 优化资源管理:高效管理通信资源和缓冲区
  • 支持网络管理:与FlexRay状态管理器协同工作,实现网络生命周期管理

6.2 应用场景

FlexRay接口主要应用于对实时性和可靠性要求较高的场景,例如:

  • 车辆底盘控制系统
  • 高级驾驶辅助系统(ADAS)
  • 动力总成控制系统
  • 车身电子控制系统
  • 电动汽车动力电池管理系统

6.3 未来发展趋势

随着汽车电子架构的发展,FlexRay接口也在不断演进:

  • 提高带宽利用率和性能
  • 增强安全性和数据保护能力
  • 优化启动时间和低功耗模式
  • 与新一代汽车以太网等技术协同工作

  • 抽象硬件差异:屏蔽不同FlexRay硬件控制器的差异,提供统一接口
  • 支持多控制器:支持在一个ECU中使用多个FlexRay控制器
  • 增强通信可靠性:提供错误处理和恢复机制
  • 优化资源管理:高效管理通信资源和缓冲区
  • 支持网络管理:与FlexRay状态管理器协同工作,实现网络生命周期管理

FlexRay接口作为AUTOSAR通信栈的重要组成部分,将继续在汽车电子控制系统中发挥重要作用,支持汽车电子控制单元(ECU)间的高性能、高可靠通信需求。

高新技术资讯