AutoSAR实战:CANIF模块深度详解
AutoSAR实战:CANIF模块深度详解
本文围绕 AUTOSAR 23-11 中的 CAN 接口模块(CanIf)展开,从架构定位、关键概念到数据流与 API 设计进行系统梳理。首先说明 CanIf 作为 Com 服务层与底层 CanDrv 之间的抽象接口,集中实现与硬件无关的通信逻辑,让 CanDrv 专注具体控制器操作。文中详细解释了 L-PDU/L-SDU、HOH/HRH/HTH、CAN Hardware Unit、Hardware Object 等基础术语,并说明 HRH/HTH 如何作为对 CAN 邮箱的抽象引用,将上层 PDU 与底层硬件对象解耦。随后介绍 CanIf 对静态 L-PDU 的管理、BasicCAN 与 FullCAN 的区别及其在硬件过滤与软件过滤中的作用,以及通过 CanIfHthCfg/CanIfHrhCfg、软件过滤器和 ID 范围/掩码机制,将接收的 CanId 映射到正确的 Rx L-PDU。文中进一步从初始化入手,说明 EcuM、CanSm、CanDrv、CanTrcv 与 CanIf 的协同关系,并重点展开发送与接收数据流:包括 CanIf_Transmit 的处理步骤、发送缓冲策略、触发发送(TriggerTransmit)、TxConfirmation 的中断/轮询两种调用路径,以及 RxIndication 后的软件过滤、数据长度检查、接收缓存和读取接口(CanIf_ReadRxPduData/ReadTx/RxNotifStatus)。在此基础上,文章还系统讲解了控制器模式与 PDU 通道模式(CANIF_OFFLINE、TX_OFFLINE、TX_OFFLINE_ACTIVE、ONLINE)的联动机制,BusOff 处理、轮询模式、多 CanDrv 支持、部分网络(PN)下的 PnTxFilter 行为,以及唤醒检测与唤醒验证流程。最后,以接口列表的形式对 CanIf 提供的各类服务函数和回调(控制器/收发器模式控制、波特率切换、错误计数与错误上报、时间戳与总线镜像等)进行了归纳,为读者理解 RTA-CAR 中 CanIf 的实现、配置要点和与上下游模块的交互关系提供了一份较完整的参考。
本文件旨在描述 CanIf BSW 模块的功能。本文件面向 RTA-CAR 在 AUTOSAR 23-11 版本中对 CanIf 的实现。具体请参考 AUTOSAR CP R23-11 中的《Specification of CAN Interface》(AUTOSAR_CP_SWS_CANInterface.pdf)。本文件在阐述过程中会引用 AUTOSAR 标准,但并不替代该标准,建议读者在阅读本应用说明的同时,也阅读 AUTOSAR 标准本身。

什么是 CanIf
CAN 接口模块(CAN Interface)包含了属于相应 ECU 的 CAN 通信设备驱动(CanDrv)的所有与 CAN 硬件无关的任务。这些功能只在 CanIf 模块中实现,从而底层 CAN 设备驱动只需专注于访问和控制对应的具体 CAN 硬件设备。这样,上层模块就可以通过 CanIf 作为抽象接口来访问 CAN 驱动。如上图所示,CanIf 位于 Com 服务层与 Com 驱动层之间。
缩略语和缩写(Acronyms and Abbreviations)
- CAN L-Pdu:CAN 协议数据单元(CAN Protocol Data Unit)。由标识符、数据长度和数据(SDU)组成,对 CAN 驱动可见。
- CAN L-SDU:CAN 服务数据单元(CAN Service Data Unit)。在 CAN L-PDU 内部传输的数据,对 CAN 接口的上层模块可见(例如 Pdu Router)。
- HOH:CAN 硬件对象句柄(CAN hardware object handle)。
- HRH:CAN 硬件接收句柄(CAN hardware receive handle)。
- HTH:CAN 硬件发送句柄(CAN hardware transmit handle)。
- SDT:SDU 类型(SDU type)。
- SDU:服务数据单元(service data unit)。
- CAN Hardware Unit:CAN 硬件单元。一个 CAN 硬件单元可以由一个或多个同类型的 CAN 控制器,以及一个、两个或多个 CAN RAM 区组成。CAN 硬件单元可以是片上或外部器件。一个 CAN 硬件单元由一个 CAN 驱动(CanDrv)表示。
- Hardware Object(HW Object):硬件对象。定义为位于 CAN 硬件单元 / CAN 控制器的 CAN RAM 内部的一个 PDU 缓冲区。
硬件对象句柄(Hardware Object Handles, HOHs)
用于发送(HTH)和接收(HRH)的 HOH 表示对 CAN 邮箱(Mailbox)的抽象引用,该邮箱中包含与 CAN 相关的数据,例如 CanId、DLC 和数据。
HOH 作为参数用于调用 CanDrv 的接口服务,由 CanDrv 的配置提供,并由 CanDrv 用作通信缓冲区和 CAN 邮箱的标识符。
CanIf 只作为 HOH 的使用者,而不会根据硬件信息去解释它,因此保持对硬件无依赖性(例如不会直接访问硬件特定的缓冲区,而是仅通过 CanDrv 的服务访问缓冲区)。
每个 CAN 控制器可以在一个邮箱中提供多个发送硬件对象,这些对象可以逻辑上链接到一个硬件对象池(复用硬件对象,Multiplexed Hw Objects),从而可以通过一个 HTH 进行寻址。
CanIf 使用两种 HOH 来访问 CanDrv:HTH 和 HRH。
HRH
HRH 是一个句柄,用于引用 CAN 控制器邮箱中的一个逻辑硬件接收对象(Hardware Receive Object)。
HRH 使 CanIf 能够在所引用的接收单元上使用 BasicCAN 或 FullCAN 接收方式,并向目标上层模块指示一个已接收的 L-SDU。
如果 HRH 引用的是配置为 BasicCAN 接收方式的接收单元,则必须在 CanIf 中启用软件过滤。
如果使用多个 HRH,每个 HRH 至少应属于单个或固定的一组 Rx L-SDU(CanRxPduIds)。
一个 HRH 可以配置为接收:
- 单个 CanId(FullCAN)
- 一组离散的 CanId(BasicCAN)
- 一段 / 范围内的 CanId(BasicCAN)
- 所有 CanId。
HTH
HTH 是一个句柄,用于引用 CAN 控制器邮箱中的一个逻辑硬件发送对象(Hardware Transmit Object)。
HTH 使 CanIf 能够在所引用的发送单元上使用 BasicCAN 或 FullCAN 发送方式,并向目标上层模块确认一个已发送的 L-SDU。
每个 CanIf Tx L-PDU 在配置时都应静态地分配给一个 CanIfBufferCfg 配置容器。
如果使用多个 HTH,每个 HTH 应属于一个单独或固定的一组 Tx L-PDU(CanTxPduIds)。
专用的 HRH 和 HTH 是根据 CanDrv 配置集派生的。HTH/HRH 以及硬件对象的定义由 CanDrv 决定。
静态 L-PDU(Static L-Pdu’s)
CanIf 支持对属于某个 CAN 控制器的所有 L-PDU 的发送与接收进行激活和去激活。
每个 L-PDU 都与一个上层模块相关联,以确保在接收、发送确认和数据访问过程中能够正确分发。
CAN 硬件单元(Can Hardware Unit)
CAN 硬件单元将一个或多个同类型的 CAN 控制器模块组合在一起,这些控制器可以是片上模块,也可以是外部独立设备。每个 CAN 硬件单元由一个 CanDrv 驱动。
如果使用不同类型的 CAN 控制器,则必须使用不同类型的 CanDrv,并通过统一的 API 暴露给 CanIf。
CanIf 在配置阶段收集关于 CAN 控制器数量、类型及其硬件对象的信息。这使得上层模块可以通过 HOH 对 CAN 控制器进行透明且硬件无关的访问。
BasicCAN 与 FullCAN(BasicCan and FullCan)
对于 CAN XL 硬件,访问帧的方式完全不同:通过描述符和队列进行操作,类似于以太网,因此以下内容不适用于 CAN XL。
CanIf 在激活软件接收过滤时,区分 BasicCAN 和 FullCAN 处理方式。
用于 FullCAN 的 CAN 邮箱(硬件对象)仅支持单个 CanId 的收发。相应地,在 BasicCAN 模式下,一个硬件对象可以发送或接收一个范围内的 CanId。
当硬件接收对象被配置为 BasicCAN 接收方式时,它可以接收通过其硬件接收过滤器的某个范围内的 CanId。该范围可能超出该 HRH 预定义要接收的 Rx L-PDU 列表。因此,CanIf 需进一步执行软件过滤,仅将预定义的 Rx L-PDU 列表传递到相应的上层模块。
CanIf 通过配置容器 CanIfHthCfg 和 CanIfHrhCfg 为所有 HOH 配置和排序 HTH 和 HRH。
CanIf 通过配置参数 CanIfHthIdSymRef 和 CanIfHrhIdSymRef 为每个 HOH 引用一个硬件接收过滤器。
CanIf 允许为每个 BasicCAN 类型的 HRH 配置并保存一个软件接收过滤器,这一软件过滤器由参数 CanIfHrhSoftwareFilter 配置。
当回调函数 CanIf_RxIndication() 返回某个 HRH 时,CanIf 需要为该 HRH 执行软件接收过滤。
初始化(Initialisation)
EcuM 会调用函数 CanIf_Init 来初始化 CanIf。在初始化过程中,所有全局变量和数据结构(包括标志位和缓冲区)都会被初始化。
EcuM 会分别调用各自的初始化函数来初始化 CanDrv 和 CanTrcv。
如果在运行时需要对整个 CAN 模块进行重新初始化,EcuM 应调用 CanSm,通过调用 CAN 接口模块的 API 服务 CanIf_SetControllerMode 来触发所需的 CAN 控制器状态转换。随后 CanIf 会将来自 CanSm 的调用映射为对相应 CanDrv 的调用。
发送请求(Transmit Requests)

CanIf 的发送请求函数 CanIf_Transmit 是上层模块在 CAN 网络上发送 L-PDU 的统一接口。上层模块只能通过 CanIf 的服务发起发送请求。
当 CanDrv 能够成功将 L-PDU 数据写入 CAN 硬件发送对象时,发送请求才算成功完成。
在调用 CanIf_Transmit 时,CanIf 会执行以下操作:
- 检查 CanIf 的初始化状态。
- 标识目标 CanDrv。
- 确定用于访问 CAN 硬件发送对象的 HTH。
- 调用 CanDrv 中的 Can_Write 或 CanXL_Write。
当发送成功时,CanIf_Transmit 返回 E_OK。
发送缓冲(Transmit Buffering)
一般行为(General Behavior)
在 CanIf 的视角下,发送过程从调用 CanIf_Transmit 开始,到上层模块的回调通知(…_TxConfirmation)被调用结束。
在发送过程中,CanIf、CanDrv 和 CAN 邮箱会在任何时刻仅在一个位置存储待发送的 L-PDU。根据发送方式的不同,这个位置可能是:
- CAN 硬件发送对象,或
- 如果启用了发送缓冲,则是 CanIf 内部的发送 L-PDU 缓冲区。
对于触发发送(Triggered Transmission),CanIf 只存储 L-PDU 的发送请求,而不存储数据本身,因为数据会在 HTH 空闲时通过 TriggerTransmit 函数“按需”获取。请记住,每个请求发送的 L-PDU 在整个流程中只会存储一次。
在启用发送缓冲的情况下,如果 CAN 驱动中的发送缓冲已被占用,CanIf 会将该 PDU 放入自己的缓冲队列中,同时即便底层实际尚未发送成功(Can_Write 返回 CAN_BUSY),CanIf_Transmit 仍会返回 E_OK。随后,当驱动通过回调 CanIf_TxConfirmation 告知先前缓冲区已清空时,CanIf 将负责发送队列中的 PDU,这意味着上层模块无需重复发起发送请求。
如果未启用发送缓冲,则在调用 CanIf_Transmit 时,由于 PDU 无法复制到 CanDrv 的缓冲区,CanIf 将返回 E_NOT_OK。
需要注意的是,PDU 通过 CanIfBufferCfg 中的配置与 HTH 相关联,缓冲区大小通过参数 CanIfBufferSize 配置。如果关闭发送缓冲,则该缓冲区大小可以配置为 0 或不配置。
另外,如果 PDU 的数据长度超过已配置的缓冲区大小,CanIf 只会缓冲配置长度范围内的数据,并丢弃其余部分;同时通过 Det_ReportRuntimeError 调用 DET,报告错误码 CANIF_E_DATA_LENGTH_MISMATCH。
缓冲区特性(Buffer Characteristics)
在发送缓冲区中存储 L-PDU(Storage of L-Pdus in the transmit buffer)
如果某个 PDU 进入 CanIf 时,缓冲区中已经存在同一个 PDU,则缓冲区中的内容会被最新的 PDU 覆盖,其设计理念是始终保持最新数据可用。
如果缓冲区中的 PDU 与当前要存储的 PDU 不同,则不会覆盖缓冲区,CanIf_Transmit 将返回 E_NOT_OK。
还要注意,发送缓冲仅在 HTH 配置为 BasicCAN 时可用;FullCAN 不支持发送缓冲。
发送缓冲区的初始化(Initialisation of transmit buffers)
当调用 CanIf_Init 时,CanIf 会对发送缓冲区执行初始化。
发送确认(Transmit Confirmation)

上面的时序图展示了通过中断方式执行 TX 确认时的调用路径。

上面的时序图展示了通过轮询方式执行 TX 确认时的调用路径。
当发送请求完成后,CanDrv 会通过回调 CanIf_TxConfirmation 通知 CanIf。
如果启用了总线镜像(Bus Mirroring),那么对于控制器上每一个被确认发送的帧,CanIf 都会调用 Mirror_ReportCanFrame,并提供存储的内容和 CAN ID。
当回调 CanIf_TxNotification 被调用时,CanIf 会找到负责该 L-PDU 的上层模块,并通知其发送成功。
如果启用了 CanIfPublicTxConfirmPollingSupport,则当某个 CAN 控制器处于 CAN_CS_STARTED 状态时,CanIf 会为该控制器缓冲接收到的 TxConfirmation 信息。
接收数据流(Receive Data Flow)
按照 AUTOSAR 基本软件架构,接收到的数据将由上层通信栈(例如 AUTOSAR COM、CanNm、CanTp、DCM)进行解析和处理。这意味着上层模块既不能操作(修改) CanDrv 的接收缓冲(Rx),也无法访问 CanIf 的发送缓冲(Tx)。
只有在 CanIfPublicReadRxPduDataApi 被设置为 TRUE 的情况下,CanIf 才会在接收路径中提供内部缓冲(Tx 缓冲在前文已经介绍)。
当接收到新的 PDU 时,CanDrv 会调用函数 CanIf_RxIndication。
接收到的 L-PDU 在硬件层面是相关的(半字节 / 字节顺序、访问类型),并被分配给通信系统的最底层——CanDrv。HRH 作为 CanDrv 与上层使用该 L-PDU 模块之间的链接。HRH 用来标识接收到新 L-PDU 的某个 CAN 硬件接收对象。
在 CanDrv 通过调用 CanIf_RxIndication() 指示收到一个 L-PDU 之后,CanIf 将按照“接收指示”一节中的描述继续处理。
CanIf 不知道 CanDrv 是使用了临时缓冲还是直接访问硬件,因此它期望在调用 CanIf_RxIndication() 时拿到已经标准化的 L-PDU 数据。
接收指示(Receive Indication)


对 CanIf_RxIndication() 的调用,会通过其参数引用一个新接收的 L-PDU。
当调用 CanIf_RxIndication() 时,CanIf 会对该 L-PDU 进行接收接受性(acceptance)评估,并为上层通信模块后续访问准备好 L-SDU。
如果在配置中启用了 <User_RxIndication>(),并且该 L-PDU 成功通过检测并被接受继续处理,则 CanIf 会使用 <User_RxIndication>() 通知上层模块这一异步事件。
如果在全局启用了总线镜像并且对于某个 CAN 控制器也激活了镜像功能,则 CanIf 会为该控制器上每个接收到的帧调用 Mirror_ReportCanFrame。
当 CanIf_TxConfirmation 被调用时,如果配置了软件过滤,CanIf 将对接收到的 L-PDU 执行软件过滤。一旦该 PDU 通过了软件过滤,且(如果配置)通过了数据长度检查,CanIf 就会为该 PDU 查找相应的上层模块,并调用上层的指示回调,将相应数据传递给它。
读取已接收数据(Read Received Data)

CanIf 提供的 API CanIf_ReadRxPduData 是上层模块读取最近从 CAN 网络接收的 CAN L-PDU 的通用接口。
上层模块只能通过 CanIf 的服务发起读取请求,而不能直接访问 CanDrv。
当 CanIf 将 L-PDU 写入上层模块的 I-PDU 缓冲区后,接收请求即告完成。
当通过参数 CanIfPublicReadRxPduDataApi 启用该 API 时,上层模块可以在不依赖 RxIndication 调用上下文的情况下,请求最近接收到的 PDU。这意味着对于某个特定 PDU,可以不配置 RxIndication 回调,同时也可以两种方式并存。这样集成者可以在配置阶段自由选择上层模块对 PDU 的接收方式。
如果 CanIfPublicReadRxPduDataApi 被设置为 TRUE,那么对于所有参数 CanIfRxPduReadData 设置为 TRUE 的 Rx L-PDU,CanIf 将为其各自存储一个接收缓冲。当调用 CanIf_RxIndication 并成功接收 PDU 后,该 PDU 的数据将被写入此缓冲区。
读取 Tx/Rx 通知状态(Read Tx/Rx notification status)
除了通知回调之外,CanIf 还提供 API 服务 CanIf_ReadTxNotifStatus,用于读取已发送 L-SDU 的发送确认状态。同时,还提供 API CanIf_ReadRxNotifStatus,用于读取任一接收 L-SDU 的接收指示状态。
这些 API 可通过参数 CanIfPublicReadRxPduNotifyStatusApi 和 CanIfPublicReadTxPduNotifyStatusApi 在全局使能/关闭,分别对应 CanIf_ReadRxNotifyStatus 和 CanIf_ReadTxNotifyStatus。同时,也可通过每个 PDU 的参数 CanIfRxPduReadNotifyStatus 和 CanIfTxPduReadNotifyStatus 对单个 PDU 进行使能/关闭控制。
CAN 控制器模式(Can Controller Mode)
一般功能(General Functionality)
CanIf 提供服务来控制由 CanDrv 表示的所有 CAN 控制器的通信模式。
CAN 控制器的状态可以通过上层模块调用 CanIf_SetControllerMode 服务来改变。该请求会从 CanIf 传递给 CanDrv,再由 CanDrv 控制实际的 CAN 控制器。
CanIf 接受所有通过 API CanIf_SetControllerMode 和 CanIf_ControllerBusOff 发起的状态切换请求,它本身不会判断这些请求是否有效,只是简单地将请求下发给驱动。
需要注意的是,为了避免在频繁查询控制器模式时也频繁调用 CAN 驱动,可以使用函数 CanIf_ControllerModeIndication:当模式发生改变时,由驱动通知 CanIf,随后 CanIf 会为每个 CAN 控制器保存当前模式,该 API 直接从 CanIf 中读取模式,而无需再回调驱动。
通常由 CanSm 负责发起模式切换请求,但并不限定只有 CanSm 可以使用这些 API。
CAN 控制器运行模式(Can Controller Operation Modes)
如果控制器处于 CAN_CS_STOPPED 状态,而某个引用该控制器的 PDU 通过调用 CanIf_Transmit 尝试发送,那么 CanIf 不会将该请求转发给 CanDrv,因此不会调用 Can_Write 或 CanXL_Write,CanIf_Transmit 会返回 E_NOT_OK。
如果控制器进入 CAN_CS_STOPPED 状态,CanIf 会清空指向该控制器的发送缓冲区,然后通过调用上层的 _TxConfirmation API 并传入 E_NOT_OK,通知上层所有尚未完成的发送请求失败。
如果启用了 CanIfPublicTxConfirmPollingSupport,则 CanIf 还会清空 TxConfirmation 缓冲。
当 CanDrv 调用回调 CanIf_ControllerBusOff 通知 CanIf 控制器发生 BusOff 时,CanIf 会通过回调 CanSm_ControllerBusOff 通知 CanSm。
当调用 CanIf_ControllerModeIndication 回调时,CanIf 会调用 CanSm 的 CanSm_ControllerModeIndication,向 CanSm 指示模式变化。
控制器模式转换(Controller Mode Transitions)
用于对 CAN 控制器发起状态切换请求的 API 以异步方式工作,即通过异步通知回调方式完成,因此真正的模式转换可能在稍后时刻才发生。当转换完成后,CanDrv 会调用 CanIf_ControllerModeIndication,进而 CanIf 会调用上层模块的 _ControllerModeIndication 回调。
上层模块也可以通过调用 CanIf_GetControllerMode 来轮询当前的控制器模式。
唤醒(WakeUp)
只有当 CAN 控制器和收发器处于通信被禁用的休眠模式时,ECU 才支持通过 CAN 唤醒。只有在该模式下,CAN 控制器处于停止状态,从而可以使能唤醒中断。
唤醒检测(Wakeup Detection)
如果启用了唤醒支持,则 CanIf 会通过 CanIf_CheckWakeup 服务(通常由集成代码调用)获知 CanDrv 或 CanTrcv 是否通过 Can_CheckWakeup 和 CanTrcv_CheckWakeup 分别报告了唤醒事件。
如果对驱动或收发器的调用中至少有一次返回 E_OK,则 CanIf_CheckWakeup 返回 E_OK,否则返回 E_NOT_OK。
在 CAN 总线唤醒事件发生时,函数 CanIf_CheckWakeup 也可能由 EcuM_CheckWakeup 调用。
唤醒验证(Wakeup Validation)
如果 CAN 控制器 / CAN 收发器检测到总线唤醒事件,它会直接通知 ECU 状态管理器(EcuM)。如果需要对唤醒进行验证,EcuM 将通过调用 CanIf_SetControllerMode 和 CanIf_SetTrcvMode 打开相应的 CAN 控制器 / CAN 收发器。
PDU 通道模式控制(Pdu Channel Mode Control)
PDU 通道组(Pdu Channel Groups)
每个 L-PDU 都被分配给一个连接到某个 CAN 控制器且位于某个 CAN 网络上的物理 CAN 通道。通过这种方式,所有属于同一物理通道的 L-PDU 可以由单个 L-PDU 通道组进行控制,因为这些通道组代表所有连接到同一底层通道的 L-PDU。
请注意,一个 L-PDU 只能属于一个通道组。
PDU 通道模式(Pdu Channel Modes)
CanIf 提供服务 CanIf_SetPduMode 和 CanIf_GetPduMode,用于以通道为粒度禁止或允许对 PDU 的处理(仅在控制器模式为 CAN_CS_STARTED 时允许)。
可接受的 PDU 模式为:
- CANIF_OFFLINE (0x00):对应通道的发送和接收路径均被禁用 ⇒ 无通信模式。
- CANIF_TX_OFFLINE (0x01):对应通道的发送路径被禁用,接收路径启用。
- CANIF_TX_OFFLINE_ACTIVE (0x02):对应通道的发送路径处于离线主动(offline active)模式,接收路径启用。此模式要求 CanIfTxOfflineActiveSupport = TRUE。
- CANIF_ONLINE (0x03):对应通道的发送和接收路径均启用 ⇒ 全功能工作模式。
在 CANIF_ONLINE 和 CANIF_OFFLINE 中,通道内所有 PDU 的 Tx 和 Rx 均分别被启用 / 禁用;而在 CANIF_TX_OFFLINE 和 CANIF_TX_OFFLINE_ACTIVE 中,允许接收但禁止发送(或仅模拟发送)。
如果调用 CanIf_SetControllerMode 并传入 CAN_CS_SLEEP 模式,CanIf 会将相应通道的 PDU 模式设置为 CANIF_OFFLINE。
当切换到 CANIF_OFFLINE 时,CanIf 将:
- 阻止将关联 PDU 的发送请求(经由 CanIf_Transmit)转发给 CanDrv;
- 清空相应的 CanIf 发送缓冲;
- 禁止调用上层模块的 RxIndication 和 TxConfirmation 回调。
如果调用 CanIf_SetControllerMode 并传入 CAN_CS_STOPPED,或调用 CanIf_ControllerBusOff,则 CanIf 会将指定通道的 PDU 模式设置为 CANIF_OFFLINE。
CANIF_OFFLINE
在初始化阶段,CanIf 会将每个通道状态初始化为 CANIF_OFFLINE。
如果调用 CanIf_SetControllerMode 并传入 CAN_CS_SLEEP 参数,CanIf 会将相应通道的 PDU 通道模式设置为 CANIF_OFFLINE。
当物理通道切换到 CANIF_OFFLINE 模式时,CanIf 应:
- 阻止将关联 L-PDU 的发送请求 CanIf_Transmit() 转发给 CanDrv(向调用的上层模块返回 E_NOT_OK);
- 清空相应的 CanIf 发送缓冲;
- 阻止调用上层模块的接收指示回调服务;
- 阻止调用上层模块的发送确认回调服务。
如果调用 CanIf_SetControllerMode 并传入 CAN_CS_STOPPED,或调用 CanIf_ControllerBusOff,则 CanIf 会将相应通道的 PDU 通道模式设置为 CANIF_TX_OFFLINE。
当物理通道切换到 CANIF_TX_OFFLINE 模式时,CanIf 应:
- 阻止将关联 L-PDU 的发送请求 CanIf_Transmit() 转发给 CanDrv(向调用的上层模块返回 E_NOT_OK);
- 清空相应的 CanIf 发送缓冲;
- 阻止调用上层模块的发送确认回调服务;
- 允许调用上层模块的接收指示回调服务。
在 CANIF_OFFLINE 和 CANIF_TX_OFFLINE 模式下,由于无法发送新的 L-PDU,CAN 控制器不能因新的发送请求进入 BusOff 状态,因此 BusOff 通知会被隐式抑制。
如果在切换到 CANIF_TX_OFFLINE 或 CANIF_OFFLINE 模式前,已经在 CAN 硬件发送对象中排队等待发送的 L-PDU 会立即被发送出去,且之后发生 BusOff 事件,则 CanIf 不会阻止 BusOff 通知的执行。
CANIF_ONLINE
当物理通道切换到 CANIF_ONLINE 模式时,CanIf 将:
- 允许将该通道内所有关联 PDU 的发送请求 CanIf_Transmit 转发给 CanDrv;
- 允许调用上层模块的 RX 和 TX 指示回调服务。
CANIF_OFFLINE_ACTIVE
如果参数 CanIfTxOfflineActiveSupport 被设置为 TRUE,则当 PDU 通道模式处于 CANIF_TX_OFFLINE_ACTIVE 状态时,CanIf 会提供“模拟发送成功”功能,即 CanIf 会立即调用上层模块的发送确认回调服务,而实际上并不会真的发送任何帧。这常用于特殊场景,例如测试场景:无需真实发送,但上层仍需认为发送成功,而真实的接收(Rx)仍然有效。
软件接收过滤(Software Receive Filter)
并非所有通过硬件接收过滤并成功进入 BasicCAN 硬件对象的 L-PDU 都是当前 ECU 想要接收的 L-PDU,CanIf 可以通过软件过滤将这些不需要的 L-PDU 过滤掉。
为了优化软件过滤的运行时间,提供了多种软件过滤算法。软件过滤机制的基本思路是:根据当前处理的 HRH 和 CanId,找出对应的 L-PDU。在找到 L-PDU 之后,CanIf 接受此次接收,并允许上层模块直接访问 L-SDU 信息。
软件过滤概念(Software Filtering Concept)
配置工具负责管理硬件接收过滤设置的信息,其中最重要的是:L-PDU 的硬件对象数量,以及它们不被过滤的 PDU / CAN ID 范围。可配置的选项包括:
- 用于 FullCAN 接收的单个 PDU;
- 可被接受的一组 PDU 列表;
- 对于 BasicCAN 接收,可将一个或多个范围映射到某个 RX 硬件对象。
这些范围可以通过上限和下限来设置(分别由 CanIfHrhRangeRxPduUpperCanId 和 CanIfHrhRangeRxPduLowerCanId 指定),只要 PDU 的 CAN ID 落在此范围内即被接受;
也可以通过设置一个基准 ID(CanIfHrhRangeBaseID)和一个掩码(CanIfHrhRangeMask)来实现,掩码用于定义基准 ID 中哪些比特是相关的,且必须与 PDU 的 ID 匹配。
此外,软件过滤是可选的;每种可配置范围类型都可以接受标准 CAN ID 和扩展 CAN ID。
最后需要注意:如果一个范围(部分)包含在另一个范围之内,或者某个单独的 CanId 落在某个范围内,则软件过滤应遵循以下原则选择 L-PDU:
- 单个 CanId 比任何范围都具有更高优先级;
- 较小的范围比较大的范围具有更高优先级。
数据长度检查(Data Length Check)
接收的数据长度值会与配置的 L-PDU 数据长度(通过参数 CanIfRxPduDataLength 配置)进行比较。
只要 PDU 的长度大于或等于配置长度(且其他过滤条件通过),CanIf 就会接受该 PDU。
数据长度检查可以通过全局参数 CanIfPrivateDataLengthCheck 进行全局配置,也可以通过每个 PDU 的参数 CanIfRxPduDataLengthCheck 进行单独配置。需要注意的是,如果在全局关闭了数据长度检查,则无法在单个 PDU 上启用它。
如果 CanIf 在数据长度检查阶段拒绝某个 PDU,则会向 DET 报告运行时错误 CANIF_E_INVALID_DATA_LENGTH。
如果数据长度检查通过,CanIf 会将该 PDU 的长度传递给上层模块。
轮询模式(Polling Mode)
轮询模式提供了一种在不使用硬件中断的情况下处理 CAN 硬件中发生的发送、接收和错误事件的方式。
因此,CanIf 和 CanDrv 提供相应的通知服务,用于检测并处理这些硬件事件。通过这种方式,上层模块可以与底层的硬件事件检测策略解耦。
如果使用了不同的 CanDrv,则在配置和系统集成阶段必须协调各个驱动的调用频率。
需要注意的是,CanIf 必须能够执行由中断触发的通知服务,也必须能够在任务级别执行轮询调用的通知服务。如果对 CAN 控制器邮箱的访问被阻塞,则会触发后续的发送缓冲。
多 CAN 驱动支持(Multiple Can Driver Support)
为了同时支持多个 CanDrv 并向上层提供统一的接口,CanIf 需要进行特定的映射。
因此,CanIf 必须将所有向下的动作派发到对应的 CanDrv 和底层 CAN 控制器 API。
同样地,在向上层回调时,CanIf 也必须提供合适的回调通知,以区分来自多个 CanDrv 的事件。
是否支持多 CanDrv 由参数 CanIfPublicMultipleDrvSupport 进行使能或禁用。
部分网络(Partial Networking)
如果启用了部分网络(Partial Networking,PN)(通过 CanIfPublicPnSupport),则 CanIf 对每个 CAN 控制器支持一个 PnTxFilter,该过滤器覆盖 PDU 通道模式。
这个过滤器只有在某个 CAN 控制器配置了至少一个 Tx L-PDU 为 CanIfTxPduPnFilterPdu 时才会生效并发生模式切换(启用 / 禁用)。
如果某个 CAN 控制器的 PnTxFilter 被启用,则只要某个 Tx L-PDU 没有被配置为该控制器的 CanIfTxPduPnFilterPdu,CanIf 会阻止所有发往该控制器的 Tx 请求(调用 CanIf_Transmit() 时返回 E_NOT_OK)。而被配置为 CanIfTxPduPnFilterPdu 的那些 L-PDU 始终会被传递给相应的 CAN 驱动。
如果在 PnTxFilter 启用的情况下调用 CanIf_RxIndication(),则相应控制器的 PnTxFilter 将被禁用。
如果某个 CAN 控制器的 PnTxFilter 被禁用,CanIf 将按照 CanIf_SetPduMode 所设置的模式行为。
如果调用 CanIf_SetPduMode 将某个控制器设置为 CANIF_TX_OFFLINE,且启用了部分网络(通过 CanIfPublicPnSupport),则对应 CAN 控制器的 PnTxFilter 将被启用。
API(APIs)
-
函数(Functions)
- 函数定义(Function Definitions)
- CanIf_Init
- 说明(Notes):
- CanIf_Init 只应由 EcuM 调用。
- 不会将控制器初始化到可工作状态。
- 初始化 CanIf 模块自身的状态。
- 参数(Parameters):
const CanIf_ConfigType* ConfigPtr- 指向选定配置结构的指针。
- 返回值(Return):Void
- 可重入性(Reentrant):No
- 同步 / 异步(Sync/Async):Synchronous
- Service ID:0x01
- 定义于(Defined):CanIf.h
- 说明(Notes):
- CanIf_Init
CanIf_Deinit
- 说明:
- 去初始化 CanIf 模块。
- 调用者必须确保当前没有正在进行的收发操作,也没有未完成的发送确认。
- 参数:None
- 返回值:Void
- 可重入性:No
- 同步 / 异步:Synchronous
- Service ID:0x02
- 定义于:CanIf.h
CanIf_SetControllerMode
- 说明:
- 该服务调用相应的 CAN 驱动服务以改变 CAN 控制器模式。
- 调用者有责任确保当前没有正在进行的收发操作,也没有未完成的发送确认。
- 服务 CanIf_SetControllerMode 会为请求的 CAN 控制器调用 Can_SetControllerMode。
- 如果 ControllerId 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_CONTROLLERID。
- 如果 ControllerMode 非法(不是 CAN_CS_STARTED、CAN_CS_SLEEP 或 CAN_CS_STOPPED),则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_CTRLMODE。
- 参数:
- In:
uint8 ControllerId- 分配给某 CAN 控制器的 ControllerId。Can_ControllerStateType ControllerMode- 请求的模式切换。
- In:
- 返回值(Std_ReturnType):
- E_OK:控制器模式请求已被接受。
- E_NOT_OK:控制器模式请求未被接受。
- 可重入性:可重入(同一控制器上不可重入)。
- 同步 / 异步:Asynchronous
- Service ID:0x03
- 定义于:CanIf.h
CanIf_GetControllerMode
- 说明:
- 该服务调用相应的 CAN 驱动服务以获取当前 CAN 控制器状态。
- 如果 ControllerId 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_CONTROLLERID。
- 如果 ControllerModePtr 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_POINTER。
- 参数:
- In:
uint8 ControllerId- 分配给某 CAN 控制器的 ControllerId。
- Out:
Can_ControllerStateType* ControllerModePtr- 指向用于存储当前 CAN 控制器模式的内存位置的指针。
- In:
- 返回值(Std_ReturnType):
- E_OK:控制器模式请求已被接受。
- E_NOT_OK:控制器模式请求未被接受。
- 可重入性:No
- 同步 / 异步:Synchronous
- Service ID:0x04
- 定义于:CanIf.h
CanIf_GetControllerErrorState
- 说明:
- 该服务调用相应的 CAN 驱动服务以获取 CAN 控制器的错误状态。
- 如果 ControllerId 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_CONTROLLERID。
- 如果参数 ErrorStatePtr 为空指针,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_POINTER。
- 参数:
- In:
uint8 ControllerId- 分配给某 CAN 控制器的 ControllerId。
- Out:
Can_ErrorStateType* ErrorStatePtr- 指向用于存储 CAN 控制器错误状态的内存位置的指针。
- In:
- 返回值(Std_ReturnType):
- E_OK:错误状态请求已被接受。
- E_NOT_OK:错误状态请求未被接受。
- 可重入性:对同一 ControllerId 非可重入。
- 同步 / 异步:Synchronous
- Service ID:0x4b
- 定义于:CanIf.h
CanIf_Transmit
- 说明:
- 请求发送一个 PDU。
- CanIf_Transmit 应调用 Can_Write,使用与传入 TxPduId 对应的硬件发送句柄以及一个 Can_PduType 结构,其中:
swPduHandle设置为在相应 CanIf_TxConfirmation() 调用中使用的 CanTxPduId;length设置为 PduInfoPtr→SduLength 提供的值;Id设置为与 TxPduId 关联的 CAN ID;Sdu设置为 PduInfoPtr->SduDataPtr 提供的指针。
- 如果 TxPduId 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_INVALID_TXPDUID。
- 参数:
- In:
PduIdType TxPduId- 要发送的 PDU 标识符。const PduInfoType* PduInfoPtr- 指向 PDU 数据的长度和数据指针及元数据的结构指针。
- In:
- 返回值(Std_ReturnType):
- E_OK:发送请求已被接受。
- E_NOT_OK:发送请求未被接受。
- 可重入性:对不同 PduId 可重入;对同一 PduId 不可重入。
- 同步 / 异步:Synchronous
- Service ID:0x49
- 定义于:CanIf.h
CanIf_ReadRxPduData
- 说明:
- 该服务向调用的上层模块提供所请求 CanIfRxSduId 的数据长度以及接收到的数据。
- 如果 CanIfRxSduId 非法(例如未配置为通过 CanIfRxPduReadData 存储在 CanIf 内部),则 CanIf 会向 DET 报告错误码 CANIF_E_INVALID_RXPDUID。
- 如果 CanIfRxInfoPtr 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_POINTER。
- 参数:
- In:
PduIdType CanIfRxSduId- 接收 L-SDU 句柄,指定对应 CAN L-SDU ID,并隐式指定 CAN 驱动实例以及对应 CAN 控制器设备。
- Out:
PduInfoType* CanIfRxInfoPtr- 包含接收 PDU 的长度(SduLength)、指向包含 PDU 的缓冲区(SduDataPtr)的指针以及该 PDU 的元数据。
- In:
- 返回值(Std_ReturnType):
- E_OK:L-SDU 数据请求已被接受。
- E_NOT_OK:未收到有效数据。
- 可重入性:Non Reentrant
- 同步 / 异步:Synchronous
- Service ID:0x06
- 定义于:CanIf.h
CanIf_ReadTxNotifStatus
- 说明:
- 该服务返回由 CanIfTxSduId 请求的某个静态或动态 CAN Tx L-PDU 的发送确认状态(是否已经发生确认)。
- 该函数用于通知上层模块与某个 L-SDU 对应的任意发送确认事件。
- 如果对某个已发送 L-SDU,将 CanIfPublicReadTxPduNotifyStatusApi 与 CanIfTxPduReadNotifyStatus 均设置为 TRUE,并调用 CanIf_ReadTxNotifStatus,则 CanIf 应重置该 L-SDU 的通知状态。
- 该 API 可通过参数 CanIfPublicReadTxPduNotifyStatusApi 在预编译期全局使能 / 禁用。
- 参数:
- In:
PduIdType CanIfTxSduId- 要发送的 L-SDU 句柄。用于指定对应的 CAN L-SDU ID,并隐式指定 CAN 驱动实例以及 CAN 控制器设备。
- In:
- 返回值:
CanIf_NotifStatusType- 对应 CAN Tx L-PDU 的当前发送确认状态。 - 可重入性:Non Reentrant
- 同步 / 异步:Synchronous
- Service ID:0x07
- 定义于:CanIf.h
CanIf_ReadRxNotifStatus
- 说明:
- 该服务返回由 CanIfRxSduId 请求的某个 CAN Rx L-PDU 的接收指示状态(是否已经发生指示)。
- 该函数用于通知上层模块与某个 L-SDU 对应的任意接收指示事件。
- 对于被定义为接收多个 CAN ID(范围接收)的 CanIfRxSduId,不允许使用 CanIf_ReadRxNotifStatus()。
- 该 API 可通过参数 CanIfPublicReadRxPduNotifyStatusApi 在预编译期全局使能 / 禁用。
- 参数:
- In:
PduIdType CanIfRxSduId- 接收 L-SDU 句柄,指定对应 CAN L-SDU ID,并隐式指定 CAN 驱动实例以及 CAN 控制器设备。
- In:
- 返回值:
CanIf_NotifStatusType- 对应 CAN Rx L-PDU 的当前接收指示状态。 - 可重入性:Non Reentrant
- 同步 / 异步:Synchronous
- Service ID:0x08
- 定义于:CanIf.h
CanIf_SetPduMode
- 说明:
- 该服务为预定义的逻辑 PDU 通道上的 L-PDU 设置请求的模式。
- 如果 ControllerId 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_CONTROLLERID。
- 如果 PduModeRequest 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_PDU_MODE。
- 参数:
- In:
uint8 ControllerId- 本 ECU 所有连接到该 ControllerId 的 PDU(该 ControllerId 被分配给某物理 CAN 控制器)都会被处理。CanIf_PduModeType PduModeRequest- 请求的 PDU 模式切换。
- In:
- 返回值(Std_ReturnType):
- E_OK:模式切换请求已被接受。
- E_NOT_OK:模式切换请求未被接受。
- 可重入性:Non Reentrant
- 同步 / 异步:Synchronous
- Service ID:0x09
- 定义于:CanIf.h
CanIf_GetPduMode
- 说明:
- 该服务上报某个 PDU 通道当前的模式。
- 如果 ControllerId 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_CONTROLLERID。
- 如果 PduModePtr 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_POINTER。
- 参数:
- In:
uint8 ControllerId- 本 ECU 所有连接到该 ControllerId 的 PDU(该 ControllerId 被分配给某物理 CAN 控制器)都会被处理。
- Out:
CanIf_PduModeType* PduModePtr- 指向用于存储逻辑 PDU 通道当前模式的内存位置的指针。
- In:
- 返回值(Std_ReturnType):
- E_OK:PDU 模式请求已被接受。
- E_NOT_OK:PDU 模式请求未被接受。
- 可重入性:可重入(同一通道不可重入)。
- 同步 / 异步:Synchronous
- Service ID:0x0A
- 定义于:CanIf.h
CanIf_SetDynamicTxId
- 说明:
- 该服务重新配置某个 CAN L-PDU 的 CAN 标识符。
- 如果 CanIfTxSduId 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_INVALID_TXPDUID。
- 如果 CanId 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_CANID。
- 该函数由参数 CanIfPublicSetDynamicTxIdApi 在预编译期配置为开 / 关。
- 参数:
- In:
PduIdType CanIfTxSduId- 要发送的 L-SDU 句柄,指定对应的 CAN L-SDU ID,并隐式指定 CAN 驱动实例及 CAN 控制器设备。Can_IdType CanId- 该 CAN L-SDU 对应的标准 / 扩展 CAN ID,可作为 FD 或传统 CAN 帧发送。
- In:
- 返回值:Void
- 可重入性:Non Reentrant
- 同步 / 异步:Synchronous
- Service ID:0x0C
- 定义于:CanIf.h
CanIf_SetTrcvMode
- 说明:
- 该服务通过调用相应的 CAN 收发器驱动服务来改变收发器(TransceiverId)的运行模式。
- 如果 TransceiverId 非法,则 CanIf 会向 DET 报告错误 CANIF_E_PARAM_TRCV。
- 如果 TransceiverMode 非法(不是 CANTRCV_TRCVMODE_STANDBY、CANTRCV_TRCVMODE_SLEEP 或 CANTRCV_TRCVMODE_NORMAL),则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_TRCVMODE。
- 收发器仅当其前一模式为 CANTRCV_TRCVMODE_NORMAL 时才能切换到 CANTRCV_TRCVMODE_STANDBY,但 CanIf 不检查这一点。
- 收发器仅当其前一模式为 CANTRCV_TRCVMODE_STANDBY 时才能切换到 CANTRCV_TRCVMODE_SLEEP,但 CanIf 也不会检查这一点。
- 该函数通过 CanIfPublicSetDynamicTxIdApi 参数在预编译期配置为开 / 关。
- 参数:
- In:
uint8 TransceiverId- 抽象的 CanIf TransceiverId,分配给要进行模式切换的 CAN 收发器。CanTrcv_TrcvModeType TransceiverMode- 请求的模式切换。
- In:
- 返回值(Std_ReturnType):
- E_OK:收发器模式请求已被接受。
- E_NOT_OK:收发器模式请求未被接受。
- 可重入性:Non Reentrant
- 同步 / 异步:Asynchronous
- Service ID:0x0D
- 定义于:CanIf.h
CanIf_GetTrcvMode
- 说明:
- 该函数调用 CanTrcv_GetOpMode,并将 CanTrcv 提供的 OpMode 写入参数 TransceiverModePtr。
- 如果 TransceiverId 非法,则 CanIf 会向 DET 报告错误 CANIF_E_PARAM_TRCV。
- 如果 TransceiverModePtr 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_POINTER。
- 参数:
- In:
uint8 TransceiverId- 抽象的 CanIf TransceiverId,分配给要进行模式查询的 CAN 收发器。
- Out:
CanTrcv_TrcvModeType* TransceiverModePtr- 指向返回收发器连接的网络当前模式的指针。
- In:
- 返回值(Std_ReturnType):
- E_OK:收发器模式请求已被接受。
- E_NOT_OK:收发器模式请求未被接受。
- 可重入性:Non Reentrant
- 同步 / 异步:Synchronous
- Service ID:0x0E
- 定义于:CanIf.h
CanIf_GetTrcvWakeupReason
- 说明:
- 该服务通过调用相应的 CAN 收发器驱动服务返回 TransceiverId 对应收发器的唤醒原因。
- 如果 TransceiverId 非法,则 CanIf 会向 DET 报告错误 CANIF_E_PARAM_TRCV。
- 如果 TrcvWuReasonPtr 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_POINTER。
- 参数:
- In:
uint8 TransceiverId- 抽象的 CanIf TransceiverId,分配给要查询唤醒原因的 CAN 收发器。
- Out:
CanTrcv_TrcvWakeupReasonType* TrcvWuReasonPtr- 指向存放收发器唤醒原因的指针。
- In:
- 返回值(Std_ReturnType):
- E_OK:唤醒原因请求已被接受。
- E_NOT_OK:唤醒原因请求未被接受。
- 可重入性:Non Reentrant
- 同步 / 异步:Synchronous
- Service ID:0x0F
- 定义于:CanIf.h
CanIf_SetTrcvWakeupMode
- 说明:
- 该函数调用 CanTrcv_SetTrcvWakeupMode。
- 如果 TransceiverId 非法,则 CanIf 会向 DET 报告错误 CANIF_E_PARAM_TRCV。
- 如果 TrcvWakeupMode 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_TRCVWAKEUPMODE。
- 参数:
- In:
uint8 TransceiverId- 抽象的 CanIf TransceiverId,分配给要设置唤醒模式的 CAN 收发器。CanTrcv_TrcvWakeupModeType TrcvWakeupMode- 请求的收发器唤醒通知模式。
- In:
- 返回值(Std_ReturnType):
- E_OK:唤醒模式请求已被接受。
- E_NOT_OK:唤醒模式请求未被接受。
- 可重入性:Non Reentrant
- 同步 / 异步:Synchronous
- Service ID:0x10
- 定义于:CanIf.h
CanIf_CheckWakeup
- 说明:
- 该服务检查底层 CAN 驱动或 CAN 收发器驱动是否已经报告唤醒事件。
- 此函数通常由集成代码调用。
- 如果 WakeupSource 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_WAKEUPSOURCE。
- 参数:
- In:
EcuM_WakeupSourceType WakeupSource- 发起唤醒事件的源设备:CAN 控制器或 CAN 收发器。
- In:
- 返回值(Std_ReturnType):
- E_OK:唤醒检查请求已被接受。
- E_NOT_OK:唤醒检查请求未被接受。
- 可重入性:Non Reentrant
- 同步 / 异步:Asynchronous
- Service ID:0x11
- 定义于:CanIf.h
CanIf_CheckValidation
- 说明:
- 该服务用于验证之前的唤醒事件。
- 此函数通常由集成代码调用。
- 如果 WakeupSource 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_WAKEUPSOURCE。
- 如果不需要验证,则可以通过将 CanIfPublicWakeupCheckValidSupport 设置为 FALSE 来省略该 API。
- 参数:
- In:
EcuM_WakeupSourceType WakeupSource- 触发唤醒事件并需要被验证的源设备:CAN 控制器或 CAN 收发器。
- In:
- 返回值(Std_ReturnType):
- E_OK:唤醒验证请求已被接受。
- E_NOT_OK:唤醒验证请求未被接受。
- 可重入性:Reentrant
- 同步 / 异步:Synchronous
- Service ID:0x12
- 定义于:CanIf.h
CanIf_GetTxConfirmationState
- 说明:
- 该服务报告自上次 CAN 控制器启动以来,对于整个 CAN 控制器是否已经发生过任何 TX 确认。
- 如果 ControllerId 非法,则 CanIf 会报告开发错误码 CANIF_E_PARAM_CONTROLLERID。
- 如果 CanSm 的 BusOff 恢复不需要 Tx 确认状态,则可以通过关闭 CanIfPublicTxConfirmPollingSupport 省略该 API。
- 参数:
- In:
uint8 ControllerId- 抽象的 CanIf ControllerId,分配给某 CAN 控制器。
- In:
- 返回值:
CanIf_NotifStatusType- 该 CAN 控制器所有 TX PDU 的综合 TX 确认状态。 - 可重入性:可重入(同一控制器不可重入)
- 同步 / 异步:Synchronous
- Service ID:0x19
- 定义于:CanIf.h
CanIf_ClearTrcvWufFlag
- 说明:
- 请求 CanIf 模块清除指定 CAN 收发器的 WUF 标志。
- 如果 TransceiverId 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_TRCV。
- CanIf 是否支持该功能由 CanIfPublicPnSupport 和 CanIfPublicTrcvPnEnable 在预编译期配置。
- 参数:
- In:
uint8 TransceiverId- 抽象的 CanIf TransceiverId,分配给指定的 CAN 收发器。
- In:
- 返回值(Std_ReturnType):
- E_OK:请求已被接受。
- E_NOT_OK:请求未被接受。
- 可重入性:针对不同收发器可重入。
- 同步 / 异步:Asynchronous
- Service ID:0x1e
- 定义于:CanIf.h
CanIf_CheckTrcvWakeFlag
- 说明:
- 请求 CanIf 模块检查指定 CAN 收发器的唤醒标志(Wake flag)。
- 如果 TransceiverId 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_TRCV。
- CanIf 是否支持该功能由 CanIfPublicPnSupport 和 CanIfPublicTrcvPnEnable 在预编译期配置。
- 参数:
- In:
uint8 TransceiverId- 抽象的 CanIf TransceiverId,分配给指定的 CAN 收发器。
- In:
- 返回值(Std_ReturnType):
- E_OK:请求已被接受。
- E_NOT_OK:请求未被接受。
- 可重入性:针对不同收发器可重入。
- 同步 / 异步:Asynchronous
- Service ID:0x1f
- 定义于:CanIf.h
CanIf_SetBaudrate
- 说明:
- 该服务设置 CAN 控制器的波特率配置。根据波特率修改需求,控制器可能需要复位。
- 如果 ControllerId 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_CONTROLLERID。
- 如果 CanIf 支持改变波特率,则 CanIf_SetBaudrate 由参数 CanIfSetBaudrateApi 进行配置。
- 参数:
- In:
uint8 ControllerId- 抽象的 CanIf ControllerId,对应要设置波特率的 CAN 控制器。uint16 BaudRateConfigID- 引用某个波特率配置的 ID。
- In:
- 返回值(Std_ReturnType):
- E_OK:服务请求已接受,设置(新)波特率已开始。
- E_NOT_OK:服务请求未被接受。
- 可重入性:对不同 ControllerId 可重入,对同一 ControllerId 不可重入。
- 同步 / 异步:Synchronous
- Service ID:0x27
- 定义于:CanIf.h
CanIf_GetControllerRxErrorCounter
- 说明:
- 该服务调用相应 CAN 驱动服务以获取 CAN 控制器的 Rx 错误计数器。
- 如果 ControllerId 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_CONTROLLERID。
- 如果 RxErrorCounterPtr 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_POINTER。
- 参数:
- In:
uint8 ControllerId- 抽象的 CanIf ControllerId,对应要查询的 CAN 控制器。
- Out:
uint8* RxErrorCounterPtr- 指向存储当前 CAN 控制器 Rx 错误计数器的内存位置的指针。
- In:
- 返回值(Std_ReturnType):
- E_OK:可用的 Rx 错误计数器已获取。
- E_NOT_OK:ControllerId 错误或 Rx 错误计数器不可用。
- 可重入性:对同一 ControllerId 非可重入。
- 同步 / 异步:Synchronous
- Service ID:0x4d
- 定义于:CanIf.h
CanIf_GetControllerTxErrorCounter
- 说明:
- 该服务调用相应 CAN 驱动服务以获取 CAN 控制器的 Tx 错误计数器。
- 如果 ControllerId 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_CONTROLLERID。
- 如果 RxErrorCounterPtr 非法(应理解为 TxErrorCounterPtr),则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_POINTER。
- 参数:
- In:
uint8 ControllerId- 抽象的 CanIf ControllerId,对应要查询的 CAN 控制器。
- Out:
uint8* RxErrorCounterPtr- 指向存储当前 CAN 控制器 Tx 错误计数器的内存位置的指针。
- In:
- 返回值(Std_ReturnType):
- E_OK:可用的 Tx 错误计数器已获取。
- E_NOT_OK:ControllerId 错误或 Tx 错误计数器不可用。
- 可重入性:对同一 ControllerId 非可重入。
- 同步 / 异步:Synchronous
- Service ID:0x4e
- 定义于:CanIf.h
CanIf_EnableBusMirroring
- 说明:
- 为某个 CAN 控制器启用或禁用总线镜像功能。
- 如果 ControllerId 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_CONTROLLERID。
- 参数:
- In:
uint8 ControllerId- 抽象的 CanIf ControllerId,对应要设置镜像模式的 CAN 控制器。boolean MirroringActive-- TRUE:对给定控制器上每一帧接收或发送都会调用 Mirror_ReportCanFrame。
- FALSE:不会为该控制器调用 Mirror_ReportCanFrame。
- In:
- 返回值(Std_ReturnType):
- E_OK:镜像模式已改变。
- E_NOT_OK:ControllerId 错误或全局禁用了镜像功能。
- 可重入性:Reentrant
- 同步 / 异步:Synchronous
- Service ID:0x4c
- 定义于:CanIf.h
CanIf_GetCurrentTime
- 说明:
- 该服务调用相应 CAN 驱动服务,从硬件寄存器中获取当前时间值。
- 如果 Controller 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_CONTROLLERID。
- 如果 timeStampPtr 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_POINTER。
- 该函数由配置参数 CanIfGlobalTimeSupport 在预编译期配置为开 / 关。
- 参数:
- In:
uint8 Controller- 要访问的 CAN 控制器索引。
- Out:
Can_TimeStampType* timeStampPtr- 当前时间戳。
- In:
- 返回值(Std_ReturnType):
- E_OK:成功。
- E_NOT_OK:失败。
- 可重入性:Non Reentrant
- 同步 / 异步:Synchronous
- Service ID:0x51
- 定义于:CanIf.h
CanIf_EnableEgressTimeStamp
- 说明:
- 该服务调用相应 CAN 驱动服务,在指定消息对象上激活发送(egress)时间戳功能。
- 如果 TxPduId 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_LPDU。
- 该函数由配置参数 CanIfGlobalTimeSupport 在预编译期配置为开 / 关。
- 参数:
- In:
PduIdType TxPduId- 对应要启用时间戳的 CAN L-PDU 的 L-PDU 句柄。
- In:
- 返回值:Void
- 可重入性:Non Reentrant
- 同步 / 异步:Synchronous
- Service ID:0x52
- 定义于:CanIf.h
CanIf_GetEgressTimeStamp
- 说明:
- 该服务调用相应 CAN 驱动服务,以在指定消息对象上获取发送(egress)时间戳。
- 如果 TxPduId 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_LPDU。
- 如果 timeStampPtr 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_POINTER。
- 该函数由配置参数 CanIfGlobalTimeSupport 在预编译期配置为开 / 关。
- 参数:
- In:
PduIdType TxPduId- 对应要获取时间戳的 CAN L-PDU 的 L-PDU 句柄。
- Out:
Can_TimeStampType* timeStampPtr- 当前时间戳。
- In:
- 返回值(Std_ReturnType):
- E_OK:成功。
- E_NOT_OK:失败。
- 可重入性:对同一 TxPduId 非可重入,对不同 TxPduId 可重入。
- 同步 / 异步:Synchronous
- Service ID:0x53
- 定义于:CanIf.h
CanIf_GetIngressTimeStamp
- 说明:
- 该服务调用相应 CAN 驱动服务,在指定消息对象上读取接收(ingress)时间戳。该函数需要在 RxIndication 函数上下文中调用。
- 如果 TxPduId 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_LPDU。
- 如果 timeStampPtr 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_POINTER。
- 该函数由配置参数 CanIfGlobalTimeSupport 在预编译期配置为开 / 关。
- 参数:
- In:
PduIdType TxPduId- 对应要获取时间戳的 CAN L-PDU 的 L-PDU 句柄。
- Out:
Can_TimeStampType* timeStampPtr- 当前时间戳。
- In:
- 返回值(Std_ReturnType):
- E_OK:成功。
- E_NOT_OK:失败。
- 可重入性:对同一 RxPduId 非可重入,对不同 RxPduId 可重入。
- 同步 / 异步:Synchronous
- Service ID:0x54
- 定义于:CanIf.h
回调(Callbacks)
- CanIf_TriggerTransmit
- 说明:
- 在该 API 中,被调用的上层模块应检查可用数据是否适配 PduInfoPtr->SduLength 给出的缓冲区大小。如果适配,则应将数据复制到 PduInfoPtr->SduDataPtr 所指向的缓冲区中,并在 PduInfoPtr->SduLength 中更新实际复制的数据长度。如果不适配,则返回 E_NOT_OK,同时不得修改 PduInfoPtr。
- 仅当启用了 TriggerTransmit 支持(CanIfTriggerTransmitSupport = TRUE)时,CanIf 才提供此回调。
- 参数:
- In:
PduIdType TxPduId- 请求发送的 SDU 的 ID。PduInfoType* PduInfoPtr- 包含指向 SDU 数据拷贝目标缓冲区(SduDataPtr)的指针,以及可用缓冲区大小(SduLength)。返回时,该服务会在 SduLength 中指示复制的 SDU 数据长度。
- In:
- 返回值(Std_ReturnType):
- E_OK:SDU 已复制,SduLength 表示复制字节数。
- E_NOT_OK:未复制任何 SDU 数据。PduInfoPtr 不可使用,因为可能为 NULL 或指向无效数据。
- 可重入性:对不同 PduId 可重入,对同一 PduId 不可重入。
- 同步 / 异步:Synchronous
- Service ID:0x41
- 定义于:CanIf.h
- 说明:
CanIf_TxConfirmation
- 说明:
- 该服务确认一个先前已成功处理的 CAN TxPDU 发送。
- 如果 TxPduId 非法,则 CanIf 会报告开发错误码 CANIF_E_PARAM_LPDU。
- 参数:
- In:
PduIdType TxPduId- 已成功发送的 CAN L-PDU 的 L-PDU 句柄。该 ID 指定对应的 CAN L-PDU ID,并隐式指定 CAN 驱动实例以及 CAN 控制器设备。
- In:
- 返回值:Void
- 可重入性:Reentrant
- 同步 / 异步:Synchronous
- Service ID:0x13
- 定义于:CanIf_Can.h
CanIf_RxIndication
- 说明:
- 该服务在通过所有过滤和验证检查后,向 CanIf 指示一个 CAN Rx L-PDU 已成功接收。
- 如果 Mailbox→Hoh 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_HOH。
- 如果 Mailbox→CanId 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_CANID。
- 如果 PduInfoPtr->SduLength 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_INVALID_DATA_LENGTH。
- 如果 PduInfoPtr 或 Mailbox 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_POINTER。
- 参数:
- In:
const Can_HwType* Mailbox- 标识 HRH 及其对应的 CAN 控制器。const PduInfoType* PduInfoPtr- 指向接收 L-PDU 的指针。
- In:
- 返回值:Void
- 可重入性:Reentrant
- 同步 / 异步:Synchronous
- Service ID:0x14
- 定义于:CanIf_Can.h
CanIf_XLRxIndication
- 说明:
- 该服务在通过所有过滤和验证检查后,向 CanIf 指示一个 CAN XL Rx L-PDU 已成功接收。它除了提供硬件和实际 L-PDU 信息外,还提供 CAN XL 特定参数。
- 如果 Mailbox→Hoh 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_HOH。
- 如果 Mailbox→CanId 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_CANID。
- 如果 PduInfoPtr、Mailbox 或 Mailbox->XLParams 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_POINTER。
- 参数:
- In:
const CanXL_HwType* Mailbox- 标识 HRH 及其对应的 CAN 控制器。const PduInfoType* PduInfoPtr- 指向接收 L-PDU 的指针。
- In:
- 返回值:Void
- 可重入性:Reentrant
- 同步 / 异步:Synchronous
- Service ID:0x55
- 定义于:CanIf_Can.h
CanIf_ControllerBusOff
- 说明:
- 该服务指示某 CAN 控制器(由抽象 CanIf ControllerId 表示)发生 BusOff 事件。
- 如果 ControllerId 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_CONTROLLERID。
- 参数:
- In:
uint8 ControllerId- 抽象的 CanIf ControllerId,分配给发生 BusOff 的 CAN 控制器。
- In:
- 返回值:Void
- 可重入性:Reentrant
- 同步 / 异步:Synchronous
- Service ID:0x16
- 定义于:CanIf_Can.h
CanIf_ConfirmPnAvailability
- 说明:
- 该服务指示某 CAN 收发器(由抽象 CanIf TransceiverId 表示)正在运行于 PN 通信模式。
- 如果 TransceiverId 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_TRCV。
- 该函数由配置参数 CanIfPublicPnSupport 和 CanIfPublicTrcvPnEnable 在预编译期配置为开 / 关。
- 参数:
- In:
uint8 TransceiverId- 抽象的 CanIf TransceiverId,分配给已检测 PN 可用性的 CAN 收发器。
- In:
- 返回值:Void
- 可重入性:Reentrant
- 同步 / 异步:Synchronous
- Service ID:0x1a
- 定义于:CanIf_CanTrcv.h
CanIf_ConfirmCtrlPnAvailability
- 说明:
- 该服务指示某 CAN 控制器(由抽象 CanIf ControllerId 表示)正在运行于 PN 通信模式。
- 如果 ControllerId 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_CONTROLLERID。
- 该函数由配置参数 CanIfPublicPnSupport 和 CanIfPublicCtrlPnEnable 在预编译期配置为开 / 关。
- 参数:
- In:
uint8 ControllerId- 抽象的 CanIf ControllerId,分配给已检测 PN 可用性的 CAN 控制器。
- In:
- 返回值:Void
- 可重入性:Reentrant
- 同步 / 异步:Synchronous
- Service ID:0x56
- 定义于:CanIf_CanDrv.h
CanIf_ClearTrcvWufFlagIndication
- 说明:
- 该服务指示某 CAN 收发器(由抽象 CanIf TransceiverId 表示)已经清除了 WufFlag。
- 如果 TransceiverId 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_TRCV。
- 该函数由配置参数 CanIfPublicPnSupport 和 CanIfPublicTrcvPnEnable 在预编译期配置为开 / 关。
- 参数:
- In:
uint8 TransceiverId- 抽象的 CanIf TransceiverId,分配给已检查 PN 可用性的 CAN 收发器。
- In:
- 返回值:Void
- 可重入性:Reentrant
- 同步 / 异步:Synchronous
- Service ID:0x20
- 定义于:CanIf_CanTrcv.h
CanIf_CheckTrcvWakeFlagIndication
- 说明:
- 该服务指示对于某 CAN 收发器(由抽象 CanIf TransceiverId 表示)的唤醒标志检查已经完成。该指示用于处理收发器通信的异步特性。
- 如果 TransceiverId 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_TRCV。
- 该函数由配置参数 CanIfPublicPnSupport 和 CanIfPublicTrcvPnEnable 在预编译期配置为开 / 关。
- 参数:
- In:
uint8 TransceiverId- 抽象的 CanIf TransceiverId,分配给已检查 PN 可用性的 CAN 收发器。
- In:
- 返回值:Void
- 可重入性:Reentrant
- 同步 / 异步:Synchronous
- Service ID:0x21
- 定义于:CanIf_CanTrcv.h
CanIf_ControllerModeIndication
- 说明:
- 该服务指示某 CAN 控制器(由抽象 CanIf ControllerId 表示)发生了状态转换。
- 如果 ControllerId 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_CONTROLLERID。
- 参数:
- In:
uint8 ControllerId- 抽象的 CanIf ControllerId,分配给发生状态转换的 CAN 控制器。Can_ControllerStateType ControllerMode- 控制器切换到的模式。
- 返回值:Void
- In:
- 可重入性:Reentrant
- 同步 / 异步:Synchronous
- Service ID:0x17
- 定义于:CanIf_Can.h
CanIf_TrcvModeIndication
- 说明:
- 该服务指示某 CAN 收发器(由抽象 CanIf TransceiverId 表示)发生了状态转换。
- 如果 TransceiverId 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_TRCV。
- 如果未支持收发器(未配置 CanIfTrcvDrvCfg),则 CanIf 不提供该函数。
- 参数:
- In:
uint8 ControllerId- 抽象的 CanIf TransceiverId,分配给发生状态转换的 CAN 收发器。CanTrcv_TrcvModeType TransceiverMode- 收发器切换到的模式。
- 返回值:Void
- In:
- 可重入性:Reentrant
- 同步 / 异步:Synchronous
- Service ID:0x22
- 定义于:CanIf_CanTrcv.h
CanIf_ControllerErrorStatePassive
- 说明:
- 该函数根据 RxErrorCounter / TxErrorCounter 的值计算出 ErrorCounterThreshold,并作为安全事件 SEV_CAN_ERRORSTATE_PASSIVE 报告给 IdsM,同时准备该安全事件的上下文数据。
- 如果 ControllerId 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_CONTROLLERID。
- 参数:
- In:
uint8 ControllerId- 抽象的 CanIf ControllerId,分配给某 CAN 控制器。uint16 RxErrorCounter- Rx 错误计数器的值。uint16 TxErrorCounter- Tx 错误计数器的值。
- 返回值:Void
- In:
- 可重入性:Reentrant
- 同步 / 异步:Synchronous
- Service ID:0x4f
- 定义于:CanIf_Can.h
CanIf_ErrorNotification
- 说明:
- 该函数通过参数 CanError 推导出总线错误源是 Rx 还是 Tx,并将总线错误作为安全事件 SEV_CAN_TX_ERROR_DETECTED 或 SEV_CAN_RX_ERROR_DETECTED 报告,同时准备相应安全事件的上下文数据。
- 如果 ControllerId 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_CONTROLLERID。
- 如果 Can_ErrorType 非法,则 CanIf 会向 DET 报告开发错误码 CANIF_E_PARAM_CAN_ERROR。
- 参数:
- In:
uint8 ControllerId- 抽象的 CanIf ControllerId,分配给某 CAN 控制器。Can_ErrorType Can_ErrorType- 报告的 CAN 错误。
- 返回值:Void
- In:
- 可重入性:Reentrant
- 同步 / 异步:Synchronous
- Service ID:0x50
- 定义于:CanIf_Can.h
接口(Interface)
- 必选接口 / API(Mandatory Interfaces/APs)
- Can_GetControllerErrorState - 获取 CAN 控制器的错误状态。
- Can_GetControllerRxErrorCounter - 返回 CAN 控制器的 Rx 错误计数器。对于某些 CAN 控制器该值可能不可用,此时返回 E_NOT_OK。需要注意的是,由于 Rx 计数器由硬件异步维护,API 返回时该值可能并非最新,上层应用不应依赖该值推断当前总线状态。
- Can_GetControllerTxErrorCounter - 返回 CAN 控制器的 Tx 错误计数器。对于某些 CAN 控制器该值可能不可用,此时返回 E_NOT_OK。同样,由于 Tx 计数器由硬件异步维护,API 返回时该值可能并非最新,上层应用不应依赖该值推断当前总线状态。
- Can_SetControllerMode - 该函数执行对 CAN 控制器状态机的软件触发状态切换。
- Can_Write - 该函数由 CanIf 调用,将 CAN 消息传递给 CanDrv 进行发送。
- Det_ReportRuntimeError - 用于上报运行时错误的服务。如果配置了回调,则应调用该回调。
- 可选接口(Optional Interfaces)
- Can_CheckWakeup - 检查指定控制器是否发生唤醒。
- Can_SetBaudrate - 设置 CAN 控制器的波特率配置。根据波特率修改需求,控制器可能需要复位。
- CanNm_RxIndication - 从下层通信接口模块指示收到一个 PDU。
- CanNm_TxConfirmation - 下层通信接口模块确认 PDU 发送成功或发送失败。
- CanSM_CheckTransceiverWakeFlagIndication - 该回调用于指示 CanIf_CheckTrcvWakeFlag API 对指定 CAN 收发器的处理已完成。
- CanSM_ClearTrcvWufFlagIndication - 该回调用于指示 CanIf_ClearTrcvWufFlag API 对指定 CAN 收发器的处理已完成。
- CanSM_ConfirmCtrlPnAvailability - 该回调用于指示控制器正在运行于 PN 通信模式。
- CanSM_ConfirmPnAvailability - 该回调用于指示收发器正在运行于 PN 通信模式。
- CanSM_ControllerBusOff - 该回调用于通知 CanSM 某 CAN 控制器发生 BusOff 事件,以便按照指定的 BusOff 恢复策略处理受影响 CAN 网络。
- CanSM_ControllerModeIndication - 该回调用于通知 CanSM 某 CAN 控制器模式发生变化。
- CanSM_TransceiverModeIndication - 该回调用于通知 CanSM 某 CAN 收发器模式发生变化。
- CanTp_RxIndication - 从下层通信接口模块指示收到一个 PDU。
- CanTp_TxConfirmation - 下层通信接口模块确认 PDU 发送成功或发送失败。
- CanTrcv_CheckWakeFlag - 请求从收发器硬件检查唤醒标志状态。
- CanTrcv_CheckWakeup - 当检测到唤醒中断时,由底层 CANIF 调用的服务。
- CanTrcv_GetBusWuReason - 获取收发器的唤醒原因并返回到参数 Reason。
- CanTrcv_GetOpMode - 获取收发器模式并返回到 OpMode。
- CanTrcv_SetOpMode - 将收发器模式设置为 OpMode 指定的值。
- CanTrcv_SetWakeupMode - 根据 TrcvWakeupMode 启用、禁用或清除收发器唤醒事件。
- CanTSyn_RxIndication - 从下层通信接口模块指示收到一个 PDU。
- CanTSyn_TxConfirmation - 下层通信接口模块确认 PDU 发送成功或发送失败。
- CanXL_Write - 该函数由 CanIf 调用,用于将 CAN XL 消息传递给 CAN XL 驱动发送,同时提供 CAN XL 特定参数以及硬件句柄和实际 PDU 信息。
- Det_ReportError - 用于上报开发错误的服务。
- EcuM_ValidateWakeupEvent - 唤醒后,ECU 状态管理器会在 WAKEUP VALIDATION 状态 / 序列暂停,等待对唤醒事件的验证。该 API 用于向 ECU 管理模块指示参数 sources 中包含的唤醒事件已被验证。
- IdsM_SetSecurityEventWithContextData - 该 API 是应用接口,用于向 IdsM 上报带上下文数据的安全事件。
- J1939Nm_RxIndication - 从下层通信接口模块指示收到一个 PDU。
- J1939Nm_TxConfirmation - 下层通信接口模块确认 PDU 发送成功或发送失败。
- J1939Tp_RxIndication - 从下层通信接口模块指示收到一个 PDU。
- J1939Tp_TxConfirmation - 下层通信接口模块确认 PDU 发送成功或发送失败。
- Mirror_ReportCanFrame - 报告一个接收或发送的 CAN 帧。所有通过硬件接收过滤的接收 CAN 帧都会被报告,而不依赖软件过滤配置。发送的 CAN 帧会在发送确认时报告。
- PduR_CanIfRxIndication - 从下层通信接口模块指示收到一个 PDU。
PduR_CanIfTxConfirmation(定义于 PduR_CanIf.h)- 下层通信接口模块确认 PDU 发送成功或发送失败。 - Xcp_CanIfRxIndication - 从下层通信接口模块指示收到一个 PDU。
- Xcp_CanIfTxConfirmation - 下层通信接口模块确认 PDU 发送成功或发送失败。
本文围绕 AUTOSAR 23-11 中的 CAN 接口模块(CanIf)展开,从架构定位、关键概念到数据流与 API 设计进行系统梳理。首先说明 CanIf 作为 Com 服务层与底层 CanDrv 之间的抽象接口,集中实现与硬件无关的通信逻辑,让 CanDrv 专注具体控制器操作。文中详细解释了 L-PDU/L-SDU、HOH/HRH/HTH、CAN Hardware Unit、Hardware Object 等基础术语,并说明 HRH/HTH 如何作为对 CAN 邮箱的抽象引用,将上层 PDU 与底层硬件对象解耦。随后介绍 CanIf 对静态 L-PDU 的管理、BasicCAN 与 FullCAN 的区别及其在硬件过滤与软件过滤中的作用,以及通过 CanIfHthCfg/CanIfHrhCfg、软件过滤器和 ID 范围/掩码机制,将接收的 CanId 映射到正确的 Rx L-PDU。文中进一步从初始化入手,说明 EcuM、CanSm、CanDrv、CanTrcv 与 CanIf 的协同关系,并重点展开发送与接收数据流:包括 CanIf_Transmit 的处理步骤、发送缓冲策略、触发发送(TriggerTransmit)、TxConfirmation 的中断/轮询两种调用路径,以及 RxIndication 后的软件过滤、数据长度检查、接收缓存和读取接口(CanIf_ReadRxPduData/ReadTx/RxNotifStatus)。在此基础上,文章还系统讲解了控制器模式与 PDU 通道模式(CANIF_OFFLINE、TX_OFFLINE、TX_OFFLINE_ACTIVE、ONLINE)的联动机制,BusOff 处理、轮询模式、多 CanDrv 支持、部分网络(PN)下的 PnTxFilter 行为,以及唤醒检测与唤醒验证流程。最后,以接口列表的形式对 CanIf 提供的各类服务函数和回调(控制器/收发器模式控制、波特率切换、错误计数与错误上报、时间戳与总线镜像等)进行了归纳,为读者理解 RTA-CAR 中 CanIf 的实现、配置要点和与上下游模块的交互关系提供了一份较完整的参考。
- 函数定义(Function Definitions)
更多推荐



所有评论(0)