AUTOSAR进阶图解==>AUTOSAR_SWS_EthernetInterface
AUTOSAR 以太网接口模块(EthIf)详解
目录
- 概述
1.1. EthIf模块定位
1.2. 功能与职责 - 架构设计
2.1. 整体架构
2.2. 模块组织
2.3. 配置结构 - 状态管理
3.1. 模块状态
3.2. 控制器状态
3.3. 收发器状态 - 通信流程
4.1. 初始化流程
4.2. 通信初始化
4.3. 数据传输
4.4. 数据接收
4.5. 链路状态管理 - 总结
1. 概述
1.1 EthIf模块定位
AUTOSAR (AUTomotive Open System ARchitecture) 架构中的以太网接口模块(EthIf)是一个关键的通信抽象层组件,位于ECU抽象层中的通信硬件抽象部分。它为上层模块提供了统一的、与硬件无关的接口,使应用程序能够访问多种不同类型的以太网控制器和收发器。
在这里插入图片描述
1.2 功能与职责
EthIf模块的主要职责是提供硬件独立的接口,实现以下功能:
- 抽象层功能:屏蔽底层控制器和收发器的差异,提供统一API
- 管理多种以太网设备:支持多个控制器、收发器和交换机
- 数据收发:提供数据帧的传输和接收功能
- 状态管理:管理控制器和收发器的状态变化
- 链路监控:检测和通知链路状态变化
- 配置管理:支持灵活配置,实现"one-fits-all"原则
EthIf模块遵循AUTOSAR的分层设计原则,不直接访问以太网硬件,而是通过多个驱动程序模块实现对硬件的间接访问,确保软件的可移植性和可重用性。
/* EthIf模块与相邻层次的接口示例 */
typedef struct {uint8 EthIfCtrlIdx; /* 控制器索引,在EthIf上下文中唯一 */boolean EthIfCtrlEnable; /* 控制器使能标志 */boolean EthIfCtrlEnableMii; /* MII接口使能标志 */boolean EthIfCtrlEnableRxInterrupt; /* 接收中断使能 */boolean EthIfCtrlEnableTxInterrupt; /* 发送中断使能 */uint16 EthIfCtrlMtu; /* 最大传输单元大小(字节) */
} EthIf_ControllerConfigType;
2. 架构设计
2.1 整体架构
以太网接口模块在AUTOSAR通信栈中位于ECU抽象层,连接上层模块(TCP/IP、EthSM、V2X等)和下层的以太网硬件驱动模块(Eth、EthTrcv、EthSwt等)。
架构层次说明:
-
应用层模块:
- TCP/IP:标准网络协议栈
- EthSM:以太网状态管理器,负责协调高层状态管理
- V2X:车辆通信模块
- CDD:复杂设备驱动
-
ECU抽象层:
- EthIf:以太网接口模块,提供硬件无关的统一接口
-
微控制器抽象层:
- Eth:以太网控制器驱动
- EthTrcv:以太网收发器驱动
- EthSwt:以太网交换机驱动
- WEth:无线以太网控制器驱动
- WEthTrcv:无线以太网收发器驱动
/* 上层模块与EthIf交互的回调函数示例 */
void TCP_IP_RxIndication(uint8 CtrlIdx, /* 控制器索引 */Eth_FrameType FrameType, /* 以太网帧类型 */boolean IsBroadcast, /* 是否为广播包 */const uint8* PhysAddrPtr, /* 源物理地址指针(MAC地址) */const uint8* DataPtr, /* 数据指针 */uint16 LenByte /* 数据长度(字节) */
) {/* 处理接收到的以太网数据帧 */
}
2.2 模块组织
EthIf模块具有明确的内部组织结构,其组件按功能分类:
- 初始化组件:负责模块、控制器和收发器的初始化
- 通信组件:处理数据传输和接收逻辑
- 状态管理组件:管理控制器和收发器的状态变化
- 链路管理组件:检测和通知链路状态变化
- 配置管理组件:处理和验证配置数据
2.3 配置结构
EthIf模块采用层次化的配置结构,支持灵活配置和扩展。
配置结构说明:
-
EthIf:顶级配置容器
- 包含全局配置和配置集合
-
EthIfGeneral:全局模块配置
- EthIfDevErrorDetect:开发错误检测使能
- EthIfEnableMii:MII接口使能
- EthIfEnableRxInterrupt:接收中断使能
- EthIfEnableTxInterrupt:发送中断使能
- EthIfVersionInfoApi:版本信息API使能
- EthIfSwitchMgmtSupport:交换机管理支持使能
-
EthIfConfigSet:配置集合,包含多个控制器、交换机和收发器配置
-
EthIfController:控制器配置
- EthIfCtrlMtu:最大传输单元大小
- EthIfCtrlIdx:控制器索引
- EthIfCtrlEnable:控制器使能标志
- EthIfCtrlEnableMii:MII接口使能标志
-
EthIfFrameOwnerConfig:帧所有者配置
- EthIfFrameType:以太网帧类型
- EthIfFrameOwner:帧处理者
-
EthIfTransceiver:收发器配置
- EthIfTrcvIdx:收发器索引
- EthIfEnableTrcvWakeup:唤醒功能使能
/* EthIf模块配置结构示例 */
const EthIf_ConfigType EthIf_Configuration = {/* 全局配置 */.EthIfGeneral = {.EthIfDevErrorDetect = TRUE, /* 使能开发错误检测 */.EthIfEnableMii = TRUE, /* 使能MII接口 */.EthIfEnableRxInterrupt = TRUE, /* 使能接收中断 */.EthIfEnableTxInterrupt = TRUE, /* 使能发送中断 */.EthIfMainFunctionPeriod = 0.01, /* 主函数周期(秒) */.EthIfVersionInfoApi = TRUE, /* 使能版本信息API */.EthIfTrcvLinkStateChgMainReload = 100 /* 链路状态变化重新加载计数 */},/* 配置集 - 包含具体组件配置 */.EthIfConfigSet = {/* 控制器配置1 */.EthIfController[0] = {.EthIfCtrlIdx = 0,.EthIfCtrlMtu = 1500, /* 标准以太网MTU */.EthIfCtrlEnable = TRUE,.EthIfCtrlEnableMii = TRUE,.EthIfCtrlEnableRxInterrupt = TRUE,.EthIfCtrlEnableTxInterrupt = TRUE},/* 收发器配置1 */.EthIfTransceiver[0] = {.EthIfTrcvIdx = 0,.EthIfEnableTrcvWakeup = FALSE},/* 帧所有者配置 - IP帧 */.EthIfFrameOwnerConfig[0] = {.EthIfFrameType = 0x0800, /* IP帧类型 */.EthIfFrameOwner = "TCP_IP" /* 处理者为TCP/IP栈 */}}
};
3. 状态管理
3.1 模块状态
EthIf模块具有基本的初始化和未初始化状态,通过EthIf_Init()
函数实现状态转换。
模块状态说明:
- 未初始化:模块上电后的初始状态,不可调用大多数API
- 已初始化:执行
EthIf_Init()
后的状态,模块功能可用
3.2 控制器状态
以太网控制器具有两种主要状态,由上层模块通过EthIf的API控制。
控制器状态:
-
ETH_MODE_DOWN:控制器关闭状态
- 不可进行数据传输和接收
- 收发器通常被禁用
- 降低功耗
-
ETH_MODE_ACTIVE:控制器活动状态
- 可以进行数据传输和接收
- 收发器可被配置
- 链路状态被监控
状态转换通过EthIf_SetControllerMode()
API实现,状态变化会通知上层模块。
/* 控制器状态转换示例 */
Std_ReturnType ActivateEthernetController(uint8 CtrlIdx)
{Std_ReturnType result;/* 请求切换控制器到激活状态 */result = EthIf_SetControllerMode(CtrlIdx, ETH_MODE_ACTIVE);/* 检查操作结果 */if (result == E_OK) {/* 控制器激活请求成功发送 *//* 注意:实际激活是异步的,会通过EthSM_CtrlModeIndication回调通知 */} else {/* 控制器激活请求失败 */}return result;
}
3.3 收发器状态
以太网收发器具有三种主要状态:
收发器状态:
-
ETHTRCV_MODE_DOWN:收发器关闭状态
- 物理链路断开
- 最低功耗状态
-
ETHTRCV_MODE_ACTIVE:收发器活动状态
- 可以通信
- 物理链路可以建立
-
ETHTRCV_MODE_SLEEP:收发器睡眠状态
- 低功耗状态
- 可被远程唤醒
收发器还具有链路状态属性:
- ETHTRCV_LINK_STATE_DOWN:链路断开
- ETHTRCV_LINK_STATE_ACTIVE:链路连接
/* 收发器链路状态监控示例 */
void MonitorLinkState(uint8 TrcvIdx)
{EthTrcv_LinkStateType linkState;Std_ReturnType result;/* 获取当前链路状态 */result = EthIf_GetLinkState(TrcvIdx, &linkState);if (result == E_OK) {if (linkState == ETHTRCV_LINK_STATE_ACTIVE) {/* 链路已连接,可以获取信号质量 */EthIf_SignalQualityResultType signalQuality;if (EthIf_GetTrcvSignalQuality(TrcvIdx, &signalQuality) == E_OK) {/* 处理信号质量信息 */}} else {/* 链路断开 */}}
}
4. 通信流程
4.1 初始化流程
系统启动时,EthIf模块需要完成一系列初始化步骤。
初始化流程说明:
-
ECU管理模块调用EthIf初始化:
- 传递配置指针
- EthIf模块执行内部初始化
-
EthIf初始化以太网控制器:
- 调用
Eth_Init()
函数 - 传递控制器配置
- 调用
-
EthIf初始化以太网收发器:
- 调用
EthTrcv_Init()
函数 - 传递收发器配置
- 调用
-
激活控制器和收发器:
- 设置控制器为活动状态
- 设置收发器为活动状态
- 等待状态变化通知
/* 初始化函数代码示例 */
void EthIf_Init(const EthIf_ConfigType* ConfigPtr)
{/* 参数检查 */if (ConfigPtr == NULL) {/* 报告开发错误 */ETHIF_DET_REPORT_ERROR(ETHIF_SID_INIT, ETHIF_E_PARAM_POINTER);return;}/* 保存配置指针 */EthIf_ConfigPtr = ConfigPtr;/* 初始化以太网控制器 */for (uint8 i = 0; i < ETHIF_MAX_CONTROLLERS; i++) {if (ConfigPtr->EthIfController[i].EthIfCtrlEnable) {Eth_Init(&Eth_Config[i]);/* 如果配置要求,设置控制器为活动状态 */if (ConfigPtr->EthIfController[i].EthIfCtrlStartMode == ETH_MODE_ACTIVE) {Eth_SetControllerMode(i, ETH_MODE_ACTIVE);}}}/* 初始化以太网收发器 */for (uint8 i = 0; i < ETHIF_MAX_TRANSCEIVERS; i++) {if (ConfigPtr->EthIfTransceiver[i].EthIfTrcvEnable) {EthTrcv_Init(&EthTrcv_Config[i]);/* 如果配置要求,设置收发器为活动状态 */if (ConfigPtr->EthIfTransceiver[i].EthIfTrcvStartMode == ETHTRCV_MODE_ACTIVE) {EthTrcv_SetTransceiverMode(i, ETHTRCV_MODE_ACTIVE);}}}/* 标记模块为已初始化状态 */EthIf_ModuleState = ETHIF_STATE_INITIALIZED;
}
4.2 通信初始化
在系统运行过程中,EthSM可能需要重新初始化通信功能,或根据需要开启/关闭以太网通信。
通信初始化流程说明:
-
EthSM请求激活控制器:
- 调用
EthIf_SetControllerMode()
函数 - 指定控制器索引和目标模式(ETH_MODE_ACTIVE)
- 调用
-
EthIf请求底层驱动激活控制器:
- 调用
Eth_SetControllerMode()
函数 - 异步模式工作
- 调用
-
底层驱动完成激活后通知:
- 通过
EthIf_CtrlModeIndication()
回调通知EthIf
- 通过
-
EthIf激活相关收发器:
- 调用
EthTrcv_SetTransceiverMode()
函数 - 指定收发器索引和目标模式(ETHTRCV_MODE_ACTIVE)
- 调用
-
收发器完成激活后通知:
- 通过
EthIf_TrcvModeIndication()
回调通知EthIf
- 通过
-
EthIf通知上层模块状态变化:
- 调用
EthSM_CtrlModeIndication()
通知EthSM模块
- 调用
/* 通信初始化代码示例 */
Std_ReturnType EthSM_StartCommunication(uint8 NetworkHandle)
{uint8 CtrlIdx;Std_ReturnType result;/* 从网络句柄获取控制器索引 */CtrlIdx = EthSM_GetControllerIdxFromNetworkHandle(NetworkHandle);/* 请求激活以太网控制器 */result = EthIf_SetControllerMode(CtrlIdx, ETH_MODE_ACTIVE);/* 控制器模式设置是异步的,实际结果将通过EthSM_CtrlModeIndication回调返回 */return result;
}
4.3 数据传输
以太网数据传输涉及缓冲区管理、帧格式化和传输确认等步骤。
数据传输流程说明:
-
上层模块获取传输缓冲区:
- 调用
EthIf_ProvideTxBuffer()
函数 - 指定控制器索引、帧类型等参数
- 获取缓冲区索引和数据指针
- 调用
-
上层模块填充数据并触发传输:
- 填充缓冲区的数据内容
- 调用
EthIf_Transmit()
函数触发传输
-
EthIf将请求转发到底层驱动:
- 调用
Eth_Transmit()
函数 - 传递必要的参数
- 调用
-
传输完成后确认:
- 轮询模式:通过
EthIf_MainFunctionTx()
检查 - 中断模式:通过
EthIf_TxConfirmation()
回调通知
- 轮询模式:通过
-
EthIf通知上层模块传输完成:
- 调用上层模块的确认回调函数
/* 数据传输代码示例 */
Std_ReturnType TCP_IP_TransmitFrame(uint8 CtrlIdx, const uint8* data, uint16 length)
{BufReq_ReturnType bufResult;Std_ReturnType result;Eth_BufIdxType bufIdx;uint8* bufPtr;uint16 bufLen;/* 1. 获取传输缓冲区 */bufResult = EthIf_ProvideTxBuffer(CtrlIdx, /* 控制器索引 */0x0800, /* IP帧类型 */&bufIdx, /* 缓冲区索引(输出) */&bufPtr, /* 缓冲区指针(输出) */&bufLen /* 缓冲区长度(输出) */);if (bufResult != BUFREQ_OK || bufPtr == NULL) {return E_NOT_OK; /* 获取缓冲区失败 */}/* 2. 检查缓冲区大小 */if (bufLen < length) {return E_NOT_OK; /* 缓冲区不足 */}/* 3. 填充数据到缓冲区 */for (uint16 i = 0; i < length; i++) {bufPtr[i] = data[i];}/* 4. 触发传输 */result = EthIf_Transmit(CtrlIdx, /* 控制器索引 */bufIdx, /* 缓冲区索引 */0x0800, /* IP帧类型 */FALSE, /* 非广播帧 */length, /* 数据长度 */NULL /* 目的MAC地址(NULL表示使用默认地址) */);return result;
}
4.4 数据接收
以太网数据接收过程包括接收中断处理、数据分发和上层通知。
数据接收流程说明:
-
轮询模式接收:
- EthIf周期性调用
EthIf_MainFunctionRx()
函数 - 调用
Eth_Receive()
检查新接收的数据帧 - 对接收到的数据进行处理和分发
- EthIf周期性调用
-
优先处理的接收:
- 对特定优先级的FIFO使用专用的处理函数
- 通过
EthIf_MainFunctionRx_<PriorityProcessing>()
实现
-
中断模式接收:
- 控制器接收中断触发
Eth_RxIrqHdlr_<CtrlIdx>()
- 调用
EthIf_RxIndication()
通知EthIf - EthIf将数据分发到对应的上层模块
- 控制器接收中断触发
/* 数据接收处理代码示例 */
void EthIf_MainFunctionRx(void)
{Eth_RxStatusType rxStatus;uint8 bufPtr[ETH_MAX_FRAME_SIZE];uint16 lenByte;Eth_FrameType frameType;uint8 physAddr[6];boolean isBroadcast;/* 检查模块是否已初始化 */if (EthIf_ModuleState != ETHIF_STATE_INITIALIZED) {return;}/* 遍历所有启用的控制器 */for (uint8 ctrlIdx = 0; ctrlIdx < ETHIF_MAX_CONTROLLERS; ctrlIdx++) {if (!EthIf_ConfigPtr->EthIfController[ctrlIdx].EthIfCtrlEnable) {continue;}/* 遍历所有非优先级处理的FIFO */for (uint8 fifoIdx = 0; fifoIdx < ETH_RX_FIFO_COUNT; fifoIdx++) {/* 检查该FIFO是否已分配给优先处理 */if (EthIf_IsFifoAssignedToPriorityProcessing(ctrlIdx, fifoIdx)) {continue;}/* 接收数据帧 */if (Eth_Receive(ctrlIdx, fifoIdx, &rxStatus) == E_OK) {/* 处理接收到的帧 */frameType = rxStatus->frameType;lenByte = rxStatus->lenByte;isBroadcast = rxStatus->isBroadcast;/* 查找帧类型对应的处理函数 */const EthIf_FrameOwnerConfig* ownerConfig = EthIf_FindFrameOwner(ctrlIdx, frameType);if (ownerConfig != NULL) {/* 调用对应的指示函数 */ownerConfig->EthIfRxIndicationFunction(ctrlIdx,frameType,isBroadcast,rxStatus->physAddr,rxStatus->dataPtr,lenByte);}}}}
}
4.5 链路状态管理
EthIf模块负责监控以太网链路状态,并通知上层模块状态变化。
链路状态管理流程说明:
-
轮询模式检测:
- EthIf周期性调用
EthIf_MainFunctionState()
函数 - 调用
EthTrcv_GetLinkState()
检查链路状态 - 如果状态发生变化,通知上层模块
- EthIf周期性调用
-
中断模式检测:
- 收发器检测到状态变化后调用
EthIf_TrcvLinkStateChg()
- EthIf通知EthSM链路状态变化
- 收发器检测到状态变化后调用
-
端口组状态通知:
- 对于配置了端口组的系统,通知
BswM_EthIf_PortGroupLinkStateChg()
- 对于配置了端口组的系统,通知
-
信号质量监控:
- 链路状态激活时,可通过
EthTrcv_GetPhySignalQuality()
获取信号质量
- 链路状态激活时,可通过
/* 链路状态监控代码示例 */
void EthIf_MainFunctionState(void)
{EthTrcv_LinkStateType currentLinkState;Std_ReturnType result;/* 检查模块是否已初始化 */if (EthIf_ModuleState != ETHIF_STATE_INITIALIZED) {return;}/* 遍历所有启用的收发器 */for (uint8 trcvIdx = 0; trcvIdx < ETHIF_MAX_TRANSCEIVERS; trcvIdx++) {if (!EthIf_ConfigPtr->EthIfTransceiver[trcvIdx].EthIfTrcvEnable) {continue;}/* 获取当前链路状态 */result = EthTrcv_GetLinkState(trcvIdx, ¤tLinkState);if (result != E_OK) {continue;}/* 检查链路状态是否发生变化 */if (currentLinkState != EthIf_StoredLinkState[trcvIdx]) {/* 更新存储的状态 */EthIf_StoredLinkState[trcvIdx] = currentLinkState;/* 获取关联的控制器索引 */uint8 ctrlIdx = EthIf_GetCtrlIdxFromTrcvIdx(trcvIdx);/* 通知EthSM链路状态变化 */EthSM_TrcvLinkStateChg(ctrlIdx, currentLinkState);/* 如果链路激活,获取信号质量 */if (currentLinkState == ETHTRCV_LINK_STATE_ACTIVE) {EthIf_SignalQualityResultType signalQuality;if (EthTrcv_GetPhySignalQuality(trcvIdx, &signalQuality) == E_OK) {/* 更新信号质量信息 */EthIf_StoredSignalQuality[trcvIdx].actualSignalQuality = signalQuality;/* 更新最高/最低信号质量 */if (signalQuality > EthIf_StoredSignalQuality[trcvIdx].highestSignalQuality) {EthIf_StoredSignalQuality[trcvIdx].highestSignalQuality = signalQuality;}if (signalQuality < EthIf_StoredSignalQuality[trcvIdx].lowestSignalQuality) {EthIf_StoredSignalQuality[trcvIdx].lowestSignalQuality = signalQuality;}}}/* 检查是否配置了端口组 */uint8 portGroupIdx = EthIf_GetPortGroupIdxFromTrcvIdx(trcvIdx);if (portGroupIdx != ETHIF_INVALID_PORT_GROUP) {/* 通知BswM端口组链路状态变化 */BswM_EthIf_PortGroupLinkStateChg(portGroupIdx, currentLinkState);}}}
}
5. 总结
AUTOSAR以太网接口(EthIf)模块作为ECU抽象层的关键组件,成功地实现了以下目标:
- 硬件抽象:通过统一的接口屏蔽不同以太网硬件的差异
- 灵活配置:支持可扩展的配置结构,实现"one-fits-all"原则
- 全面的状态管理:提供完善的控制器和收发器状态管理
- 高效的通信处理:支持多种数据传输和接收模式
- 可靠的链路管理:提供链路状态监控和通知机制
EthIf模块的设计遵循AUTOSAR的分层原则,使上层应用能够独立于具体硬件,提高了软件的可重用性和可移植性,同时也简化了复杂以太网网络的管理和使用。
通过标准化的接口和灵活的配置,EthIf模块为AUTOSAR架构中的以太网通信提供了坚实的基础,支持从简单的点对点连接到复杂的网络拓扑,满足现代汽车电子系统日益增长的高速数据交换需求。