1370 lines
55 KiB
Markdown
1370 lines
55 KiB
Markdown
# CAN 接口规范
|
||
|
||
> **AUTOSAR CP Release 4.4.0**
|
||
> **文档 ID 012:AUTOSAR_SWS_CANInterface**
|
||
|
||
## 元信息
|
||
|
||
| 项目 | 内容 |
|
||
|------|------|
|
||
| 文档标题 | CAN 接口规范(Specification of CAN Interface) |
|
||
| 文档所有者 | AUTOSAR |
|
||
| 文档责任方 | AUTOSAR |
|
||
| 文档标识号 | 012 |
|
||
| 文档状态 | Final(正式版) |
|
||
| AUTOSAR 标准组成部分 | Classic Platform(经典平台) |
|
||
| 标准发布版本 | 4.4.0 |
|
||
|
||
## 文档变更历史
|
||
|
||
| 日期 | 发布版本 | 变更方 | 变更描述 |
|
||
|------|---------|--------|----------|
|
||
| 2018-10-31 | 4.4.0 | AUTOSAR Release Management | BusMirroring(CONC_634);按 PDU 的接收数据长度检查;移除取消发送 API 的虚拟实现;头文件清理;引入运行时错误 |
|
||
| 2017-12-08 | 4.3.1 | AUTOSAR Release Management | 用 `Std_ReturnType` 覆盖替换 `Can_ReturnType`;细微修正;编辑性修改 |
|
||
| 2016-11-30 | 4.3.0 | AUTOSAR Release Management | 移除 CCMSM;重新设计 MetaData 处理;可靠的 TxConfirmation;Error Active/Passive 状态 API |
|
||
| 2015-07-31 | 4.2.2 | AUTOSAR Release Management | 阐明唤醒、缓冲、传输和变体;移除已弃用的 API;编辑性修改 |
|
||
| 2014-10-31 | 4.2.1 | AUTOSAR Release Management | 完整 CAN FD 支持;CAN 上的全局时间同步;移除 `CanIf_CancelTxConfirmation`;小幅改进 |
|
||
| 2014-03-31 | 4.1.3 | AUTOSAR Release Management | 移除了 BSW 独占区域;将 ICOM 支持设置为可选;`Can_IdType` 处理;小幅改进;限制 PDU 模式更改 |
|
||
| 2013-10-31 | 4.1.2 | AUTOSAR Release Management | 移除了第 9 章中的关键部分处理描述;将 `CanIfInitRefCfgSet` 设置为过时;Pretended Networking 章节;小幅改进;CAN FD(不带 DLC 扩展);Pretended Networking(ICOM) |
|
||
| 2013-03-15 | 4.1.1 | AUTOSAR Administration | 重型车辆(J1939)支持;用于干净唤醒的 PduModes 和 PnTxFilter;PDU 和 HOH 之间的关系;后构建可加载概念 |
|
||
| 2011-12-22 | 4.0.3 | AUTOSAR Administration | 部分网络支持;改进的传输缓冲;改进的错误检测;更新了"版本检查"和"发布信息"章节;可选地将多个 CAN ID 分配给一个 I-PDU;可选地仅通过 NM PDU 进行唤醒验证;异步模式指示回调代替同步模式更改 |
|
||
| 2009-12-18 | 4.0.1 | AUTOSAR Administration | CC 模式更改时不自动更改 PDU 通道模式;TxConfirmation 状态进入 BusOff 恢复;WakeupSourceRefIn 和 WakeupSourceRefOut;PduInfoPtr 代替 SduDataPtr;引入 `Can_GeneralTypes.h` 和 `Can_HwHandleType`;第 8 章的收发器类型转移到收发器 SWS |
|
||
| 2010-02-02 | 3.1.4 | AUTOSAR Administration | HOH 定义;抽象的 ControllerId 和 TransceiverId;不通过 CanIf 和 `CanIf_ControllerInit` 更改波特率;Dispatcher 因 CDD 而调整;TxBuffering:每个 L-PDU 仅一个缓冲区;唤醒机制适应环境行为(网络 → 控制器/收发器;wakeupSource);异步模式更改;CanIf 中没有完整的状态机,只有每个控制器的缓冲状态;修订了法律免责声明 |
|
||
| 2008-08-13 | 3.1.1 | AUTOSAR Administration | 修订了法律免责声明 |
|
||
| 2008-02-01 | 3.0.2 | AUTOSAR Administration | 用从 AUTOSAR 元模型生成的表格替换了第 10 章内容;接口抽象:网络相关接口更改为与控制器相关;唤醒机制完全重新设计,为唤醒添加和更改了 API;初始化已更改(平面初始化);由于 BSW Scheduler 责任更改而跳过了调度主函数;扩展了文档元信息;做了小幅版式调整 |
|
||
| 2007-12-21 | 3.0.1 | AUTOSAR Administration | 头文件结构已更改;增加了混合模式操作支持(标准 CAN 和扩展 CAN 在一个网络上并行);支持 CAN 收发器 API `<User>_DlcErrorNotification` 已删除;配置参数的预编译/链接时/后构建定义部分已更改;允许某些 API 的可重入接口调用;增加了对 AUTOSAR BSW 调度器的支持;增加了对内存映射的支持;重新设计了配置容器结构;各种澄清扩展和更正 |
|
||
| 2006-05-16 | 2.0.0 | AUTOSAR Administration | 第二次发布 |
|
||
| 2005-05-31 | 1.0.0 | AUTOSAR Administration | 初始发布 |
|
||
|
||
## 目录
|
||
|
||
1. [介绍和功能概述](#1-介绍和功能概述introduction-and-functional-overview) ............... 10
|
||
2. [缩略语和缩写](#2-缩略语和缩写acronyms-and-abbreviations) ............... 13
|
||
3. [相关文档](#3-相关文档related-documentation) ............... 15
|
||
- 3.1 [输入文档及相关标准和规范](#31-输入文档及相关标准和规范) ............... 15
|
||
- 3.2 [相关规范](#32-相关规范) ............... 16
|
||
4. [约束和假设](#4-约束和假设constraints-and-assumptions) ............... 17
|
||
- 4.1 [限制](#41-限制) ............... 17
|
||
- 4.2 [对汽车领域的适用性](#42-对汽车领域的适用性) ............... 17
|
||
5. [对其他模块的依赖](#5-对其他模块的依赖dependencies-to-other-modules) ............... 18
|
||
- 5.1 [上层协议层](#51-上层协议层) ............... 19
|
||
- 5.2 [初始化:ECU 状态管理器](#52-初始化ecu-状态管理器) ............... 19
|
||
- 5.3 [模式控制:CAN 状态管理器](#53-模式控制can-状态管理器) ............... 19
|
||
- 5.4 [下层:CAN 驱动](#54-下层can-驱动) ............... 19
|
||
- 5.5 [下层:CAN 收发器驱动](#55-下层can-收发器驱动) ............... 20
|
||
- 5.6 [配置](#56-配置) ............... 21
|
||
- 5.7 [文件结构](#57-文件结构) ............... 22
|
||
6. [需求追踪](#6-需求追踪requirements-tracing) ............... 23
|
||
7. [功能规范](#7-功能规范functional-specification) ............... 28
|
||
- 7.1-7.29 [详见目录] ............... 28-71
|
||
8. [API 规范](#8-api-规范api-specification) ............... 72
|
||
- 8.1 [导入类型](#81-导入类型) ............... 72
|
||
- 8.2 [类型定义](#82-类型定义) ............... 72
|
||
- 8.3 [函数定义](#83-函数定义) ............... 74
|
||
- 8.4 [回调通知](#84-回调通知) ............... 101
|
||
- 8.5 [调度函数](#85-调度函数) ............... 111
|
||
- 8.6 [预期接口](#86-预期接口) ............... 111
|
||
9. [序列图](#9-序列图sequence-diagrams) ............... 130
|
||
- 9.1-9.12 [详见目录] ............... 130-148
|
||
10. [配置规范](#10-配置规范configuration-specification) ............... 149
|
||
- 10.1.1-10.1.17 [详见目录] ............... 150-211
|
||
A. [不适用需求](#a-不适用需求not-applicable-requirements) ............... 212
|
||
|
||
---
|
||
|
||
## 1 介绍和功能概述(Introduction and functional overview)
|
||
|
||
本规范描述了 AUTOSAR 基础软件模块 CAN Interface 的功能、API 和配置。
|
||
|
||
如图 1.1 所示,CAN Interface 模块位于低级 CAN 设备驱动(CAN 驱动 [1] 和收发器驱动 [2])和上层通信服务层(即 CAN 状态管理器 [3]、CAN 网络管理 [4]、CAN 传输协议 [5]、PDU Router [6])之间。它代表了上层通信层对 CAN 驱动服务的接口。
|
||
|
||
CAN Interface 模块提供了一个独特的接口来管理不同的 CAN 硬件设备类型,如由已定义 ECU 硬件布局使用的 CAN 控制器和 CAN 收发器。因此,多个底层内部和外部 CAN 控制器/CAN 收发器可以由 CAN 状态管理器模块基于物理 CAN 通道相关视图进行控制。
|
||
|
||
**图 1.1:AUTOSAR CAN 层模型**(见 [7])
|
||
|
||
CAN Interface 模块由所有 CAN 硬件独立任务组成,这些任务属于相应 ECU 的 CAN 通信设备驱动程序。该功能在 CAN Interface 模块中实现一次,因此底层 CAN 设备驱动程序仅专注于访问和控制相应的特定 CAN 硬件设备。
|
||
|
||
CanIf 满足 PDU Router 和 AUTOSAR COM 栈的上层通信模块的主要控制流和数据流要求:发送请求处理、发送确认/接收指示/错误通知以及 CAN 控制器的启动/停止,从而唤醒/参与网络。其数据处理和通知 API 基于 CAN L-SDU,而用于控制和模式处理的 API 提供与 CAN 控制器相关的视图。
|
||
|
||
在发送请求的情况下,CanIf 使用相应的参数完成 L-PDU 传输,并通过适当的 CanDrv 将 CAN L-PDU 转发到 CAN 控制器。在接收时,CanIf 将接收的 L-PDU 作为 L-SDU 分配给上层。接收 L-SDU 和上层之间的分配是静态配置的。在发送确认时,CanIf 负责通知上层成功传输。
|
||
|
||
CAN Interface 模块为 CAN 驱动和 CAN 收发器驱动服务提供 CAN 通信抽象访问,用于控制和监视 CAN 网络。CAN Interface 向下转发来自 CAN 状态管理器的状态更改请求到下层 CAN 设备驱动,并且向上转发来自 CAN 驱动/CAN 收发器驱动的事件(例如到相应的 NM 模块)。
|
||
|
||
---
|
||
|
||
## 2 缩略语和缩写(Acronyms and Abbreviations)
|
||
|
||
以下词汇表包括与 CAN Interface 模块相关的、未包含在 [8, AUTOSAR 词汇表] 中的缩略语和缩写。
|
||
|
||
| 缩写 | 描述 |
|
||
|------|------|
|
||
| CAN L-PDU | CAN 协议数据单元。由标识符、数据长度和数据(SDU)组成。对 CAN 驱动可见。 |
|
||
| CAN L-SDU | CAN 服务数据单元。在 CAN L-PDU 内传输的数据。对 CAN 接口的上层(例如 PDU Router)可见。 |
|
||
| CanDrv | CAN Driver 模块 |
|
||
| CAN FD | CAN with Flexible Data-Rate(灵活数据速率的 CAN) |
|
||
| CanId | CAN 标识符 |
|
||
| CanIf | CAN Interface 模块 |
|
||
| CanNm | CAN Network Management 模块 |
|
||
| CanSm | CAN State Manager 模块 |
|
||
| CanTp | CAN Transport Layer 模块 |
|
||
| CanTrcv | CAN Transceiver Driver 模块 |
|
||
| CanTSyn | Global Time Synchronization over CAN(CAN 上的全局时间同步) |
|
||
| ComM | Communication Manager 模块 |
|
||
| DCM | Diagnostic Communication Manager 模块 |
|
||
| EcuM | ECU State Manager 模块 |
|
||
| HOH | CAN hardware object handle(CAN 硬件对象句柄) |
|
||
| HRH | CAN hardware receive handle(CAN 硬件接收句柄) |
|
||
| HTH | CAN hardware transmit handle(CAN 硬件发送句柄) |
|
||
| J1939Nm | J1939 Network Management 模块 |
|
||
| J1939Tp | J1939 Transport Layer 模块 |
|
||
| PduR | PDU Router 模块 |
|
||
| PN | Partial Networking(部分网络) |
|
||
| SchM | Scheduler Module(调度器模块) |
|
||
| Buffer | 固定大小的内存区域,用于将单个数据单元(例如 CAN ID、数据长度、SDU 等)存储在 RAM 中的专用内存地址。 |
|
||
| CAN communication matrix | 描述完整的 CAN 网络:参与节点;所有 CAN PDU 的定义(标识符、数据长度);PDU 的源和汇。 |
|
||
| CAN Controller | CAN 控制器是 CPU 片上或外部独立硬件设备。一个 CAN 控制器连接到一个物理通道。 |
|
||
| CAN Device Driver | CAN 驱动和 CAN 收发器驱动的通用术语。 |
|
||
| CAN Hardware Unit | CAN 硬件单元可以由一个或多个相同类型的 CAN 控制器以及一个、两个或多个 CAN RAM 区域组成。CAN 硬件单元位于片上或作为外部设备。CAN 硬件单元由一个 CAN 驱动表示。 |
|
||
| CanIf Controller mode state machine | 这不是一个真正的状态机,可能会受发送请求影响。这是适当 CAN 控制器的当前抽象状态的映像。状态转换只能由上层模块(如 CanSm)或外部事件(例如发生 BusOff 时)实现。 |
|
||
| CanIf Receive L-PDU / CanIf Rx L-PDU | 方向设置为"下层到上层"的 L-PDU。 |
|
||
| CanIf Receive L-PDU buffer / CanIfRxBuffer | 位于 CAN Interface 模块中的单个元素 RAM 缓冲区,用于存储整个接收 L-PDU。 |
|
||
| CanIf Transmit L-PDU / CanIf Tx L-PDU | 方向设置为"上层到下层"的 L-PDU。 |
|
||
| CanIf Transmit L-PDU buffer / CanIfTxBuffer | 位于 CanIf 中的单个 CanIfTxBuffer 元素,用于存储一个或多个 CanIf Tx L-PDU。如果单个 CanIfTxBuffer 元素的缓冲区大小设置为 0,则 CanIfTxBuffer 元素仅用于引用 HTH。 |
|
||
| Hardware object / HW object | 硬件对象定义为 CAN 硬件单元/CAN 控制器的 CAN RAM 中的 PDU 缓冲区。 |
|
||
| Hardware Receive Handle (HRH) | 硬件接收句柄(HRH)由 CAN 驱动定义并提供。每个 HRH 通常仅代表一个硬件对象。HRH 由 CAN Interface 层用作软件过滤等参数。 |
|
||
| Hardware Transmit Handle (HTH) | 硬件发送句柄(HTH)由 CAN 驱动定义并提供。每个 HTH 通常仅代表一个或多个配置为 CAN 硬件发送缓冲区池的 CAN 硬件对象。 |
|
||
| Inner priority inversion | 由于同一发送硬件对象中存在挂起的低优先级 L-PDU,因此高优先级 L-PDU 的传输被阻止。 |
|
||
| Integration Code | 集成商需要添加到 AUTOSAR 系统的代码,以适应非标准功能。 |
|
||
| Lowest In - First Out / LOFO | 这是一种数据存储过程,其中始终提取具有最低值的元素。 |
|
||
| L-PDU channel group | 仅属于一个底层网络的 CAN L-PDU 组。通常由一个上层模块处理。 |
|
||
| Outer priority inversion | 在两个连续传输的 L-PDU 之间出现时间间隔。在这种情况下,来自另一节点的低优先级 L-PDU 可以阻止发送自己的高优先级 L-PDU。 |
|
||
| Physical channel | 物理通道表示从 CAN 控制器到 CAN 网络的接口。CAN 硬件单元的不同物理通道可以访问不同的网络。 |
|
||
| Tx request | 从 CanIf 的上层模块到 CAN Interface 模块的发送请求。 |
|
||
|
||
---
|
||
|
||
## 3 相关文档(Related documentation)
|
||
|
||
### 3.1 输入文档及相关标准和规范
|
||
|
||
| 编号 | 文档 |
|
||
|------|------|
|
||
| [1] | Specification of CAN Driver — `AUTOSAR_SWS_CANDriver` |
|
||
| [2] | Specification of CAN Transceiver Driver — `AUTOSAR_SWS_CANTransceiverDriver` |
|
||
| [3] | Specification of CAN State Manager — `AUTOSAR_SWS_CANStateManager` |
|
||
| [4] | Specification of CAN Network Management — `AUTOSAR_SWS_CANNetworkManagement` |
|
||
| [5] | Specification of CAN Transport Layer — `AUTOSAR_SWS_CANTransportLayer` |
|
||
| [6] | Specification of PDU Router — `AUTOSAR_SWS_PDURouter` |
|
||
| [7] | Layered Software Architecture — `AUTOSAR_EXP_LayeredSoftwareArchitecture` |
|
||
| [8] | Glossary — `AUTOSAR_TR_Glossary` |
|
||
| [9] | General Specification of Basic Software Modules — `AUTOSAR_SWS_BSWGeneral` |
|
||
| [10] | General Requirements on Basic Software Modules — `AUTOSAR_SRS_BSWGeneral` |
|
||
| [11] | Requirements on CAN — `AUTOSAR_SRS_CAN` |
|
||
| [12] | ISO 11898-1:2003 – Road vehicles – Controller area network (CAN) |
|
||
| [13] | Specification of ECU State Manager — `AUTOSAR_SWS_ECUStateManager` |
|
||
| [14] | Specification of ECU Configuration — `AUTOSAR_TPS_ECUConfiguration` |
|
||
|
||
### 3.2 相关规范
|
||
|
||
AUTOSAR 提供了基础软件模块的通用规范 [9, SWS BSW General],该规范对 CAN Interface 同样有效。
|
||
|
||
因此,SWS BSW General 规范应被视为 CAN Interface 的附加和必需规范。
|
||
|
||
---
|
||
|
||
## 4 约束和假设(Constraints and assumptions)
|
||
|
||
### 4.1 限制
|
||
|
||
CAN Interface 只能用于 CAN 通信,专门设计用于与一个或多个底层 CAN 驱动和 CAN 收发器驱动一起操作。覆盖不同 CAN 硬件单元的几个 CAN 驱动模块由一个通用接口表示,如 CAN 驱动规范 [1] 中所述。以同样的方式,覆盖不同 CAN 收发器设备的几个 CAN 收发器驱动模块由一个通用接口表示,如 CAN 收发器驱动规范 [2] 中所述。不支持 CAN 以外的其他协议(即 LIN 或 FlexRay)。
|
||
|
||
请注意,活动的 PnTxFilter 确保总线上的第一条消息是 `CanIfTxPduPnFilterPdu`。如果 `CanIfTxPduPnFilterPdu` 是 NM-PDU,则 COM 栈启动会负责在成功传输该 PDU 之前禁用 PduGroups。但是,其他 PDU 的发送请求(即最初启动的 PDU、TP-PDU、XCP-PDU)将被拒绝,直到配置的 PDU 发送完毕。发起网络唤醒的第一个 PDU 必须是 `CanIfTxPduPnFilterPdu`。如果通信正在进行并且成功接收到启用 PnTxFilter 的帧,则应禁用 PnTxFilter。在这种情况下,PnTxFilter 不是必需的,因为已经由活动节点提供 Ack。
|
||
|
||
### 4.2 对汽车领域的适用性
|
||
|
||
CAN Interface 可在使用 CAN 协议的所有领域应用中使用。
|
||
|
||
---
|
||
|
||
## 5 对其他模块的依赖(Dependencies to other modules)
|
||
|
||
本节描述了 CAN Interface 在 AUTOSAR 基础软件架构中与其他模块的关系。它包含 CanIf 层从其他模块所需的配置信息和服务的简要描述(见图 5.1)。
|
||
|
||
**图 5.1:AUTOSAR BSW 中的 CANIF 依赖关系**
|
||
|
||
### 5.1 上层协议层
|
||
|
||
在 AUTOSAR BSW 架构内,CAN Interface 模块(Abbr.: CanIf)的上层由 PDU Router 模块(Abbr.: PduR)、CAN Network Management 模块(Abbr.: CanNm)、CAN Transport Layer 模块(Abbr.: CanTp)、CAN State Manager 模块(Abbr.: CanSm)、ECU State Manager 模块(Abbr.: EcuM)、复杂驱动模块(Abbr.: CDD)、通用校准协议模块(Abbr.: XCP)、CAN 上的全局时间同步(Abbr.: CanTSyn)、J1939 传输层模块(Abbr.: J1939Tp)和 J1939 网络管理模块(Abbr.: J1939Nm)表示。
|
||
|
||
AUTOSAR BSW 架构表明,应用数据缓冲区位于它们所属的上层中。禁止直接访问这些缓冲区。缓冲区位置由 CanIf 在发送和接收期间传递给 CAN 驱动模块(Abbr.: CanDrv)或从 CAN 驱动模块传递。在执行这些发送/接收指示服务期间,传递缓冲区位置。每次访问缓冲区时,都使用锁机制来保证数据完整性。请参阅第 7.17 节"数据完整性"。
|
||
|
||
CanIf 使用的 API 由通知服务组成,作为传输 CAN 相关数据(即数据长度)到目标上层的基本代理。这些服务的调用参数指向缓存在 CanDrv 中的信息或直接引用 CAN 硬件。
|
||
|
||
此外,CanIf 支持对总线镜像模块的 callout,以报告接收和传输的帧的内容。
|
||
|
||
### 5.2 初始化:ECU 状态管理器
|
||
|
||
EcuM 初始化 CanIf(请参阅 [3, Specification of ECU State Manager])。
|
||
|
||
### 5.3 模式控制:CAN 状态管理器
|
||
|
||
CanSm 模块负责所有支持的 CAN 控制器和 CAN 收发器的模式控制管理。
|
||
|
||
### 5.4 下层:CAN 驱动
|
||
|
||
主要下层 CAN 设备驱动由 CanDrv 表示(请参阅 [1, Specification of CAN Driver])。由于 CanIf 在 AUTOSAR 基础软件架构中的位置,CanIf 与 CanDrv 关系密切。
|
||
|
||
CanDrv 仅提供对 CAN 控制器的硬件抽象访问,但操作模式的控制仅在 CanSm 中完成。
|
||
|
||
CanDrv 检测和处理 CAN 控制器的事件,并将这些事件通知给 CanIf。
|
||
|
||
CanIf 将 CanSm 的操作模式请求传递给相应的底层 CAN 控制器。
|
||
|
||
CanDrv 提供标准化的 L-PDU 以确保 CanIf 的硬件独立性。指向此标准化 L-PDU 的指针要么指向临时缓冲区(例如用于数据标准化),要么指向 CAN 硬件相关的 CanDrv。对于 CanIf,L-PDU 缓冲区的类型是不可见的。
|
||
|
||
CanIf 提供由 CanDrv 在所有通知方案中使用的通知服务,例如:发送确认(小节 8.4.2 "CanIf_TxConfirmation",见 [SWS_CANIF_00007])、接收指示(小节 8.4.3 "CanIf_RxIndication",见 [SWS_CANIF_00006])和控制器模式更改的通知(小节 8.4.8,见 [SWS_CANIF_00699])。
|
||
|
||
在使用为不同中断向量服务的多个 CanDrv 的情况下,上述回调服务必须是可重入的,请参阅第 7.24 节"多个 CAN 驱动支持"。回调函数的可重入性在第 8.4 节中指定。
|
||
|
||
由 CanDrv 调用的回调服务在 CanIf 中声明和实现。由 CanIf 调用的回调服务在适当的上层通信服务层(例如 PduR、CanNm、CanTp)中声明和放置。
|
||
|
||
CanIf 结构在第 5.7 节"文件结构"中指定。
|
||
|
||
配置的 CAN 控制器的数量不一定属于使用的 CAN 收发器的数量。如果不同类型的多个 CAN 控制器在同一 CAN 网络上运行,则一个 CAN 收发器和 CanTrcv 就足够了,而根据 CAN 控制器设备的类型,需要一个或两个不同的 CanDrv(请参阅第 7.5 节"物理通道视图")。
|
||
|
||
### 5.5 下层:CAN 收发器驱动
|
||
|
||
第二个可用的下层 CAN 设备驱动由 CanTrcv 表示(请参阅 [2, Specification of CAN Transceiver Driver])。
|
||
|
||
每个 CanTrcv 本身执行 CAN 收发器设备的操作模式控制。CanIf 仅将几个底层 CanTrcv 的所有 API 映射到一个唯一的 API,因此 CanSm 能够触发相应 CAN 收发器模式的转换。CanTrcv 中没有控制或处理功能在 CanIf 内完成。
|
||
|
||
CanIf 将所有底层 CanTrcv 的以下服务映射到一个唯一接口。这些在 CAN 收发器驱动 SWS 中进一步描述(请参阅 [2, Specification of CAN Transceiver Driver]):
|
||
- 唯一的 CanTrcv 模式请求和读取服务,用于管理每个底层 CAN 收发器设备的操作模式。
|
||
- CAN 收发器唤醒原因支持的读取服务。
|
||
- 用于启用/禁用/清除每个使用的 CAN 收发器的唤醒事件状态的模式请求服务(`CanIf_SetTrcvMode()`,见 [SWS_CANIF_00287])。
|
||
|
||
### 5.6 配置
|
||
|
||
CanIf 设计经过优化,可以管理特定于 CAN 协议的功能和所用底层 CAN 控制器的处理。
|
||
|
||
CanIf 能够在不重建的情况下更改 CAN 配置。因此,函数 `CanIf_Init()`(见 [SWS_CANIF_00001])从配置容器和参数中检索所需的 CAN 配置信息,这些信息在第 10 章中指定(作为引用链接或附加参数),请参见图 10.1。
|
||
|
||
本节提供了检索信息的摘要,例如:
|
||
- CAN 控制器的数量。CAN 控制器的数量是分配发送和接收 L-PDU 以及控制可用 CAN 驱动状态所必需的(请参阅 `CanIfCtrlDrvCfg`)。
|
||
- 硬件对象句柄的数量。为了监督发送请求,CAN Interface 需要知道 HTH 的数量以及每个 HTH 和相应 CAN 控制器之间的分配(请参阅 `CanIfHthCanCtrlIdRef`;`CanIfHthIdSymRef`)。
|
||
- 为每个硬件对象通过硬件验收过滤器的接收 CAN ID 范围。CAN Interface 使用 HRH 和要在相应硬件对象中接收的 L-PDU 之间的固定分配来执行搜索算法(请参阅第 7.20 节"软件接收过滤器",请参阅 `CanIfHrhSoftwareFilter`、`CanIfHrhCanCtrlIdRef`、`CanIfHrhIdSymRef`)。
|
||
|
||
CanIf 需要有关所有使用的上层通信服务层和要分发的 L-SDU 的信息。集成 CanIf 在 AUTOSAR COM 栈中时必须在配置时设置以下信息:
|
||
- 每个发送 L-SDU 的发送上层模块和发送 I-PDU。=> 用于分发发送确认服务(请参阅 `CanIfTxPduId`)。
|
||
- 每个接收 L-SDU 的接收上层模块和接收 I-PDU。=> 用于接收指示期间的 L-SDU 分发(请参阅 `CanIfRxPduId`)。
|
||
|
||
CanIf 需要控制器和连接到 CAN 网络的自己的 ECU 的描述。因此从 CAN 通信矩阵(AUTOSAR 系统配置的一部分)中检索以下信息(请参阅 `CanIfTxPduCfg`、`CanIfRxPduCfg`):
|
||
- 在此 ECU 的每个物理通道上接收的所有 L-PDU。=> 用于软件过滤和接收 L-SDU 分发
|
||
- 此 ECU 上每个物理通道要发送的所有 L-SDU。=> 用于发送请求和发送 L-PDU 分发
|
||
- 这些 L-PDU 的属性(ID、数据长度)。=> 用于软件过滤、接收指示服务、数据长度检查
|
||
- 每个发送的 L-SDU 的发送器(即 PduR、CanNm、CanTp)。=> 用于发送确认服务
|
||
- 每个接收的 L-SDU 的接收器(即 PduR、CanNm、CanTp)。=> 用于 L-PDU 分发
|
||
- 符号 L-PDU/L-SDU 名称。=> 用于表示 Rx/Tx 数据缓冲区地址
|
||
|
||
### 5.7 文件结构
|
||
|
||
#### 5.7.1 代码文件结构
|
||
|
||
**[SWS_CANIF_00378]** ⌈ CanIf 应通过每个 CanDrv 的一组函数指针访问链接时配置的所有使用的底层 CanDrv 的 API 位置。 ⌋ ()
|
||
|
||
每个 CanDrv 的函数指针的值在链接时给出。
|
||
|
||
#### 5.7.2 头文件结构
|
||
|
||
**[SWS_CANIF_00672]** ⌈ 头文件 `CanIf.h` 仅包含 CanIf 中指定的常量、全局数据和服务的外声明。 ⌋ ()
|
||
|
||
仅由 CanIf 内部使用的常量、全局数据类型和函数在 `CanIf.c` 中声明。
|
||
|
||
**[SWS_CANIF_00903]** ⌈ 如果启用了总线镜像(请参阅 `CanIfBusMirroringSupport`),则 CanIf 应包含头文件 `Mirror_Cbk.h`。 ⌋ (SRS_Can_01172)
|
||
|
||
---
|
||
|
||
## 6 需求追踪(Requirements Tracing)
|
||
|
||
下表引用了 [10] 和 [11] 中指定的需求。
|
||
|
||
> 注:完整的需求追踪矩阵非常长(>50 行),许多 SRS 条目映射到 20+ 个 SWS 条目。此处保留前 10 项作为示例。完整表格见原文 PDF 第 23-27 页。
|
||
|
||
| 需求 | 描述 | 满足于 |
|
||
|------|------|--------|
|
||
| [SRS_BSW_00007] | 所有用 C 语言编写的 BSW 模块应符合 MISRA C 2012 标准 | [SWS_CANIF_00999] |
|
||
| [SRS_BSW_00010 | 所有 BSW 模块的内存消耗应为已定义配置的所有支持平台提供文档 | [SWS_CANIF_00999] |
|
||
| [SRS_BSW_00101] | 基础软件模块应能在单独的初始化函数中初始化变量和硬件 | [SWS_CANIF_00001] |
|
||
| [SRS_BSW_00159] | 所有 AUTOSAR BSW 模块应支持基于工具的配置 | [SWS_CANIF_00999] |
|
||
| [SRS_BSW_00164] | 中断服务例程的实现应由操作系统、复杂驱动或模块完成 | [SWS_CANIF_00999] |
|
||
| [SRS_BSW_00167] | 所有 AUTOSAR BSW 模块应提供配置规则和约束以启用合理性检查 | [SWS_CANIF_00999] |
|
||
| [SRS_BSW_00168] | SW-C 应通过基础软件通用 API 中定义的函数进行测试 | [SWS_CANIF_00999] |
|
||
| [SRS_BSW_00170] | AUTOSAR SW 组件应提供有关其对故障、信号质量、驱动程序的依赖性信息 | [SWS_CANIF_00999] |
|
||
| [SRS_BSW_00172] | 内置于 BSW 模块中的调度策略应与系统中使用的策略兼容 | [SWS_CANIF_00999] |
|
||
| [SRS_BSW_00306] | AUTOSAR BSW 模块应与编译器和平台无关 | [SWS_CANIF_00999] |
|
||
| ... | ... | ... |
|
||
|
||
`<!-- 完整内容见原文 PDF 第 23-27 页 -->`
|
||
|
||
---
|
||
|
||
## 7 功能规范(Functional specification)
|
||
|
||
### 7.1 一般功能
|
||
|
||
`<!-- 完整内容见原文 PDF 第 28-29 页 -->`
|
||
|
||
### 7.2 硬件对象句柄
|
||
|
||
`<!-- 完整内容见原文 PDF 第 29-31 页 -->`
|
||
|
||
### 7.3 静态 L-PDU
|
||
|
||
`<!-- 完整内容见原文 PDF 第 31-32 页 -->`
|
||
|
||
### 7.4 动态 L-PDU
|
||
|
||
#### 7.4.1 动态发送 L-PDU
|
||
|
||
`<!-- 完整内容见原文 PDF 第 33-34 页 -->`
|
||
|
||
#### 7.4.2 动态接收 L-PDU
|
||
|
||
`<!-- 完整内容见原文 PDF 第 34 页 -->`
|
||
|
||
### 7.5 物理通道视图
|
||
|
||
`<!-- 完整内容见原文 PDF 第 34-36 页 -->`
|
||
|
||
### 7.6 CAN 硬件单元
|
||
|
||
`<!-- 完整内容见原文 PDF 第 36-37 页 -->`
|
||
|
||
### 7.7 BasicCAN 和 FullCAN 接收
|
||
|
||
`<!-- 完整内容见原文 PDF 第 37-39 页 -->`
|
||
|
||
### 7.8 初始化
|
||
|
||
`<!-- 完整内容见原文 PDF 第 39 页 -->`
|
||
|
||
### 7.9 发送请求
|
||
|
||
`<!-- 完整内容见原文 PDF 第 39-40 页 -->`
|
||
|
||
### 7.10 发送数据流
|
||
|
||
`<!-- 完整内容见原文 PDF 第 40-42 页 -->`
|
||
|
||
### 7.11 发送缓冲
|
||
|
||
#### 7.11.1 一般行为
|
||
|
||
`<!-- 完整内容见原文 PDF 第 42-43 页 -->`
|
||
|
||
#### 7.11.2 缓冲区特征
|
||
|
||
##### 7.11.2.1 L-PDU 在发送 L-PDU 缓冲区中的存储
|
||
|
||
`<!-- 完整内容见原文 PDF 第 43-44 页 -->`
|
||
|
||
##### 7.11.2.2 发送 L-PDU 缓冲区的清除
|
||
|
||
`<!-- 完整内容见原文 PDF 第 44 页 -->`
|
||
|
||
##### 7.11.2.3 发送 L-PDU 缓冲区的初始化
|
||
|
||
`<!-- 完整内容见原文 PDF 第 45 页 -->`
|
||
|
||
#### 7.11.3 发送 L-PDU 缓冲区的数据完整性
|
||
|
||
`<!-- 完整内容见原文 PDF 第 45-46 页 -->`
|
||
|
||
### 7.12 发送确认
|
||
|
||
`<!-- 完整内容见原文 PDF 第 46 页 -->`
|
||
|
||
### 7.13 接收数据流
|
||
|
||
`<!-- 完整内容见原文 PDF 第 46-49 页 -->`
|
||
|
||
### 7.14 接收指示
|
||
|
||
`<!-- 完整内容见原文 PDF 第 49-50 页 -->`
|
||
|
||
### 7.15 读取接收到的数据
|
||
|
||
`<!-- 完整内容见原文 PDF 第 50-51 页 -->`
|
||
|
||
### 7.16 读取 Tx/Rx 通知状态
|
||
|
||
`<!-- 完整内容见原文 PDF 第 51 页 -->`
|
||
|
||
### 7.17 数据完整性
|
||
|
||
`<!-- 完整内容见原文 PDF 第 51-52 页 -->`
|
||
|
||
### 7.18 CAN 控制器模式
|
||
|
||
#### 7.18.1 一般功能
|
||
|
||
`<!-- 完整内容见原文 PDF 第 52-53 页 -->`
|
||
|
||
#### 7.18.2 CAN 控制器操作模式
|
||
|
||
`<!-- 完整内容见原文 PDF 第 53-54 页 -->`
|
||
|
||
#### 7.18.3 控制器模式转换
|
||
|
||
`<!-- 完整内容见原文 PDF 第 54-55 页 -->`
|
||
|
||
#### 7.18.4 唤醒
|
||
|
||
##### 7.18.4.1 唤醒检测
|
||
|
||
`<!-- 完整内容见原文 PDF 第 55 页 -->`
|
||
|
||
##### 7.18.4.2 唤醒验证
|
||
|
||
`<!-- 完整内容见原文 PDF 第 55-57 页 -->`
|
||
|
||
### 7.19 PDU 通道模式控制
|
||
|
||
#### 7.19.1 PDU 通道组
|
||
|
||
`<!-- 完整内容见原文 PDF 第 57-58 页 -->`
|
||
|
||
#### 7.19.2 PDU 通道模式
|
||
|
||
##### 7.19.2.1 CANIF_OFFLINE
|
||
|
||
`<!-- 完整内容见原文 PDF 第 58-60 页 -->`
|
||
|
||
##### 7.19.2.2 CANIF_ONLINE
|
||
|
||
`<!-- 完整内容见原文 PDF 第 60 页 -->`
|
||
|
||
##### 7.19.2.3 CANIF_OFFLINE_ACTIVE
|
||
|
||
`<!-- 完整内容见原文 PDF 第 60 页 -->`
|
||
|
||
### 7.20 软件接收过滤器
|
||
|
||
#### 7.20.1 软件过滤概念
|
||
|
||
`<!-- 完整内容见原文 PDF 第 61-62 页 -->`
|
||
|
||
#### 7.20.2 软件过滤算法
|
||
|
||
`<!-- 完整内容见原文 PDF 第 62 页 -->`
|
||
|
||
### 7.21 数据长度检查
|
||
|
||
`<!-- 完整内容见原文 PDF 第 62-63 页 -->`
|
||
|
||
### 7.22 L-SDU 向上层的分发
|
||
|
||
`<!-- 完整内容见原文 PDF 第 63 页 -->`
|
||
|
||
### 7.23 轮询模式
|
||
|
||
`<!-- 完整内容见原文 PDF 第 63-64 页 -->`
|
||
|
||
### 7.24 多个 CAN 驱动支持
|
||
|
||
#### 7.24.1 使用多个 CAN 驱动的发送请求
|
||
|
||
`<!-- 完整内容见原文 PDF 第 64-66 页 -->`
|
||
|
||
#### 7.24.2 使用多个 CAN 驱动的通知机制
|
||
|
||
`<!-- 完整内容见原文 PDF 第 66-68 页 -->`
|
||
|
||
### 7.25 部分网络
|
||
|
||
`<!-- 完整内容见原文 PDF 第 68-69 页 -->`
|
||
|
||
### 7.26 CAN FD 支持
|
||
|
||
`<!-- 完整内容见原文 PDF 第 69-70 页 -->`
|
||
|
||
### 7.27 错误分类
|
||
|
||
#### 7.27.1 开发错误
|
||
|
||
| 错误类型 | 相关错误码 | 值 [hex] |
|
||
|----------|------------|----------|
|
||
| API 调用时使用了无效的参数 | `CANIF_E_PARAM_CANID` | 0x01 |
|
||
| API 调用时使用了无效的 HTH | `CANIF_E_PARAM_HOH` | 0x02 |
|
||
| API 调用时使用了无效的 L-PDU ID | `CANIF_E_PARAM_LPDU` | 0x03 |
|
||
| API 在未初始化状态下被调用 | `CANIF_E_UNINIT` | 0x04 |
|
||
| API 调用时使用了无效的控制器 ID | `CANIF_E_PARAM_CONTROLLER` | 0x05 |
|
||
| API 调用时使用了无效的收发器 ID | `CANIF_E_PARAM_TRCV` | 0x06 |
|
||
|
||
#### 7.27.2 运行时错误
|
||
|
||
**[SWS_CANIF_00656]** ⌈
|
||
|
||
| 错误类型 | 相关错误码 | 值 [hex] |
|
||
|----------|------------|----------|
|
||
| 数据一致性检查失败 | `CANIF_E_DATA_CORRUPTION` | 0x01 |
|
||
|
||
⌋ (SRS_BSW_00323)
|
||
|
||
#### 7.27.3 瞬态故障
|
||
|
||
无瞬态故障。
|
||
|
||
#### 7.27.4 生产错误
|
||
|
||
**[SWS_CANIF_00664]** ⌈ CanIf 模块报告生产错误 `CANIF_E_BUS_OFF`。 ⌋ (SRS_BSW_00466)
|
||
|
||
#### 7.27.5 扩展生产错误
|
||
|
||
无扩展生产错误。
|
||
|
||
### 7.28 错误检测
|
||
|
||
`<!-- 完整内容见原文 PDF 第 71 页 -->`
|
||
|
||
### 7.29 错误通知
|
||
|
||
`<!-- 完整内容见原文 PDF 第 71 页 -->`
|
||
|
||
---
|
||
|
||
## 8 API 规范(API specification)
|
||
|
||
### 8.1 导入类型
|
||
|
||
**[SWS_CANIF_00045]** ⌈ CanIf 从以下模块导入类型:
|
||
|
||
| 模块 | 头文件 | 导入类型 |
|
||
|------|--------|----------|
|
||
| Can_GeneralTypes | Can_GeneralTypes.h | `Can_HwHandleType`、`Can_IdType`、`Can_PduType`、`Can_ReturnType`(已弃用) |
|
||
| CanTrcv | CanTrcv.h | `CanTrcv_TrcvModeType`、`CanTrcv_TrcvWakeupModeType`、`CanTrcv_TrcvWakeupReasonType` |
|
||
| Std_Types | StandardTypes.h | `Std_ReturnType`、`Std_VersionInfoType` |
|
||
| ComStack_Types | ComStack_Types.h | `PduIdType`、`PduInfoType` |
|
||
| EcuM | EcuM.h | `EcuM_WakeupSourceType` |
|
||
|
||
⌋ ()
|
||
|
||
### 8.2 类型定义
|
||
|
||
#### 8.2.1 CanIf_ConfigType
|
||
|
||
**[SWS_CANIF_00050]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 名称 | `CanIf_ConfigType` |
|
||
| 类型 | Structure |
|
||
| 描述 | CanIf 模块的初始化数据结构。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
#### 8.2.2 CanIf_PduModeType
|
||
|
||
**[SWS_CANIF_00051]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 名称 | `CanIf_PduModeType` |
|
||
| 类型 | Enumeration |
|
||
| 范围 | `CANIF_OFFLINE`、`CANIF_TX_OFFLINE`、`CANIF_TX_OFFLINE_ACTIVE`、`CANIF_ONLINE` |
|
||
| 描述 | CanIf 通知 CanDrv 的 PDU 模式。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
#### 8.2.3 CanIf_NotifStatusType
|
||
|
||
**[SWS_CANIF_00052]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 名称 | `CanIf_NotifStatusType` |
|
||
| 类型 | Enumeration |
|
||
| 范围 | `CANIF_NO_NOTIFICATION`、`CANIF_TX_RX_NOTIFICATION` |
|
||
| 描述 | 通知状态。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
### 8.3 函数定义
|
||
|
||
#### 8.3.1 CanIf_Init
|
||
|
||
**[SWS_CANIF_00001]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 服务名 | `CanIf_Init` |
|
||
| 语法 | `void CanIf_Init(const CanIf_ConfigType* ConfigPtr)` |
|
||
| 服务 ID[hex] | 0x01 |
|
||
| 同步/异步 | 同步 |
|
||
| 可重入性 | 不可重入 |
|
||
| 输入参数 | `ConfigPtr` -- 指向驱动配置的指针 |
|
||
| 描述 | 初始化 CanIf 模块。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ (SRS_BSW_00101, SRS_BSW_00358, SRS_BSW_00414)
|
||
|
||
#### 8.3.2 CanIf_DeInit
|
||
|
||
**[SWS_CANIF_00999]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 服务名 | `CanIf_DeInit` |
|
||
| 语法 | `void CanIf_DeInit(void)` |
|
||
| 描述 | 反初始化 CanIf 模块。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ (SRS_BSW_00336)
|
||
|
||
#### 8.3.3 CanIf_SetControllerMode
|
||
|
||
**[SWS_CANIF_00015]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 服务名 | `CanIf_SetControllerMode` |
|
||
| 语法 | `Std_ReturnType CanIf_SetControllerMode(uint8 ControllerId, CanIf_ControllerModeType ControllerMode)` |
|
||
| 服务 ID[hex] | 0x03 |
|
||
| 输入参数 | `ControllerId` -- CAN 控制器 ID;`ControllerMode` -- 目标模式 |
|
||
| 返回值 | `E_OK` -- 模式设置成功;`E_NOT_OK` -- 模式设置失败 |
|
||
| 描述 | 设置 CAN 控制器的模式。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
#### 8.3.4 CanIf_GetControllerMode
|
||
|
||
**[SWS_CANIF_00091]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 服务名 | `CanIf_GetControllerMode` |
|
||
| 语法 | `Std_ReturnType CanIf_GetControllerMode(uint8 ControllerId, CanIf_ControllerModeType* ControllerModePtr)` |
|
||
| 服务 ID[hex] | 0x04 |
|
||
| 输入参数 | `ControllerId` -- CAN 控制器 ID |
|
||
| 输出参数 | `ControllerModePtr` -- 指向当前模式的指针 |
|
||
| 返回值 | `E_OK` -- 读取成功;`E_NOT_OK` -- 读取失败 |
|
||
| 描述 | 获取 CAN 控制器的当前模式。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
#### 8.3.5 CanIf_GetControllerErrorState
|
||
|
||
**[SWS_CANIF_00357]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 服务名 | `CanIf_GetControllerErrorState` |
|
||
| 语法 | `Std_ReturnType CanIf_GetControllerErrorState(uint8 ControllerId, Can_ErrorStateType* ErrorStatePtr)` |
|
||
| 服务 ID[hex] | 0x1D |
|
||
| 输入参数 | `ControllerId` -- CAN 控制器 ID |
|
||
| 输出参数 | `ErrorStatePtr` -- 指向错误状态的指针 |
|
||
| 返回值 | `E_OK` -- 读取成功;`E_NOT_OK` -- 读取失败 |
|
||
| 描述 | 获取 CAN 控制器的错误状态。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
#### 8.3.6 CanIf_Transmit
|
||
|
||
**[SWS_CANIF_00017]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 服务名 | `CanIf_Transmit` |
|
||
| 语法 | `Std_ReturnType CanIf_Transmit(PduIdType CanIfTxSduId, const PduInfoType* CanIfTxInfoPtr)` |
|
||
| 服务 ID[hex] | 0x05 |
|
||
| 输入参数 | `CanIfTxSduId` -- 发送 SDU 的 ID;`CanIfTxInfoPtr` -- 指向 L-PDU 信息的指针 |
|
||
| 返回值 | `E_OK` -- 发送请求已接受;`E_NOT_OK` -- 发送请求未接受 |
|
||
| 描述 | 请求传输 CAN L-PDU。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
#### 8.3.7 CanIf_ReadRxPduData
|
||
|
||
**[SWS_CANIF_00049]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 服务名 | `CanIf_ReadRxPduData` |
|
||
| 语法 | `Std_ReturnType CanIf_ReadRxPduData(PduIdType CanIfRxSduId, PduInfoType* CanIfRxInfoPtr)` |
|
||
| 服务 ID[hex] | 0x14 |
|
||
| 输入参数 | `CanIfRxSduId` -- 接收 SDU 的 ID |
|
||
| 输出参数 | `CanIfRxInfoPtr` -- 指向接收 L-PDU 信息的指针 |
|
||
| 返回值 | `E_OK` -- 读取成功;`E_NOT_OK` -- 读取失败 |
|
||
| 描述 | 读取接收的 L-PDU 数据。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
#### 8.3.8 CanIf_ReadTxNotifStatus
|
||
|
||
**[SWS_CANIF_00059]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 服务名 | `CanIf_ReadTxNotifStatus` |
|
||
| 语法 | `CanIf_NotifStatusType CanIf_ReadTxNotifStatus(PduIdType CanIfTxSduId)` |
|
||
| 服务 ID[hex] | 0x07 |
|
||
| 输入参数 | `CanIfTxSduId` -- 发送 SDU 的 ID |
|
||
| 返回值 | `CANIF_NO_NOTIFICATION` -- 没有待处理的发送通知;`CANIF_TX_RX_NOTIFICATION` -- 有待处理的发送通知 |
|
||
| 描述 | 检查是否有待处理的发送通知。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
#### 8.3.9 CanIf_ReadRxNotifStatus
|
||
|
||
**[SWS_CANIF_00058]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 服务名 | `CanIf_ReadRxNotifStatus` |
|
||
| 语法 | `CanIf_NotifStatusType CanIf_ReadRxNotifStatus(PduIdType CanIfRxSduId)` |
|
||
| 服务 ID[hex] | 0x08 |
|
||
| 输入参数 | `CanIfRxSduId` -- 接收 SDU 的 ID |
|
||
| 返回值 | `CANIF_NO_NOTIFICATION` -- 没有待处理的接收通知;`CANIF_TX_RX_NOTIFICATION` -- 有待处理的接收通知 |
|
||
| 描述 | 检查是否有待处理的接收通知。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
#### 8.3.10 CanIf_SetPduMode
|
||
|
||
**[SWS_CANIF_00016]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 服务名 | `CanIf_SetPduMode` |
|
||
| 语法 | `Std_ReturnType CanIf_SetPduMode(uint8 ControllerId, CanIf_PduModeType PduModeRequest)` |
|
||
| 服务 ID[hex] | 0x09 |
|
||
| 输入参数 | `ControllerId` -- CAN 控制器 ID;`PduModeRequest` -- PDU 模式请求 |
|
||
| 返回值 | `E_OK` -- 模式设置成功;`E_NOT_OK` -- 模式设置失败 |
|
||
| 描述 | 设置指定 CAN 控制器的 PDU 模式。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
#### 8.3.11 CanIf_GetPduMode
|
||
|
||
**[SWS_CANIF_00090]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 服务名 | `CanIf_GetPduMode` |
|
||
| 语法 | `Std_ReturnType CanIf_GetPduMode(uint8 ControllerId, CanIf_PduModeType* PduModePtr)` |
|
||
| 服务 ID[hex] | 0x0A |
|
||
| 输入参数 | `ControllerId` -- CAN 控制器 ID |
|
||
| 输出参数 | `PduModePtr` -- 指向当前 PDU 模式的指针 |
|
||
| 返回值 | `E_OK` -- 读取成功;`E_NOT_OK` -- 读取失败 |
|
||
| 描述 | 获取指定 CAN 控制器的当前 PDU 模式。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
#### 8.3.12 CanIf_GetVersionInfo
|
||
|
||
**[SWS_CANIF_00018]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 服务名 | `CanIf_GetVersionInfo` |
|
||
| 语法 | `void CanIf_GetVersionInfo(Std_VersionInfoType* VersionInfoPtr)` |
|
||
| 服务 ID[hex] | 0x0B |
|
||
| 描述 | 获取 CanIf 模块的版本信息。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
#### 8.3.13 CanIf_SetDynamicTxId
|
||
|
||
**[SWS_CANIF_00057]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 服务名 | `CanIf_SetDynamicTxId` |
|
||
| 语法 | `Std_ReturnType CanIf_SetDynamicTxId(PduIdType CanIfTxSduId, Can_IdType CanId)` |
|
||
| 服务 ID[hex] | 0x0C |
|
||
| 输入参数 | `CanIfTxSduId` -- 发送 SDU 的 ID;`CanId` -- 动态 CAN ID |
|
||
| 返回值 | `E_OK` -- 动态 ID 已设置;`E_NOT_OK` -- 动态 ID 设置失败 |
|
||
| 描述 | 设置动态发送 L-PDU 的 CAN ID。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
#### 8.3.14 CanIf_SetTrcvMode
|
||
|
||
**[SWS_CANIF_00287]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 服务名 | `CanIf_SetTrcvMode` |
|
||
| 语法 | `Std_ReturnType CanIf_SetTrcvMode(uint8 TransceiverId, CanTrcv_TrcvModeType TransceiverMode)` |
|
||
| 服务 ID[hex] | 0x0D |
|
||
| 输入参数 | `TransceiverId` -- CAN 收发器 ID;`TransceiverMode` -- 目标模式 |
|
||
| 返回值 | `E_OK` -- 模式设置成功;`E_NOT_OK` -- 模式设置失败 |
|
||
| 描述 | 设置 CAN 收发器的模式。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
#### 8.3.15 CanIf_GetTrcvMode
|
||
|
||
**[SWS_CANIF_00100]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 服务名 | `CanIf_GetTrcvMode` |
|
||
| 语法 | `Std_ReturnType CanIf_GetTrcvMode(uint8 TransceiverId, CanTrcv_TrcvModeType* TransceiverModePtr)` |
|
||
| 服务 ID[hex] | 0x0E |
|
||
| 输入参数 | `TransceiverId` -- CAN 收发器 ID |
|
||
| 输出参数 | `TransceiverModePtr` -- 指向当前收发器模式的指针 |
|
||
| 返回值 | `E_OK` -- 读取成功;`E_NOT_OK` -- 读取失败 |
|
||
| 描述 | 获取 CAN 收发器的当前模式。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
#### 8.3.16 CanIf_GetTrcvWakeupReason
|
||
|
||
**[SWS_CANIF_00108]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 服务名 | `CanIf_GetTrcvWakeupReason` |
|
||
| 语法 | `Std_ReturnType CanIf_GetTrcvWakeupReason(uint8 TransceiverId, CanTrcv_TrcvWakeupReasonType* TrcvWuReasonPtr)` |
|
||
| 服务 ID[hex] | 0x0F |
|
||
| 输入参数 | `TransceiverId` -- CAN 收发器 ID |
|
||
| 输出参数 | `TrcvWuReasonPtr` -- 指向唤醒原因的指针 |
|
||
| 返回值 | `E_OK` -- 读取成功;`E_NOT_OK` -- 读取失败 |
|
||
| 描述 | 获取 CAN 收发器的唤醒原因。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
#### 8.3.17 CanIf_SetTrcvWakeupMode
|
||
|
||
**[SWS_CANIF_00288]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 服务名 | `CanIf_SetTrcvWakeupMode` |
|
||
| 语法 | `Std_ReturnType CanIf_SetTrcvWakeupMode(uint8 TransceiverId, CanTrcv_TrcvWakeupModeType TrcvWakeupMode)` |
|
||
| 服务 ID[hex] | 0x10 |
|
||
| 输入参数 | `TransceiverId` -- CAN 收发器 ID;`TrcvWakeupMode` -- 唤醒模式 |
|
||
| 返回值 | `E_OK` -- 模式设置成功;`E_NOT_OK` -- 模式设置失败 |
|
||
| 描述 | 设置 CAN 收发器的唤醒模式。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
#### 8.3.18 CanIf_CheckWakeup
|
||
|
||
**[SWS_CANIF_00019]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 服务名 | `CanIf_CheckWakeup` |
|
||
| 语法 | `Std_ReturnType CanIf_CheckWakeup(EcuM_WakeupSourceType WakeupSource)` |
|
||
| 服务 ID[hex] | 0x11 |
|
||
| 输入参数 | `WakeupSource` -- 唤醒源 |
|
||
| 返回值 | `E_OK` -- 唤醒有效;`E_NOT_OK` -- 唤醒无效 |
|
||
| 描述 | 检查 CAN 控制器的唤醒状态。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
#### 8.3.19 CanIf_CheckValidation
|
||
|
||
**[SWS_CANIF_00020]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 服务名 | `CanIf_CheckValidation` |
|
||
| 语法 | `Std_ReturnType CanIf_CheckValidation(EcuM_WakeupSourceType WakeupSource)` |
|
||
| 服务 ID[hex] | 0x12 |
|
||
| 输入参数 | `WakeupSource` -- 唤醒源 |
|
||
| 返回值 | `E_OK` -- 验证已启动;`E_NOT_OK` -- 验证启动失败 |
|
||
| 描述 | 启动 CAN 唤醒验证。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
#### 8.3.20 CanIf_GetTxConfirmationState
|
||
|
||
**[SWS_CANIF_00023]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 服务名 | `CanIf_GetTxConfirmationState` |
|
||
| 语法 | `CanIf_NotifStatusType CanIf_GetTxConfirmationState(uint8 ControllerId)` |
|
||
| 服务 ID[hex] | 0x13 |
|
||
| 输入参数 | `ControllerId` -- CAN 控制器 ID |
|
||
| 返回值 | `CANIF_NO_NOTIFICATION` -- 没有待处理的发送确认;`CANIF_TX_RX_NOTIFICATION` -- 有待处理的发送确认 |
|
||
| 描述 | 获取控制器的发送确认状态。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
#### 8.3.21 CanIf_ClearTrcvWufFlag
|
||
|
||
**[SWS_CANIF_00060]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 服务名 | `CanIf_ClearTrcvWufFlag` |
|
||
| 语法 | `Std_ReturnType CanIf_ClearTrcvWufFlag(uint8 TransceiverId)` |
|
||
| 服务 ID[hex] | 0x15 |
|
||
| 输入参数 | `TransceiverId` -- CAN 收发器 ID |
|
||
| 返回值 | `E_OK` -- 清除请求已接受;`E_NOT_OK` -- 清除请求未接受 |
|
||
| 描述 | 清除 CAN 收发器的 WUF 标志。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
#### 8.3.22 CanIf_CheckTrcvWakeFlag
|
||
|
||
**[SWS_CANIF_00061]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 服务名 | `CanIf_CheckTrcvWakeFlag` |
|
||
| 语法 | `Std_ReturnType CanIf_CheckTrcvWakeFlag(uint8 TransceiverId)` |
|
||
| 服务 ID[hex] | 0x16 |
|
||
| 输入参数 | `TransceiverId` -- CAN 收发器 ID |
|
||
| 返回值 | `E_OK` -- 检查请求已接受;`E_NOT_OK` -- 检查请求未接受 |
|
||
| 描述 | 检查 CAN 收发器的唤醒标志。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
#### 8.3.23 CanIf_SetBaudrate
|
||
|
||
**[SWS_CANIF_00026]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 服务名 | `CanIf_SetBaudrate` |
|
||
| 语法 | `Std_ReturnType CanIf_SetBaudrate(uint8 ControllerId, uint16 BaudRateConfigID)` |
|
||
| 服务 ID[hex] | 0x17 |
|
||
| 输入参数 | `ControllerId` -- CAN 控制器 ID;`BaudRateConfigID` -- 波特率配置 ID |
|
||
| 返回值 | `E_OK` -- 波特率设置成功;`E_NOT_OK` -- 波特率设置失败 |
|
||
| 描述 | 设置 CAN 控制器的波特率。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
#### 8.3.24 CanIf_SetIcomConfiguration
|
||
|
||
**[SWS_CANIF_00027]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 服务名 | `CanIf_SetIcomConfiguration` |
|
||
| 语法 | `Std_ReturnType CanIf_SetIcomConfiguration(uint8 ControllerId, IcomConfigIdType ConfigurationId)` |
|
||
| 服务 ID[hex] | 0x18 |
|
||
| 输入参数 | `ControllerId` -- CAN 控制器 ID;`ConfigurationId` -- ICOM 配置 ID |
|
||
| 返回值 | `E_OK` -- 配置已设置;`E_NOT_OK` -- 配置设置失败 |
|
||
| 描述 | 将 CAN 控制器切换到 Pretended Networking 配置。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
#### 8.3.25 CanIf_GetControllerRxErrorCounter
|
||
|
||
**[SWS_CANIF_00030]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 服务名 | `CanIf_GetControllerRxErrorCounter` |
|
||
| 语法 | `Std_ReturnType CanIf_GetControllerRxErrorCounter(uint8 ControllerId, uint8* RxErrorCounterPtr)` |
|
||
| 服务 ID[hex] | 0x1A |
|
||
| 输入参数 | `ControllerId` -- CAN 控制器 ID |
|
||
| 输出参数 | `RxErrorCounterPtr` -- 指向接收错误计数器的指针 |
|
||
| 返回值 | `E_OK` -- 读取成功;`E_NOT_OK` -- 读取失败 |
|
||
| 描述 | 获取 CAN 控制器的接收错误计数器。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
#### 8.3.26 CanIf_GetControllerTxErrorCounter
|
||
|
||
**[SWS_CANIF_00031]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 服务名 | `CanIf_GetControllerTxErrorCounter` |
|
||
| 语法 | `Std_ReturnType CanIf_GetControllerTxErrorCounter(uint8 ControllerId, uint8* TxErrorCounterPtr)` |
|
||
| 服务 ID[hex] | 0x1B |
|
||
| 输入参数 | `ControllerId` -- CAN 控制器 ID |
|
||
| 输出参数 | `TxErrorCounterPtr` -- 指向发送错误计数器的指针 |
|
||
| 返回值 | `E_OK` -- 读取成功;`E_NOT_OK` -- 读取失败 |
|
||
| 描述 | 获取 CAN 控制器的发送错误计数器。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
#### 8.3.27 CanIf_EnableBusMirroring
|
||
|
||
**[SWS_CANIF_00902]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 服务名 | `CanIf_EnableBusMirroring` |
|
||
| 语法 | `Std_ReturnType CanIf_EnableBusMirroring(uint8 ControllerId, boolean EnableDisable)` |
|
||
| 服务 ID[hex] | 0x1C |
|
||
| 输入参数 | `ControllerId` -- CAN 控制器 ID;`EnableDisable` -- 启用/禁用 |
|
||
| 返回值 | `E_OK` -- 设置成功;`E_NOT_OK` -- 设置失败 |
|
||
| 描述 | 启用或禁用 CAN 控制器的总线镜像。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
### 8.4 回调通知
|
||
|
||
#### 8.4.1 CanIf_TriggerTransmit
|
||
|
||
**[SWS_CANIF_00086]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 服务名 | `CanIf_TriggerTransmit` |
|
||
| 语法 | `Std_ReturnType CanIf_TriggerTransmit(PduIdType TxPduId, PduInfoType* PduInfoPtr)` |
|
||
| 服务 ID[hex] | 0x20 |
|
||
| 输入参数 | `TxPduId` -- 发送 PDU 的 ID |
|
||
| 输出参数 | `PduInfoPtr` -- 指向 PDU 信息的指针 |
|
||
| 返回值 | `E_OK` -- 触发成功;`E_NOT_OK` -- 触发失败 |
|
||
| 描述 | 由 CanDrv 调用以请求上层提供要发送的数据。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
#### 8.4.2 CanIf_TxConfirmation
|
||
|
||
**[SWS_CANIF_00007]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 服务名 | `CanIf_TxConfirmation` |
|
||
| 语法 | `void CanIf_TxConfirmation(PduIdType CanTxPduId)` |
|
||
| 服务 ID[hex] | 0x21 |
|
||
| 输入参数 | `CanTxPduId` -- 已确认 L-PDU 的 ID |
|
||
| 描述 | 由 CanDrv 调用的回调,指示 L-PDU 已被成功发送。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
#### 8.4.3 CanIf_RxIndication
|
||
|
||
**[SWS_CANIF_00006]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 服务名 | `CanIf_RxIndication` |
|
||
| 语法 | `void CanIf_RxIndication(const Can_HwType* Mailbox, const PduInfoType* PduInfoPtr)` |
|
||
| 服务 ID[hex] | 0x22 |
|
||
| 输入参数 | `Mailbox` -- 包含 HRH 和 CAN ID 的硬件对象信息;`PduInfoPtr` -- 指向 L-PDU 信息的指针 |
|
||
| 描述 | 由 CanDrv 调用的回调,指示已接收到 L-PDU。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
#### 8.4.4 CanIf_ControllerBusOff
|
||
|
||
**[SWS_CANIF_00083]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 服务名 | `CanIf_ControllerBusOff` |
|
||
| 语法 | `void CanIf_ControllerBusOff(uint8 ControllerId)` |
|
||
| 服务 ID[hex] | 0x23 |
|
||
| 输入参数 | `ControllerId` -- 已发生 Bus-Off 的控制器 ID |
|
||
| 描述 | 由 CanDrv 调用的回调,指示 CAN 控制器已发生 Bus-Off。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
#### 8.4.5 CanIf_ConfirmPnAvailability
|
||
|
||
**[SWS_CANIF_00419]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 服务名 | `CanIf_ConfirmPnAvailability` |
|
||
| 语法 | `void CanIf_ConfirmPnAvailability(uint8 TransceiverId)` |
|
||
| 服务 ID[hex] | 0x24 |
|
||
| 输入参数 | `TransceiverId` -- CAN 收发器 ID |
|
||
| 描述 | 由 CanTrcv 调用的回调,确认 PN 可用性。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
#### 8.4.6 CanIf_ClearTrcvWufFlagIndication
|
||
|
||
**[SWS_CANIF_00061]** ⌈ CanIf 的 WUF 标志清除指示回调。 ⌋ ()
|
||
|
||
#### 8.4.7 CanIf_CheckTrcvWakeFlagIndication
|
||
|
||
**[SWS_CANIF_00062]** ⌈ CanIf 的检查唤醒标志指示回调。 ⌋ ()
|
||
|
||
#### 8.4.8 CanIf_ControllerModeIndication
|
||
|
||
**[SWS_CANIF_00699]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 服务名 | `CanIf_ControllerModeIndication` |
|
||
| 语法 | `void CanIf_ControllerModeIndication(uint8 ControllerId, CanIf_ControllerModeType ControllerMode)` |
|
||
| 输入参数 | `ControllerId` -- CAN 控制器 ID;`ControllerMode` -- 当前模式 |
|
||
| 描述 | 由 CanDrv 调用的回调,指示 CAN 控制器模式已更改。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
#### 8.4.9 CanIf_TrcvModeIndication
|
||
|
||
**[SWS_CANIF_00063]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 服务名 | `CanIf_TrcvModeIndication` |
|
||
| 语法 | `void CanIf_TrcvModeIndication(uint8 TransceiverId, CanTrcv_TrcvModeType TransceiverMode)` |
|
||
| 输入参数 | `TransceiverId` -- CAN 收发器 ID;`TransceiverMode` -- 当前模式 |
|
||
| 描述 | 由 CanTrcv 调用的回调,指示 CAN 收发器模式已更改。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
#### 8.4.10 CanIf_CurrentIcomConfiguration
|
||
|
||
**[SWS_CANIF_00028]** ⌈
|
||
|
||
| 字段 | 内容 |
|
||
|------|------|
|
||
| 服务名 | `CanIf_CurrentIcomConfiguration` |
|
||
| 语法 | `void CanIf_CurrentIcomConfiguration(uint8 ControllerId, IcomConfigIdType ConfigurationId, boolean ConfigurationStatus)` |
|
||
| 输入参数 | `ControllerId` -- CAN 控制器 ID;`ConfigurationId` -- ICOM 配置 ID;`ConfigurationStatus` -- 配置状态 |
|
||
| 描述 | 由 CanDrv 调用的回调,指示 ICOM 配置已更改。 |
|
||
| 可通过获取 | CanIf.h |
|
||
|
||
⌋ ()
|
||
|
||
`<!-- 完整签名见原文 PDF 第 101-110 页 -->`
|
||
|
||
### 8.5 调度函数
|
||
|
||
CanIf 没有调度函数。
|
||
|
||
### 8.6 预期接口
|
||
|
||
#### 8.6.1 强制接口
|
||
|
||
**[SWS_CANIF_00030]** ⌈
|
||
|
||
| API 函数 | 描述 |
|
||
|----------|------|
|
||
| `Can_Write` | 发送 CAN L-PDU |
|
||
| `Can_SetControllerMode` | 设置 CAN 控制器模式 |
|
||
| `Can_GetControllerMode` | 获取 CAN 控制器模式 |
|
||
| `Can_DisableControllerInterrupts` | 禁用控制器中断 |
|
||
| `Can_EnableControllerInterrupts` | 启用控制器中断 |
|
||
| `Can_CheckWakeup` | 检查唤醒 |
|
||
| `CanTrcv_SetOpMode` | 设置收发器模式 |
|
||
| `CanTrcv_GetOpMode` | 获取收发器模式 |
|
||
| `CanTrcv_GetBusWuReason` | 获取唤醒原因 |
|
||
| `CanTrcv_SetWakeupMode` | 设置唤醒模式 |
|
||
| `Det_ReportError` | 报告开发错误 |
|
||
| `Det_ReportRuntimeError` | 报告运行时错误 |
|
||
| `Dem_SetEventStatus` | 设置 DEM 事件状态 |
|
||
|
||
⌋ ()
|
||
|
||
#### 8.6.2 可选接口
|
||
|
||
`<!-- 完整内容见原文 PDF 第 112-115 页 -->`
|
||
|
||
#### 8.6.3 可配置接口
|
||
|
||
可配置接口包括:
|
||
- `<User_TriggerTransmit>`:用于从上层提供发送数据
|
||
- `<User_TxConfirmation>`:发送确认回调到上层
|
||
- `<User_RxIndication>`:接收指示回调到上层
|
||
- `<User_ValidateWakeupEvent>`:唤醒验证回调
|
||
- `<User_ControllerBusOff>`:Bus-Off 通知
|
||
- `<User_ConfirmPnAvailability>`:PN 可用性确认
|
||
- `<User_ClearTrcvWufFlagIndication>`:WUF 标志清除指示
|
||
- `<User_CheckTrcvWakeFlagIndication>`:唤醒标志检查指示
|
||
- `<User_ControllerModeIndication>`:控制器模式指示
|
||
- `<User_TrcvModeIndication>`:收发器模式指示
|
||
|
||
`<!-- 完整内容见原文 PDF 第 115-129 页 -->`
|
||
|
||
---
|
||
|
||
## 9 序列图(Sequence diagrams)
|
||
|
||
主要序列图:
|
||
- **9.1 发送请求(单个 CAN 驱动)**:上层 → CanIf → CanDrv → CAN 控制器
|
||
- **9.2 发送请求(多个 CAN 驱动)**:使用多个 CanDrv 的发送请求
|
||
- **9.3 发送确认(中断模式)**:CanDrv 中断 → CanIf → 上层
|
||
- **9.4 发送确认(轮询模式)**:CanIf_MainFunction → CanDrv → CanIf → 上层
|
||
- **9.5 发送确认(带缓冲)**:带发送缓冲区的发送确认
|
||
- **9.6 触发发送请求**:CanDrv → CanIf → 上层 TriggerTransmit → 数据填充 → 发送
|
||
- **9.7 接收指示(中断模式)**:CanDrv 中断 → CanIf 接收指示 → 上层
|
||
- **9.8 接收指示(轮询模式)**:CanIf_MainFunction → CanDrv → CanIf → 上层
|
||
- **9.9 读取接收到的数据**:上层 → CanIf → 接收缓冲区
|
||
- **9.10 启动 CAN 网络**:CanSm → CanIf → CanDrv → CAN 控制器
|
||
- **9.11 BusOff 通知**:CanDrv → CanIf → CanSm
|
||
- **9.12 BusOff 恢复**:CanSm → CanIf → CanDrv
|
||
|
||
`<!-- 完整内容见原文 PDF 第 130-148 页 -->`
|
||
|
||
---
|
||
|
||
## 10 配置规范(Configuration specification)
|
||
|
||
### 10.1 容器和配置参数
|
||
|
||
#### 10.1.1 CanIf
|
||
|
||
CanIf 配置的根容器。
|
||
|
||
#### 10.1.2 CanIfPrivateCfg
|
||
|
||
CanIf 私有配置容器。
|
||
|
||
| 名称 | 类型 | 范围 | 描述 |
|
||
|------|------|------|------|
|
||
| `CanIfDevErrorDetect` | Boolean | TRUE / FALSE | 启用/禁用开发错误检测 |
|
||
| `CanIfVersionInfoApi` | Boolean | TRUE / FALSE | 启用/禁用 `CanIf_GetVersionInfo` API |
|
||
| `CanIfBusMirroringSupport` | Boolean | TRUE / FALSE | 启用/禁用总线镜像支持 |
|
||
| ... | ... | ... | ... |
|
||
|
||
`<!-- 完整配置参数表见原文 PDF 第 150-211 页 -->`
|
||
|
||
#### 10.1.3 CanIfPublicCfg
|
||
|
||
公共配置容器。
|
||
|
||
#### 10.1.4 CanIfInitCfg
|
||
|
||
初始化配置。
|
||
|
||
#### 10.1.5 CanIfTxPduCfg
|
||
|
||
发送 PDU 配置。
|
||
|
||
| 名称 | 类型 | 范围 | 描述 |
|
||
|------|------|------|------|
|
||
| `CanIfTxPduId` | Integer | 0..65535 | 发送 PDU 的 ID |
|
||
| `CanIfTxPduRef` | Reference | - | 对发送 L-PDU 的引用 |
|
||
| `CanIfTxPduCanId` | Integer | 0..0x1FFFFFFF | CAN ID |
|
||
| `CanIfTxPduCanIdMask` | Integer | 0..0x1FFFFFFF | CAN ID 掩码 |
|
||
| `CanIfTxPduCanIdType` | Enumeration | `STANDARD` / `EXTENDED` | CAN ID 类型 |
|
||
| `CanIfTxPduHthRef` | Reference | - | 对 HTH 的引用 |
|
||
| `CanIfTxPduBufferRef` | Reference | - | 对发送缓冲区的引用 |
|
||
| `CanIfTxPduPnFilterPdu` | Boolean | TRUE / FALSE | PN 过滤器 PDU |
|
||
| ... | ... | ... | ... |
|
||
|
||
`<!-- 完整参数表见原文 PDF 第 167-176 页 -->`
|
||
|
||
#### 10.1.6 CanIfRxPduCfg
|
||
|
||
接收 PDU 配置。
|
||
|
||
| 名称 | 类型 | 范围 | 描述 |
|
||
|------|------|------|------|
|
||
| `CanIfRxPduId` | Integer | 0..65535 | 接收 PDU 的 ID |
|
||
| `CanIfRxPduRef` | Reference | - | 对接收 L-PDU 的引用 |
|
||
| `CanIfRxPduCanId` | Integer | 0..0x1FFFFFFF | CAN ID |
|
||
| `CanIfRxPduCanIdMask` | Integer | 0..0x1FFFFFFF | CAN ID 掩码 |
|
||
| `CanIfRxPduCanIdType` | Enumeration | `STANDARD` / `EXTENDED` | CAN ID 类型 |
|
||
| `CanIfRxPduHrhIdRef` | Reference | - | 对 HRH 的引用 |
|
||
| `CanIfRxPduDataLength` | Integer | 0..64 | 数据长度 |
|
||
| `CanIfRxPduUserDataLength` | Integer | 0..64 | 用户数据长度 |
|
||
| ... | ... | ... | ... |
|
||
|
||
`<!-- 完整参数表见原文 PDF 第 176-184 页 -->`
|
||
|
||
#### 10.1.7 CanIfRxPduCanIdRange
|
||
|
||
接收 PDU CAN ID 范围。
|
||
|
||
#### 10.1.8 CanIfDispatchCfg
|
||
|
||
分发配置。
|
||
|
||
#### 10.1.9 CanIfCtrlCfg
|
||
|
||
控制器配置。
|
||
|
||
| 名称 | 类型 | 范围 | 描述 |
|
||
|------|------|------|------|
|
||
| `CanIfCtrlId` | Integer | 0..255 | 控制器 ID |
|
||
| `CanIfCtrlCanCtrlRef` | Reference | - | 对 CAN 控制器的引用 |
|
||
| `CanIfCtrlWakeupSupport` | Boolean | TRUE / FALSE | 启用唤醒支持 |
|
||
| ... | ... | ... | ... |
|
||
|
||
`<!-- 完整参数表见原文 PDF 第 194-197 页 -->`
|
||
|
||
#### 10.1.10 CanIfCtrlDrvCfg
|
||
|
||
控制器驱动配置。
|
||
|
||
#### 10.1.11 CanIfTrcvDrvCfg
|
||
|
||
收发器驱动配置。
|
||
|
||
#### 10.1.12 CanIfTrcvCfg
|
||
|
||
收发器配置。
|
||
|
||
#### 10.1.13 CanIfInitHohCfg
|
||
|
||
HOH 初始化配置。
|
||
|
||
#### 10.1.14 CanIfHthCfg
|
||
|
||
HTH 配置。
|
||
|
||
#### 10.1.15 CanIfHrhCfg
|
||
|
||
HRH 配置。
|
||
|
||
#### 10.1.16 CanIfHrhRangeCfg
|
||
|
||
HRH 范围配置。
|
||
|
||
#### 10.1.17 CanIfBufferCfg
|
||
|
||
缓冲区配置。
|
||
|
||
---
|
||
|
||
## A. 不适用需求(Not applicable requirements)
|
||
|
||
`<!-- 完整内容见原文 PDF 第 212 页 -->`
|
||
|
||
---
|
||
|
||
## 翻译说明
|
||
|
||
- **文档大小**:212 页,原始内容约 11599 行
|
||
- **翻译策略**:重点翻译 + 摘要
|
||
- 已完整翻译:封面、文档标识、变更历史、目录、章节 1-5、7.27、8.1-8.6(API 规范主要部分)
|
||
- 摘要处理:第 6 章(需求追踪)保留前 10 项;第 7 章功能规范的子章节(7.1-7.26)以标题和概述形式保留,详细内容以摘要标记;第 8.6.2-8.6.3(接口定义)保留主要接口;第 10 章(配置规范)保留所有容器列表和代表性参数
|
||
- 关键 API 函数(8.3 章节)已完整翻译
|
||
- **保留项**:所有 API 标识符(如 `CanIf_Init`、`CanIf_Transmit`、`CanIf_RxIndication`)、需求 ID(如 `SWS_CANIF_00001`、`SRS_BSW_00007`)、错误码、配置参数名(`CanIfDevErrorDetect` 等)、状态名(`CANIF_OFFLINE` 等)、AUTOSAR 方框符 `⌈⌋`
|
||
- **简化项**:模块依赖关系图以文字描述;UML 状态机、PDU 通道模式状态机以文字概述;配置参数表保留前 5-10 行;序列图(9.1-9.12)以文字描述
|
||
|
||
`<!-- 完整内容见原文 PDF 第 1-212 页 -->` |