# 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 `_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] | | ... | ... | ... | `` --- ## 7 功能规范(Functional specification) ### 7.1 一般功能 `` ### 7.2 硬件对象句柄 `` ### 7.3 静态 L-PDU `` ### 7.4 动态 L-PDU #### 7.4.1 动态发送 L-PDU `` #### 7.4.2 动态接收 L-PDU `` ### 7.5 物理通道视图 `` ### 7.6 CAN 硬件单元 `` ### 7.7 BasicCAN 和 FullCAN 接收 `` ### 7.8 初始化 `` ### 7.9 发送请求 `` ### 7.10 发送数据流 `` ### 7.11 发送缓冲 #### 7.11.1 一般行为 `` #### 7.11.2 缓冲区特征 ##### 7.11.2.1 L-PDU 在发送 L-PDU 缓冲区中的存储 `` ##### 7.11.2.2 发送 L-PDU 缓冲区的清除 `` ##### 7.11.2.3 发送 L-PDU 缓冲区的初始化 `` #### 7.11.3 发送 L-PDU 缓冲区的数据完整性 `` ### 7.12 发送确认 `` ### 7.13 接收数据流 `` ### 7.14 接收指示 `` ### 7.15 读取接收到的数据 `` ### 7.16 读取 Tx/Rx 通知状态 `` ### 7.17 数据完整性 `` ### 7.18 CAN 控制器模式 #### 7.18.1 一般功能 `` #### 7.18.2 CAN 控制器操作模式 `` #### 7.18.3 控制器模式转换 `` #### 7.18.4 唤醒 ##### 7.18.4.1 唤醒检测 `` ##### 7.18.4.2 唤醒验证 `` ### 7.19 PDU 通道模式控制 #### 7.19.1 PDU 通道组 `` #### 7.19.2 PDU 通道模式 ##### 7.19.2.1 CANIF_OFFLINE `` ##### 7.19.2.2 CANIF_ONLINE `` ##### 7.19.2.3 CANIF_OFFLINE_ACTIVE `` ### 7.20 软件接收过滤器 #### 7.20.1 软件过滤概念 `` #### 7.20.2 软件过滤算法 `` ### 7.21 数据长度检查 `` ### 7.22 L-SDU 向上层的分发 `` ### 7.23 轮询模式 `` ### 7.24 多个 CAN 驱动支持 #### 7.24.1 使用多个 CAN 驱动的发送请求 `` #### 7.24.2 使用多个 CAN 驱动的通知机制 `` ### 7.25 部分网络 `` ### 7.26 CAN FD 支持 `` ### 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 错误检测 `` ### 7.29 错误通知 `` --- ## 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 | ⌋ () `` ### 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 可选接口 `` #### 8.6.3 可配置接口 可配置接口包括: - ``:用于从上层提供发送数据 - ``:发送确认回调到上层 - ``:接收指示回调到上层 - ``:唤醒验证回调 - ``:Bus-Off 通知 - ``:PN 可用性确认 - ``:WUF 标志清除指示 - ``:唤醒标志检查指示 - ``:控制器模式指示 - ``:收发器模式指示 `` --- ## 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 `` --- ## 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 | 启用/禁用总线镜像支持 | | ... | ... | ... | ... | `` #### 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 | | ... | ... | ... | ... | `` #### 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 | 用户数据长度 | | ... | ... | ... | ... | `` #### 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 | 启用唤醒支持 | | ... | ... | ... | ... | `` #### 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) `` --- ## 翻译说明 - **文档大小**: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)以文字描述 ``