AUTOSAR Classic CanIf 模块详解:作用、原理、配置与接口关系
CanIf(CAN Interface) 是 AUTOSAR Classic 通信栈里连接上层 PDU 路由与底层 CAN Driver 的接口层。它的核心任务不是理解业务信号,而是把上层的 PDU 请求映射到具体的 CAN 控制器、发送邮箱和接收邮箱上。
1. CanIf 的作用
- 屏蔽底层 CAN Driver 的差异
- 统一上层收发接口
- 维护 PDU 到 HTH / HRH 的映射
- 处理控制器模式、PDU 模式、发送确认和接收指示
2. CanIf 在通信栈中的位置
flowchart TB
SWC[SWC / 应用层] --> COM[COM]
COM --> PDUR[PduR]
PDUR --> CANIF[CanIf]
CANIF --> CAN[CAN Driver]
CAN --> HW[CAN 控制器 / 邮箱]
HW --> BUS[(CAN 总线)]
3. 工作原理
发送时,COM 先把信号打包成 I-PDU,PduR 再把 I-PDU 路由到 CanIf;CanIf 根据配置找到对应的 HTH,调用 Can_Write() 交给 CAN Driver。接收时,CAN Driver 收到帧后通过 CanIf_RxIndication() 往上通知,再经由 PduR 分发给 COM 或其他模块。
sequenceDiagram
participant COM as COM
participant PduR as PduR
participant CanIf as CanIf
participant Can as CAN Driver
COM->>PduR: I-PDU 发送请求
PduR->>CanIf: CanIf_Transmit()
CanIf->>Can: Can_Write(HTH)
Can-->>CanIf: Can_TxConfirmation()
CanIf-->>PduR: 发送确认
PduR-->>COM: 发送完成
4. 典型配置项及作用
| 常见/典型名称 | 作用 |
|---|---|
| CanIfDevErrorDetect | 开发错误检测 |
| CanIfVersionInfoApi | 版本信息接口 |
| CanIfPublicTxBuffering | 发送缓冲/排队 |
| CanIfCancelTransmitSupport | 支持取消发送 |
| CanIfCtrlCfg | 控制器配置 |
| CanIfHthCfg | 发送硬件对象配置 |
| CanIfHrhCfg | 接收硬件对象配置 |
| CanIfTxPduCfg | 发送 PDU 映射 |
| CanIfRxPduCfg | 接收 PDU 映射 |
| CanIfTxPduCanId | 发送 CAN ID |
| CanIfRxPduCanId | 接收 CAN ID |
| CanIfTxPduHthRef | 发送句柄引用 |
| CanIfRxPduHrhRef | 接收句柄引用 |
| CanIfPduMode | PDU 在线/离线模式 |
| CanIfControllerMode | 控制器模式管理 |
5. 常见使用场景
- 周期报文发送
- 诊断与刷写通信
- 网络管理报文
- 多 CAN 控制器 ECU 的报文映射
- 低功耗唤醒与 Bus-Off 管理
6. 与 CAN、PduR、COM 的关系
CanIf 是中间适配层:上游接 PduR / COM / CanTp / CanNm,下游接 CAN Driver。COM 负责信号,PduR 负责路由,CanIf 负责把抽象 PDU 翻译成具体 CAN 硬件操作。
8. 小结
CanIf 的定位可以记成一句话:把上层 PDU 翻译成 CAN 硬件听得懂的东西,再把硬件收到的帧翻译回上层 PDU。