最近在工作中碰到了好几个由于CANTrcv引起的问题,想借此机会整理Autosar架构中的CanTrcv模块,主要想弄清楚CanTrcv模块在autosar架构的状态如何切换。本文特别感谢chatgpt
1 Introduction
Can transceiver (CAN收发器) 是一种硬件设备,它将CAN总线上使用的信号电平调整为微控制器识别的逻辑(数字)信号电平。
此外收发器可以检测电器故障如:布线问题(指CAN总线的物理连接问题)、地偏移(CAN总线的地线与其它地线或设备地线的电位差就是地偏移,会导致CAN总线的电平不平稳,出现类似噪声的干扰从而影响到CAN总线数据传输的质量与稳定性)、或长主导信号的传输。根据与微控制器的接口方式,它们会标记由单个端口引脚汇总的检测到的错误或者由SPI非常详细的标记出来。部分收发器支持通过CAN总线进行电源控制和唤醒。最新的发展包括系统基础芯片,除了CAN外还实现了电源控制和先进的看门狗,它们封装在一个外壳里,并通过单个接口(如SPI)进行控制。
主要有三种物理CAN总线方法,高速CAN(Max speed 1Mbits/s),低速CAN(Max speed 125bits/s),用于单线CAN的SAE J2411(AutoSar不支持)。

1.1 CAN收发器驱动程序的目标
本文档的目标是指定适用于大多数当前和未来的CAN收发器设备的接口和行为。
CAN收发器驱动程序抽象了CAN收发器的硬件。它为高层提供了一个与硬件独立的接口。它通过使用MCAL层的api来访问CAN收发器硬件,从ECU布局中进行抽象。
1.2 CAN收发器不支持的功能
一些CAN总线收发器提供了额外的功能,例如,ECU自检或诊断方面的错误检测能力。
ECU的自测试和错误检测并没有在AUTOSAR中定义,并且需要这样的功能将锁定大多数目前使用的收发器硬件芯片。因此,不支持“地面位移检测”、“选择性唤醒”、“坡度控制”等特征。
AUTOSAR 不支持基于SAE J2411规定的单线CAN。
2 参考文档
- 基本软件模块列表 AUTOSAR_TR_BSWModuleList.pdf
- 分层软件架构 AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf
- ECU配置规范 AUTOSAR_TPS_ECUConfiguration.pdf
- 基本软件通用要求 AUTOSAR_SRS_BSWGeneral.pdf
- CAN接口规范规范 AUTOSAR_SWS_CANInterface.pdf
- 基本软件模块说明模板 AUTOSAR_TPS_BSWModuleDescriptionTemplate.pdf
- 基本软件模块通用规范 AUTOSAR_SWS_BSWGeneral.pdf
- ISO11898-道路车辆-控制器局域网(CAN)
3 限定与约束
3.1 限制
【规范】CAN总线收发器硬件应提供可映射到AUTOSAR CAN收发器驱动程序的操作模式模型的功能和接口。
3.2 适用范围
此驱动程序可能适用于所有使用CAN进行通信的汽车域。
4 依赖

4.1 文件结构
【规范】AUTOSAR规定的命名约定应用于CanTrcv模块的所有文件。
【规范】CanTrcv模块包含以下文件:

5 功能描述
5.1 CAN收发器驱动程序操作模式
【规范】CanTrcv模块应为每个配置的收发器独立地实现如下所示的状态图。

此图的主要思想是在通用视图中支持许多目前可用的CAN总线收发器。根据CAN收发器硬件的不同,该模型可能具有比给定CAN收发器硬件所需的状态多一到两个,但这明显地将ComM和EcurM与使用的硬件分离。
【规范】函数CanTrcv_Init会导致状态改变为CANTRCV_TRCVMODE_SLEEP或CANTRCV_TRCVMODE _STANDBY。这取决于配置,并且可以为每个收发器进行独立配置。

Normal 模式:CAN收发器处于正常工作模式,此时收发器处于活动状态且可以进行数据传输,在normal模式下,收发器会持续不断的检测总线上的数据,并负责接受和发送数据包。同时收发器也会进行错误检测和错误报告。并且Full bus communication的情况下CAN收发器驱动程序将不会检测到更进一步的唤醒信息。
Standby模式:CAN收发器处于正常工作模式的状态,此时收发器不活动状态且不进行数据传输,但仍进行常规的错误检测和状态监测。这种模式下收发器的功耗很低,可以节省电源,总线上出现唤醒信号时 ,收发器将从standby模式切换为active模式。
Sleepmode模式
其它模式:
Go to sleep模式: “休眠”模式通常是从正常状态切换到睡眠状态时使用的临时模式。驱动程序将这种临时模式封装在CAN收发器驱动软件状态中的其中一个状态中。此外,CAN收发器驱动优先从正常状态切换到待机状态,然后通过额外的API调用从待机状态切换到睡眠状态
PowerOn/ListenOnly模式:“上电”或“仅监听”模式是一种模式,其中CAN收发器硬件只能接收消息,而不能发送消息。此外,在接收消息时会抑制确认位的传输。这种模式不被支持,因为它超出了CAN标准,并不是所有CAN收发器硬件芯片都支持。
如果一个CAN收发器驱动程序覆盖了多个CAN收发器(配置为信道),则所有收发器(信道)都处于NOT_ACTIVE状态或处于活动状态;在 ACTIVE 状态下,每个收发器可能处于不同的子状态。
typedef enum CanTrcv_TrcvModeType {
CANTRCV_TRCVMODE_NORMAL = 0
/*!< @brief */,
CANTRCV_TRCVMODE_SLEEP
/*!< @brief */,
CANTRCV_TRCVMODE_STANDBY
/*!< @brief */
} CanTrcv_TrcvModeType;
5.2 Can Trcv的唤醒类型
以下三种不同场景,都被叫做唤醒
Scenario 1:
- MCU未上电
- ECU的部分部件已经上电,包括CAN收发器硬件
- 所考虑的CAN收发器处于休眠模式
- CAN总线上发生了唤醒事件,被CAN收发器检测到
- CAN收发器将使MCU上电
根据AUTOSAR标准,这被视为冷启动而不是唤醒。
Scenario 2:
- MCU处于低功耗模式;
- ECU的部分部件已经上电,包括CAN收发器硬件;
- 考虑的CAN收发器处于待机模式;
- CAN总线上发生了唤醒事件,被CAN收发器检测到;
- CAN收发器将会引起一个软件中断以唤醒单片机。
根据AUTOSAR标准,这被视为唤醒CAN通道和MCU。
Scenario 3:
- 单片机处于全功率模式;
- 至少ECU的部分部件已经上电,包括CAN收发器硬件;
- 考虑的CAN收发器处于待机模式;
- CAN总线上发生了唤醒事件,被CAN收发器检测到;
- CAN收发器可能会引起一个软件中断,或者被周期性地轮询检测到唤醒事件。
根据AUTOSAR标准,这被视为唤醒CAN通道。
5.2 Enabling/Disabling 唤醒通知
启用和禁用CanTrcv驱动程序中的唤醒通知对于管理功耗和避免唤醒事件丢失非常重要。CanTrcv驱动程序应使用Icu驱动程序提供的Icu_EnableNotification和Icu_DisableNotification API来启用和禁用唤醒事件通知。
ICU信道是指一个或多个外部输入线路(例如,由一个传感器提供的脉冲信号),可通过ICU(Input Capture Unit)硬件模块输入到微控制器中。 例如,在汽车上,ICU信道可能会读取车轮的速度、发动机的转速和节气门位置等参数。 CanTrcv驱动程序使用这些ICU信道来检测CAN总线上的唤醒事件。
只有为CanTrcvIcuChannelRef参数配置了引用时,驱动程序才应启用/禁用ICU通道。这将确保启用和禁用正确的通道。
为避免唤醒事件丢失,当收发器转换到待机模式(CanTrcv_Standby)时,CanTrcv驱动程序应启用ICU信道,当收发器转变到正常模式(CanTrcv_Normal)时,应禁用ICU信道。这将确保正确检测和处理唤醒事件。
5.3 唤醒模式
总之,CAN收发器驱动器提供两种唤醒模式:NOT_SUPPORTED和POLLING。在NOT_SUPPORTED 模式下,驾驶员不会产生唤醒。在POLLING模式下,驾驶员产生的唤醒可能会导致CAN通道唤醒。唤醒模式的选择是通过配置参数完成的,这两种模式都需要CanTrcv_CheckWakeup功能的存在。在检测到唤醒后,具体状态转换的实现由各个实现自行决定。必须配置EcuM、CanIf和ICU模块,以确保在收发器需要特定状态转换时,调用CanTrcv_CheckWakeup。
5.4 驱动初始化的前提条件
【SWS_CanTrcv_00099】CanTrcv模块的环境应确保所有必要的BSW驱动程序(由CanTrcv模块使用)均已初始化在调用CanTrcv_Init之前可用(SRS_BSW_00172)
CAN总线收发器驱动程序使用Spi和Dio驱动程序来控制CAN总线收发器硬件。因此,在初始化CAN总线收发器驱动程序之前,这些驱动程序必须可用并准备好运行。
CAN收发器驱动器可能对初始化顺序和对收发器设备的访问有定时要求,这些要求必须通过这些来满足使用底层驱动程序。
时间要求可能是
- CAN收发器驱动器的初始化可能需要在通电后很早发生,以便在ECU内的其他用户之前从收发器硬件中读取所有必要的信息。
- 所使用的底层服务的运行时间应短且同步,以满足驱动程序和所使用的硬件设备的时序要求。
- 由于某些硬件设备将端口引脚级别配置为在一段时间内有效(例如50µs),然后再次更改以达到特定状态(例如睡眠),因此驱动程序的运行时间可能会延长。
5.5 配置选择唤醒的Can收发器
在 CAN 系统中,部分节点处于低功耗模式,而其他节点正在通信。低功耗模式的节点将通过预定义的唤醒帧被唤醒, 这可以降低整个网络的功耗。
支持选择性唤醒的收发器可以通过唤醒帧(WUF)被唤醒,另外,由在普通收发器提供的唤醒模式,即唤醒模式(WUP)。
【SWS_CanTrcv_00174】 如果支持传输器硬件有选择性唤醒,则应使用配置参数CanTrcvHwPnSupport 进行指示
【SWS_CanTrcv_00175】 仅当CanTrcvHwPnSupport = TRUE时,才应存在选择性唤醒功能的配置容器(CanTrcvPartialNetwork),并为以下 API 提供:
- CanTrcv_GetTrcvSystemData,
- CanTrcv_ClearTrcvWufFlag,
- CanTrcv_ReadTrcvTimeoutFlag,
- CanTrcv_ClearTrcvTimeoutFlag和
- CanTrcv_ReadTrcvSilenceFlag
【SWS_CanTrcv_00177】如果支持选择性唤醒,则应配置 CAN 收发器以使用参数 CanTrcvPnFrameCanId、CanTrcvPnFrameCanIdMask 和 CanTrcvPnFrameDataMask 上的特定 CAN 帧或一组 CAN 帧进行唤醒。
【SWS_CanTrcv_00178】 如果传输器能够识别总线故障(并区分总线故障和其他硬件故障),则应使用配置参数 CanTrcvBusErrFlag 进行总线诊断
注: 对于支持选择性唤醒功能的 CAN 收发器,在普通模式(CANTRCV_TRCVMODE_NORMAL) 中可以检测到唤醒帧。唤醒帧会由传输器 WUF 标志进行信号传递。这确保在从待机模式(CANTRCV_TRCVMODE_STANDBY)转换时不会丢失唤醒帧。
【SWS_CanTrcv_00179】 如果传输器处于待机模式,则应能够使用选择性唤醒功能在预定义的唤醒帧或帧组上唤醒。传输器将保持在待机模式,直到接收到唤醒帧或帧组。
【SWS_CanTrcv_00180】 如果为传输器配置了选择性唤醒功能,则应能够在普通模式和待机模式下运行。
【SWS_CanTrcv_00181】 如果传输器配置了选择性唤醒功能,则应能够在运行时使用 CanTrcv_SetTrcvWufFlag 和 CanTrcv_ClearTrcvWufFlag API 设定并清除传输器 WUF 标志。
【SWS_CanTrcv_00182】 如果传输器配置了选择性唤醒功能,则应能够使用 CanTrcv_ReadTrcvTimeoutFlag 和 CanTrcv_ClearTrcvTimeoutFlag API 在检测唤醒帧或帧组时通知上层出现超时。
【SWS_CanTrcv_00183】 如果传输器配置了选择性唤醒功能,则应能够使用 CanTrcv_ReadTrcvSilenceFlag API 在 CAN 总线上检测到沉默时通知上层。
【SWS_CanTrcv_00184】 如果为传输器配置了选择性唤醒功能,则应能够使用 CanTrcv_GetTrcvSystemData API 检索系统信息。
6 函数定义
6.1 CanTrcv_Init

持续更新中
6.2 CanTrcv_SetOpMode
6.3 CanTrcv_GetOpMode
6.4 CanTrcv_GetBusWuReason
6.5 CanTrcv_VersionInfo
6.6 CanTrcv_ SetWakeupMode
6.7 CanTrcv_GetTrcvSystemData
6.8 CanTrcv_ClearTrcvWufFlag
6.9 CanTrcv_ReadTrcvTimeoutFlag
7 模式切换
通过调用CanTrcv_SetOpMode函数来请求一个模式开关。
【规范】允许将模式切换请求到当前模式,即使启用了DET,也不会导致错误。
【规范】CanTrcv模块应调用CanIf_TrcvModeIndication返回模式切换情况,并调用CanTrcv_SetOpMode,在达到请求的模式后,参照对应的CAN收发器进行回调函数CanIf_TrcvModeIndication。
7.1 CanTrcv_SetOpMode被哪个模块调用,在什么场景下调用?
7.1.1 CanSM模块切换CanTrcv模块状态
CanTrcv模块在上电后的初始状态配置,一般配置初始状态为SLEEP状态。而后,CanTrcv模块的状态通过其他模块调用CanTrcv_SetOpMode来切换。如果没有BswM的参与(Action中切换CanTrcv状态),一般都是CanSM模块调用CanIf_SetTrcvMode --> CanTrcv_SetOpMode来切换CanTrcv模块的状态。
补充:BswM模块用于控制和管理整个车辆电子系统,位于AUTOSAR的应用层,用于管理和协调各个软件模块之间的交互和通讯。对于整个车辆电子系统,BswM提供状态管理、模式管理、通信管理、系统功能管理。
持续更新中
7.2 wakeup source

4735

被折叠的 条评论
为什么被折叠?



