AUTOSAR_SWS_CANDriver
AUTOSAR_SWS_CANDriver
简介和功能概述
该规范指定了 AUTOSAR 基础软件模块 CAN 驱动程序(在本文档中称为“Can 模块”)的功能、API 和配置。
CAN 模块属于最低层,执行硬件访问并向上层提供独立于硬件的 API。
唯一可以访问 CAN 模块的上层是 CanIf 模块(另请参阅 SRS_SPAL_12092)。
CAN 模块提供启动传输的服务,并调用 CanIf 模块的回调函数来通知事件,独立于硬件。
此外,它还提供控制属于同一 CAN 硬件单元的 CAN 控制器的行为和状态的服务。
只要属于同一个 CAN 硬件单元,多个 CAN 控制器就可以由单个 CAN 模块控制。
有关 CAN 控制器和 CAN 硬件单元的详细描述,请参见首字母缩略词和缩写章节以及[5]中的图表。
首字母缩略词和缩写
优先级反转
- 由于优先级较低,存储在缓冲区中的消息会等待,直到“总线上的流量平静下来”。
- 在等待期间,此消息可能会阻止同一微控制器生成通过总线传输的更高优先级的消息。
- 假设 CAN 节点希望传输一组具有高优先级的连续消息,这些消息存储在不同的消息缓冲区中。如果 CAN 网络上这些消息之间的帧间空间大于 CAN 标准定义的最小空间,则第二个节点能够开始传输较低优先级的消息。
- 最小帧间空间由间歇字段确定,该字段由 3 个隐性 bit 组成。
- 之前由于另一条消息的传输而处于待处理阶段的消息,将在总线空闲期间开始被传输,最快可紧随间歇字段之后,从间歇字段之后的第一个 bit 开始。
- 例外情况是,具有待传输的消息的节点会将间歇字段的第三个 bit 解释为显性 bit,并以此 bit 作为帧的起始位,开始传输帧的第一个标识符位,而无需先传输 SOF 位。
- CAN 模块的内部处理时间必须足够短,以发送具有最小帧间空间的连续消息,以避免在上述所有情况下出现外部优先级反转。
CAN 硬件单元
CAN 硬件单元将一个或多个 CAN 控制器(可能位于片上或作为相同类型的外部独立设备)与通用或单独的硬件对象组合在一起。下图显示了一个 CAN 硬件单元,它由两个连接到两个物理通道的 CAN 控制器组成:
一个 CAN 控制器始终对应一个物理通道。允许在总线侧连接物理通道。无论如何,CanIf 模块将分别处理相关的 CAN 控制器。
一些 CAN 硬件单元支持使用 CAN RAM 组合多个 CAN 控制器的可能性,以扩展一个 CAN 控制器的消息对象数量。这些组合的 CAN 控制器由 CAN 模块作为一个控制器处理。
CAN 模块不支持 CAN 远程帧。
[SWS_Can_00237]
[SRS_Can_01147]
- CAN 模块不得传输由远程传输请求触发的报文。
[SWS_Can_00236]
[SRS_Can_01147]
- CAN 模块应初始化 CAN 硬件以忽略任何远程传输请求。
对其他模块的依赖
驱动服务
[SWS_Can_00238]
[SRS_BSW_00005]
- 如果 CAN 控制器在片上,则 CAN 模块不得使用任何其他驱动程序的服务。
[SWS_Can_00239]
[SRS_BSW_00377]
- 函数 Can_Init 将初始化 CAN 控制器使用的所有片上硬件资源。唯一的例外是数字 I/O 引脚配置(CAN 使用的引脚),该配置由 Port 驱动程序完成。
[SWS_Can_00240]
[ ]
- MCU 模块(SPAL 参见 [8])应配置与其他模块“共享”的寄存器设置。
实施提示:在初始化 CAN 模块之前,应先初始化 MCU 模块。
[SWS_Can_00242]
[SRS_BSW_00005]
- 如果使用片外 CAN 控制器(在这种情况下,CAN 驱动程序不再是 C 抽象层的一部分,而是 ECU 抽象层的一部分。因此(理论上)可以使用所需的任何 C 抽象层驱动程序。),则 CAN 模块应使用其他 MCAL 驱动程序的服务(例如 SPI)。
实施提示:如果 CAN 模块使用其他 MCAL 驱动程序的服务(例如 SPI),则必须确保在初始化 CAN 模块之前这些驱动程序已启动并正在运行。
[SWS_Can_00244]
[ ]
- CAN 模块应使用底层 MCAL 驱动程序的同步 API,并且不得提供可由 MCAL 驱动程序调用的回调函数。
因此,C 和 CAN 硬件单元之间的连接类型仅对实现有影响,而不对 API 有影响。
系统服务
[SWS_Can_00280]
[ ]
- 在特殊的硬件情况下,CAN 模块应轮询硬件事件。
[SWS_Can_00281]
[ ]
- CAN 模块应当使用系统服务提供的 OsCounter 进行超时检测,以防硬件没有在预期的时间内做出反应(硬件故障),防止无限循环。
实施提示:等待硬件反应的 CAN 模块函数的阻塞时间应短于 CAN 主函数(即 Can_MainFunction_Read)的触发周期,因为 CAN 主函数不能用于此目的。
CAN 模块用户
[SWS_Can_00058]
[SRS_SPAL_12092]
- CAN 模块与其他模块(例如默认错误跟踪器 (DET)、ECU 状态管理器 (EcuM))直接交互,并与 CanIf 模块交互。本文档从未指定请求的实际来源或通知的实际目的地。驱动程序仅将 CanIf 模块视为来源和目的地。
文件结构
[SWS_Can_00436]
[ ]
- Can_GeneralTypes.h 应包含 AUTOSAR CAN 模块 Can、CanIf 和 CanTrcv 之间共享的所有类型和常量。
需求可追溯性
功能规格
在 L-PDU 传输时,CAN 模块将 L-PDU 写入 CAN 控制器硬件内部的适当缓冲区中。有关 L-PDU 传输的详细说明,请参阅第 7.5 章。
在 L-PDU 接收时,CAN 模块使用 ID、数据长度和指向 L-SDU 的指针作为参数调用 RX 指示回调函数。有关 L-PDU 接收的详细说明,请参阅第 7.6 章。
CAN 模块提供了一个用作周期性处理的功能接口,必须由基本软件调度程序模块定期调用。
此外,CAN 模块还提供控制 CAN 控制器状态的服务。总线关闭和唤醒事件通过回调函数通知。
CAN 模块是访问硬件资源的基础软件模块。因此,它旨在满足 AUTOSAR_SRS_SPAL(AUTOSAR_SRS_SPALGeneral.pdf)中指定的基础软件模块的要求。
[SWS_Can_00033]
[SRS_BSW_00164]
[SRS_SPAL_12129]
- CAN 模块应为所有需要使用到的 CAN 硬件单元中断实现中断服务程序。
[SWS_Can_00419]
[ ]
- CAN 模块应禁用 CAN 控制器中所有未使用的中断。
[SWS_Can_00420]
[ ]
- CAN 模块应在 ISR 结束时重置中断标志(如果硬件没有自动完成)。
实施提示:CAN 模块不得设置向量表条目的配置(即优先级)。
[SWS_Can_00079]
[SRS_BSW_00007]
[SRS_BSW_00306]
[SRS_BSW_00308]
[SRS_BSW_00309]
[SRS_BSW_00330]
- CAN 模块应满足基础软件模块通用要求中描述的所有设计和实施指南。
驱动范围
一个 CAN 模块可以访问一个可能由多个 CAN 控制器组成的 CAN 硬件单元。
[SWS_Can_00077]
[SRS_BSW_00347]
- 对于不同类型的 CAN 硬件单元,应实现不同的 CAN 模块。
[SWS_Can_00284]
[ ]
- 如果在一个 ECU 中实现了多个 CAN 硬件单元(相同或不同供应商),则 CAN 模块的函数名称和全局变量应实现为不同名称的函数和全局变量。
命名约定如下:
<CAN 模块 名称>_<供应商 ID>_<供应商 具体 API 名称>_<驱动程序缩写>()
[SRS_BSW_00347] 指定命名约定。
[SWS_Can_00385]
[ ]
- 仅当必须支持一个 ECU 上的多种不同类型的 CAN 控制器时,才应使用命名约定。
[SWS_Can_00386]
[ ]
- 如果仅使用一种控制器类型,则原始命名约定(不带任何 <驱动程序缩写> 扩展)就足够了。
有关 CanIf 模块如何处理多个 CAN 模块的描述,请参阅 CAN 接口规格(AUTOSAR_SWS_CANInterface.pdf)。
驱动程序状态机
CAN 模块的状态机非常简单,只有两个状态 CAN_UNINIT 和 CAN_READY。图7.1显示了状态机。
[SWS_Can_00103]
[SRS_BSW_00406]
- 上电/复位后,CAN 模块应处于 CAN_UNINIT 状态。
[SWS_Can_00246]
[SRS_SPAL_12057]
[SRS_Can_01041]
- 初始化硬件单元内的所有控制器后,函数 Can_Init 应将模块状态更改为 CAN_READY。
[SWS_Can_00245]
[SRS_SPAL_12057]
[SRS_Can_01041]
- 函数 Can_Init 将根据配置初始化所有 CAN 控制器。
然后必须通过调用函数 Can_SetControllerMode( CAN_CS_STARTED ) 单独启动每个 CAN 控制器。
实现提示:
对硬件单元内所有 CAN 控制器都有影响的硬件寄存器的设置只能在函数 Can_Init 中设置。
实现提示:
ECU 状态管理器模块在运行时最多应调用一次 Can_Init。
[SWS_Can_91009]
[SRS_Can_01166]
- 函数 Can_DeInit 应在取消初始化硬件单元内的所有控制器之前,将模块状态更改为 CAN_UNINIT。
参考 [SWS_Can_91010]。
CAN 控制器状态机
每个 CAN 控制器都有用硬件实现的复杂状态机。为简化起见,本描述中将状态数减少为以下四个基本状态:
- UNINIT
- STOPPED
- STARTED
- SLEEP
任何对 CAN 硬件的访问都会被 CAN 模块的函数封装起来,但 CAN 模块不会记忆状态变化。
CAN 模块提供 Can_Init、Can_SetBaudrate 和 Can_SetControllerMode 服务。这些服务执行必要的寄存器设置,从而引起所需的硬件 CAN 控制器状态的更改。
外部事件触发状态改变的情况总共有两种:
- 总线关闭事件
- 硬件唤醒事件
这些事件由中断或 Can_MainFunction_BusOff 或 Can_MainFunction_Wakeup 中轮询的状态位指示。
CAN 模块执行必要的寄存器设置以实现所需的行为(即,在总线关闭的情况下不进行硬件恢复)。然后,它使用相应的回调函数通知 CanIf 模块(软件状态在此回调函数内更改)。
如果启用了开发错误,并且上层请求了不允许的状态转换,则 CAN 模块将引发开发错误 CAN_E_TRANSITION。
CAN 模块在执行 Can_Write 或引发回调之前不会检查实际状态。
CAN 控制器状态描述
本章介绍不同控制器状态所需的硬件行为。
CAN 控制器状态 UNINIT
CAN 控制器未初始化。所有属于 CAN 模块的寄存器都处于复位状态,CAN 中断已禁用。CAN 控制器未加入 CAN 总线。
CAN 控制器状态 STOPPED
在此状态下,CAN 控制器已初始化,但不加入总线。此外,不得发送错误帧和确认。
(示例:对于许多控制器,进入“初始化”模式会导致控制器停止。)
CAN 控制器状态 STARTED
控制器处于正常运行模式,功能齐全,这意味着它已加入网络。对于许多控制器来说,离开“初始化”模式会导致控制器启动。
CAN 控制器状态 SLEEP
对于支持睡眠模式(由 CAN 硬件直接支持通过 CAN 总线唤醒)的 CAN 硬件,在硬件设置上仅在 STOPPED 状态时有不同。
[SWS_Can_00257]
[SRS_SPAL_12067]
- 当 CAN 硬件支持睡眠模式并被触发转换到睡眠状态时,CAN 模块应将控制器设置为睡眠状态,硬件可通过 CAN 总线从该状态唤醒。
[SWS_Can_00258]
[ ]
- 当 CAN 硬件不支持睡眠模式并被触发转换到 SLEEP 状态时,CAN 模块应模拟一个逻辑 SLEEP 状态,只有当它被软件触发转换到 STOPPED 状态时,它才会从该状态返回。
[SWS_Can_00404]
[ ]
- 当处于逻辑 SLEEP 状态时,CAN 硬件应保持处于 STOPPED 状态。
CAN 控制器状态转换
软件使用 Can_SetControllerMode 函数触发状态转换,参数为所需的转换目标状态。由软件触发的成功状态转换将会通过回调函数 (CanIf_ControllerModeIndication) 来通知。
监控是否达到所请求的状态是上层模块的一部分,而不是 CAN 模块的一部分。
某些转换由总线 (硬件) 上的事件触发。这些转换通过回调函数发出通知。
生产代码中无效转换的行为未定义。图 7-2 显示了所有有效的状态转换。
- UNINIT -> STOPPED(对于硬件单元中的所有控制器)
- 由调用 Can_Init 函数造成的软件触发
- 对硬件单元内的所有 CAN 控制器进行配置
所有控制寄存器均按照静态配置来设置。
[SWS_Can_00259]
[ ]
- 函数 Can_Init 应将所有 CAN 控制器设置为 STOPPED 状态。
当进入函数 Can_Init 并且 CAN 模块不处于 CAN_UNINIT 状态或 CAN 控制器不处于 UNINIT 状态时,它将引发错误 CAN_E_TRANSITION(与 [SWS_Can_00174] 和 [SWS_Can_00408] 比较)。
函数 Can_SetBaudrate 引起的状态转换
- STOPPED -> STOPPED,SLEEP -> SLEEP,STARTED -> STARTED
- 由调用 Can_SetBaudrate 函数造成的软件触发
- 更改 CAN 控制器配置
CAN 控制器寄存器按照静态配置进行设置。
[SWS_Can_00256]
[ ]
- 如果调用 Can_SetBaudrate() 使 CAN 控制器重新初始化后,CAN 控制器未处于 STOPPED 状态,则它应返回 E_NOT_OK。
[SWS_Can_00260]
[ ]
- 如果需要重新初始化,函数 Can_SetBaudrate 应维持 CAN 控制器处于 STOPPED 状态。
[SWS_Can_00422]
[ ]
- 如果需要重新初始化,函数 Can_SetBaudrate 应确保不会设置任何导致 CAN 控制器加入网络的设置。
函数 Can_SetControllerMode 引起的状态转换
软件可以使用 Can_SetControllerMode 函数触发 CAN 控制器状态转换。根据 CAN 硬件,可能需要经过一段时间的延迟才能更改寄存器设置以转换到新的 CAN 控制器状态。
CAN 模块在状态转换成功后向上层 (CanIf_ControllerModeIndication) 通知新状态。监控是否达到所请求的状态是上层模块的实现功能,而不是 CAN 模块的实现功能。
[SWS_Can_00370]
[ ]
- 函数 Can_Mainfunction_Mode 应轮询 CAN 状态寄存器的标志,直到该标志发出信号表明更改生效,并使用函数 CanIf_ControllerModeIndication 以及抽象 CanIf ControllerId 通知上层有关引用的相应 CAN 控制器的状态转换已成功。
[SWS_Can_00398]
[ ]
- 函数 Can_SetControllerMode 应使用系统服务 GetCounterValue 进行超时监控,以避免阻塞函数。
[SWS_Can_00372]
[SRS_SPAL_12077]
- 如果标志表明更改未生效并且最大时间 CanTimeoutDuration 已过,则应退出函数 Can_SetControllerMode,并且函数 Can_Mainfunction_Mode 应继续轮询标志。
[SWS_Can_00373]
[ ]
- 如果状态转换是由函数 Can_SetControllerMode 触发的,函数 Can_Mainfunction_Mode 应当调用函数 CanIf_ControllerModeIndication 来通知上层抽象 CanIf ControllerId 所引用的相应 CAN 控制器的状态转换已成功。
函数 Can_SetControllerMode(CAN_CS_STARTED)引起的状态转换
- STOPPED -> STARTED
- 软件触发
[SWS_Can_00261]
[ ]
- 函数 Can_SetControllerMode( CAN_CS_STARTED ) 将以使 CAN 控制器加入网络的方式设置硬件寄存器。
[SWS_Can_00262]
[ ]
- 函数 Can_SetControllerMode( CAN_CS_STARTED ) 应等待有限的时间,直到 CAN 控制器完全运行。与 [SWS_Can_00398] 比较。
在 CAN 控制器运行之前发起的传输请求会丢失。
可操作性的唯一确认方式是接收 TX 确认或 RX 确认。
发送实体可能会收到确认超时,并且需要能够应对这种情况。
[SWS_Can_00409]
[ ]
- 当进入函数 Can_SetControllerMode( CAN_CS_STARTED ) 且 CAN 控制器未处于 STOPPED 状态时,它将检测到无效的状态转换(与 [SWS_Can_00200] 比较)。
函数 Can_SetControllerMode(CAN_CS_STOPPED)引起的状态转换
- STARTED -> STOPPED
- SLEEP -> STOPPED
- 软件触发
[SWS_Can_00263]
[ ]
- 函数 Can_SetControllerMode( CAN_CS_STOPPED ) 将设置 CAN 硬件内部的 bit,以使 CAN 控制器停止加入网络。
[SWS_Can_00264]
[ ]
- 函数 Can_SetControllerMode( CAN_CS_STOPPED ) 应等待一段有限的时间,直到 CAN 控制器真正关闭(与 [SWS_Can_00398] 比较)。
[SWS_Can_00267]
[ ]
- 如果 CAN 硬件不支持睡眠模式,则从 SLEEP 到 STOPPED 的转换将从逻辑睡眠模式返回,但对 CAN 控制器状态没有影响(因为控制器已经处于停止状态)。
[SWS_Can_00268]
[ ]
- 函数 Can_SetControllerMode( CAN_CS_STOPPED ) 应等待一段有限的时间,直到 CAN 控制器处于 STOPPED 状态(与 [SWS_Can_00398] 比较)。
[SWS_Can_00282]
[ ]
- 函数 Can_SetControllerMode( CAN_CS_STOPPED ) 将取消待处理的消息。
函数 Can_SetControllerMode(CAN_CS_SLEEP)引起的状态转换
- STOPPED -> SLEEP
- 软件触发
[SWS_Can_00265]
[ ]
- 函数 Can_SetControllerMode( CAN_CS_SLEEP ) 将把控制器设置为睡眠模式。
[SWS_Can_00266]
[ ]
- 如果 CAN 硬件支持睡眠模式,则函数 Can_SetControllerMode( CAN_CS_SLEEP ) 应等待一段有限的时间,直到 CAN 控制器处于睡眠状态并确保 CAN 硬件可唤醒(与 [SWS_Can_00398] 比较)。
[SWS_Can_00290]
[ ]
- 如果 CAN 硬件不支持睡眠模式,函数 Can_SetControllerMode( CAN_CS_SLEEP ) 应将 CAN 控制器设置为逻辑睡眠模式。
[SWS_Can_00405]
[ ]
- 仅当调用函数 Can_SetControllerMode( CAN_CS_STOPPED ) 时,才会退出此逻辑睡眠模式。
[SWS_Can_00411]
[ ]
- 当进入函数 Can_SetControllerMode( CAN_CS_SLEEP ),且 CAN 控制器既不处于 STOPPED 状态也不处于 SLEEP 状态时,它应检测到无效的状态转换(与 [SWS_Can_00200] 比较)。
硬件唤醒引起的状态转换(由 CAN 总线的唤醒事件触发)
- SLEEP -> STOPPED
- 由传入的 L-PDU 触发
- ECU 状态管理器模块通过函数 EcuM_CheckWakeup 接收通知
仅当硬件支持睡眠模式时,才会发生这种状态转换。
[SWS_Can_00270]
[ ]
- 当硬件唤醒时(由 CAN 总线的唤醒事件触发),CAN 控制器应转换到 STOPPED 状态。
[SWS_Can_00271]
[SRS_BSW_00375]
[SRS_SPAL_12069]
[SRS_Can_01054]
- 当硬件唤醒时(由 CAN 总线的唤醒事件触发),CAN 模块应在中断上下文或 Can_MainFunction_Wakeup 上下文中调用函数 EcuM_CheckWakeup。
[SWS_Can_00269]
[ ]
- CAN 模块不得进一步处理导致唤醒的 L-PDU。
[SWS_Can_00048]
[SRS_Can_01122]
- 如果在退出睡眠转换期间发生 CAN 总线唤醒,函数 Can_SetControllerMode( CAN_CS_STOPPED ) 将返回 E_NOT_OK。
由 Bus-Off 引起的状态转换(由 CAN 控制器的状态改变触发)
[SWS_Can_00020]
[SRS_Can_01055]
- STARTED -> STOPPED
- 当 CAN 控制器遇到总线关闭状态时,此转换由硬件触发
- 当达到 STOPPED 状态后,通过函数 CanIf_ControllerBusOff 通知 CanIf 模块,并参考具有抽象 CanIf ControllerId 的相应 CAN 控制器。
[SWS_Can_00272]
[SRS_Can_01060]
- 检测到总线关闭后,CAN 控制器应转换至 STOPPED 状态,并且 CAN 模块应确保 CAN 控制器不再处于加入网络的状态。
[SWS_Can_00273]
[SRS_Can_01060]
- 检测到总线关闭后,CAN 模块应取消未处理的消息。
[SWS_Can_00274]
[SRS_Can_01060]
- CAN 模块应禁用或抑制自动总线关闭恢复。
函数 Can_DeInit 引起的状态转换
- STOPPED -> UNINIT; SLEEP -> UNINIT(适用于硬件单元中的所有控制器)
- 由调用函数 Can_DeInit 造成的软件触发
- 准备重新配置硬件单元内的所有 CAN 控制器
[SWS_Can_91010]
[SRS_Can_01166]
[SRS_Can_01053]
- 函数 Can_DeInit 应将所有 CAN 控制器设置为 UNINIT 状态。
当进入函数 Can_DeInit 并且 CAN 模块不处于 CAN_READY 状态或任何 CAN 控制器都处于 STARTED 状态时,它将引发错误 CAN_E_TRANSITION(参考 [SWS_Can_91011] 和 [SWS_Can_91012])。
CAN 模块/控制器初始化
ECU 状态管理器模块应在使用 CAN 模块的任何其他功能之前,在启动阶段通过调用函数 Can_Init 来初始化 CAN 模块。
[SWS_Can_00250]
[SRS_BSW_00101]
- Can_Init 函数应初始化:
- 静态变量,包括标志
- 完整 CAN 硬件单元的通用设置
- 每个 CAN 控制器的 CAN 控制器特定设置
[SWS_Can_00053]
[SRS_SPAL_12125]
- Can_Init 不应改变未使用的 CAN 控制器的寄存器。
CAN 模块应应用以下有关控制器寄存器初始化的规则:
[SWS_Can_00407]
[SRS_SPAL_12461]
- 如果硬件只允许使用寄存器一次,则实现该功能的 CAN 模块负责初始化寄存器。
- 如果该寄存器可以影响多个硬件模块,并且它是 I/O 寄存器,则它应由 Port 驱动程序初始化。
- 如果该寄存器可以影响多个硬件模块,并且它不是 I/O 寄存器,则它应由 MCU 驱动程序初始化。
- 复位后需要直接初始化的一次性可写寄存器应由启动代码初始化。
- 所有其他寄存器均须由启动代码初始化。
[SWS_Can_00056]
[ ]
- 可以通过将指针“Config”传递给模块的 init 函数来选择第 10 章中标记为“多个”(“M”或“x”)的构建后配置元素。
[SWS_Can_00062]
[SRS_Can_01139]
[SRS_Can_01042]
- 如果 Can_SetBaudrate 确定目标配置更改需要重新初始化并且 CAN 控制器处于停止状态,则函数 Can_SetBaudrate 将重新初始化 CAN 控制器和控制器特定设置。
如果需要重新初始化,则必须先将 CAN 控制器切换到 STOPPED 状态,然后才能执行 Can_SetBaudrate() 并应用新的波特率配置。
[SWS_Can_00255]
[ ]
- 函数 Can_SetBaudrate 只会影响包含单个 CAN 控制器特定配置的寄存器区域。
[SWS_Can_00021]
[SRS_BSW_00344]
[SRS_BSW_00404]
[SRS_BSW_00405]
[SRS_SPAL_12263]
[SRS_SPAL_12265]
- 可以使用参数 Config 选择所需的 CAN 控制器配置。
[SWS_Can_00291]
[SRS_BSW_00438]
- Config 指向用于实现的数组,该数组是存储在 ROM 中的特定数据结构。不同的控制器配置集作为数据结构存在于 ROM 中。
Config 的可能值由配置描述提供(参见第 10 章)。
CAN 模块配置定义了全局 CAN 硬件单元的设置和对 CAN 控制器默认配置集的引用。
L-PDU 传输
在传输 L-PDU 时,CAN 模块将 L-PDU 的内容、 ID 以及数据长度转换为硬件特定格式(如有必要)并触发传输。
[SWS_Can_00059]
[SRS_SPAL_12063]
- CAN 到内存的数据映射定义如下:首先发送的 CAN 数据字节是数组元素 0,最后发送的 CAN 数据字节是数组元素 7 或 63(在 CAN FD 情况下) 。
[SWS_Can_00427]
[ ]
- 如果 CAN 硬件缓冲区内部的呈现与 AUTOSAR 定义不同,则 CAN 模块必须为上层提供适配的 SDU 缓存。
[SWS_Can_00100]
[SRS_Can_01135]
- 可以配置多个具有唯一 HTH 的 TX 硬件对象。CanIf 模块提供 HTH 作为 TX 请求的参数。请参见图 7-3 了解可能的配置。
[SWS_Can_00276]
[ ]
- 函数 Can_Write 应记录在参数 PduInfo 中给出的 swPduHandle,直到 CAN 模块针对此请求调用 CanIf_TxConfirmation,在此请求中 swPduHandle 将作为参数被给出。
[SWS_Can_00276] 的特性用于减少 CanIf 模块实现中的搜索时间。
[SWS_Can_00016]
[SRS_Can_01051]
- CAN 模块应调用 CanIf_TxConfirmation 来指示传输成功。它应由相应硬件资源的 TX 中断服务例程调用,或在轮询模式下在 Can_MainFunction_Write 内部调用。
优先级反转
可以使用多路复用传输来避免外部/内部优先级反转(参见第 2.1 章)。
[SWS_Can_00277]
[SRS_Can_01134]
- CAN 模块应允许在预编译时静态配置(ON | OFF)功能“多路复用传输”。
[SWS_Can_00401]
[SRS_Can_01134]
- 若干个传输硬件对象可被分配给同一个 HTH(由“CanHwObjectCount”定义),对于上层而言,他们是同一个传输实体。
[SWS_Can_00402]
[SRS_Can_01134]
- CAN 模块应支持多路复用传输机制,该机制适用于以下设备:
- 多个硬件传输对象,被分组为一个传输实体,使用相同的寄存器集可以填充他们中的任意一个,并且微控制器会自动将 L-PDU 存储到他们中为空闲状态的个体。
- 硬件将提供寄存器或功能来识别他们中的空闲个体。
[SWS_Can_00403]
[SRS_Can_01134]
- CAN 模块应支持设备的多路复用传输,设备按照 L-PDU 优先级的顺序发送 L-PDU。
注意:按优先级对 L-PDU 进行排序可以避免分配给配置为多路复用传输的 Basic-CAN 的 L-PDU 的内部优先级反转。
避免内部优先级反转的另一种可能性是:如果 CAN 硬件能够使用 CAN ID 或相关优先级字段在传输时确定优先级,则可将所有 HTH 都配置为 Full-CAN。
注意:应避免使用软件模拟的优先级处理,因为它的开销会使多路复用传输的优势丢失。
[SWS_Can_00011]
[SRS_SPAL_12075]
[SRS_Can_01059]
- CAN 模块应直接从上层缓冲区中复制数据。上层应负责保持缓冲区的一致性,直到函数调用(Can_Write)返回。
L-PDU 接收
[SWS_Can_00279]
[SRS_Can_01045]
- 在接收 L-PDU 时,CAN 模块应使用参数 Mailbox 中的 ID、Hoh、抽象 CanIf ControllerId 以及参数 PduInfoPtr 中的数据长度和指向 L-SDU 缓冲区的指针来调用 RX 指示回调函数 CanIf_RxIndication。
[SWS_Can_00423]
[ ]
- 对于扩展 CAN 帧,由于上层 (CanIf) 不知道所接收的 CAN 帧是标准 CAN 帧还是扩展 CAN 帧,因此 CAN 模块应将 ID 转换为标准格式。
- 对于扩展 CAN 帧,需要将所接收 CAN 帧的 ID 的 MSB 设为“1”,以将所接收的 CAN 帧标记为扩展 CAN 帧。
[SWS_Can_00396]
[SRS_Can_01045]
- 相应硬件资源的 RX 中断服务程序或轮询模式下的函数 Can_MainFunction_Read 会调用回调函数 CanIf_RxIndication。
[SWS_Can_00060]
[SRS_SPAL_12063]
- CAN 到内存的数据映射定义为首先接收的 CAN 数据字节为数组元素 0,最后接收的 CAN 数据字节为数组元素 7 或 63(对于 CAN FD 而言)。如果 CAN 硬件缓冲区内的表示与 AUTOSAR 定义不同,则 CAN 模块必须为上层提供适配的 SDU 缓冲区。
[SWS_Can_00501]
[SRS_Can_01162]
- CAN 驱动程序应指示接收到的消息是常规 CAN 帧还是 CAN FD 帧,该类型在 Can_IdType 中被描述。
接收数据一致性
为了防止丢失收到的消息,一些控制器支持由一组硬件对象构建的 FIFO,而在其他控制器上,可以配置具有相同属性的另一个硬件对象,该对象被用作影子缓冲区,并在主对象繁忙时介入。
[SWS_Can_00489]
[ ]
- CAN 驱动程序应支持实现了硬件 FIFO 功能的控制器。FIFO 的大小通过“CanHwObjectCount”配置。
[SWS_Can_00490]
[ ]
- 不支持硬件 FIFO 功能的控制器通常提供实现了影子缓冲区机制的功能,当主硬件对象繁忙时,其他硬件对象将接管。硬件对象的数量通过“CanHwObjectCount”配置。
[SWS_Can_00299]
[ ]
- 如果 RX 缓冲区无法受到 CAN 硬件保护(锁定)以防止被新接收的消息覆盖,则 CAN 模块应在接收后将 L-SDU 复制到影子缓冲区中。
[SWS_Can_00300]
[ ]
- 如果 CAN 硬件不是全局可访问的,则 CAN 模块应将 L-SDU 复制到影子缓冲区中。
完整的 RX 处理(包括复制到目标层,例如 COM)是在 RX 中断上下文或 Can_MainFunction_Read 上下文中被完成的。
[SWS_Can_00012]
[SRS_Can_01059]
- CAN 模块应保证 ISR 和 Can_MainFunction_Read 函数不会被自身中断。CAN 硬件(或影子)缓冲区应始终保持为连续的,因为它是按顺序在一个函数中写入和读取的,并且该函数永远不会被自身中断。
如果无法配置 CAN 硬件以在接收后锁定 RX 硬件对象(硬件功能),则可能会发生硬件缓冲区被新到达的消息覆盖的情况。在这种情况下,如果硬件支持,CAN 控制器会检测到“覆盖”事件。
如果 CAN 硬件可以配置为在接收后锁定 RX 硬件对象,则可能会发生新到达的消息无法被存储到硬件缓冲区的情况。在这种情况下,如果硬件支持,CAN 控制器会检测到“溢出”事件。
[SWS_Can_00395]
[ ]
- 如果检测到“覆盖”或“溢出”事件,CAN 模块将引发运行时错误 CAN_E_DATALOST。
实现提示:
系统设计人员应确保消息接收功能(中断驱动或轮询)的运行时间与系统设计中最快的可能接收时间相匹配。
唤醒概念
CAN 模块会处理可由 CAN 控制器本身检测到的唤醒,而不是通过 CAN 收发器检测到的唤醒。有两种可能的情况:中断唤醒和轮询唤醒。
对于中断唤醒,当硬件检测到唤醒时,将调用 CAN 模块的 ISR。
[SWS_Can_00364]
[SRS_BSW_00375]
[SRS_SPAL_12069]
[SRS_Can_01054]
- 如果唤醒事件的 ISR 被调用,则应依次调用 EcuM_CheckWakeup。传递给 EcuM_CheckWakeup 的参数应为 CanWakeupSourceRef 引用的唤醒源的 ID。
在这两种情况下:
- ECU 状态管理器将设置 MCU 并通过 CAN 接口回调 CAN 模块,从而调用 Can_CheckWakeup
- 当通过轮询检测到唤醒事件时,ECU 状态管理器将像以前一样通过 CAN 接口循环调用 Can_CheckWakeup
Can_CheckWakeup 都会检查 CAN 控制器是否检测到唤醒并返回结果。然后,CAN 驱动程序将通过 EcuM_SetWakeupEvent 通知 ECU 状态管理器有关唤醒事件的信息。
唤醒验证将由 ECU 状态管理器和 CanIf 随后完成,以防止发生错误唤醒事件,无需 CAN 模块的任何帮助。
有关唤醒机制和唤醒序列图的一般描述,请参阅 ECU 状态管理器规范(AUTOSAR_SWS_ECUStateManager.pdf)。
通知概念
对于 CanIf 模块,CAN 模块只提供事件触发通知接口,每个通知都由一个回调函数表示。
[SWS_Can_00099]
[SRS_Can_01132]
- 可以通过中断或轮询硬件对象的状态标志来检测硬件事件。轮询配置的可能性取决于硬件(即哪些事件可以被轮询,哪些事件需要被轮询),不受本标准的限制。
[SWS_Can_00007]
[SRS_Can_01062]
- 可以配置驱动程序使其不使用中断(完全轮询)。
CAN 模块轮询和不轮询的配置是由驱动程序内部决定的,在模块外部不可见。轮询是在 CAN 主函数 (Can_MainFunction_xxx) 内完成的。
此外,轮询事件由相应的回调函数来通知。那么调用的上下文不是 ISR,而是 CAN 主函数。所有回调函数的实现都应像在 ISR 中实现的一样被完成。
有关更多详细信息,另请参阅 CAN 主功能:
- Can_MainFunction_Read
- Can_MainFunction_Write
- Can_MainFunction_BusOff
- Can_MainFunction_Wakeup
重入问题
例程必须满足以下条件才能重入:
- 它以原子方式使用所有共享变量,除非每个变量都单独分配给函数的特定实例。
- 它不调用不可重入的函数。
- 它不以非原子方式使用硬件。
传输请求只由 CanIf 模块转发,该过程发生在函数 CanIf_Transmit 内部。
函数 CanIf_Transmit 是可重入的。因此函数 Can_Write 需要实现线程安全(例如通过使用互斥锁):
- 当写入操作无法以重入的方式被执行时,进一步的(抢占式)调用将返回 CAN_BUSY。(例如:允许写入不同的硬件 TX 句柄,不允许写入相同的 TX 句柄)。
- 如果出现 CAN_BUSY,CanIf 模块会将该请求入队。(行为与所有硬件对象都处于繁忙状态时相同)。
- Can_EnableCanInterrupts 和 Can_DisableCanInterrupts 可以在可重入函数中调用。因此,这些函数也需要是可重入的。
所有其他服务不需要被实现为可重入函数。
CAN 主函数(即 Can_MainFunction_Read)本身不应被中断。因此,这些 CAN 主函数是不可重入的。
硬件时间戳
如果 CAN 控制器支持基于硬件的时间戳功能,则可以使用基于硬件的时间戳来提高 CAN 上同步时间基准的精度。如果支持基于硬件的时间戳,则应提供以下 CAN 驱动程序 API:
- Can_GetCurrentTime
- Can_EnableEgressTimeStamp
- Can_GetEgressTimeStamp
- Can_GetIngressTimeStamp
这些 API 需要通过配置参数 CanGlobalTimeSupport 来启用。
CAN 控制器的基于硬件的时间戳功能应提供一个自由运行的计数器,用于获取 CAN 报文接收和发送的时间戳。
自由运行计数器是一种递增计数并在达到其规定的最大值后溢出且计数值归为零的计数器。CiA 603 标准中规定,自由运行计数器的计数时钟周期的换算比例应至少为 1 μs,最多为 1 ns。
强烈建议提供 32 位时间戳寄存器和 32 位计数器。
当 CAN 帧被视为有效时,将捕获已发送和已接收 CAN 消息的时间戳。详细信息请参阅 CiA 603 标准。
错误分类
在此基础上,下一节将详细说明排列在各个小节中的具体错误。
[SWS_Can_00104]
[SRS_BSW_00337]
[SRS_BSW_00385]
[SRS_BSW_00331]
- CAN 模块应能够根据其配置(默认/生产)检测以下错误和异常。
开发错误
[SWS_Can_91019]
[ ]
运行时错误
[SWS_Can_91020]
[ ]
[SWS_Can_00026]
[SRS_BSW_00337]
[SRS_BSW_00323]
[SRS_SPAL_00157]
- CAN 模块应指示因错误使用 CAN 模块 API 而导致的错误。这包括 API 参数检查和调用顺序错误。
[SWS_Can_00091]
[SRS_SPAL_12448]
- DET 返回后,引发开发错误的 CAN 模块函数应立即返回。
[SWS_Can_00089]
[SRS_BSW_00369]
[SRS_BSW_00386]
[SRS_SPAL_12448]
- CAN 模块环境应仅在 DET 打开且函数提供返回值时,在 CAN 模块函数的返回值中指示开发错误。返回值为 E_NOT_OK。
返回值
CAN_BUSY 通过函数 Can_Write 的返回值被报告。CanIf 模块根据为 CanIf 模块指定的序列图做出反应。如果在转换到睡眠模式期间发生唤醒,则通过返回值报告 E_NOT_OK。总线关闭和唤醒事件通过通知回调函数被进一步处理。
CAN FD 支持
出于性能原因,某些 CAN 控制器允许使用被称为 CAN FD(Flexible Data-Rate)的灵活数据速率功能(请参阅“具有灵活数据速率的 CAN”规范)。指示在仲裁阶段,可以在有效载荷和 CRC 期间切换到更高的波特率。
必须通过使用 CanControllerFdBaudrateConfig 来扩展的 CanControllerBaudrateConfig 来配置第二波特率。如果波特率处于被激活状态且具有 CAN FD 配置(请参阅 CanControllerFdBaudrateConfig),则此控制器的 CAN FD 功能已启用。
需要指定第二波特率来支持使用比特率切换 (BRS)的 CAN FD 帧的接收。是否使用第二波特率进行传输取决于配置参数 CanControllerTxBitRateSwitch(参见 CanControllerFdBaudrateConfig)。
然而,在某些情况下,传统的 CAN 2.0 消息需要在支持 CAN FD 消息的网络中被传输,例如为了方便 CAN 选择性唤醒。在这些情况下,需要支持将传统 CAN 消息与 CAN FD 消息一起进行交错传输。
这可以在帧级别实现,通过使用在 Can_Write 期间被传递的 CanId 的两个最高有效 bit(参见 Can_IdType、[SWS_Can_00416])来指示应使用哪种帧。
CAN FD 还支持扩展有效载荷,允许传输最多 64 个字节。此功能还取决于 CAN FD 配置(参见 CanControllerFdBaudrateConfig)。
因此,如果 CAN 控制器处于 CAN FD 模式(有效的 CanControllerFdBaudrateConfig)并且传递给 Can_Write() 的 CanId 中设置了 CAN FD 标志,则 CAN 驱动程序应支持传输长度达 64 字节的 PDU。
如果有传输 CAN FD 帧的请求并且 CAN 控制器不在 CAN FD 模式(没有设置 CanControllerFdBaudrateConfig),只要 PDU 长度 <= 8 字节,该帧就会被作为传统 CAN 帧被发送。
CAN XL 扩展
CAN / CAN FD 是经过验证的、价格合理且分布良好的通信协议,其各自的通信堆栈已在 AUTOSAR 中被指定。
在汽车行业,为应对现代 E/E 架构的复杂性,不断增加通信带宽是一种趋势。拥有一个符合这一趋势的低成本、强大的总线系统显然被视为对 AUTOSAR 标准的有益补充。因此,引入了 CAN XL(参见 CiA 610-1(数据链路层和物理编码子层要求,规范草案)、CiA 611-1(SDU 类型,规范提案草案))。
目标是 CAN XL 将有助于弥补当前 CAN 实现与当前 100 Mbit 以太网解决方案之间的差距。在同一网络段上,CAN 2.0/FD/XL 和以太网流量可以共存。波特率不像 10BASE-T1S 那样固定为 10 Mbit/s,而是可以灵活调整至 20 Mbit/s。此外,有效载荷可达 2048 字节。
CAN XL 对现有 AUTOSAR 模块的影响很小,但仍具有新属性。
使用新推出的 CAN XL 驱动程序,仍然可以发送 CAN 2.0 和 CAN FD 帧而无需进行任何更改。
由于 CAN XL 驱动程序是作为现有 CAN 驱动程序的扩展实现的(带有新文档 CAN XL 驱动程序规格 AUTOSAR_SWS_CANXLDriver.pdf ),非 CAN XL 硬件仍将使用基本的 CAN 驱动程序实现。
CAN XL 驱动程序是 CAN 驱动程序的扩展,并引入了附加 API 来支持 CAN XL 帧和以太网通信(有关详细信息,请参阅 CAN XL 驱动程序规格 AUTOSAR_SWS_CANXLDriver.pdf )。
CAN 错误类型的报告
[SWS_Can_91022]
[SRS_Ids_00810]
- 如果 CanEnableSecurityEventReporting = true 并且 CAN 驱动程序检测到 0x1 - 0xB 范围内的 Can_ErrorType,则 CAN 驱动程序应把 ControllerId 和 CanError 作为参数来调用 CanIf_ErrorNotification。
[SWS_Can_91024]
[SRS_Ids_00810]
- 如果预定义的 Can_ErrorType 值中没有一个与 CAN 硬件提供的错误相匹配,则 CAN 驱动程序不应向 CanIf 报告该错误。
[SWS_Can_91023]
[SRS_Ids_00810]
- 如果 CanEnableSecurityEventReporting = true 且 CAN 驱动程序检测到错误状态的被动转换,则 CAN 驱动程序应使用 ControllerId 以及 Rx 和 Tx 的错误计数值来调用 CanIf_ControllerErrorStatePassive。
API 规范
如 [SWS_Can_00284] 所述,在具有多个 CAN 模块的实现中,函数名称的前缀可能会发生变化。
导入的类型
本章列出了以下模块包含的所有类型:
[SWS_Can_00222]
[ ]
类型定义
Can_ConfigType
[SWS_Can_00413]
[ ]
Can_PduType
[SWS_Can_00415]
[ ]
Can_IdType
[SWS_Can_00416]
[ ]
Can_HwHandleType
[SWS_Can_00429]
[ ]
Can_HwType
[SWS_Can_00496]
[ ]
Std_ReturnType 扩展
[SWS_Can_00039]
[SRS_BSW_00331]
Can_ErrorStateType
[SWS_Can_91003]
[ ]
Can_ControllerStateType
[SWS_Can_91013]
[ ]
Can_ErrorType
[SWS_Can_91021]
[ ]
Can_TimeStampType
[SWS_Can_91029]{DRAFT}
[SRS_Can_01181]
函数定义
影响整个硬件单元的服务
Can_Init
[SWS_Can_00223]
[SRS_BSW_00358]
[SRS_BSW_00414]
可用配置集的符号名称由 CAN 模块的配置描述提供。有关配置描述,请参阅第 10 章。
[SWS_Can_00174]
[ ]
- 如果启用了 CAN 模块的开发错误检测:如果驱动程序不处于 CAN_UNINIT 状态,则函数 Can_Init 将引发错误 CAN_E_TRANSITION。
[SWS_Can_00408]
[ ]
- 如果启用了 CAN 模块的开发错误检测:如果 CAN 控制器不处于 UNINIT 状态,则函数 Can_Init 将引发错误 CAN_E_TRANSITION。
Can_GetVersionInfo
[SWS_Can_00224]
[ ]
[SWS_Can_00177]
[ ]
- 如果启用了 CAN 模块的开发错误检测:如果参数 versionInfo 为空指针,则函数 Can_GetVersionInfo 将引发错误 CAN_E_PARAM_POINTER。
Can_DeInit
[SWS_Can_91002]
[SRS_Can_01166]
[SRS_BSW_00336]
注意:[SWS_BSW_00152]、[SWS_BSW_00072]、[SWS_BSW_00232]、[SWS_BSW_00233] 指定了逆初始化函数的一般行为和约束。
警告:Can_DeInit 函数的调用者必须确保没有 CAN 控制器处于 STARTED 状态。
[SWS_Can_91011]
[SRS_BSW_00369]
- 如果启用了 CAN 模块的开发错误检测:如果驱动程序未处于 CAN_READY 状态,则函数 Can_DeInit 将引发错误 CAN_E_TRANSITION。
[SWS_Can_91012]
[SRS_BSW_00369]
- 如果启用了 CAN 模块的开发错误检测:如果任何 CAN 控制器处于 STARTED 状态,则函数 Can_DeInit 将引发错误 CAN_E_TRANSITION。
影响单个 CAN 控制器的服务
Can_SetBaudrate
[SWS_Can_00491]
[ ]
可能有多种波特率配置可用。可以使用 Can_SetBaudrate 函数在不同配置之间切换。根据旧的和新的波特率配置,运行时只需更改一部分参数,并且可以避免重新初始化 CAN 控制器。
如果调用 Can_SetBaudrate 将导致 CAN 控制器重新初始化,则调用此函数时 CAN 控制器必须处于 STOPPED 状态(请参阅 [SWS_Can_00256] 和 [SWS_Can_00260])。
CAN 控制器在(重新)初始化后处于 STOPPED 状态(请参阅 [SWS_Can_00259])。
[SWS_Can_00492]
[ ]
- 如果启用了 CAN 模块的开发错误检测:如果驱动程序尚未初始化,函数 Can_SetBaudrate 将引发错误 CAN_E_UNINIT 并返回 E_NOT_OK。
[SWS_Can_00493]
[ ]
- 如果启用了 CAN 模块的开发错误检测:如果参数 BaudRateConfigID 具有无效值,则函数 Can_SetBaudrate 将引发错误 CAN_E_PARAM_BAUDRATE 并返回 E_NOT_OK。
[SWS_Can_00494]
[ ]
- 如果启用了 CAN 模块的开发错误检测,如果参数 Controller 的值超出范围,则函数 Can_SetBaudrate 将引发错误 CAN_E_PARAM_CONTROLLER,并且返回 E_NOT_OK。
[SWS_Can_00500]
[ ]
- 如果未重新初始化 CAN 控制器就无法执行请求的波特率更改,则应返回 E_NOT_OK。
Can_SetControllerMode
[SWS_Can_00230]
[ ]
[SWS_Can_00017]
[SRS_SPAL_12169]
[SRS_Can_01053]
- 函数 Can_SetControllerMode 应执行软件触发条件下的 CAN 控制器状态机的状态转换。另请参阅 [SRS_SPAL_12169]。
[SWS_Can_00384]
[ ]
- 每次使用状态转换值 CAN_CS_STARTED 触发 CAN 控制器状态机时,函数 Can_SetControllerMode 应使用之前由函数 Can_SetBaudrate 或 Can_Init 使用的相同控制器配置集来重新初始化 CAN 控制器。
有关进入睡眠状态转换期间发生来自 CAN 总线的唤醒事件的情况,请参阅 [SWS_Can_00048]。
[SWS_Can_00294]
[ ]
- 在检查唤醒状态期间,函数 Can_SetControllerMode 应禁用唤醒中断。
[SWS_Can_00196]
[ ]
- 函数 Can_SetControllerMode 应启用新状态下需要用到的中断。
[SWS_Can_00425]
[ ]
- 当 CAN 中断已被函数 Can_DisableControllerInterrupts 禁用时,CAN 中断的使能不应被执行。
[SWS_Can_00197]
[ ]
- 函数 Can_SetControllerMode 应禁用新状态下不允许的中断。
[SWS_Can_00426]
[ ]
- 当 CAN 中断已通过函数 Can_DisableControllerInterrupts 被禁用时,不应执行 CAN 中断的禁用操作。
[SWS_Can_00198]
[ ]
- 如果启用了 CAN 模块的开发错误检测:如果模块尚未初始化,则函数 Can_SetControllerMode 将引发开发错误 CAN_E_UNINIT 并返回 E_NOT_OK。
[SWS_Can_00199]
[ ]
- 如果启用了 CAN 模块的开发错误检测:如果参数 Controller 超出范围,则函数 Can_SetControllerMode 将引发开发错误 CAN_E_PARAM_CONTROLLER 并返回 E_NOT_OK。
[SWS_Can_00200]
[ ]
- 如果启用了 CAN 模块的开发错误检测:如果请求了无效转换,则函数 Can_SetControllerMode 将引发错误 CAN_E_TRANSITION 并返回 E_NOT_OK。
Can_DisableControllerInterrupts
[SWS_Can_00231]
[SRS_BSW_00312]
[SWS_Can_00049]
[SRS_Can_01043]
- 如果该 CAN 控制器的中断已启用,则函数 Can_DisableControllerInterrupts 将访问该 CAN 控制器寄存器且仅禁用该 CAN 控制器的所有中断。
[SWS_Can_00202]
[ ]
- 当 Can_DisableControllerInterrupts 被调用多次时,必须调用 Can_EnableControllerInterrupts 多次才能重新启用中断。
实施注意事项:
函数 Can_DisableControllerInterrupts 可以在每次执行时增加一个计数器值,该计数器指示在启用中断(增量禁用)之前需要调用多少次 Can_EnableControllerInterrupts。
[SWS_Can_00204]
[ ]
- CAN 模块应跟踪在其他函数(即 Can_SetControllerMode)中,中断的所有单独启用和单独禁用,以便可以恢复正确的中断使能状态。
实现示例:
- 在中断允许模式下,每次中断状态改变:
- 修改中断使能 bit(硬件状态)
- 修改软件标志(软件状态)
- 将软件状态同步到硬件状态
- 在中断禁用模式下,每次中断状态改变:
- 修改软件标志(软件状态)
- 只修改软件状态,不将软件状态同步到硬件状态
- Can_DisableControllerInterrupts 和 Can_EnableControllerInterrupts:
- 不修改软件标志(软件状态)
- 只影响是否将软件状态同步到硬件状态
- Can_EnableControllerInterrupts:
- 读取软件标志(软件状态)以重新设置正确的中断(硬件状态)
- 将当前的软件标志(软件状态)同步到硬件状态
[SWS_Can_00205]
[ ]
- 如果启用了 CAN 模块的开发错误检测:如果驱动程序尚未初始化,函数 Can_DisableControllerInterrupts 将引发错误 CAN_E_UNINIT。
[SWS_Can_00206]
[ ]
- 如果启用了 CAN 模块的开发错误检测:如果参数 Controller 超出范围,函数 Can_DisableControllerInterrupts 将引发错误 CAN_E_PARAM_CONTROLLER。
Can_EnableControllerInterrupts
[SWS_Can_00232]
[SRS_BSW_00312]
[SWS_Can_00050]
[SRS_Can_01043]
- 函数 Can_EnableControllerInterrupts 将根据当前软件状态启用所有必须启用的中断。
[SWS_Can_00202] 适用于此功能。
[SWS_Can_00208]
[ ]
- 当之前没有调用过 Can_DisableControllerInterrupts 时,函数 Can_EnableControllerInterrupts 将不执行任何操作。
另请参阅 Can_DisableControllerInterrupts 的实施示例。
[SWS_Can_00209]
[ ]
- 如果启用了 CAN 模块的开发错误检测:如果驱动程序尚未初始化,函数 Can_EnableControllerInterrupts 将引发错误 CAN_E_UNINIT。
[SWS_Can_00210]
[ ]
- 如果启用了 CAN 模块的开发错误检测:如果参数 Controller 超出范围,函数 Can_EnableControllerInterrupts 将引发错误 CAN_E_PARAM_CONTROLLER。
Can_CheckWakeup
[SWS_Can_00360]
[ ]
[SWS_Can_00361]
[ ]
- 函数 Can_CheckWakeup 将检查请求的 CAN 控制器是否检测到唤醒。如果成功检测到唤醒事件,则应通过 API EcuM_SetWakeupEvent 向 EcuM 报告。
[SWS_Can_00362]
[ ]
- 如果启用了 CAN 模块的开发错误检测:如果驱动程序尚未初始化,函数 Can_CheckWakeup 将引发错误 CAN_E_UNINIT。
[SWS_Can_00363]
[ ]
- 如果启用了 CAN 模块的开发错误检测:如果参数 Controller 超出范围,函数 Can_CheckWakeup 将引发错误 CAN_E_PARAM_CONTROLLER。
Can_GetControllerErrorState
[SWS_Can_91004]
[ ]
[SWS_Can_91005]
[SRS_BSW_00406]
[SRS_BSW_00416]
- 如果启用了 CAN 模块的开发错误检测:如果模块尚未初始化,则函数 Can_GetControllerErrorState 将引发开发错误 CAN_E_UNINIT 并返回 E_NOT_OK。
[SWS_Can_91006]
[SRS_BSW_00323]
- 如果启用了 CAN 模块的开发错误检测:如果参数 ControllerId 超出范围,函数 Can_GetControllerErrorState 将引发开发错误 CAN_E_PARAM_CONTROLLER 并返回 E_NOT_OK。
[SWS_Can_91007]
[SRS_BSW_00323]
- 如果启用了 CAN 模块的开发错误检测:如果参数 ErrorStatePtr 为空指针,则函数 Can_GetControllerErrorState 将引发开发错误 CAN_E_PARAM_POINTER 并返回 E_NOT_OK。
[SWS_Can_91008]
[SRS_Can_01167]
- 当以 ControllerId 作为输入参数调用 API Can_GetControllerErrorState() 时,CAN 驱动程序应读取 CAN 控制器的错误状态寄存器,并将错误状态返回给上层。
Can_GetControllerMode
[SWS_Can_91014]
[ ]
[SWS_Can_91015]
[ ]
- 服务 Can_GetControllerMode 应返回所请求的 CAN 控制器的模式。
[SWS_Can_91016]
[SRS_BSW_00406]
[SRS_BSW_00416]
- 如果启用了 CAN 模块的开发错误检测:如果驱动程序尚未初始化,函数 Can_GetControllerMode 将引发错误 CAN_E_UNINIT 并返回 E_NOT_OK。
[SWS_Can_91017]
[SRS_BSW_00323]
- 如果 Can_GetControllerMode() 的参数 Controller 具有无效值,则 CAN 驱动程序应向 DET的 Det_ReportError 服务报告开发错误代码 CAN_E_PARAM_CONTROLLER。
[SWS_Can_91018]
[SRS_BSW_00323]
- 如果 Can_GetControllerMode() 的参数 ControllerModePtr 为空指针,则 CAN 驱动程序应向 DET 的 Det_ReportError 服务报告开发错误代码 CAN_E_PARAM_POINTER。
Can_GetControllerRxErrorCounter
[SWS_Can_00511]
[ ]
[SWS_Can_00512]
[SRS_BSW_00406]
- 如果启用了 CAN 模块的开发错误检测:如果模块尚未初始化,则函数 Can_GetControllerRxErrorCounter 将引发开发错误 CAN_E_UNINIT 并返回 E_NOT_OK。
[SWS_Can_00513]
[SRS_BSW_00323]
- 如果启用了 CAN 模块的开发错误检测:如果参数 ControllerId 超出范围,则函数 Can_GetControllerRxErrorCounter 将引发开发错误 CAN_E_PARAM_CONTROLLER 并返回 E_NOT_OK。
[SWS_Can_00514]
[SRS_BSW_00323]
- 如果启用了 CAN 模块的开发错误检测:如果参数 RxErrorCounterPtr 为空指针,则函数 Can_GetControllerRxErrorCounter 将引发开发错误 CAN_E_PARAM_POINTER 并返回 E_NOT_OK。
[SWS_Can_00515]
[SRS_Can_01170]
- 当使用 ControllerId 作为输入参数调用 API Can_GetControllerRxErrorCounter 时,CAN 驱动程序应读取 CAN 控制器的 Rx 错误计数寄存器,并将 Rx 错误计数返回给上层。
Can_GetControllerTxErrorCounter
[SWS_Can_00516]
[ ]
[SWS_Can_00517]
[SRS_BSW_00406]
- 如果启用了 CAN 模块的开发错误检测:如果模块尚未初始化,则函数 Can_GetControllerTxErrorCounter 将引发开发错误 CAN_E_UNINIT 并返回 E_NOT_OK。
[SWS_Can_00518]
[SRS_BSW_00323]
- 如果启用了 CAN 模块的开发错误检测:如果参数 ControllerId 超出范围,则函数 Can_GetControllerTxErrorCounter 将引发开发错误 CAN_E_PARAM_CONTROLLER 并返回 E_NOT_OK。
[SWS_Can_00519]
[SRS_BSW_00323]
- 如果启用了 CAN 模块的开发错误检测:如果参数 TxErrorCounterPtr 为空指针,则函数 Can_GetControllerTxErrorCounter 将引发开发错误 CAN_E_PARAM_POINTER 并返回 E_NOT_OK。
[SWS_Can_00520]
[SRS_Can_01170]
- 当使用 ControllerId 作为输入参数调用 API Can_GetControllerTxErrorCounter 时,CAN 驱动程序应读取 CAN 控制器的 Tx 错误计数器寄存器,并将 Tx 错误计数返回给上层。
Can_GetCurrentTime
[SWS_Can_91026]{DRAFT}
[SRS_Can_01181]
[SWS_Can_00521] {DRAFT}
[ ]
- 如果启用了开发错误检测:该函数应检查服务 Can_Init 是否先前被调用。如果检查失败,该函数应引发开发错误 CAN_E_UNINIT。
[SWS_Can_00522] {DRAFT}
[ ]
- 如果启用了开发错误检测:该函数应检查参数 ControllerId 是否有效。如果检查失败,该函数应引发开发错误 CAN_E_PARAM_CONTROLLER。
[SWS_Can_00523] {DRAFT}
[ ]
- 如果启用了开发错误检测:该函数应检查参数 timeStampPtr 是否有效。如果检查失败,该函数应引发开发错误 CAN_E_PARAM_POINTER。
[SWS_Can_00524] {DRAFT}
[ ]
- 该功能应在编译前通过配置参数 CanGlobalTimeSupport 配置为打开/关闭。
Can_EnableEgressTimeStamp
[SWS_Can_91025]{DRAFT}
[SRS_Can_01181]
[SWS_Can_00525] {DRAFT}
[ ]
- 如果启用了开发错误检测:该函数应检查服务 Can_Init 是否先前被调用。如果检查失败,该函数应引发开发错误 CAN_E_UNINIT。
[SWS_Can_00526] {DRAFT}
[ ]
- 如果启用了 CAN 模块的开发错误检测:函数 Can_Write 将引发错误 CAN_E_PARAM_HANDLE,并且如果参数 Hth 不是配置的硬件传输句柄,则将返回 E_NOT_OK。
[SWS_Can_00527] {DRAFT}
[ ]
- 该功能应在编译前通过配置参数 CanGlobalTimeSupport 配置开/关。
[SWS_Can_00528] {DRAFT}
[ ]
- 警告:该功能需要先前的控制器初始化(Can_Init)。
Can_GetEgressTimeStamp
[SWS_Can_91027]{DRAFT}
[SRS_Can_01181]
[SWS_Can_00529] {DRAFT}
[ ]
- 如果启用了开发错误检测:该函数应检查服务 Can_Init 是否先前被调用。如果检查失败,该函数应引发开发错误 CAN_E_UNINIT。
[SWS_Can_00530] {DRAFT}
[ ]
- 如果启用了开发错误检测:该函数应检查参数 TxPduId 是否有效。如果检查失败,该函数应引发开发错误 CAN_E_PARAM_LPDU。
[SWS_Can_00531] {DRAFT}
[ ]
- 如果启用了 CAN 模块的开发错误检测:当参数 Hth 不是配置的硬件传输句柄时,函数 Can_GetEgressTimeStamp 将引发错误 CAN_E_PARAM_HANDLE,并且返回 E_NOT_OK。
[SWS_Can_00532] {DRAFT}
[ ]
- 如果启用了开发错误检测:该函数应检查参数 timeStampPtr 是否有效。如果检查失败,该函数应引发开发错误 CAN_E_PARAM_POINTER。
[SWS_Can_00533] {DRAFT}
[ ]
- 该功能应在预编译时通过配置参数 CanGlobalTimeSupport 配置为打开/关闭。
[SWS_Can_00534]
[ ]
- 警告:该功能需要先前的控制器初始化(Can_Init)。
Can_GetIngressTimeStamp
[SWS_Can_91028]{DRAFT}
[SRS_Can_01181]
[SWS_Can_00535] {DRAFT}
[ ]
- 如果启用了开发错误检测:该函数应检查服务 Can_Init 是否先前被调用。如果检查失败,该函数应引发开发错误 CAN_E_UNINIT。
[SWS_Can_00536] {DRAFT}
[ ]
- 如果启用了 CAN 模块的开发错误检测:当参数 Hrh 不是配置的硬件接收句柄时,函数 Can_GetIngressTimeStamp 将引发错误 CAN_E_PARAM_HANDLE,并且返回 E_NOT_OK。
[SWS_Can_00537] {DRAFT}
[ ]
- 如果启用了开发错误检测:该函数应检查参数 timeStampPtr 是否有效。如果检查失败,该函数应引发开发错误 CAN_E_PARAM_POINTER。
[SWS_Can_00538] {DRAFT}
[ ]
- 该功能应在预编译时通过配置参数 CanGlobalTimeSupport 配置为打开/关闭。
[SWS_Can_00539] {DRAFT}
[ ]
- 警告:该功能需要先前的控制器初始化(Can_Init)。
影响硬件句柄的服务
Can_Write
[SWS_Can_00233]
[SRS_BSW_00312]
函数 Can_Write 首先检查 HTH 标识的硬件传输对象是否空闲,以及是否针对同一 HTH 正在进行另一个 Can_Write。
[SWS_Can_00212]
[SRS_Can_01049]
- 如果硬件传输对象为空闲状态,函数 Can_Write 将执行以下操作:
- 该 HTH 的互斥锁设置为“已被占用”
- ID、数据长度和 SDU 以适合硬件的格式(如果需要)被复制到适当的硬件寄存器/缓冲区中
- 启动传输所需的所有控制操作均被完成
- 该 HTH 的互斥锁设置为“已被释放”
- 函数返回 E_OK
[SWS_Can_00213]
[SRS_Can_01049]
- 如果硬件传输对象正忙于处理另一个 L-PDU 的传输请求,则函数 Can_Write 将不执行任何操作:
- 1. 不得取消另一个 L-PDU 的传输,并且函数 Can_Write 退出并不采取任何操作。
- 2. 函数 Can_Write 应返回 CAN_BUSY。
[SWS_Can_00214]
[SRS_BSW_00312]
[SRS_Can_01049]
- 如果 Can_Write 的抢占式调用被发出,且 Can_Write 无法进行重入处理(即具有相同 HTH 的调用),则函数 Can_Write 将返回 CAN_BUSY。
[SWS_Can_00275]
[ ]
- 函数 Can_Write 应是非阻塞的。
[SWS_Can_00216]
[ ]
- 如果启用了 CAN 模块的开发错误检测:函数 Can_Write 将引发错误 CAN_E_UNINIT,并且如果驱动程序尚未初始化,则将返回 E_NOT_OK。
[SWS_Can_00217]
[ ]
- 如果启用了 CAN 模块的开发错误检测:如果参数 HTH 不是配置的硬件传输句柄,函数 Can_Write 将引发错误 CAN_E_PARAM_HANDLE 并将返回 E_NOT_OK。
[SWS_Can_00218]
[SRS_Can_01005]
- 如果启用了 CAN 模块的开发错误检测,并且引发了错误 CAN_E_PARAM_DATA_LENGTH,函数 Can_Write 应返回 E_NOT_OK:
- 如果长度超过 64 字节。
- 如果长度超过 8 字节且 CAN 控制器不在 CAN FD 模式(没有 CanControllerFdBaudrateConfig)。
- 如果长度超过 8 字节且 CAN 控制器处于 CAN FD 模式(有效的 CanControllerFdBaudrateConfig),但 Can_PduType->id 中的 CAN FD 标志未设置(参考 Can_IdType)。
[SWS_Can_00219]
[ ]
- 如果启用了 CAN 驱动程序的开发错误检测:当参数 PduInfo 为空指针时,Can_Write() 将引发 CAN_E_PARAM_POINTER,并且返回 E_NOT_OK。
[SWS_Can_00503]
[ ]
- 如果此硬件对象启用了触发传输 API(CanTriggerTransmitEnable = TRUE),则 Can_Write() 将接受 SDU 为空指针的情况(Can_PduType.Can_SduPtrType = NULL)。
[SWS_Can_00504]
[ ]
- 如果硬件对象启用了触发传输 API,则 Can_Write() 应将空指针解释为 SDU(Can_PduType.Can_SduPtrType = NULL),此空指针将作为使用触发传输接口的请求。如果是这样,并且硬件对象是空闲的,则 Can_Write() 应使用消息缓冲区的最大大小来调用 CanIf_TriggerTransmit(),以获取 PDU 的数据。
注意:使用消息缓冲区大小的情况允许对 PDU 大小进行后期更改,例如,如果容器 PDU 在调用 Can_Write() 和调用 CanIf_TriggerTransmit() 之间接收到另一个包含的 PDU。
[SWS_Can_00505]
[ ]
- 如果启用了 CAN 驱动程序的开发错误检测:如果此硬件对象的触发传输 API 被禁用(CanTriggerTransmitEnable = FALSE)并且 PduInfo 内的 SDU 指针为空指针,则 Can_Write() 将引发 CAN_E_PARAM_POINTER 并返回 E_NOT_OK。
[SWS_Can_00506]
[SRS_BSW_00449]
[SRS_BSW_00357]
[SRS_BSW_00369]
[SRS_Can_01130]
- 如果触发传输 API(CanIf_TriggerTransmit())返回 E_NOT_OK,则 Can_Write() 将返回 E_NOT_OK。
[SWS_Can_00486]
[ ]
- 发送的 CAN 帧类型必须根据 Can_PduType->id 的两个最高有效位来决定。仅当 CAN 控制器处于 CAN FD 模式(有效的 CanControllerFdBaudrateConfig)时,才会检测 CAN FD 帧标志位。
[SWS_Can_00502]
[SRS_Can_01160]
- 如果 PduInfo->SduLength 与可能的 DLC 值不匹配,CanDrv 应使用当前能满足 PduInfo->SduLength 大小的最小有效 DLC 选项进行传输,并将未使用的字节初始化为相应 CanFdPaddingValue 的值(参见 [ECUC_Can_00485])。
回调通知
本章列出了 CAN 模块向下层模块提供的所有功能。CAN 模块的下层模块是 SPI 模块。SPI 模块是 MCAL 的一部分,可用于在微控制器和外部 CAN 控制器之间交换数据。
CAN 模块不提供回调函数。仅可使用同步 MCAL API 来访问外部 CAN 控制器。
AUTOSAR CAN 模块在每次接收 L-PDU 时支持的可选 L-PDU 调用。
[SWS_Can_00443]
[ ]
其中 <LPDU_CalloutName> 必须替换为可配置的具体 L-PDU 调用名称,请参阅 [ECUC_Can_00434]。
[SWS_Can_00444]
[ ]
- 如果 L-PDU 调用返回 False,则将不再处理 L-PDU。
启用/禁用唤醒通知
[SWS_Can_00445]
[ ]
- CAN 驱动程序应使用 ICU 驱动程序提供的以下 API,来启用和禁用唤醒事件通知:
- Icu_EnableNotification
- Icu_DisableNotification
[SWS_Can_00446]
[ ]
- 当“外部”CAN 控制器已转换为 SLEEP 状态时,应调用 Icu_EnableNotification。
[SWS_Can_00447]
[ ]
- 当“外部”CAN 控制器已转换为 STOPPED 状态时,应调用 Icu_DisableNotification。
调度功能
这些函数由基本软件调度程序直接调用。以下函数应无返回值和参数。所有函数均应为不可重入的。
[SWS_Can_00110]
[SRS_BSW_00428]
- 对于 CAN 主处理功能的执行顺序没有要求。
Can_MainFunction_Write
[SWS_Can_00225]
[ ]
[SWS_Can_00031]
[SRS_BSW_00432]
[SRS_BSW_00373]
[SRS_SPAL_00157]
- 当 CanTxProcessing 设置为 POLLING 或 MIXED 时,函数 Can_MainFunction_Write 应执行 TX 轮询的确认。在 MIXED 处理的情况下,仅应轮询 CanHardwareObjectUsesPolling 设置为 TRUE 的硬件对象。
[SWS_Can_00178]
[ ]
- 如果根本不使用轮询,CAN 模块可以将函数 Can_MainFunction_Write 实现为空定义。
[SWS_Can_00441]
[ ]
- 如果通过 CanMainFunctionRWPeriods 配置了多个主函数周期(参见 [ECUC_Can_00437]):
- 则对于每个由至少一个 TRANSMIT CanHardwareObject 引用的 CanMainFunctionRWPeriods
- Can_MainFunction_Write() 函数的名称应为Can_MainFunction_Write_<CanMainFunctionRWPeriods.ShortName>()(参见 [ECUC_Can_00438])
Can_MainFunction_Read
[SWS_Can_00226]
[ ]
[SWS_Can_00108]
[SRS_BSW_00432]
[SRS_SPAL_00157]
- 当 CanRxProcessing 设置为 POLLING 或 MIXED 时,函数 Can_MainFunction_Read 应执行 RX 指示的轮询。在 MIXED 处理的情况下,仅应轮询 CanHardwareObjectUsesPolling 设置为 TRUE 的硬件对象。
[SWS_Can_00180]
[ ]
- 如果根本不使用轮询,CAN 模块可以将函数 Can_MainFunction_Read 实现为空定义。
[SWS_Can_00442]
[ ]
- 如果通过 CanMainFunctionRWPeriods 配置了多个主功能周期(参见 [ECUC_Can_00437]):
- 则对于每个由至少一个 RECEIVE CanHardwareObject 引用的 CanMainFunctionRWPeriods
- Can_MainFunction_Read() 函数的名称应为Can_MainFunction_Read_<CanMainFunctionRWPeriods.ShortName>()(参见 [ECUC_Can_00438])
Can_MainFunction_BusOff
[SWS_Can_00227]
[ ]
[SWS_Can_00109]
[SRS_BSW_00432]
[SRS_SPAL_00157]
- 函数 Can_MainFunction_BusOff 应对静态配置为“待轮询”的总线关闭事件执行轮询。
[SWS_Can_00183]
[ ]
- 如果根本不使用轮询,CAN 模块可以将函数 Can_MainFunction_BusOff 实现为空定义。
Can_MainFunction_Wakeup
[SWS_Can_00228]
[ ]
[SWS_Can_00112]
[SRS_BSW_00432]
[SRS_SPAL_00157]
- 函数 Can_MainFunction_Wakeup 应对静态配置为“待轮询”的唤醒事件执行轮询。
[SWS_Can_00185]
[ ]
- 如果根本不使用轮询,CAN 模块可以将函数 Can_MainFunction_Wakeup 实现为空定义。
Can_MainFunction_Mode
[SWS_Can_00368]
[ ]
[SWS_Can_00369]
[ ]
- 函数 Can_MainFunction_Mode 将实现对 CAN 状态寄存器标志的轮询,以检测 CAN 控制器状态的转换。与第 7.3.2 章比较。
预期接口
强制接口
本章定义了实现模块核心功能所需的所有接口。CAN 模块调用的所有回调函数均在 CanIf 模块中实现。这些回调函数不可配置。
[SWS_Can_00234]
[SRS_Can_01055]
可选接口
本章定义了实现模块可选功能所需的所有接口。
[SWS_Can_00235]
[SRS_SPAL_12056]
[SRS_Can_01054]
序列图
Can 和 CanIf 模块之间的交互
有关序列图,请参阅 CanIf 模块规范(CAN 接口规格 AUTOSAR_SWS_CANInterface.pdf)。
其中描述了传输、接收和错误处理的序列。
唤醒序列
有关唤醒序列图,请参阅 ECU 状态管理器规范(ECU 状态管理器规范 AUTOSAR_SWS_ECUStateManager.pdf)。
配置规范
容器和配置参数
描述的参数是 CAN 模块配置器的输入。
[SWS_Can_00022]
[SRS_BSW_00159]
- CAN 模块的代码配置是 CAN 控制器特定的。如果 CAN 控制器位于芯片上,则 CAN 模块的代码生成工具的细节是由控制器指定的。如果 CAN 控制器是外部设备,则生成工具的细节不是由控制器指定的。
[SWS_Can_00024]
[SRS_BSW_00167]
[SRS_SPAL_12463]
- 可配置的有效值取决于硬件。因此,标准中无法给出规则和约束。配置工具负责进行静态配置检查,以及模块之间的依赖关系(即 Port 驱动程序、MCU 驱动程序等)。
[SWS_Can_00507]
[ ]
- CAN 模块应拒绝实现不支持的分区映射的配置。
[ ]
- 该模块将作为每个分区中的独立实例运行,这意味着被调用的 API 将仅针对其被调用的分区。
CanController
[SWS_Can_CONSTR_00509]
[ ]
- CanControllerEcucPartitionRef 引用的 ECUC 分区应是 CanEcucPartitionRef 引用的 ECUC 分区的子集。
[SWS_Can_CONSTR_00510]
[ ]
- 同一个通信通道的 CanController 和 CanTrcvChannel 都应该引用同一个 ECUC 分区。
[SWS_Can_CONSTR_00511]
[ ]
- 如果 CanEcucPartitionRef 引用一个或多个 ECUC 分区,则 CanControllerEcucPartitionRef 多重性应为 1,并且也引用其中一个 ECUC 分区。
CanControllerBaudrateConfig
CanControllerFdBaudrateConfig
CanHardwareObject
[ ]
- 如果配置了可选参数 CanObjectPayloadLength,则应设置长度,以使通过该 HOH 接收或发送的每个 PDU 都“适合”该长度。因此,如果设置,CanObjectPayloadLength 应等于或大于 EcuCPduCollection 中所有受影响 PDU 的最大 PDU 长度。
Can/CanConfigSet/A_HOH/CanObjectPayloadLength >= EcuC/EcuCPduCollection/A_PDU_Of_A_HOH/PduLength 必须成立。
评论
发表评论