# CAN 收发器驱动规范
> **AUTOSAR CP Release 4.4.0**
> **文档 ID 071:AUTOSAR_SWS_CANTransceiverDriver**
## 元信息
| 项目 | 内容 |
|------|------|
| 文档标题 | CAN 收发器驱动规范(Specification of CAN Transceiver Driver) |
| 文档所有者 | AUTOSAR |
| 文档责任方 | AUTOSAR |
| 文档标识号 | 071 |
| 文档状态 | Final(正式版) |
| AUTOSAR 标准组成部分 | Classic Platform(经典平台) |
| 标准发布版本 | 4.4.0 |
## 文档变更历史
| 日期 | 发布版本 | 变更方 | 变更描述 |
|------|---------|--------|----------|
| 2018-10-31 | 4.4.0 | AUTOSAR Release Management | 移除了 API `CanTrcv_MainFunctionDiagnostics` 和 `CanTrcv_MainFunction` 在未初始化状态下的 DET 上报行为 |
| 2017-12-08 | 4.3.1 | AUTOSAR Release Management | 在状态机图中加入了 `CanTrcv_DeInit` API;编辑性修改,新增"运行时错误" |
| 2016-11-30 | 4.3.0 | AUTOSAR Release Management | 新增 `CanTrcv_DeInit` API;更新了序列图;`CanTrcvGetVersionInfo` 重命名为 `CanTrcvVersionInfoApi`;更新了配置参数的 Configuration class;MainFunction 周期的小幅修正 |
| 2014-10-31 | 4.2.1 | AUTOSAR Release Management | 修订了 CAN 收发器的配置;wait state 功能的细微修正;澄清了关于唤醒源的内容 |
| 2014-03-31 | 4.1.3 | AUTOSAR Release Management | 修订了 SPI 接口的配置;修订了收发器驱动的命名约定 |
| 2013-10-31 | 4.1.2 | AUTOSAR Release Management | 从调度函数 API 表中移除了 "Timing" 行;编辑性修改;移除了关于变更文档的章节 |
| 2013-03-15 | 4.1.1 | AUTOSAR Administration | 更新了序列图;按新的 SWS_BSWGeneral 重新编写 |
| 2011-12-22 | 4.0.3 | AUTOSAR Administration | 新增对 Partial Networking(部分网络)的支持;实现了 Production error(生产错误)概念;更新了波特率配置参数处理;新增检测"上电由 CAN 通信引起"的支持;修正了 API 的可重入性属性;修正了部分需求;修正了可选接口表 |
| 2009-12-18 | 4.0.1 | AUTOSAR Administration | 更改了 CanTrcv 状态名并修改了状态图;不再限制 SBC(System Basis Chip)的使用;允许向当前模式请求模式切换;CanTrcv 驱动必须在每次模式切换请求到达所请求模式后调用 `CanIf_TrcvModeIndication` |
| 2010-02-02 | 3.1.4 | AUTOSAR Administration | 唤醒事件报告:在 R4.0 中,CanTrcv 存储唤醒事件。CanIf 周期性调用 `CanTrcv_CheckWakeup()` 来检查唤醒事件;唤醒模式:在 R4.0 中,不支持通过中断机制的唤醒,仅有 POLLING 和 NOT_SUPPORTED 唤醒模式可用;新增 Sleep Wait Count:新增用于进入睡眠模式的等待计数(`CanTrcvSleepWaitCount`);修订了法律免责声明 |
| 2008-08-13 | 3.1.1 | AUTOSAR Administration | 修订了法律免责声明 |
| 2007-12-21 | 3.0.1 | AUTOSAR Administration | 将 API 名 `CanIf_TrcvWakeupByBus` 更改为 `CanIf_SetWakeupEvent`;新增错误码 `CANTRCV_E_PARAM_TRCV_WAKEUP_MODE`;`CanTrcv_GetOpMode`、`CanTrcv_GetBusWuReason` 和 `CanTrcv_GetVersionInfo` API 的输出参数更改为指针类型;修改了 API `CanTrcv_CB_WakeupByBus`;扩展了文档元信息;做了小幅版式调整 |
| 2007-01-24 | 2.1.15 | AUTOSAR Administration | CAN 收发器驱动位于 CAN 接口之下。来自更高层的所有 API 访问都通过 CAN 接口路由;每种 CAN 收发器硬件类型使用一个 CAN 收发器驱动。不同的 CAN 收发器硬件类型使用不同的 CAN 收发器驱动;修订了法律免责声明;新增了发布说明;修订了"用户建议";新增了"修订信息" |
| 2006-05-16 | 2.0 | AUTOSAR Administration | 初始发布 |
## 目录
1. [介绍(Introduction)](#1-介绍introduction) .................................................................................................. 8
- 1.1 [CAN 收发器驱动的目标](#11-can-收发器驱动的目标) ........................................................................ 9
- 1.2 [显式未涵盖的 CAN 收发器功能](#12-显式未涵盖的-can-收发器功能) ................................................ 9
- 1.3 [符合 SAE J2411 的单线 CAN 收发器](#13-符合-sae-j2411-的单线-can-收发器) ..................................... 9
2. [缩略语和缩写(Acronyms and abbreviations)](#2-缩略语和缩写acronyms-and-abbreviations) ........... 10
3. [相关文档(Related documentation)](#3-相关文档related-documentation) ........................................ 11
- 3.1 [输入文档](#31-输入文档) ........................................................................................ 11
- 3.2 [相关标准和规范](#32-相关标准和规范) .................................................................. 11
- 3.3 [相关规范](#33-相关规范) ...................................................................................... 11
4. [约束和假设(Constraints and assumptions)](#4-约束和假设constraints-and-assumptions) ............... 12
- 4.1 [限制](#41-限制) ...................................................................................................... 12
- 4.2 [对汽车领域的适用性](#42-对汽车领域的适用性) ..................................................... 12
5. [对其他模块的依赖(Dependencies to other modules)](#5-对其他模块的依赖dependencies-to-other-modules) ... 13
- 5.1 [文件结构](#51-文件结构) ...................................................................................... 13
- 5.1.1 [代码文件结构](#511-代码文件结构) ........................................................... 13
6. [需求追踪(Requirements Traceability)](#6-需求追踪requirements-traceability) ............................. 14
7. [功能规范(Functional specification)](#7-功能规范functional-specification) ................................. 22
- 7.1 [CAN 收发器驱动操作模式](#71-can-收发器驱动操作模式) ................................... 22
- 7.1.1 [操作模式切换](#711-操作模式切换) .......................................................... 23
- 7.2 [CAN 收发器硬件操作模式](#72-can-收发器硬件操作模式) ................................... 23
- 7.2.1 [临时"Go-To-Sleep"模式示例](#721-临时go-to-sleep模式示例) ................... 24
- 7.2.2 ["PowerOn/ListenOnly"模式示例](#722-poweronlistenonly模式示例) ............... 24
- 7.3 [CAN 收发器唤醒类型](#73-can-收发器唤醒类型) ................................................ 24
- 7.4 [使能/禁用唤醒通知](#74-使能禁用唤醒通知) .................................................... 25
- 7.5 [CAN 收发器唤醒模式](#75-can-收发器唤醒模式) ................................................ 25
- 7.6 [错误分类](#76-错误分类) ................................................................................ 26
- 7.6.1 [开发错误](#761-开发错误) ...................................................................... 26
- 7.6.2 [运行时错误](#762-运行时错误) .............................................................. 26
- 7.6.3 [瞬态故障](#763-瞬态故障) ...................................................................... 27
- 7.6.4 [生产错误](#764-生产错误) ...................................................................... 27
- 7.6.5 [扩展生产错误](#765-扩展生产错误) ...................................................... 27
- 7.7 [驱动初始化的前置条件](#77-驱动初始化的前置条件) ......................................... 27
- 7.8 [实例概念](#78-实例概念) ................................................................................. 28
- 7.9 [等待状态](#79-等待状态) ................................................................................. 28
- 7.10 [具有选择性唤醒功能的收发器](#710-具有选择性唤醒功能的收发器) .................... 28
8. [API 规范(API specification)](#8-api-规范api-specification) ................................................. 30
- 8.1 [导入类型](#81-导入类型) ................................................................................. 30
- 8.2 [类型定义](#82-类型定义) ................................................................................. 31
- 8.3 [函数定义](#83-函数定义) ................................................................................. 32
- 8.3.1 [CanTrcv_Init](#831-cantrcv_init) .............................................................. 32
- 8.3.2 [CanTrcv_SetOpMode](#832-cantrcv_setopmode) ........................................ 33
- 8.3.3 [CanTrcv_GetOpMode](#833-cantrcv_getopmode) ........................................ 35
- 8.3.4 [CanTrcv_GetBusWuReason](#834-cantrcv_getbuswureason) ......................... 36
- 8.3.5 [CanTrcv_VersionInfo](#835-cantrcv_versioninfo) ...................................... 37
- 8.3.6 [CanTrcv_SetWakeupMode](#836-cantrcv_setwakeupmode) ........................... 37
- 8.3.7 [CanTrcv_GetTrcvSystemData](#837-cantrcv_gettrcvsystemdata) ................... 39
- 8.3.8 [CanTrcv_ClearTrcvWufFlag](#838-cantrcv_cleartrcvwufflag) ...................... 40
- 8.3.9 [CanTrcv_ReadTrcvTimeoutFlag](#839-cantrcv_readtrcvtimeoutflag) .............. 41
- 8.3.10 [CanTrcv_ClearTrcvTimeoutFlag](#8310-cantrcv_cleartrcvtimeoutflag) ............ 41
- 8.3.11 [CanTrcv_ReadTrcvSilenceFlag](#8311-cantrcv_readtrcvsilenceflag) ............. 42
- 8.3.12 [CanTrcv_CheckWakeup](#8312-cantrcv_checkwakeup) ............................... 43
- 8.3.13 [CanTrcv_SetPNActivationState](#8313-cantrcv_setpnactivationstate) ............ 43
- 8.3.14 [CanTrcv_CheckWakeFlag](#8314-cantrcv_checkwakeflag) ........................... 44
- 8.3.15 [CanTrcv_DeInit](#8315-cantrcv_deinit) .................................................. 45
- 8.4 [调度函数](#84-调度函数) ................................................................................ 46
- 8.4.1 [CanTrcv_MainFunction](#841-cantrcv_mainfunction) ................................ 46
- 8.4.2 [CanTrcv_MainFunctionDiagnostics](#842-cantrcv_mainfunctiondiagnostics) .... 46
- 8.5 [回调通知](#85-回调通知) ................................................................................. 47
- 8.6 [预期接口](#86-预期接口) ................................................................................. 47
- 8.6.1 [强制接口](#861-强制接口) ...................................................................... 47
- 8.6.2 [可选接口](#862-可选接口) ...................................................................... 47
- 8.6.3 [可配置接口](#863-可配置接口) .............................................................. 48
9. [序列图(Sequence diagram)](#9-序列图sequence-diagram) ................................................. 49
- 9.1 [带有效校验的唤醒](#91-带有效校验的唤醒) .................................................... 49
- 9.2 [与 DIO 模块的交互](#92-与-dio-模块的交互) .................................................... 50
- 9.3 [反初始化(SPI 同步)](#93-反初始化spi-同步) ................................................. 52
- 9.4 [反初始化(SPI 异步)](#94-反初始化spi-异步) ................................................. 54
10. [配置规范(Configuration specification)](#10-配置规范configuration-specification) ................ 56
- 10.1 [如何阅读本章](#101-如何阅读本章) ............................................................. 56
- 10.2 [容器和配置参数](#102-容器和配置参数) .................................................... 57
- 10.2.1 [CanTrcv](#1021-cantrcv) ........................................................................ 57
- 10.2.2 [CanTrcvGeneral](#1022-cantrcvgeneral) .............................................. 57
- 10.2.3 [CanTrcvConfigSet](#1023-cantrcvconfigset) ........................................ 61
- 10.2.4 [CanTrcvChannel](#1024-cantrcvchannel) ............................................ 62
- 10.2.5 [CanTrcvAccess](#1025-cantrcvaccess) .............................................. 69
- 10.2.6 [CanTrcvDioAccess](#1026-cantrcvdioaccess) ...................................... 69
- 10.2.7 [CanTrcvDioChannelAccess](#1027-cantrcvdiochannelaccess) .................. 69
- 10.2.8 [CanTrcvSpiAccess](#1028-cantrcvspiaccess) ...................................... 70
- 10.2.9 [CanTrcvSpiSequence](#1029-cantrcvspisequence) .............................. 71
- 10.2.10 [CanTrcvDemEventParameterRefs](#10210-cantrcvdemeventparameterrefs) .. 72
- 10.2.11 [CanTrcvPartialNetwork](#10211-cantrcvpartialnetwork) ........................ 73
- 10.2.12 [CanTrcvPnFrameDataMaskSpec](#10212-cantrcvpnframedatamaskspec) .... 76
- 10.3 [发布信息](#103-发布信息) ......................................................................... 77
11. [不适用需求(Not applicable requirements)](#11-不适用需求not-applicable-requirements) ...... 78
---
## 1 介绍(Introduction)
本规范描述了 CAN 收发器驱动(CAN Transceiver Driver)模块的功能、API 和配置。CAN 收发器驱动模块负责处理 ECU 上的 CAN 收发器硬件芯片。
CAN 收发器是一种硬件设备,它将 CAN 总线上使用的信号电平适配为微控制器可识别的逻辑(数字)信号电平。
此外,收发器能够检测电气故障,如接线问题、地偏置或长时间显性位的传输。根据与微控制器的接口方式,它们可以由单个端口引脚汇总报告所检测到的错误,或通过 SPI 提供详细错误信息。
一些收发器支持电源控制和通过 CAN 总线唤醒。市场上存在不同的唤醒/休眠以及电源控制方案。
在汽车环境中,主要使用三种不同的 CAN 总线物理层。它们是:高速 CAN(最高 1 Mbit/s)的 ISO11898、低速 CAN(最高 125 Kbit/s)的 ISO11519,以及单线 CAN 的 SAE J2411。
最新发展包括系统基础芯片(SBC,System Basis Chips),其中除了 CAN 之外还集成了电源控制和高级看门狗。这些都封装在一个芯片内并通过单一接口(例如通过 SPI)进行控制。
### 1.1 CAN 收发器驱动的目标
本文档的目标是规定适用于当前和未来大多数 CAN 收发器设备的接口和行为。
CAN 收发器驱动抽象了 CAN 收发器硬件。它向上层提供与硬件无关的接口。通过使用 MCAL 层的 API 访问 CAN 收发器硬件,它将自身与 ECU 布局解耦。
### 1.2 显式未涵盖的 CAN 收发器功能
一些 CAN 总线收发器提供附加功能,例如 ECU 自检或用于诊断的错误检测能力。
ECU 自检和错误检测未在 AUTOSAR 中定义,要求这些功能将排除目前使用的大多数收发器硬件芯片。
因此,不支持诸如"地偏移检测"、"选择性唤醒"、"斜率控制"等功能。
### 1.3 符合 SAE J2411 的单线 CAN 收发器
AUTOSAR 不支持符合 SAE J2411 的单线 CAN。
---
## 2 缩略语和缩写(Acronyms and abbreviations)
| 缩写 | 描述 |
|------|------|
| ComM | Communication Manager(通信管理器) |
| DEM | Diagnostic Event Manager(诊断事件管理器) |
| DET | Default Error Tracer(默认错误跟踪器) |
| DIO | Digital Input Output(数字输入输出,SPAL 模块) |
| EB | Externally Buffered channels(外部缓冲通道)。待传输数据的缓冲区位于 SPI Handler/Driver 之外 |
| EcuM | ECU State Manager(ECU 状态管理器) |
| IB | Internally Buffered channels(内部缓冲通道)。待传输数据的缓冲区位于 SPI Handler/Driver 之内 |
| ISR | Interrupt Service Routine(中断服务例程) |
| MCAL | Micro Controller Abstraction Layer(微控制器抽象层) |
| Port | Port module(SPAL 模块的端口模块) |
| n/a | Not Applicable(不适用) |
| SBC | System Basis Chip(系统基础芯片)。一种集成 CAN 和/或 LIN 收发器、看门狗和电源控制的设备 |
| SPAL | Standard Peripheral Abstraction Layer(标准外设抽象层) |
| SPI Channel | SPI 通道。数据交换的软件介质,由相同条件定义:配置参数、相同大小的数据元素数量、数据指针(源和目标)或位置。有关详细信息,请参见 SPI 驱动规范 |
| SPI Job | SPI 作业。由一个或多个具有相同片选信号的通道组成。作业被认为是原子的,因此不能被中断。作业还分配有优先级。有关详细信息,请参见 SPI 驱动规范 |
| SPI Sequence | SPI 序列。要传输的若干连续作业的集合。序列依赖于静态配置。有关详细信息,请参见 SPI 驱动规范 |
| CAN Channel | CAN 通道。通过 CAN 收发器从 CAN 控制器连接到 CAN 网络的物理通道 |
| API | Application Programming Interface(应用程序编程接口) |
---
## 3 相关文档(Related documentation)
### 3.1 输入文档
- [1] List of Basic Software Modules — `AUTOSAR_TR_BSWModuleList.pdf`
- [2] Layered Software Architecture — `AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf`
- [3] Specification of ECU Configuration — `AUTOSAR_TPS_ECUConfiguration.pdf`
- [4] General Requirements on Basic Software — `AUTOSAR_SRS_BSWGeneral.pdf`
- [5] Specification of CAN Interface — `AUTOSAR_SWS_CANInterface.pdf`
- [6] Basic Software Module Description Template — `AUTOSAR_TPS_BSWModuleDescriptionTemplate.pdf`
- [7] General Specification of Basic Software Modules — `AUTOSAR_SWS_BSWGeneral.pdf`
### 3.2 相关标准和规范
- [8] ISO11898 – Road vehicles - Controller area network (CAN)
### 3.3 相关规范
AUTOSAR 提供了基础软件模块的通用规范 [7](SWS BSW General),该规范对 CAN 收发器驱动同样有效。
因此,SWS BSW General 规范应被视为 CAN 收发器驱动的附加和必需规范。
---
## 4 约束和假设(Constraints and assumptions)
### 4.1 限制
**[SWS_CanTrcv_00098]** ⌈ CAN 总线收发器硬件应提供可映射到 AUTOSAR CAN 收发器驱动操作模式模型的功能和接口。 ⌋ (SRS_BSW_00172)
另见第 7.1 章。
### 4.2 对汽车领域的适用性
本驱动可适用于所有使用 CAN 进行通信的汽车领域。
---
## 5 对其他模块的依赖(Dependencies to other modules)
| 模块 | 依赖 |
|------|------|
| CanIf | 所有 CAN 收发器驱动都位于 CanIf 之下 |
| ComM | ComM 通过 CanIf 控制 CAN 收发器驱动的通信模式。每个 CAN 收发器驱动独立受控 |
| DET | DET 从 CAN 收发器驱动获取开发错误信息 |
| DEM | DEM 从 CAN 收发器驱动获取生产错误信息 |
| DIO | 使用 DIO 模块访问通过端口连接的 CAN 收发器设备 |
| EcuM | EcuM 通过 CanIf 从 CAN 收发器驱动获取唤醒事件信息 |
| SPI | 使用 SPI 模块访问通过 SPI 连接的 CAN 收发器设备 |
### 5.1 文件结构
#### 5.1.1 代码文件结构
**[SWS_CanTrcv_00064]** ⌈ AUTOSAR 规定的命名约定适用于 CanTrcv 模块的所有文件。 ⌋ (SRS_BSW_00300)
**[SWS_CanTrcv_00065]** ⌈ CanTrcv 模块由以下文件组成:
| 文件名 | 需求 | 描述 |
|--------|------|------|
| `CanTrcv.c` | SWS_CanTrcv_00069 | 实现通用 C 文件。它不包含中断例程。 |
| `CanTrcv.h` | SWS_CanTrcv_00052 | 仅包含与其他 BSW 模块相关的信息(API)。根据配置产生的 API 差异被封装。 |
---
## 6 需求追踪(Requirements Traceability)
下表列出了本规范所基于的需求,以及这些需求在哪些需求规范条目中得到满足。
> 注:完整的需求追踪矩阵非常长(>80 项),此处保留表头并列出前 10 条代表性条目作为示例。完整表格见原文 PDF 第 14-22 页。
| 需求 | 描述 | 满足于 |
|------|------|--------|
| SRS_BSW_00005 | µC 抽象层(MCAL)的模块不得有硬编码的水平接口 | SWS_CanTrcv_00999 |
| SRS_BSW_00006 | µC 抽象层(MCAL)之上的软件模块的源代码不应与处理器和编译器相关 | SWS_CanTrcv_00999 |
| SRS_BSW_00007 | 所有用 C 语言编写的 BSW 模块应符合 MISRA C 2012 标准 | SWS_CanTrcv_00999 |
| SRS_BSW_00009 | 所有 BSW 模块应按照统一标准进行文档化 | SWS_CanTrcv_00999 |
| SRS_BSW_00010 | 所有 BSW 模块的内存消耗应为已定义配置的所有支持平台提供文档 | SWS_CanTrcv_00999 |
| SRS_BSW_00101 | 基础软件模块应能在单独的初始化函数中初始化变量和硬件 | SWS_CanTrcv_00001 |
| SRS_BSW_00160 | AUTOSAR BSW 模块的配置文件应可读 | SWS_CanTrcv_00090, SWS_CanTrcv_00091, SWS_CanTrcv_00093, SWS_CanTrcv_00095 |
| SRS_BSW_00161 | AUTOSAR 基础软件应提供对更高级软件层标准化的微控制器抽象层接口 | SWS_CanTrcv_00999 |
| SRS_BSW_00164 | 中断服务例程的实现应由操作系统、复杂驱动或模块完成 | SWS_CanTrcv_00999 |
| SRS_BSW_00168 | SW-C 应通过基础软件通用 API 中定义的函数进行测试 | SWS_CanTrcv_00999 |
| SRS_BSW_00171 | 在 ECU 中不需要的 BSW 组件的可选功能应在预编译时可配置 | SWS_CanTrcv_00013 |
| SRS_BSW_00172 | 内置于 BSW 模块中的调度策略应与系统中使用的策略兼容 | SWS_CanTrcv_00001, SWS_CanTrcv_00013, SWS_CanTrcv_00090, SWS_CanTrcv_00091, SWS_CanTrcv_00098, SWS_CanTrcv_00099 |
| SRS_BSW_00300 | 所有 AUTOSAR BSW 模块应通过无歧义的名称标识 | SWS_CanTrcv_00064 |
| SRS_BSW_00304 | 所有 AUTOSAR BSW 模块应使用以下数据类型替代原生 C 数据类型 | SWS_CanTrcv_00999 |
| SRS_BSW_00305 | 数据类型命名约定 | SWS_CanTrcv_00999 |
| SRS_BSW_00306 | AUTOSAR BSW 模块应与编译器和平台无关 | SWS_CanTrcv_00999 |
| SRS_BSW_00307 | 全局变量命名约定 | SWS_CanTrcv_00999 |
| SRS_BSW_00308 | AUTOSAR BSW 模块不应在头文件中而应在 C 文件中定义全局数据 | SWS_CanTrcv_00999 |
| SRS_BSW_00309 | 所有 AUTOSAR BSW 模块应通过显式使用 const 关键字标记所有只读用途的全局数据 | SWS_CanTrcv_00999 |
| SRS_BSW_00310 | API 命名约定 | SWS_CanTrcv_00001, SWS_CanTrcv_00002, SWS_CanTrcv_00005, SWS_CanTrcv_00007, SWS_CanTrcv_00008, SWS_CanTrcv_00009, SWS_CanTrcv_00013 |
| ... | ... | ... |
``
---
## 7 功能规范(Functional specification)
### 7.1 CAN 收发器驱动操作模式
**[SWS_CanTrcv_00055]** ⌈ CanTrcv 模块应为每个已配置的收发器独立实现下图所示的状态图。 ⌋ (SRS_Can_01098, SRS_Can_01099, SRS_Can_01100)
```
Power on Power off
POWER_ON
NOT_ACTIVE
CanTrcv_Init() ACTIVE
[CFG1] CanTrcv_Init()
[CFG3]
3(a) CanTrcv_DeInit() 1(a)
CANTRCV_TRCVMODE_SLEEP CANTRCV_TRCVMODE_NORMAL
1(c)
CanTrcv_Init()
[CFG2] 2(b)
CanTrcv_DeInit()
3(b) 1(b)
CANTRCV_TRCVMODE_STANDBY
2(a)
图例:
1 - CanTrcv_SetOpMode(CANTRCV_TRCVMODE_NORMAL)
2 - CanTrcv_SetOpMode(CANTRCV_TRCVMODE_STANDBY)
3 - CanTrcv_SetOpMode(CANTRCV_TRCVMODE_SLEEP)
```
此图的主要目的是以通用方式支持迄今为止可用的众多 CAN 总线收发器。根据 CAN 收发器硬件的不同,该模型对给定的 CAN 收发器硬件可能多出一两个状态,但这将明显将 ComM 和 EcuM 与所用硬件解耦。
**[SWS_CanTrcv_00148]** ⌈ `CanTrcv_Init` 函数会引起向 `CANTRCV_TRCVMODE_SLEEP`、`CANTRCV_TRCVMODE_NORMAL` 或 `CANTRCV_TRCVMODE_STANDBY` 的状态变更。这取决于配置,并可为每个收发器独立配置。 ⌋ ()
| 状态 | 描述 |
|------|------|
| POWER_ON | ECU 已完全上电。 |
| NOT_ACTIVE | CAN 收发器硬件状态取决于 ECU 硬件以及 Dio 和 Port 驱动配置。CAN 收发器驱动尚未初始化,因此不活动。 |
| ACTIVE | 已调用 `CanTrcv_Init` 函数。它将 CAN 收发器驱动带入活动状态。根据配置,CAN 收发器驱动进入 `CANTRCV_TRCVMODE_SLEEP`、`CANTRCV_TRCVMODE_STANDBY` 或 `CANTRCV_TRCVMODE_NORMAL` 状态。 |
| CANTRCV_TRCVMODE_NORMAL | 完全总线通信。如果 CAN 收发器硬件控制 ECU 电源,则 ECU 完全供电。CAN 收发器驱动不再检测唤醒信息。 |
| CANTRCV_TRCVMODE_STANDBY | 无法通信。如果 CAN 收发器硬件控制 ECU 电源,ECU 仍处于供电状态。从此模式到 `CANTRCV_TRCVMODE_SLEEP` 的转换是唯一有效的。可以通过总线或本地唤醒事件唤醒。 |
| CANTRCV_TRCVMODE_SLEEP | 无法通信。根据电源管理的责任归属,ECU 可能断电。可以通过总线或本地唤醒事件唤醒。 |
如果一个 CAN 收发器驱动覆盖多个 CAN 收发器(配置为通道),则所有收发器(通道)要么都处于 `NOT_ACTIVE` 状态,要么都处于 `ACTIVE` 状态。
在 `ACTIVE` 状态下,每个收发器可以处于不同的子状态。
#### 7.1.1 操作模式切换
通过调用 `CanTrcv_SetOpMode` 函数请求模式切换。
**[SWS_CanTrcv_00161]** ⌈ 对当前模式的模式切换请求是允许的,且即使启用 DET 也不应导致错误。 ⌋ ()
**[SWS_CanTrcv_00158]** ⌈ 对于通过 `CanTrcv_SetOpMode` 进行的每次模式切换请求,在到达所请求模式后,CanTrcv 模块应使用抽象 CanIf TransceiverId 调用对应 CAN 收发器的回调函数 `CanIf_TrcvModeIndication`。 ⌋ ()
### 7.2 CAN 收发器硬件操作模式
CAN 收发器硬件可能支持比上述状态图更多的模式转换。本章解释了其依赖关系和建议的实现行为。
由实现决定哪个 CAN 收发器硬件状态被哪个 CAN 收发器驱动软件状态所覆盖。实现必须保证所描述的 CAN 收发器驱动软件状态的完整功能由该实现来实现。
#### 7.2.1 临时"Go-To-Sleep"模式示例
通常称为"Go-to-sleep"的模式是从 Normal 切换到 Sleep 时的临时模式。驱动将这种临时模式封装在某个 CAN 收发器驱动软件状态内。此外,CAN 收发器驱动先从 Normal 切换到 Standby,然后通过额外的 API 调用从 Standby 切换到 Sleep。
#### 7.2.2 "PowerOn/ListenOnly"模式示例
通常称为"PowerOn"或"ListenOnly"的模式是 CAN 收发器硬件只能接收消息而无法发送消息的模式。此外,在接收消息期间不发送应答位。不支持此模式,因为它在 CAN 标准之外,并且并非所有 CAN 收发器硬件芯片都支持。
### 7.3 CAN 收发器唤醒类型
存在三种不同的场景通常称为唤醒:
**场景 1:**
- MCU 未上电。
- ECU 部分(包括 CAN 收发器硬件)已上电。
- 所考虑的 CAN 收发器处于 SLEEP 模式。
- CAN 收发器硬件检测到 CAN 总线上的唤醒事件。
- CAN 收发器硬件使 MCU 上电。
在 AUTOSAR 术语中,这被视为冷启动而非唤醒。
**场景 2:**
- MCU 处于低功耗模式。
- ECU 部分(包括 CAN 收发器硬件)已上电。
- 所考虑的 CAN 收发器处于 STANDBY 模式。
- CAN 收发器硬件检测到 CAN 总线上的唤醒事件。
- CAN 收发器硬件触发软件中断以唤醒。
在 AUTOSAR 术语中,这被视为 CAN 通道和 MCU 的唤醒。
**场景 3:**
- MCU 处于全功率模式。
- 至少 ECU 部分(包括 CAN 收发器硬件)已上电。
- 所考虑的 CAN 收发器处于 STANDBY 模式。
- CAN 收发器硬件检测到 CAN 上的唤醒事件。
- CAN 收发器硬件触发软件中断以唤醒,或周期性地轮询唤醒事件。
在 AUTOSAR 术语中,这被视为 CAN 通道的唤醒。
### 7.4 使能/禁用唤醒通知
**[SWS_CanTrcv_00171]** ⌈ CanTrcv 驱动应使用 ICU 驱动提供的以下 API 来使能和禁用唤醒事件通知:
- `Icu_EnableNotification`
- `Icu_DisableNotification`
仅当为参数 `CanTrcvIcuChannelRef` 配置了引用时,CanTrcv 驱动才应使能/禁用 ICU 通道。 ⌋ ()
CanTrcv 驱动应确保以下内容以避免丢失唤醒事件:
**[SWS_CanTrcv_00172]** ⌈ 当收发器转换到 Standby 模式(`CANTRCV_STANDBY`)时,应使能 ICU 通道。 ⌋ ()
**[SWS_CanTrcv_00173]** ⌈ 当收发器转换到 Normal 模式(`CANTRCV_NORMAL`)时,应禁用 ICU 通道。 ⌋ ()
### 7.5 CAN 收发器唤醒模式
CAN 收发器驱动提供两种唤醒模式:
**[SWS_CanTrcv_00090]** ⌈ `NOT_SUPPORTED` 模式 ⌋ (SRS_BSW_00388, SRS_BSW_00389, SRS_BSW_00390, SRS_BSW_00392, SRS_BSW_00393, SRS_BSW_00394, SRS_BSW_00408, SRS_BSW_00160, SRS_BSW_00172, SRS_Can_01090)
在 `NOT_SUPPORTED` 模式下,CAN 收发器驱动不生成唤醒。所有 CAN 收发器硬件类型都支持此模式。
**[SWS_CanTrcv_00091]** ⌈ `POLLING` 模式 ⌋ (SRS_BSW_00388, SRS_BSW_00389, SRS_BSW_00390, SRS_BSW_00392, SRS_BSW_00393, SRS_BSW_00394, SRS_BSW_00395, SRS_BSW_00408, SRS_BSW_00160, SRS_BSW_00172, SRS_Can_01090, SRS_Can_01092)
在 `POLLING` 模式下,由 CAN 收发器驱动生成的唤醒可能导致 CAN 通道唤醒。在此模式下,不可能产生 MCU 唤醒。此模式假设所用 CAN 收发器硬件类型的支持。唤醒模式 `POLLING` 要求源代码中存在函数 `CanTrcv_CheckWakeup` 和主函数 `CanTrcv_MainFunction`。
主函数 `CanTrcv_MainFunction` 应由 BSW 调度器调用,`CanTrcv_CheckWakeup` 由 CanIf 调用。
唤醒模式的选择由配置参数 `CanTrcvWakeUpSupport` 完成。每个 CAN 收发器的唤醒支持可由配置参数 `CanTrcvWakeupByBusUsed` 单独开启或关闭。
**注:** 在两种模式下,函数 `CanTrcv_CheckWakeup` 都应存在,但其功能应基于所配置的唤醒模式(`NOT_SUPPORTED` 或 `POLLING`)。
**实现提示:** 如果 CAN 收发器在检测到唤醒后需要由软件启动特定的状态转换(例如 Sleep -> Normal),这可以由 CanTrcv 模块在执行 `CanTrcv_CheckWakeup` 期间完成。这种行为是实现特定的。
必须通过相关模块(EcuM、CanIf、ICU 等)的配置确保在收发器需要特定状态转换时调用 `CanTrcv_CheckWakeup`。
### 7.6 错误分类
#### 7.6.1 开发错误
| 错误类型 | 相关性 | 相关错误码 | 值 [hex] |
|----------|--------|------------|----------|
| API 调用时为 CAN 收发器传入了错误的参数 | Development | `CANTRCV_E_INVALID_TRANSCEIVER` | 1 |
| API 调用时传入了空指针参数 | Development | `CANTRCV_E_PARAM_POINTER` | 2 |
| API 服务在未初始化的情况下被使用 | Development | `CANTRCV_E_UNINIT` | 11 |
| API 服务在错误的收发器操作模式下被调用 | Development | `CANTRCV_E_TRCV_NOT_STANDBY` / `CANTRCV_E_TRCV_NOT_NORMAL` | 21 / 22 |
| API 服务调用时 TrcvWakeupMode 参数无效 | Development | `CANTRCV_E_PARAM_TRCV_WAKEUP_MODE` | 23 |
| API 服务调用时 OpMode 参数无效 | Development | `CANTRCV_E_PARAM_TRCV_OPMODE` | 24 |
| 配置的波特率不被收发器支持 | Development | `CANTRCV_E_BAUDRATE_NOT_SUPPORTED` | 25 |
| 模块初始化失败,例如在 post-build 中以无效指针调用 `CanTrcv_Init()` | Development | `CANTRCV_E_INIT_FAILED` | 27 |
#### 7.6.2 运行时错误
| 错误类型 | 相关错误码 | 值 [hex] |
|----------|------------|----------|
| 与收发器无/不正确的通信 | `CANTRCV_E_NO_TRCV_CONTROL` | 26 |
#### 7.6.3 瞬态故障
无瞬态故障。
#### 7.6.4 生产错误
无生产错误。
#### 7.6.5 扩展生产错误
**[SWS_CanTrcv_00228]** ⌈
| 字段 | 内容 |
|------|------|
| 错误名称 | `CANTRCV_E_BUS_ERROR` |
| 简短描述 | 在通信过程中发生了 CAN 总线错误 |
| 详细描述 | 当收发器在 CAN 通信期间检测到总线故障时,应发出此扩展生产错误。 |
| 检测条件 - 失败 | 当与总线故障对应的标志被置位时,应使用参数 `EventId` 为 `CANTRCV_E_BUS_ERROR`、`EventStatus` 为 `DEM_EVENT_STATUS_FAILED` 调用 `Dem_SetEventStatus`。见 SWS_CanTrcv_00206, SWS_CanTrcv_00229 |
| 检测条件 - 通过 | 当与总线故障对应的标志未被置位时,应使用参数 `EventId` 为 `CANTRCV_E_BUS_ERROR`、`EventStatus` 为 `DEM_EVENT_STATUS_PASSED` 调用 `Dem_SetEventStatus`。见 SWS_CanTrcv_00227, SWS_CanTrcv_00229 |
| 二级参数 | N/A |
| 所需时间 | N/A |
| 监控频率 | 持续 |
⌋ (SRS_BSW_00339, SRS_BSW_00385)
**[SWS_CanTrcv_00229]** ⌈ 当 Bus Error(BUSERR)标志被置位时(取决于是否配置并被硬件支持),扩展生产错误 `CANTRCV_E_BUS_ERROR`(由 DEM 分配值)应可由 CAN 收发器模块检测到。 ⌋ ()
### 7.7 驱动初始化的前置条件
**[SWS_CanTrcv_00099]** ⌈ CanTrcv 模块的环境必须确保在调用 `CanTrcv_Init` 之前,所有必要的 BSW 驱动(由 CanTrcv 模块使用)已初始化并可用。 ⌋ (SRS_BSW_00172)
CAN 总线收发器驱动使用 Spi 和 Dio 驱动来控制 CAN 总线收发器硬件。因此,在 CAN 总线收发器驱动初始化之前,这些驱动必须可用并准备好运行。
CAN 收发器驱动对初始化序列和收发器设备的访问可能有时间要求,所使用的底层驱动必须满足这些要求。
时间要求可能是:
1) CAN 总线收发器驱动的初始化调用必须在通电后尽早执行,以便及时从收发器硬件读取 ECU 内所有其他用户所需的所有必要信息。
2) 所用底层服务的运行时间应非常短且是同步的,使驱动能保持其自身的时间要求(受所用硬件设备限制)。
3) 驱动的运行时间可能由于某些硬件设备将端口引脚电平配置为有效(例如 50µs)然后再更改以达到特定状态(如 sleep)而延长。
### 7.8 实例概念
**[SWS_CanTrcv_00016]** ⌈ 对于每种不同的 CAN 收发器硬件类型,ECU 都有一个 CAN 收发器驱动实例。一个实例服务于所有同类型的 CAN 收发器硬件。 ⌋ (SRS_BSW_00347, SRS_BSW_00413, SRS_Can_01091)
### 7.9 等待状态
对于更改操作模式,CAN 收发器硬件可能必须执行等待状态。
**[SWS_CanTrcv_00230]** ⌈ CAN 收发器驱动应使用 Time 服务 `Tm_BusyWait1us16bit` 实现收发器状态变更的等待时间。 ⌋ ()
### 7.10 具有选择性唤醒功能的收发器
本节描述具有选择性唤醒功能的 CAN 收发器的需求。
部分网络(Partial Networking)是 CAN 系统中的一种状态,其中一些节点处于低功耗模式,而其他节点正在通信。这降低了整个网络的功耗。处于低功耗模式的节点通过预定义的唤醒帧被唤醒。
支持选择性唤醒的收发器除了普通收发器提供的通过唤醒模式(WUP)唤醒外,还可以通过唤醒帧(WUF)唤醒。
**[SWS_CanTrcv_00174]** ⌈ 如果收发器硬件支持选择性唤醒,则应使用配置参数 `CanTrcvHwPnSupport` 指示。 ⌋ ()
**[SWS_CanTrcv_00175]** ⌈ 选择性唤醒功能的配置容器(`CanTrcvPartialNetwork`)和以下 API:
- 8.4.7 `CanTrcv_GetTrcvSystemData`,
- 8.4.8 `CanTrcv_ClearTrcvWufFlag`,
- 8.4.9 `CanTrcv_ReadTrcvTimeoutFlag`,
- 8.4.10 `CanTrcv_ClearTrcvTimeoutFlag`,
- 8.4.11 `CanTrcv_ReadTrcvSilenceFlag`
应仅在 `CanTrcvHwPnSupport = TRUE` 时存在。 ⌋ ()
**[SWS_CanTrcv_00177]** ⌈ 如果支持选择性唤醒,则 CAN 收发器应配置为使用参数 `CanTrcvPnFrameCanId`、`CanTrcvPnFrameCanIdMask` 和 `CanTrcvPnFrameDataMask` 对特定 CAN 帧或一组 CAN 帧进行唤醒。 ⌋ ()
**[SWS_CanTrcv_00178]** ⌈ 如果收发器具有识别总线故障(并区分总线故障和其他硬件故障)的能力,则应使用配置参数 `CanTrcvBusErrFlag` 指示,用于总线诊断目的。 ⌋ ()
**注:** 对于支持选择性唤醒功能的 CAN 收发器,在 Normal 模式(`CANTRCV_TRCVMODE_NORMAL`)期间可以检测唤醒帧。检测到的唤醒帧由收发器 WUF 标志发出信号。这确保了在转换到 Standby 模式(`CANTRCV_TRCVMODE_STANDBY`)期间不会丢失唤醒帧。
---
## 8 API 规范(API specification)
### 8.1 导入类型
本章列出了从以下文件包含的所有类型:
**[SWS_CanTrcv_00084]** ⌈
| 模块 | 头文件 | 导入类型 |
|------|--------|----------|
| Can_GeneralTypes | Can_GeneralTypes.h | `CanTrcv_TrcvModeType` |
| | Can_GeneralTypes.h | `CanTrcv_TrcvWakeupModeType` |
| | Can_GeneralTypes.h | `CanTrcv_TrcvWakeupReasonType` |
| Dem | Rte_Dem_Type.h | `Dem_EventIdType` |
| | Rte_Dem_Type.h | `Dem_EventStatusType` |
| Dio | Dio.h | `Dio_ChannelGroupType` |
| | Dio.h | `Dio_ChannelType` |
| | Dio.h | `Dio_LevelType` |
| | Dio.h | `Dio_PortLevelType` |
| | Dio.h | `Dio_PortType` |
| EcuM | EcuM.h | `EcuM_WakeupSourceType` |
| Icu | Icu.h | `Icu_ChannelType` |
| Spi | Spi.h | `Spi_ChannelType` |
| | Spi.h | `Spi_DataBufferType` |
| | Spi.h | `Spi_NumberOfDataType` |
| | Spi.h | `Spi_SequenceType` |
| | Spi.h | `Spi_StatusType` |
| Std_Types | StandardTypes.h | `Std_ReturnType` |
| | StandardTypes.h | `Std_VersionInfoType` |
⌋ ()
**[SWS_CanTrcv_00163]** ⌈
| 字段 | 内容 |
|------|------|
| 名称 | `CanTrcv_TrcvModeType` |
| 类型 | Enumeration |
| 范围 | `CANTRCV_TRCVMODE_SLEEP` -- 收发器模式 SLEEP
`CANTRCV_TRCVMODE_STANDBY` -- 收发器模式 STANDBY
`CANTRCV_TRCVMODE_NORMAL` 0x00 -- 收发器模式 NORMAL |
| 描述 | CAN 收发器驱动的操作模式。 |
| 可通过获取 | Can_GeneralTypes.h |
⌋ ()
**[SWS_CanTrcv_00164]** ⌈
| 字段 | 内容 |
|------|------|
| 名称 | `CanTrcv_TrcvWakeupModeType` |
| 类型 | Enumeration |
| 范围 | `CANTRCV_WUMODE_ENABLE` 0x00 -- 寻址的收发器上唤醒事件的通知已启用
`CANTRCV_WUMODE_DISABLE` 0x01 -- 寻址的收发器上唤醒事件的通知已禁用
`CANTRCV_WUMODE_CLEAR` 0x02 -- 寻址的收发器上存储的唤醒事件被清除 |
| 描述 | 此类型应用于控制 CAN 收发器相关的唤醒事件和唤醒通知。 |
| 可通过获取 | Can_GeneralTypes.h |
⌋ ()
**[SWS_CanTrcv_00165]** ⌈
| 字段 | 内容 |
|------|------|
| 名称 | `CanTrcv_TrcvWakeupReasonType` |
| 类型 | Enumeration |
| 范围 | `CANTRCV_WU_ERROR` 0x00 -- 由于错误,未检测到唤醒原因。此值仅在之前向 DEM 报告了错误时报告
`CANTRCV_WU_NOT_SUPPORTED` 0x01 -- 收发器不支持任何唤醒原因信息
`CANTRCV_WU_BY_BUS` 0x02 -- 收发器检测到网络已使 ECU 唤醒
`CANTRCV_WU_INTERNALLY` 0x03 -- 收发器检测到网络已被 ECU 通过 NORMAL 模式请求唤醒
`CANTRCV_WU_RESET` 0x04 -- 收发器检测到"唤醒"是因 ECU 复位引起
`CANTRCV_WU_POWER_ON` 0x05 -- 收发器检测到"唤醒"是因上电后的 ECU 复位引起
`CANTRCV_WU_BY_PIN` 0x06 -- 收发器检测到在收发器某个引脚(不在 CAN 总线上)处的唤醒事件
`CANTRCV_WU_BY_SYSERR` 0x07 -- 收发器检测到 ECU 的唤醒是由与硬件相关的设备故障引起 |
| 描述 | 此类型表示 CAN 收发器详细检测到的唤醒原因。 |
| 可通过获取 | Can_GeneralTypes.h |
⌋ ()
### 8.2 类型定义
**[SWS_CanTrcv_00209]** ⌈
| 字段 | 内容 |
|------|------|
| 名称 | `CanTrcv_ConfigType` |
| 类型 | Structure |
| 范围 | 实现特定 -- |
| 描述 | 这是一个外部数据结构类型,包含 CAN 收发器驱动的整体初始化数据以及影响所有收发器的设置。此外,它还包含指向收发器配置结构的指针。初始化数据结构的内容是 CAN 收发器硬件特定的。 |
| 可通过获取 | CanTrcv.h |
⌋ ()
**[SWS_CanTrcv_00210]** ⌈
| 字段 | 内容 |
|------|------|
| 名称 | `CanTrcv_PNActivationType` |
| 类型 | Enumeration |
| 范围 | `PN_ENABLED` -- CanTrcv 中 PN 唤醒功能已启用
`PN_DISABLED` -- CanTrcv 中 PN 唤醒功能已禁用 |
| 描述 | 用于描述 CanTrcv 中 PN 唤醒功能是启用还是禁用的数据类型。 |
| 可通过获取 | CanTrcv.h |
⌋ ()
**[SWS_CanTrcv_00211]** ⌈
| 字段 | 内容 |
|------|------|
| 名称 | `CanTrcv_TrcvFlagStateType` |
| 类型 | Enumeration |
| 范围 | `CANTRCV_FLAG_SET` -- 收发器硬件中已置位该标志
`CANTRCV_FLAG_CLEARED` -- 收发器硬件中已清除该标志 |
| 描述 | 提供收发器硬件中某标志的状态。 |
| 可通过获取 | CanTrcv.h |
⌋ ()
### 8.3 函数定义
#### 8.3.1 CanTrcv_Init
**[SWS_CanTrcv_00001]** ⌈
| 字段 | 内容 |
|------|------|
| 服务名 | `CanTrcv_Init` |
| 语法 | `void CanTrcv_Init(const CanTrcv_ConfigType* ConfigPtr)` |
| 服务 ID[hex] | 0x00 |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 输入参数 | `ConfigPtr` -- 指向驱动配置的指针 |
| 输入输出参数 | 无 |
| 输出参数 | 无 |
| 返回值 | 无 |
| 描述 | 初始化 CanTrcv 模块。 |
| 可通过获取 | CanTrcv.h |
⌋ (SRS_BSW_00310, SRS_BSW_00358, SRS_BSW_00369, SRS_BSW_00371, SRS_BSW_00414, SRS_BSW_00101, SRS_BSW_00172, SRS_Can_01096, SRS_Can_01097, SRS_Can_01109, SRS_Can_01110, SRS_Can_01108)
**[SWS_CanTrcv_00180]** ⌈ `CanTrcv_Init` 函数应根据其初始化序列和配置(由参数 `ConfigPtr` 提供)初始化所有连接的 CAN 收发器。同时,它也应支持 AUTOSAR 栈的配置序列。 ⌋ ()
**[SWS_CanTrcv_00100]** ⌈ `CanTrcv_Init` 函数应将 CAN 收发器硬件设置为由配置参数 `CanTrcvInitState` 配置的状态。 ⌋ ()
请注意,在通电和调用 `CanTrcv_Init` 之间的这段时间内,CAN 收发器硬件可能处于不同的状态。这取决于硬件和 SPAL 驱动配置。
复位后(例如上电)的初始化序列是 CAN 收发器驱动的关键阶段。
**[SWS_CanTrcv_00167]** ⌈ 如果硬件支持,`CanTrcv_Init` 应验证是否存在由收发器活动引起的唤醒,如果是 TRUE,则应通过 API `EcuM_SetWakeupEvent`(使用 `CanTrcvWakeupSourceRef` 中引用的唤醒源)向 EcuM 报告。 ⌋ ()
**[SWS_CanTrcv_00181]** ⌈ 如果启用了选择性唤醒且硬件支持:`CanTrcv_Init` API 应检查收发器状态的 POR 和 SYSERR 标志。 ⌋ ()
**[SWS_CanTrcv_00182]** ⌈ 如果 POR 标志或 SYSERR 标志已置位,则收发器应通过运行配置序列重新配置为选择性唤醒功能。如果 POR 标志或 SYSERR 标志未置位,则存储在收发器存储器中的配置仍然有效,无需重新配置。 ⌋ ()
**[SWS_CanTrcv_00183]** ⌈ 如果 POR 标志已置位,则应通过 API `EcuM_SetWakeupEvent` 向 EcuM 报告唤醒,其唤醒源值在 `CanTrcvPorWakeupsourceRef` 所引用的符号名称值的位位置处为"1",其他位为"0"。 ⌋ ()
**[SWS_CanTrcv_00184]** ⌈ 如果 SYSERR 标志已置位,则应通过 API `EcuM_SetWakeupEvent` 向 EcuM 报告唤醒,其唤醒源值在 `CanTrcvSyserrWakeupSourceRef` 所引用的符号名称值的位位置处为"1",其他位为"0"。 ⌋ ()
**[SWS_CanTrcv_00113]** ⌈ 如果与收发器无/不正确的通信,则 `CanTrcv_Init` 函数应将运行时错误码 `CANTRCV_E_NO_TRCV_CONTROL` 报告给默认错误跟踪器并返回 `E_NOT_OK`。 ⌋ ()
**[SWS_CanTrcv_00168]** ⌈ 如果为 CanTrcv 模块启用了开发错误检测:`CanTrcv_Init` 函数应在配置的波特率不被收发器支持时引发开发错误 `CANTRCV_E_BAUDRATE_NOT_SUPPORTED`。 ⌋ ()
**[SWS_CanTrcv_00226]** ⌈ 为了实现 AUTOSAR 部分网络机制,CAN 收发器应支持为唤醒帧定义数据掩码(`CanTrcvPnFrameDataMask` 的配置结构是必需的)。 ⌋ ()
#### 8.3.2 CanTrcv_SetOpMode
**[SWS_CanTrcv_00002]** ⌈
| 字段 | 内容 |
|------|------|
| 服务名 | `CanTrcv_SetOpMode` |
| 语法 | `Std_ReturnType CanTrcv_SetOpMode(uint8 Transceiver, CanTrcv_TrcvModeType OpMode)` |
| 服务 ID[hex] | 0x01 |
| 同步/异步 | 异步 |
| 可重入性 | 对不同收发器可重入 |
| 输入参数 | `Transceiver` -- API 调用必须应用到的 CAN 收发器
`OpMode` -- 此参数包含所期望的操作模式 |
| 输入输出参数 | 无 |
| 输出参数 | 无 |
| 返回值 | `Std_ReturnType` -- `E_OK`:如果收发器模式更改的请求已被接受;`E_NOT_OK`:如果收发器模式更改的请求未被接受或任何参数超出允许范围 |
| 描述 | 将收发器的模式设置为 `OpMode` 的值。 |
| 可通过获取 | CanTrcv.h |
⌋ (SRS_BSW_00310, SRS_BSW_00357, SRS_BSW_00369, SRS_BSW_00371, SRS_BSW_00406, SRS_Can_01091, SRS_Can_01097, SRS_Can_01098, SRS_Can_01099, SRS_Can_01100, SRS_Can_01109, SRS_Can_01110, SRS_Can_01108)
**[SWS_CanTrcv_00102]** ⌈ `CanTrcv_SetOpMode` 函数应将收发器的内部状态切换为参数 `OpMode` 的值,可以是 `CANTRCV_TRCVMODE_NORMAL`、`CANTRCV_TRCVMODE_STANDBY` 或 `CANTRCV_TRCVMODE_SLEEP`。 ⌋ ()
**[SWS_CanTrcv_00103]** ⌈ 如果收发器处于 `CANTRCV_TRCVMODE_NORMAL` 模式,则 CanTrcv 模块的用户应使用 `OpMode = CANTRCV_TRCVMODE_STANDBY` 或 `CANTRCV_TRCVMODE_NORMAL` 调用 `CanTrcv_SetOpMode`。 ⌋ ()
**[SWS_CanTrcv_00104]** ⌈ 如果收发器处于 `CANTRCV_TRCVMODE_STANDBY` 模式,则 CanTrcv 模块的用户应使用 `OpMode = CANTRCV_TRCVMODE_SLEEP` 或 `CANTRCV_TRCVMODE_STANDBY` 调用 `CanTrcv_SetOpMode`。 ⌋ ()
**[SWS_CanTrcv_00105]** ⌈ 如果所请求的模式不受底层收发器硬件支持,则 `CanTrcv_SetOpMode` 函数应返回 `E_NOT_OK`。 ⌋ ()
**[SWS_CanTrcv_00186]** ⌈ 如果硬件支持选择性唤醒:`CanTrcv_SetOpMode` API 应检查收发器状态的 POR 和 SYSERR 标志。 ⌋ ()
**[SWS_CanTrcv_00187]** ⌈ 如果 POR 标志已置位,则收发器应重新初始化以运行收发器的配置序列。 ⌋ ()
**[SWS_CanTrcv_00188]** ⌈ 如果 SYSERR 标志未置位且所请求的模式为 `CANTRCV_NORMAL`,则收发器应为相应的抽象 CanIf TransceiverId 调用 API `CanIf_ConfirmPnAvailability()`。`CanIf_ConfirmPnAvailability` 通过 CanIf 和 CanSm 通知 CanNm 已启用选择性唤醒。 ⌋ ()
**[SWS_CanTrcv_00114]** ⌈ 如果与收发器无/不正确的通信,则 `CanTrcv_SetOpMode` 函数应将运行时错误码 `CANTRCV_E_NO_TRCV_CONTROL` 报告给默认错误跟踪器并返回 `E_NOT_OK`。 ⌋ ()
**[SWS_CanTrcv_00120]** ⌈ 如果为 CanTrcv 模块启用了开发错误检测:如果使用 `OpMode = CANTRCV_TRCVMODE_STANDBY` 调用 `CanTrcv_SetOpMode`,且收发器未处于 `CANTRCV_TRCVMODE_NORMAL` 或 `CANTRCV_TRCVMODE_STANDBY` 模式,则该函数应引发开发错误 `CANTRCV_E_TRCV_NOT_NORMAL`,否则(如果禁用 DET)返回 `E_NOT_OK`。 ⌋ ()
**[SWS_CanTrcv_00121]** ⌈ 如果为 CanTrcv 模块启用了开发错误检测:如果使用 `OpMode = CANTRCV_TRCVMODE_SLEEP` 调用 `CanTrcv_SetOpMode`,且收发器未处于 `CANTRCV_TRCVMODE_STANDBY` 或 `CANTRCV_TRCVMODE_SLEEP` 模式,则该函数应引发开发错误 `CANTRCV_E_TRCV_NOT_STANDBY`,否则(如果禁用 DET)返回 `E_NOT_OK`。 ⌋ ()
**[SWS_CanTrcv_00122]** ⌈ 如果在 CanTrcv 模块初始化之前被调用,则 `CanTrcv_SetOpMode` 函数应引发开发错误 `CANTRCV_E_UNINIT`,否则(如果禁用 DET)返回 `E_NOT_OK`。 ⌋ ()
**[SWS_CanTrcv_00123]** ⌈ 如果使用无效的收发器编号调用,则 `CanTrcv_SetOpMode` 函数应引发开发错误 `CANTRCV_E_INVALID_TRANSCEIVER`,否则(如果禁用 DET)返回 `E_NOT_OK`。 ⌋ ()
**[SWS_CanTrcv_00087]** ⌈ 如果使用无效的 `OpMode` 调用,则 `CanTrcv_SetOpMode` 函数应引发开发错误 `CANTRCV_E_PARAM_TRCV_OPMODE`,否则(如果禁用 DET)返回 `E_NOT_OK`。 ⌋ ()
#### 8.3.3 CanTrcv_GetOpMode
**[SWS_CanTrcv_00005]** ⌈
| 字段 | 内容 |
|------|------|
| 服务名 | `CanTrcv_GetOpMode` |
| 语法 | `Std_ReturnType CanTrcv_GetOpMode(uint8 Transceiver, CanTrcv_TrcvModeType* OpMode)` |
| 服务 ID[hex] | 0x02 |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 输入参数 | `Transceiver` -- API 调用必须应用到的 CAN 收发器 |
| 输入输出参数 | 无 |
| 输出参数 | `OpMode` -- 指向应用此 API 的总线的操作模式的指针 |
| 返回值 | `Std_ReturnType` -- `E_OK`:如果检测到操作模式;`E_NOT_OK`:如果未检测到操作模式 |
| 描述 | 获取收发器的模式并将其返回到 `OpMode` 中。 |
| 可通过获取 | CanTrcv.h |
⌋ (SRS_BSW_00310, SRS_BSW_00369, SRS_BSW_00371, SRS_BSW_00377, SRS_BSW_00406, SRS_Can_01091, SRS_Can_01097, SRS_Can_01101, SRS_Can_01109, SRS_Can_01110)
**[SWS_CanTrcv_00106]** ⌈ `CanTrcv_GetOpMode` 函数应在 out 参数 `OpMode` 中收集 CAN 收发器驱动的实际状态。 ⌋ ()
请参阅 `CanTrcv_Init` 函数以了解 CAN 收发器驱动初始化后到首次操作模式更改请求之前所提供的状态。
**[SWS_CanTrcv_00115]** ⌈ 如果与收发器无/不正确的通信,则 `CanTrcv_GetOpMode` 函数应将运行时错误码 `CANTRCV_E_NO_TRCV_CONTROL` 报告给默认错误跟踪器并返回 `E_NOT_OK`。 ⌋ ()
**[SWS_CanTrcv_00124]** ⌈ 如果在 CanTrcv 模块初始化之前被调用,则 `CanTrcv_GetOpMode` 函数应引发开发错误 `CANTRCV_E_UNINIT`,否则(如果禁用 DET)返回 `E_NOT_OK`。 ⌋ ()
**[SWS_CanTrcv_00129]** ⌈ 如果使用无效的收发器编号调用,则 `CanTrcv_GetOpMode` 函数应引发开发错误 `CANTRCV_E_INVALID_TRANSCEIVER`,否则(如果禁用 DET)返回 `E_NOT_OK`。 ⌋ ()
**[SWS_CanTrcv_00132]** ⌈ 如果使用 `OpMode = NULL` 调用,则 `CanTrcv_GetOpMode` 函数应引发开发错误 `CANTRCV_E_PARAM_POINTER`,否则(如果禁用 DET)返回 `E_NOT_OK`。 ⌋ ()
#### 8.3.4 CanTrcv_GetBusWuReason
**[SWS_CanTrcv_00007]** ⌈
| 字段 | 内容 |
|------|------|
| 服务名 | `CanTrcv_GetBusWuReason` |
| 语法 | `Std_ReturnType CanTrcv_GetBusWuReason(uint8 Transceiver, CanTrcv_TrcvWakeupReasonType* reason)` |
| 服务 ID[hex] | 0x03 |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 输入参数 | `Transceiver` -- API 调用必须应用到的 CAN 收发器 |
| 输入输出参数 | 无 |
| 输出参数 | `reason` -- 指向应用此 API 的总线的唤醒原因的指针 |
| 返回值 | `Std_ReturnType` -- `E_OK`:如果提供了收发器唤醒原因;`E_NOT_OK`:如果没有可用的唤醒原因或服务请求由于开发错误而失败 |
| 描述 | 获取收发器的唤醒原因并将其返回到参数 `Reason` 中。 |
| 可通过获取 | CanTrcv.h |
⌋ (SRS_BSW_00310, SRS_BSW_00369, SRS_BSW_00371, SRS_BSW_00375, SRS_BSW_00377, SRS_BSW_00406, SRS_Can_01091, SRS_Can_01095, SRS_Can_01097, SRS_Can_01103, SRS_Can_01106, SRS_Can_01109, SRS_Can_01110)
**[SWS_CanTrcv_00107]** ⌈ `CanTrcv_GetBusWuReason` 函数应在参数 `Reason` 中收集 CAN 收发器检测到的唤醒原因。 ⌋ ()
检测和区分可能的唤醒原因的能力在很大程度上取决于 CAN 收发器硬件。
请注意,如果有多个总线可用,则每个总线可能报告不同的唤醒原因。例如,如果 ECU 具有 CAN,则可能发生由 CAN 引起的唤醒,并且传入的数据可能导致另一个 CAN 总线的内部唤醒。
**[SWS_CanTrcv_00116]** ⌈ 如果与收发器无/不正确的通信,则 `CanTrcv_GetBusWuReason` 函数应将运行时错误码 `CANTRCV_E_NO_TRCV_CONTROL` 报告给默认错误跟踪器并返回 `E_OK`。 ⌋ ()
**[SWS_CanTrcv_00125]** ⌈ 如果在 CanTrcv 模块初始化之前被调用,则 `CanTrcv_GetBusWuReason` 函数应引发开发错误 `CANTRCV_E_UNINIT`,否则(如果禁用 DET)返回 `E_NOT_OK`。 ⌋ ()
**[SWS_CanTrcv_00130]** ⌈ 如果使用无效的收发器编号调用,则 `CanTrcv_GetBusWuReason` 函数应引发开发错误 `CANTRCV_E_INVALID_TRANSCEIVER`,否则(如果禁用 DET)返回 `E_NOT_OK`。 ⌋ ()
**[SWS_CanTrcv_00133]** ⌈ 如果使用 `Reason = NULL` 调用,则 `CanTrcv_GetBusWuReason` 函数应引发开发错误 `CANTRCV_E_PARAM_POINTER`,否则(如果禁用 DET)返回 `E_NOT_OK`。 ⌋ ()
#### 8.3.5 CanTrcv_VersionInfo
**[SWS_CanTrcv_00008]** ⌈
| 字段 | 内容 |
|------|------|
| 服务名 | `CanTrcv_GetVersionInfo` |
| 语法 | `void CanTrcv_GetVersionInfo(Std_VersionInfoType* versioninfo)` |
| 服务 ID[hex] | 0x04 |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 输入参数 | 无 |
| 输入输出参数 | 无 |
| 输出参数 | `versioninfo` -- 指向此模块版本信息的指针 |
| 返回值 | 无 |
| 描述 | 获取模块的版本并将其返回到 `VersionInfo` 中。 |
| 可通过获取 | CanTrcv.h |
⌋ (SRS_BSW_00310, SRS_BSW_00369, SRS_BSW_00371, SRS_BSW_00406, SRS_BSW_00407, SRS_BSW_00411)
#### 8.3.6 CanTrcv_SetWakeupMode
**[SWS_CanTrcv_00009]** ⌈
| 字段 | 内容 |
|------|------|
| 服务名 | `CanTrcv_SetWakeupMode` |
| 语法 | `Std_ReturnType CanTrcv_SetWakeupMode(uint8 Transceiver, CanTrcv_TrcvWakeupModeType TrcvWakeupMode)` |
| 服务 ID[hex] | 0x05 |
| 同步/异步 | 同步 |
| 可重入性 | 对不同收发器可重入 |
| 输入参数 | `Transceiver` -- API 调用必须应用到的 CAN 收发器
`TrcvWakeupMode` -- 请求的收发器唤醒原因 |
| 输入输出参数 | 无 |
| 输出参数 | 无 |
| 返回值 | `Std_ReturnType` -- `E_OK`:如果唤醒状态已更改为所请求的模式;`E_NOT_OK`:如果唤醒状态更改失败或参数超出允许范围。状态未发生变化。 |
| 描述 | 根据 `TrcvWakeupMode` 启用、禁用或清除收发器的唤醒事件。 |
| 可通过获取 | CanTrcv.h |
⌋ (SRS_BSW_00310, SRS_BSW_00369, SRS_BSW_00371, SRS_BSW_00406, SRS_Can_01091, SRS_Can_01097, SRS_Can_01109, SRS_Can_01110, SRS_Can_01115)
**[SWS_CanTrcv_00111]** ⌈ 启用:如果使用 `TrcvWakupMode = CANTRCV_WUMODE_ENABLE` 调用 `CanTrcv_SetWakeupMode`,并且 CanTrcv 模块对寻址的总线有挂起的存储唤醒事件,则 CanTrcv 模块应将其唤醒事件更新为"present"。 ⌋ ()
**[SWS_CanTrcv_00093]** ⌈ 禁用:如果使用 `TrcvWakeupMode = CANTRCV_WUMODE_DISABLE` 调用 `CanTrcv_SetWakeupMode`,则寻址的收发器上的唤醒事件被禁用。收发器设备和收发器驱动需要检测唤醒事件并在内部存储,以便在再次启用唤醒模式时引发唤醒事件。 ⌋ (SRS_BSW_00388...)
**[SWS_CanTrcv_00094]** ⌈ 清除:如果使用 `TrcvWakeupMode = CANTRCV_WUMODE_CLEAR` 调用 `CanTrcv_SetWakeupMode`,则寻址的收发器上存储的唤醒事件被清除。 ⌋ ()
**[SWS_CanTrcv_00150]** ⌈ 当唤醒通知被禁用时,必须使用清除唤醒事件的方式在更高层控制下清除所有存储的唤醒事件。 ⌋ ()
**[SWS_CanTrcv_00095]** ⌈ 实现可以启用、禁用或清除上次通信周期以来的唤醒事件。重要的是在禁用期间不要丢失唤醒事件。 ⌋ (SRS_BSW_00388...)
#### 8.3.7 CanTrcv_GetTrcvSystemData
**[SWS_CanTrcv_00213]** ⌈
| 字段 | 内容 |
|------|------|
| 服务名 | `CanTrcv_GetTrcvSystemData` |
| 语法 | `Std_ReturnType CanTrcv_GetTrcvSystemData(uint8 Transceiver, const uint32* TrcvSysData)` |
| 服务 ID[hex] | 0x09 |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 输入参数 | `Transceiver` -- CAN 收发器 ID |
| 输入输出参数 | 无 |
| 输出参数 | `TrcvSysData` -- 收发器的配置/状态数据 |
| 返回值 | `Std_ReturnType` -- `E_OK`:如果成功读取了收发器状态;`E_NOT_OK`:如果收发器状态数据不可用或发生开发错误 |
| 描述 | 读取收发器配置/状态数据并通过参数 `TrcvSysData` 返回。此 API 应仅在 `CanTrcvHwPnSupport = TRUE` 时存在。 |
| 可通过获取 | CanTrcv.h |
⌋ ()
**[SWS_CanTrcv_00189]** ⌈ `CanTrcv_GetTrcvSystemData` 函数应读取 CAN 收发器的配置/状态并将读取的数据存储在 out 参数 `TrcvSysData` 中。如果成功,应返回 `E_OK`。 ⌋ ()
**提示:** 此 API 可通过诊断服务调用或在初始化期间调用,以确定收发器状态及其可用性。
**注:** 目前尚未就收发器硬件规范的参数集达成一致。因此,诊断数据现在以 `uint32` 形式返回(存储在收发器寄存器中)。当定义明确和标准的参数集时,可以为抽象诊断数据定义数据结构。
#### 8.3.8 CanTrcv_ClearTrcvWufFlag
**[SWS_CanTrcv_00214]** ⌈
| 字段 | 内容 |
|------|------|
| 服务名 | `CanTrcv_ClearTrcvWufFlag` |
| 语法 | `Std_ReturnType CanTrcv_ClearTrcvWufFlag(uint8 Transceiver)` |
| 服务 ID[hex] | 0x0a |
| 同步/异步 | 同步 |
| 可重入性 | 对不同收发器可重入 |
| 输入参数 | `Transceiver` -- CAN 收发器 ID |
| 输入输出参数 | 无 |
| 输出参数 | 无 |
| 返回值 | `Std_ReturnType` -- `E_OK`:如果 WUF 标志已清除;`E_NOT_OK`:如果 WUF 标志未清除或发生开发错误 |
| 描述 | 清除收发器硬件中的 WUF 标志。此 API 应仅在 `CanTrcvHwPnSupport = TRUE` 时存在。 |
| 可通过获取 | CanTrcv.h |
⌋ (SRS_Can_01157)
**[SWS_CanTrcv_00194]** ⌈ `CanTrcv_ClearTrcvWufFlag` 函数应清除 CAN 收发器中的唤醒标志。如果成功,应返回 `E_OK`。 ⌋ ()
**实现提示:** 此 API 应由 CanSM 模块用于确保在进入低功耗模式期间不丢失帧唤醒事件。此 API 清除 WUF 标志。清除 WUF 标志后,CAN 收发器应置于 Standby 模式(`CANTRCV_STANDBY`)。如果启用选择性唤醒功能时发生系统错误(SYSERR,例如配置错误),则收发器将禁用该功能。收发器将在下一个 CAN 唤醒模式(WUP)上唤醒。如果发生任何其他硬件错误(例如帧检测错误),则当收发器内部的错误计数器溢出时收发器将唤醒。
**[SWS_CanTrcv_00195]** ⌈ CanTrcv 应通过回调通知 `CanIf_ClearTrcvWufFlagIndication`(使用抽象 CanIf TransceiverId 引用相应的 CAN 收发器)通知 CanIf 已清除所请求收发器的唤醒标志。 ⌋ ()
#### 8.3.9 CanTrcv_ReadTrcvTimeoutFlag
**[SWS_CanTrcv_00215]** ⌈
| 字段 | 内容 |
|------|------|
| 服务名 | `CanTrcv_ReadTrcvTimeoutFlag` |
| 语法 | `Std_ReturnType CanTrcv_ReadTrcvTimeoutFlag(uint8 Transceiver, CanTrcv_TrcvFlagStateType* FlagState)` |
| 服务 ID[hex] | 0x0b |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 输入参数 | `Transceiver` -- CAN 收发器 ID |
| 输入输出参数 | 无 |
| 输出参数 | `FlagState` -- 超时标志的状态 |
| 返回值 | `Std_ReturnType` -- `E_OK`:如果成功读取了超时标志的状态;`E_NOT_OK`:如果无法读取超时标志的状态 |
| 描述 | 从收发器硬件读取超时标志的状态。此 API 应仅在 `CanTrcvHwPnSupport = TRUE` 时存在。 |
| 可通过获取 | CanTrcv.h |
⌋ ()
#### 8.3.10 CanTrcv_ClearTrcvTimeoutFlag
**[SWS_CanTrcv_00216]** ⌈
| 字段 | 内容 |
|------|------|
| 服务名 | `CanTrcv_ClearTrcvTimeoutFlag` |
| 语法 | `Std_ReturnType CanTrcv_ClearTrcvTimeoutFlag(uint8 Transceiver)` |
| 服务 ID[hex] | 0x0c |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 输入参数 | `Transceiver` -- CAN 收发器 ID |
| 输入输出参数 | 无 |
| 输出参数 | 无 |
| 返回值 | `Std_ReturnType` -- `E_OK`:如果成功清除了超时标志;`E_NOT_OK`:如果无法清除超时标志 |
| 描述 | 清除收发器硬件中超时标志的状态。此 API 应仅在 `CanTrcvHwPnSupport = TRUE` 时存在。 |
| 可通过获取 | CanTrcv.h |
⌋ ()
#### 8.3.11 CanTrcv_ReadTrcvSilenceFlag
**[SWS_CanTrcv_00217]** ⌈
| 字段 | 内容 |
|------|------|
| 服务名 | `CanTrcv_ReadTrcvSilenceFlag` |
| 语法 | `Std_ReturnType CanTrcv_ReadTrcvSilenceFlag(uint8 Transceiver, CanTrcv_TrcvFlagStateType* FlagState)` |
| 服务 ID[hex] | 0x0d |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 输入参数 | `Transceiver` -- CAN 收发器 ID |
| 输入输出参数 | 无 |
| 输出参数 | `FlagState` -- 静默标志的状态 |
| 返回值 | `Std_ReturnType` -- `E_OK`:如果成功读取了静默标志的状态;`E_NOT_OK`:如果无法读取静默标志的状态 |
| 描述 | 从收发器硬件读取静默标志的状态。此 API 应仅在 `CanTrcvHwPnSupport = TRUE` 时存在。 |
| 可通过获取 | CanTrcv.h |
⌋ ()
#### 8.3.12 CanTrcv_CheckWakeup
**[SWS_CanTrcv_00143]** ⌈
| 字段 | 内容 |
|------|------|
| 服务名 | `CanTrcv_CheckWakeup` |
| 语法 | `Std_ReturnType CanTrcv_CheckWakeup(uint8 Transceiver)` |
| 服务 ID[hex] | 0x07 |
| 同步/异步 | 同步 |
| 可重入性 | 可重入 |
| 输入参数 | `Transceiver` -- API 调用必须应用到的 CAN 收发器 |
| 输入输出参数 | 无 |
| 输出参数 | 无 |
| 返回值 | `Std_ReturnType` -- `E_OK`:API 调用已被接受;`E_NOT_OK`:API 调用未被接受 |
| 描述 | 在检测到唤醒中断时由底层 CANIF 调用。 |
| 可通过获取 | CanTrcv.h |
⌋ ()
`EcuM_EndCheckWakeup(WakeupSource)` 由 `CanTrcv_CheckWakeup` 异步调用以检查唤醒源。
#### 8.3.13 CanTrcv_SetPNActivationState
**[SWS_CanTrcv_00219]** ⌈
| 字段 | 内容 |
|------|------|
| 服务名 | `CanTrcv_SetPNActivationState` |
| 语法 | `Std_ReturnType CanTrcv_SetPNActivationState(CanTrcv_PNActivationType ActivationState)` |
| 服务 ID[hex] | 0x0f |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 输入参数 | `ActivationState` -- `PN_ENABLED`:CanTrcv 中的 PN 唤醒功能应启用;`PN_DIABLED`:CanTrcv 中的 PN 唤醒功能应禁用 |
| 输入输出参数 | 无 |
| 输出参数 | 无 |
| 返回值 | `Std_ReturnType` -- `E_OK`:如果 PN 已更改为所请求的配置;`E_NOT_OK`:如果 PN 配置更改失败。状态未发生变化。 |
| 描述 | 此 API 配置 Standby 和 Sleep 模式下收发器的唤醒:CAN 收发器由远程唤醒模式(标准 CAN 唤醒)或所配置的远程唤醒帧唤醒。 |
| 可通过获取 | CanTrcv.h |
⌋ ()
#### 8.3.14 CanTrcv_CheckWakeFlag
**[SWS_CanTrcv_00223]** ⌈
| 字段 | 内容 |
|------|------|
| 服务名 | `CanTrcv_CheckWakeFlag` |
| 语法 | `Std_ReturnType CanTrcv_CheckWakeFlag(uint8 Transceiver)` |
| 服务 ID[hex] | 0x0e |
| 同步/异步 | 异步 |
| 可重入性 | 不可重入 |
| 输入参数 | `Transceiver` -- CAN 收发器 ID |
| 输入输出参数 | 无 |
| 输出参数 | 无 |
| 返回值 | `Std_ReturnType` -- `E_OK`:如果已接受检查唤醒标志的请求;`E_NOT_OK`:如果未接受检查唤醒标志的请求 |
| 描述 | 请求检查收发器硬件中唤醒标志的状态。 |
| 可通过获取 | CanTrcv.h |
⌋ ()
**[SWS_CanTrcv_00224]** ⌈ CanTrcv 应使用回调通知 `CanIf_CheckTrcvWakeFlagIndication` 通知 CanIf 已检查了具有相应 TransceiverId 的 CAN 收发器的唤醒标志。 ⌋ ()
#### 8.3.15 CanTrcv_DeInit
**[SWS_CanTrcv_91001]** ⌈
| 字段 | 内容 |
|------|------|
| 服务名 | `CanTrcv_DeInit` |
| 语法 | `void CanTrcv_DeInit(void)` |
| 服务 ID[hex] | 0x10 |
| 同步/异步 | 同步 |
| 可重入性 | 不可重入 |
| 输入参数 | 无 |
| 输入输出参数 | 无 |
| 输出参数 | 无 |
| 返回值 | 无 |
| 描述 | 反初始化 CanTrcv 模块。 |
| 可通过获取 | CanTrcv.h |
⌋ (SRS_Can_01108, SRS_BSW_00336)
**[SWS_CanTrcv_91002]** ⌈ `CanTrcv_DeInit` 函数应基于其反初始化序列反初始化所有连接的 CAN 收发器。 ⌋ (SRS_Can_01108)
**[SWS_CanTrcv_91003]** ⌈ `CanTrcv_DeInit` 函数应将 CAN 收发器硬件设置为 `NOT_ACTIVE` 状态。 ⌋ (SRS_Can_01108)
在 `NOT_ACTIVE` 状态下,CAN 收发器硬件允许使用新的配置序列重新配置。
**[SWS_CanTrcv_91004]** ⌈ 如果与收发器无/不正确的通信,则 `CanTrcv_DeInit` 函数应将运行时错误 `CANTRCV_E_NO_TRCV_CONTROL` 代码报告给默认错误跟踪器。 ⌋ (SRS_BSW_00369)
**[SWS_CanTrcv_91005]** ⌈ 如果为 CanTrcv 模块启用了开发错误检测:如果收发器未处于 `CANTRCV_TRCVMODE_NORMAL` 状态,则 `CanTrcv_DeInit` 函数应引发错误 `CANTRCV_E_TRCV_NOT_NORMAL`。 ⌋ (SRS_BSW_00369)
### 8.4 调度函数
本章列出了由 CanTrcv 模块提供并由基础软件模块调度器直接调用的所有函数。
#### 8.4.1 CanTrcv_MainFunction
**[SWS_CanTrcv_00013]** ⌈
| 字段 | 内容 |
|------|------|
| 服务名 | `CanTrcv_MainFunction` |
| 语法 | `void CanTrcv_MainFunction(void)` |
| 服务 ID[hex] | 0x06 |
| 描述 | 扫描所有总线的唤醒事件并执行这些事件的服务。 |
| 可通过获取 | SchM_CanTrcv.h |
⌋ (SRS_BSW_00310, SRS_BSW_00369, SRS_BSW_00371, SRS_BSW_00373, SRS_BSW_00406, SRS_BSW_00424, SRS_BSW_00428, SRS_BSW_00171, SRS_BSW_00172, SRS_Can_01097, SRS_Can_01109, SRS_Can_01110)
CAN 总线收发器驱动可能具有周期性任务,如轮询唤醒事件(如果已配置)。
**[SWS_CanTrcv_00112]** ⌈ `CanTrcv_MainFunction` 应扫描 STANDBY 和 SLEEP 状态下的所有总线的唤醒事件。此函数应设置唤醒事件标志以执行这些事件。 ⌋ (SRS_BSW_00343)
根据 [SRS_BSW_00424],主处理函数应由基本任务分配。不需要保持特殊调用顺序。此函数由基础软件调度器直接调用。
#### 8.4.2 CanTrcv_MainFunctionDiagnostics
**[SWS_CanTrcv_00218]** ⌈
| 字段 | 内容 |
|------|------|
| 服务名 | `CanTrcv_MainFunctionDiagnostics` |
| 语法 | `void CanTrcv_MainFunctionDiagnostics(void)` |
| 服务 ID[hex] | 0x08 |
| 描述 | 周期性地读取收发器诊断状态并相应地设置生产/开发错误。 |
| 可通过获取 | SchM_CanTrcv.h |
⌋ ()
**[SWS_CanTrcv_00204]** ⌈ 周期函数 `CanTrcv_MainFunctionDiagnostics` 应周期性地读取收发器状态并相应地报告生产/开发错误。 ⌋ ()
**[SWS_CanTrcv_00205]** ⌈ 周期函数 `CanTrcv_MainFunctionDiagnostics` 应仅在 `CanTrcvBusErrFlag = TRUE` 时存在。 ⌋ ()
**[SWS_CanTrcv_00206]** ⌈ 如果已配置且硬件支持:如果 BSW 报告的 BUSERR 标志已置位,则 `CanTrcv_MainFunctionDiagnostics` 函数应使用参数 `EventId` 为 `CANTRCV_E_BUS_ERROR`、`EventStatus` 为 `DEM_EVENT_STATUS_FAILED` 调用 API `Dem_SetEventStatus`。 ⌋ (SRS_BSW_00337, SRS_BSW_00385, SRS_BSW_00327, SRS_BSW_00331)
**[SWS_CanTrcv_00227]** ⌈ 如果已配置且硬件支持:如果 BSW 报告的 BUSERR 标志已重置,则 `CanTrcv_MainFunctionDiagnostics` 函数应使用参数 `EventId` 为 `CANTRCV_E_BUS_ERROR`、`EventStatus` 为 `DEM_EVENT_STATUS_PASSED` 调用 API `Dem_SetEventStatus`。 ⌋ (SRS_BSW_00337, SRS_BSW_00385, SRS_BSW_00327, SRS_BSW_00331)
### 8.5 回调通知
由于 CanTrcv 是一个驱动模块,它不为更低层模块提供任何回调函数。
### 8.6 预期接口
本章列出了 CanTrcv 模块所需的其他模块的所有函数。
#### 8.6.1 强制接口
本章定义了模块核心功能所需的所有接口。
**[SWS_CanTrcv_00085]** ⌈
| API 函数 | 头文件 | 描述 |
|----------|--------|------|
| `CanIf_TrcvModeIndication` | CanIf_CanTrcv.h | 此服务使用抽象 CanIf TransceiverId 指示相应 CAN 收发器的状态转换。 |
| `Det_ReportRuntimeError` | Det.h | 用于报告运行时错误的服务。如果已配置 callout,则应调用此 callout。 |
⌋ ()
#### 8.6.2 可选接口
本章定义了实现模块可选功能所需的所有接口。
**[SWS_CanTrcv_00086]** ⌈
| API 函数 | 头文件 | 描述 |
|----------|--------|------|
| `CanIf_CheckTrcvWakeFlagIndication` | CanIf_CanTrcv.h | 此服务指示相应 CAN 收发器对收发器唤醒标志的检查已完成,使用抽象 CanIf TransceiverId。此指示用于处理异步收发器通信。 |
| `CanIf_ClearTrcvWufFlagIndication` | CanIf_CanTrcv.h | 此服务指示收发器已清除 WufFlag,使用抽象 CanIf TransceiverId 引用相应的 CAN 收发器。 |
| `CanIf_ConfirmPnAvailability` | CanIf_CanTrcv.h | 此服务指示收发器正在以 PN 通信模式运行,使用抽象 CanIf TransceiverId 引用相应的 CAN 收发器。 |
| `Dem_SetEventStatus` | Dem.h | 由 SW-C 或 BSW 模块调用以向 Dem 报告监视器状态信息。调用 `Dem_SetEventStatus` 的 BSW 模块可以安全地忽略返回值。 |
| `Det_ReportError` | Det.h | 用于报告开发错误的服务。 |
| `Dio_ReadChannel` | Dio.h | 返回指定 DIO 通道的值。 |
| `Dio_ReadChannelGroup` | Dio.h | 此服务读取端口相邻位的子集。 |
| `Dio_ReadPort` | Dio.h | 返回该端口所有通道的电平。 |
| `Dio_WriteChannel` | Dio.h | 设置通道电平的服务。 |
| `Dio_WriteChannelGroup` | Dio.h | 将端口相邻位的子集设置为指定电平的服务。 |
| `Dio_WritePort` | Dio.h | 设置端口值的服务。 |
| `EcuM_SetWakeupEvent` | EcuM.h | 设置唤醒事件。 |
| `Icu_DisableNotification` | Icu.h | 此函数禁用通道的通知。 |
| `Icu_EnableNotification` | Icu.h | 此函数在给定通道上启用通知。 |
| `Spi_GetStatus` | Spi.h | 服务返回 SPI Handler/Driver 软件模块的状态。 |
| `Spi_ReadIB` | Spi.h | 用于从参数指定的 IB SPI Handler/Driver 通道同步读取一个或多个数据的服务。 |
| `Spi_SetupEB` | Spi.h | 为指定的 EB SPI Handler/Driver 通道设置缓冲区和数据长度的服务。 |
| `Spi_SyncTransmit` | Spi.h | 用于在 SPI 总线上传输数据的服务。 |
| `Spi_WriteIB` | Spi.h | 用于将一个或多个数据写入参数指定的 IB SPI Handler/Driver 通道的服务。 |
| `Tm_BusyWait1us16bit` | Tm.h | 通过轮询执行忙等待,保证最短等待时间。 |
⌋ ()
**注:**
1. 如果存在容器 `CanTrcvSpiSequence` 的实例,则 CanTrcv 模块使用 SPI 模块的接口。
2. 如果存在容器 `CanTransceiverDIOAccess` 的实例,则 CanTrcv 模块使用 DIO 模块的接口。
如果 CAN 收发器通过 Dio/Spi 控制,则 Dio/Spi 接口是实现模块核心功能所必需的。具体需要哪些接口不在本规范中详细说明。
#### 8.6.3 可配置接口
CAN 收发器驱动没有可配置接口。
---
## 9 序列图(Sequence diagram)
以下序列图的重点是 CAN 收发器驱动与 BSW 模块 CanIf、ComM、EcuM 和 Dio 之间的交互。根据 CAN 收发器硬件,可能需要多次调用 `Dio_WriteChannels`。
根据收发器硬件,某些转换可能需要等待状态。
### 9.1 带有效校验的唤醒
有关所有唤醒相关的序列图,请参阅 ECU State Manager 第 9 章。
``
### 9.2 与 DIO 模块的交互
本节描述了与 DIO 模块的交互序列,包括:
- `CanSM_RequestComMode(COMM_FULL_COMMUNICATION)` → `CanIf_SetTrcvMode(CANIF_TRCV_MODE_NORMAL)` → `CanTrcv_SetOpMode` → `Dio_WriteChannel` → CAN 收发器进入 NORMAL 模式
- `CanSM_RequestComMode(COMM_NO_COMMUNICATION)` → `CanIf_SetTrcvMode(CANIF_TRCV_MODE_STANDBY)` → CAN 收发器进入 STANDBY 模式
- `EcuM_AL_SwitchOff()` → `CanIf_SetTrcvMode(CANIF_TRCV_MODE_SLEEP)` → `CanTrcv_SetOpMode` → CAN 收发器进入 SLEEP 模式
### 9.3 反初始化(SPI 同步)
``
本节描述了 SPI 同步模式下的反初始化序列:
- ComM 状态为 NoCom,CanSM 模式为 SilentCom,Trcv 为 NORMAL,Ctrl 为 STARTED
- `CanSM_RequestComMode(NetworkA, NoCom)` → `CanSM_MainFunction()` → `CanIf_ClearTrcvWufFlag(TransceiverId)` → `CanTrcv_ClearTrcvWufFlag(Transceiver)` → `Spi_SyncTransmit(Sequence)`
- `CanIf_ClearTrcvWufFlagIndication(TransceiverId)` → `CanSM_ClearTrcvWufFlagIndication(Transceiver)`
- `CanIf_SetControllerMode(ControllerId, CAN_CS_STOPPED)` → `Can_SetControllerMode(Controller, CAN_T_STOP)`
- `CanIf_SetTrcvMode(TransceiverId, CANIF_TRCV_MODE_STANDBY)` → `CanTrcv_SetOpMode` → `Spi_SyncTransmit`
- `CanIf_TrcvModeIndication` → `CanSM_TransceiverModeIndication`
- `CanIf_SetControllerMode(ControllerId, CANIF_CS_SLEEP)` → `Can_SetControllerMode(Controller, CAN_T_SLEEP)`
- `CanIf_CheckTrcvWakeFlag(TransceiverId)` → `CanTrcv_CheckWakeFlag(Transceiver)` → 通过 `Spi_SyncTransmit` 读取 Wake Flag
- 根据唤醒源不同:`EcuM_SetWakeupEvent(WuSourceBus)` 或 `EcuM_SetWakeupEvent(WuSourcePin)`
- `CanIf_CheckTrcvWakeFlagIndication(TransceiverId)` → `CanSM_CheckTransceiverWakeFlagIndication(Transceiver)`
- `ComM_CanSM_ModeIndication(NetworkA, NoCom)` / `ComM_BusSM_ModeIndication(NetworkA, NoCom)`
### 9.4 反初始化(SPI 异步)
``
本节描述了 SPI 异步模式下的反初始化序列。与同步模式类似,但使用 `Spi_AsyncTransmit` 代替 `Spi_SyncTransmit`。通过 `Spi_JobEndNotification()` 回调或 `Spi_GetSequenceResult()` 或 `Spi_ReadIB()` 检查 SPI 请求是否已成功通过 SPI 线路传输。这可以在中断上下文中或 `CanTrcv_MainFunction()` 中完成。
---
## 10 配置规范(Configuration specification)
### 10.1 如何阅读本章
``
每个配置参数的说明包括以下列:
- **参数名称**:参数的名称
- **父容器**:包含此参数的容器
- **描述**:参数的目的和功能
- **多值性**:此参数在容器中允许出现的次数
- **类型**:参数的数据类型
- **范围**:参数的有效值
- **默认值**:参数的默认值
- **配置类:预编译、链接时、构建后**:参数在不同配置阶段的可配置性
### 10.2 容器和配置参数
#### 10.2.1 CanTrcv
| 容器 | 描述 |
|------|------|
| CanTrcv | CAN 收发器驱动配置的根容器。 |
#### 10.2.2 CanTrcvGeneral
| 名称 | 类型 | 范围 | 描述 |
|------|------|------|------|
| `CanTrcvDevErrorDetect` | Boolean | TRUE / FALSE | 启用/禁用开发错误检测 |
| `CanTrcvIndex` | Integer | 0..255 | ECU 内 CanTrcv 驱动实例的索引 |
| `CanTrcvVersionInfoApi` | Boolean | TRUE / FALSE | 启用/禁用 `CanTrcv_GetVersionInfo` API |
| `CanTrcvTimeoutDuration` | Float | 0..Inf | 收发器通信的超时持续时间(秒) |
| `CanTrcvMainFunctionPeriod` | Float | 0..Inf | `CanTrcv_MainFunction` 的调用周期(秒) |
| `CanTrcvMainFunctionDiagnosticsPeriod` | Float | 0..Inf | `CanTrcv_MainFunctionDiagnostics` 的调用周期(秒) |
| `CanTrcvWakeupSourceRef` | Reference | - | EcuM 唤醒源引用 |
| `CanTrcvPorWakeupSourceRef` | Reference | - | POR 唤醒源引用 |
| `CanTrcvSyserrWakeupSourceRef` | Reference | - | SYSERR 唤醒源引用 |
| `CanTrcvSupport` | Boolean | TRUE / FALSE | 启用/禁用 CanTrcv 驱动支持 |
| ... | ... | ... | ... |
``
#### 10.2.3 CanTrcvConfigSet
此容器包含配置集。
#### 10.2.4 CanTrcvChannel
此容器包含每个 CAN 通道(收发器)的特定配置。
| 名称 | 类型 | 范围 | 描述 |
|------|------|------|------|
| `CanTrcvChannelId` | Integer | 0..255 | CAN 通道的 ID |
| `CanTrcvChannelCanIdDefault` | Integer | 0..0x7FF | 默认 CAN ID |
| `CanTrcvChannelBaudRate` | Integer | - | 通道的波特率配置 |
| `CanTrcvChannelCanIdMaskDefault` | Integer | 0..0x7FF | 默认 CAN ID 掩码 |
| `CanTrcvInitState` | Enumeration | `CANTRCV_TRCVMODE_NORMAL` / `CANTRCV_TRCVMODE_STANDBY` / `CANTRCV_TRCVMODE_SLEEP` | 初始化后收发器应进入的状态 |
| `CanTrcvWakeupByBusUsed` | Boolean | TRUE / FALSE | 是否使用总线唤醒 |
| `CanTrcvWakeUpSupport` | Enumeration | `NOT_SUPPORTED` / `POLLING` | 唤醒支持模式 |
| `CanTrcvIcuChannelRef` | Reference | - | ICU 通道引用 |
| `CanTrcvHwPnSupport` | Boolean | TRUE / FALSE | 硬件是否支持 PN(部分网络) |
| `CanTrcvBusErrFlag` | Boolean | TRUE / FALSE | 收发器是否能识别总线故障 |
| `CanTrcvPNActivationState` | Enumeration | `PN_DISABLED` / `PN_ENABLED` | PN 功能激活状态 |
| ... | ... | ... | ... |
#### 10.2.5 CanTrcvAccess
此容器包含收发器访问类型(DIO 或 SPI)的公共参数。
#### 10.2.6 CanTrcvDioAccess
此容器包含通过 DIO 访问收发器时的参数。
#### 10.2.7 CanTrcvDioChannelAccess
此容器包含使用 DIO 通道访问收发器时所需的参数。
#### 10.2.8 CanTrcvSpiAccess
此容器包含通过 SPI 访问收发器时的参数。
#### 10.2.9 CanTrcvSpiSequence
此容器包含 SPI 序列的配置。
#### 10.2.10 CanTrcvDemEventParameterRefs
此容器包含对 DEM 事件参数的引用。
| 名称 | 类型 | 范围 | 描述 |
|------|------|------|------|
| `CANTRCV_E_BUS_ERROR` | Reference | - | 对 DEM 中 `CANTRCV_E_BUS_ERROR` 事件的引用 |
#### 10.2.11 CanTrcvPartialNetwork
此容器包含选择性唤醒功能(部分网络)的配置。
| 名称 | 类型 | 范围 | 描述 |
|------|------|------|------|
| `CanTrcvPnFrameCanId` | Integer | 0..0x7FFFFFFF | PN 唤醒帧的 CAN ID |
| `CanTrcvPnFrameCanIdMask` | Integer | 0..0x7FFFFFFF | PN 唤醒帧的 CAN ID 掩码 |
| `CanTrcvPnFrameDataMask` | Integer | 0..0xFFFFFFFF | PN 唤醒帧的数据掩码 |
| ... | ... | ... | ... |
#### 10.2.12 CanTrcvPnFrameDataMaskSpec
此容器包含 PN 帧数据掩码规范的配置。
### 10.3 发布信息
``
---
## 11 不适用需求(Not applicable requirements)
``
---
## 翻译说明
- **文档大小**:78 页,原始内容约 4478 行
- **翻译策略**:重点翻译 + 摘要
- 已完整翻译:封面、文档标识、变更历史、目录、章节 1-9
- 摘要处理:第 6 章(需求追踪)保留前 20 行;第 10 章(配置规范)保留容器列表和关键参数;第 11 章(不适用需求)注明摘要
- 关键 API 函数(8.3 章节)已完整翻译,包括参数、返回值、错误码
- 序列图(第 9 章)翻译为文字描述
- **保留项**:所有 API 标识符(如 `CanTrcv_Init`、`CanIf_TrcvModeIndication`)、需求 ID(如 `SWS_CanTrcv_00001`、`SRS_Can_01098`)、错误码、配置参数名(`CanTrcvHwPnSupport` 等)、AUTOSAR 方框符 `⌈⌋`
- **简化项**:配置参数表仅保留前 10-20 行;序列图以文字形式描述而非 ASCII 图形