【干货分享】Autosar CanIf 模块的应用干货笔记1
目录
往期推荐
什么是 CanIf
相关常见缩略语和缩写
硬件对象句柄(HOHs)
HRH
HTH
静态L-Pdu
CAN硬件单元
基本CAN和完全CAN
初始化
传输请求
CanIf的传输请求
传输缓冲
General Behavior
缓冲区特性
传输缓冲区初始化 当调用CanIf_Init时,CanIf将执行缓冲区的初始化。
传输确认
接收数据流
接收指示
Read Received Data
Pdu通道模式控制
Pdu通道模式
软件接收过滤
轮询模式
多Can驱动程序支持
部分网络支持
往期推荐
- ETAS工具链自动化实战指南<一>
- ETAS工具链自动化实战指南<二>
- ETAS工具链自动化实战指南<三>
- AUTOSAR工程师必读:Artop的核心功能
- Vector工具链自动化实战指南<一>
- isolar高手秘籍| ECU Configuration三分钟速成!
- 掌握核心步骤:RTA-BSW以太网配置全解析
- 一文详解TC399 CAN MCAL 配置
- LSL常见应用场景及示例<一>
- LSL常见应用场景及示例<二>
- LSL常见应用场景及示例<三>
- 为什么Autosar钟情arxml而非json?大揭秘!
- 深入浅出:SOME/IP-SD的工作原理与应用
- 【技术进阶】|一文掌握Autosar ComStack的精髓!
- Autosar培训笔记整理<一>
- 【AutoSAR进阶】|实战详解ETAS工具链UDS 0x2f服务核心配置!
- 实战详解ETAS工具链CanTp模块自动化配置
-
一文搞懂AUTOSAR架构9种通信方式
-
一文搞懂AUTOSAR架构中的BSW Configuration Class
-
实战干货|详解ETAS工具链之 intra-ECU通信的数据转换
-
【实战干货】基于ETAS工具链添加以太网信号的正确姿势!
-
【干货】一文详解TC399 CAN MCAL 配置
什么是 CanIf
CAN接口(CanIf)模块由所有与硬件无关的任务组成,这些任务属于相应ECU的CAN通信设备驱动程序。此功能在CanIf模块中实现,因此底层的CAN设备驱动程序仅专注于访问和控制相应的特定CAN硬件设备。这样,CanIf可以作为一个硬件抽象模块,供上层使用,作为与CAN驱动程序的接口。如下图所示,CanIf位于Com服务层和Com驱动层之间。
相关常见缩略语和缩写
-
CAN L-PduCAN协议数据单元(Protocol Data Unit),包含标识符、数据长度和数据(SDU),可被CAN驱动程序访问。
-
CAN L-SDUCAN服务数据单元(Service Data Unit),数据通过CAN L-Pdu进行传输,供CAN接口的上层访问(例如,Pdu路由器)。
-
HOHCAN硬件对象句柄(Handle of Hardware Object)。
-
HRHCAN硬件接收句柄(Handle of Hardware Receive)。
-
HTHCAN硬件传输句柄(Handle of Hardware Transmit)。
-
SDT服务数据单元类型(Service Data Type)。
-
SDU服务数据单元(Service Data Unit)。
-
CAN硬件单元一个CAN硬件单元可以由一个或多个相同类型的CAN控制器和一个、两个或多个CAN RAM区域组成。CAN硬件单元可以是芯片上的或外部设备,CAN硬件单元由一个CAN驱动程序表示。
-
硬件对象(HW Object)一个CAN硬件对象定义为CAN硬件单元/控制器中的Pdu缓冲区。
硬件对象句柄(HOHs)
传输(HTHs)和接收(HRHs)句柄表示指向CAN邮箱的抽象引用,该邮箱包含与CAN相关的数据,如CanId、DLC和数据。 HOH在CanDrv接口服务的调用中作为参数,并由CanDrv配置提供,CanDrv将其作为通信缓冲区和CAN邮箱的标识符使用。 CanIf仅作为HOH的用户使用,但不对其硬件信息进行解释,因此保持硬件无关(例如,不直接访问硬件特定的缓冲区,而仅通过CanDrv服务访问缓冲区)。
每个CAN控制器可以在邮箱中提供多个传输硬件对象,这些对象可以逻辑上链接到一个硬件对象池(复用硬件对象),因此可以通过一个HTH进行寻址。
CanIf将使用两种类型的HOH来访问CanDrv:HTH和HRH。
HRH
HRH应为指向CAN控制器邮箱的逻辑硬件接收对象的句柄。 HRH应使CanIf能够使用基本CAN或完全CAN接收方法,引用接收单元,并将接收到的L-SDU指示给目标上层模块。 如果HRH引用配置为基本CAN接收的接收单元,CanIf应启用软件过滤。 如果使用多个HRH,则每个HRH应至少属于一个固定的Rx L-SDU组(CanRxPduIds)。 HRH可以配置为接收:
-
单一CanId(完全CAN)
-
一组单一CanId(基本CAN)
-
CanId的范围/区域(基本CAN)
-
所有CanId。
HTH
HTH应为指向CAN控制器邮箱的逻辑硬件传输对象的句柄。 HTH应使CanIf能够使用基本CAN或完全CAN传输方法,引用传输单元,并确认已传输的L-SDU给目标上层模块。 每个CanIf Tx L-Pdu应在配置时静态分配到一个CanIfBufferCfg配置容器。 如果使用多个HTH,则每个HTH应属于一个固定的Tx L-Pdu组(CanTxPduIds)。 专用的HRH和HTH是从CanDrv的配置集中派生的。HTH/HRH和硬件对象的定义由CanDrv决定。
静态L-Pdu
CanIf支持启用和禁用属于CAN控制器的所有L-Pdu的传输和接收。 每个L-Pdu与上层模块相关联,以确保在接收、传输确认和数据访问期间的正确调度。
CAN硬件单元
CAN硬件单元将一个或多个相同类型的CAN控制器模块组合在一起,这些控制器模块可以位于芯片内或作为外部独立设备。每个CAN硬件单元由CanDrv服务。 如果使用不同类型的CAN控制器,则必须使用不同类型的CanDrv,并通过统一的API与CanIf进行交互。CanIf在配置时收集关于CAN控制器的数量和类型以及它们的硬件对象的信息。这使得上层模块可以通过HOH透明且硬件无关地访问CAN控制器。
基本CAN和完全CAN
Can XL硬件使用描述符和队列访问帧,类似于以太网,因此这不适用于Can XL。
CanIf区分基本CAN和完全CAN处理,以激活软件接收过滤。对于完全CAN操作的CAN邮箱(硬件对象),只允许单个CanId的传输或接收。因此,基本CAN操作使得一个硬件对象能够传输或接收一范围的CanId。 当硬件接收对象配置为基本CAN接收时,能够接收通过其硬件接收过滤器的CanId范围。这一范围可以超出此HRH接收的预定义Rx L-Pdu列表。因此,CanIf随后应执行软件过滤,只将预定义的Rx L-Pdu传递给相应的上层模块。
CanIf为所有HOH从配置容器CanIfHthCfg和CanIfHrhCfg中配置和排序HTH和HRH。 CanIf引用每个HOH的硬件接收过滤器,来自配置参数CanIfHthIdSymRef和CanIfHrhIdSymRef。 CanIf允许为每个HRH配置并存储软件接收过滤器,类型为基本CAN,由参数CanIfHrhSoftwareFilter配置。 CanIf应执行HRH的软件接收过滤器,当通过回调函数CanIf_RxIndication()传递HRH时。
初始化
EcuM将调用函数CanIf_Init来初始化CanIf。在初始化过程中,所有全局变量和数据结构(包括标志和缓冲区)都会初始化。EcuM将通过调用各自的初始化函数分别初始化CanDrv和CanTrcv。 如果在运行时需要重新初始化整个CAN模块,EcuM应调用CanSm,通过调用CAN接口模块的API服务CanIf_SetControllerMode,启动CAN控制器的所需状态转换,然后CanIf将CanSm的调用映射到相应CanDrv的调用。
传输请求
CanIf的传输请求
CanIf的传输请求函数CanIf_Transmit
是上层模块在CAN网络上传输L-Pdu的通用接口。上层模块仅通过CanIf的服务发起传输。传输请求若成功完成,则表示CanDrv能够成功将L-Pdu数据写入CAN硬件传输对象。
在调用CanIf_Transmit
时,CanIf执行以下操作:
-
检查CanIf的初始化状态。
-
确定CanDrv。
-
确定HTH(硬件传输对象)来访问CAN硬件传输对象。
-
在CanDrv中调用
Can_Write
或CanXL_Write
。 -
若传输成功,
CanIf_Transmit
返回代码E_OK
。
传输缓冲
General Behavior
对于CanIf,传输过程从调用CanIf_Transmit
开始,到上层模块的回调通知(..._TxConfirmation
)调用结束。在传输过程中,CanIf、CanDrv和CAN邮箱会存储待传输的L-Pdu,但只会存储一次。根据传输方法,这个存储位置可以是:CAN硬件传输对象,或者如果启用了传输缓冲,则为CanIf中的传输L-Pdu缓冲区。
对于触发传输,CanIf仅存储L-Pdu的传输请求,而不存储数据,因为数据会在触发传输函数调用时(当HTH空闲时)即时提取。请记住,请求传输的L-Pdu只会被存储一次。
如果启用了传输缓冲,当CAN驱动程序中的传输缓冲区被占用时,CanIf将缓存Pdu以进行传输,并且即使传输未发生(Can_Write
返回CAN_BUSY
),也会返回E_OK
。然后,CanIf将在回调函数CanIf_TxConfirmation
被调用时,驱动程序清空之前填充的缓冲区后,负责传输排队的Pdu,这意味着上层模块不需要重新尝试传输请求。如果禁用传输缓冲,则在调用CanIf_Transmit
时,如果Pdu无法复制到CanDrv的缓冲区,CanIf将返回E_NOT_OK
。
请记住,Pdu通过CanIfBufferCfg
中的容器引用HTH,缓冲区大小通过参数CanIfBufferSize
设置。如果禁用传输缓冲,则缓冲区大小可以设置为零,或根本不设置。 此外,如果Pdu的数据长度超过缓冲区的配置大小,则CanIf将缓存配置的数量,并丢弃剩余的部分。然后,它会通过Det_ReportRuntimeError
函数调用DET并传递错误代码CANIF_E_DATA_LENGTH_MISMATCH
。
缓冲区特性
-
L-Pdu存储在传输缓冲区中 最后,如果Pdu进入CanIf并且缓冲区中已经存在相同的Pdu,则缓冲区的内容将被最新的Pdu覆盖。这样做的原因是保持最新的数据可用。如果缓冲区中的Pdu与新的Pdu不同,则缓冲区不会被覆盖,
CanIf_Transmit
将返回E_NOT_OK
。还需注意,传输缓冲仅在HTH配置为BasicCAN时有效,FullCAN不支持。
-
传输缓冲区初始化 当调用
CanIf_Init
时,CanIf将执行缓冲区的初始化。
传输确认
上述时序图显示了通过中断执行TX确认时的调用路径。
上述时序图显示了通过轮询执行TX确认时的调用路径。
当传输请求完成后,CanDrv通过回调函数CanIf_TxConfirmation通知CanIf。如果启用了总线镜像,则CanIf将调用Mirror_ReportCanFrame,为每个确认的控制器帧传输提供存储的内容和CAN ID。
当回调函数CanIf_TxNotification被调用时,CanIf将找到负责该L-Pdu的上层模块,并通知它传输已成功完成。 如果CanIfPublicTxConfirmPollingSupport被启用,则CanIf应为每个CAN控制器缓冲接收到的Tx确认信息,当该控制器的工作模式处于CAN_CS_STARTED状态时。
接收数据流
根据AUTOSAR基本软件架构,接收到的数据将由上层通信栈(例如AUTOSAR COM、CanNm、CanTp、DCM)评估和处理。这意味着,上层模块既不能修改(即更改)CanDrv(Rx)的缓冲区,也没有访问CanIf(Tx)缓冲区的权限。CanIf仅在CanIfPublicReadRxPduDataApi设置为TRUE时,在接收路径中提供内部缓冲。
在接收到新的Pdu时,CanDrv将调用CanIf_RxIndication函数。接收到的L-Pdu是硬件相关的(例如,字节和半字节顺序、访问类型),并分配给通信系统中的最低层——CanDrv。HRH充当CanDrv和使用L-Pdu的上层模块之间的桥梁。HRH标识一个CAN硬件接收对象,该对象接收到一个新的L-Pdu。
在接收到L-Pdu的指示后,CanDrv(调用CanIf_RxIndication())将继续按照“接收指示”部分中的描述执行。CanIf不知道CanDrv是否使用临时缓冲区或直接访问硬件,因此它期望在调用CanIf_RxIndication()时接收到标准化的L-Pdu数据。
接收指示
调用 CanIf_RxIndication()
时,其参数引用了一个新接收到的 L-Pdu。如果调用 CanIf_RxIndication()
,CanIf 将评估该 L-Pdu 是否接受,并为上层通信层准备 L-SDU,以供后续访问。
如果该 L-Pdu 被成功检测并接受以供进一步处理,CanIf 将使用 <User_RxIndication>()
(如果已配置)通知上层模块此异步事件。
如果全局启用了总线镜像并且为某个 CAN 控制器激活了镜像功能,CanIf 将在该控制器上接收到每个帧时调用 Mirror_ReportCanFrame
。
当调用 CanIf_TxConfirmation
时,CanIf 将对接收到的 L-Pdu 进行软件过滤(如果已配置)。一旦 Pdu 被软件过滤接受,CanIf 将执行数据长度检查(如果已配置)。然后,CanIf 会识别该 Pdu 的上层模块,并在调用上层模块的指示回调时提供所需的数据。
Read Received Data
CanIf提供的API CanIf_ReadRxPduData
是一个通用接口,供上层模块读取最近从CAN网络接收到的CAN L-Pdus。 上层模块可以通过CanIf的服务启动接收数据请求,而无需直接访问CanDrv。接收请求将在CanIf将L-Pdu写入上层的I-Pdu缓冲区时完成。
当通过参数 CanIfPublicReadRxPduDataApi
启用此API时,上层模块可以在没有调用 RxIndication
的上下文中请求最近接收到的Pdu。这意味着无需为特定的Pdu配置 RxIndication
函数,但两种选项可以同时使用。这使得集成商可以在配置时决定如何实现上层模块的Pdu接收。
如果参数 CanIfPublicReadRxPduDataApi
设置为 true
,则CanIf将为设置了 CanIfRxPduReadData
参数为 true
的接收L-Pdu存储缓冲区。在这种配置下,当调用成功的 CanIf_RxIndication
后,接收到的Pdu数据将写入此缓冲区。
读取Tx/Rx通知状态
除了通知回调之外,CanIf还提供了API服务 CanIf_ReadTxNotifStatus
,用于读取已发送L-SDU的传输确认状态。还有API CanIf_ReadRxNotifStatus
,用于读取任何接收L-SDU的接收指示状态。
这些API可以通过参数 CanIfPublicReadRxPduNotifyStatusApi
和 CanIfPublicReadTxPduNotifyStatusApi
全局启用/禁用,分别用于 CanIf_ReadRxNotifyStatus
和 CanIf_ReadTxNotifyStatus
,并可以通过每个Pdu的参数 CanIfRxPduReadNotifyStatus
和 CanIfTxPduReadNotifyStatus
启用/禁用。
Can控制器模式通用功能
CanIf提供服务来控制所有由CanDrv表示的CAN控制器的通信模式。Can控制器的状态可以通过上层的请求,调用CanIf_SetControllerMode
服务进行更改。这个请求会通过CanDrv传递给Can控制器。
CanIf接受所有通过API CanIf_SetControllerMode
和 CanIf_ControllerBusOff
发起的状态转换请求,因为CanIf并不决定这些请求是否有效,它只是将请求传递给驱动程序。
需要注意的是,为了避免频繁调用CAN驱动程序,可以使用 CanIf_ControllerModeIndication
函数,这样就不需要回传给驱动程序。相反,当模式发生变化时,驱动程序会通知CanIf,并将变化存储在每个Can控制器中,CanIf读取该值。
通常,CanSm负责执行模式更改请求,但并非只有CanSm允许使用这些API。
Can控制器操作模式
如果一个控制器处于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会清除Tx确认缓冲区。
当CanDrv调用CanIf回调函数 CanIf_ControllerBusOff
通知CanIf状态变化时,CanIf会通过回调 CanSm_ControllerBusOff
通知CanSm。 当调用回调函数 CanIf_ControllerModeIndication
时,CanIf会调用CanSm的 CanSm_ControllerModeIndication
,以通知CanSm有关模式变化的信息。
控制器模式转换
API用于状态更改请求的Can控制器行为是异步的,并且通知回调也是异步的,因此实际的模式转换可能是异步的。当转换完成后,CanDrv将调用 CanIf_ControllerModeIndication
,随后CanIf会调用上层的 _ControllerModeIndication
回调。上层模块可以通过调用 CanIf_GetControllerMode
来轮询Can控制器模式。
唤醒
当CAN控制器和收发器处于休眠模式且通信被禁用时,ECU仅支持通过CAN唤醒。只有在此模式下,CAN控制器会被停止,因此可以启用唤醒中断。
唤醒检测 如果启用了唤醒支持,CanIf会通过 CanIf_CheckWakeup
服务被通知唤醒事件(可能由集成代码触发),以便检查CanDrv或CanTrcv(分别通过 can_CheckWakeup
和 CanTrcv_CheckWakeup
)是否已发出唤醒事件。如果至少有一个驱动程序或收发器的调用返回E_OK,则 CanIf_CheckWakeup
会返回E_OK,否则返回E_NOT_OK。在CAN总线唤醒事件的情况下, CanIf_CheckWakeup
也可以从 EcuM_CheckWakeup
被调用。
唤醒验证 如果CAN控制器或CAN收发器检测到总线唤醒事件,它将直接通知ECU状态管理器。如果唤醒需要验证,ECU状态管理器将通过 CanIf_SetControllerMode
和 CanIf_SetTrcvMode
函数打开相应的CAN控制器或CAN收发器。
Pdu通道模式控制
Pdu通道组 每个L-Pdu都分配给一个专用的物理CAN通道,连接到一个CAN控制器上的CAN网络。通过这种方式,所有属于一个物理通道的L-Pdu都可以通过一个单独的L-Pdu通道组进行控制,因为这些组代表了连接到单一底层通道的所有L-Pdu。请注意,一个L-Pdu只能分配给一个通道组。
Pdu通道模式
CanIf提供了CanIf_SetPduMode和CanIf_GetPduMode服务,用于按通道禁止Pdu的处理。仅当通道模式设置为CAN_CS_STARTED时,才允许这样操作。 可接受的Pdu模式包括:
-
CANIF_OFFLINE(0x00) - 禁用相应通道的发送和接收路径 => 无通信模式
-
CANIF_TX_OFFLINE(0x01) - 禁用相应通道的发送路径,接收路径启用
-
CANIF_TX_OFFLINE_ACTIVE(0x02) - 相应通道的发送路径处于离线激活模式,接收路径启用。此模式要求CanIfTxOfflineActive支持=TRUE
-
CANIF_ONLINE(0x03) - 启用相应通道的发送和接收路径 => 完整操作模式。
当CANIF_ONLINE和CANIF_OFFLINE禁用通道的发送和接收路径时,CANIF_TX_OFFLINE和CANIF_TX_OFFLINE_ACTIVE允许接收但不进行Pdu发送。
如果调用CanIf_SetControllerMode并设置模式为CAN_CS_SLEEP参数,则CanIf会将Pdu模式设置为CANIF_OFFLINE。切换到CANIF_OFFLINE模式时,CanIf会防止将发送请求(通过CanIf_Transmit)转发给CanDrv,因此不会调用Can_Write或CanXL_Write,且CanIf_Transmit将返回E_NOT_OK。
如果调用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发送缓冲区
-
阻止调用发送确认回调服务的上层模块
-
启用调用接收指示回调服务的上层模块。
由于无法发送L-PDU,因此在CANIF_OFFLINE和CANIF_TX_OFFLINE模式下,CAN总线关闭(BusOff)通知会被隐式抑制,因为没有L-PDU可以发送,CAN控制器也无法进入BusOff模式。
如果已经等待发送的L-PDU在切换到CANIF_TX_OFFLINE或CANIF_OFFLINE模式后立即传输,并且随后发生BusOff事件,则CanIf不会禁止执行BusOff通知。
CANIF_ONLINE 对于切换到CANIF_OFFLINE模式的物理通道,CanIf将:
-
启用将发送请求(CanIf_Transmit)转发给CanDrv
-
启用调用上层模块的接收和发送指示回调服务。
CANIF_OFFLINE_ACTIVE 如果CanIfTxOfflineActiveSupport参数设置为true,则CanIf在Pdu通道模式为CANIF_TX_OFFLINE_ACTIVE时提供成功发送的模拟。这意味着CanIf立即调用发送确认回调服务给上层,而不实际执行发送。这用于如测试等特定用例,其中不希望实际发送,但上层必须相信发生了发送操作,且仍然需要真正的接收。
软件接收过滤
并非所有可以通过硬件RX过滤器并成功接收的L-PDU都会成为ECU接收的L-PDU,CanIf可以过滤掉这些不需要的L-PDU。
提供了特定的软件过滤算法以优化软件过滤的运行时。软件过滤机制的方式是根据正在处理的HRH和CanId来查找相应的L-PDU。在找到L-PDU后,CanIf会接受接收并允许上层直接访问L-SDU信息。
软件过滤概念 配置工具处理硬件接受过滤器设置的相关信息,最重要的设置是L-PDU硬件对象的数量以及它们允许的Pdu/Can ID范围,这些范围不会被过滤掉。选项包括:对于完整的CAN接收,可以接受单个Pdu,或者可以接受Pdu列表,或者可以将一个或多个范围与Basic CAN接收的RX硬件对象关联。
这些范围可以通过设置上限和下限(分别为CanIfHrhRangeRxPduUpperCanId和CanIfHrhRangeRxPduLowerCanId)来设置,任何PDU落在这些边界内的都会被接受,或者可以设置基ID(CanIfHrhRangeBaseID)和掩码(CanIfHrhRangeMask),掩码定义了基ID中哪些位是相关的,必须与PDU的ID匹配。需要注意的是,软件过滤是可选的,并且每种配置的范围类型都会接受标准的Can ID和扩展的Can ID。
最后要注意:如果一个范围(部分)包含在另一个范围内,或者一个单一的CanId包含在一个范围内,则软件过滤将根据以下假设选择L-PDU:
-
单一的CanId优先于任何范围。
-
较小的范围优先于较大的范围。
数据长度检查 接收的数据长度值将与接收到的L-PDU的配置数据长度值进行比较,配置通过参数CanIfRxPduDataLength。CanIf将接受任何大小等于或大于配置长度的PDU(假设该PDU通过过滤)。数据长度检查可以全局设置(CanIfPrivateDataLengthCheck)和按PDU设置(CanIfRxPduDataLengthCheck),请记住,如果全局禁用了检查,则无法按PDU启用它。如果CanIf在数据长度检查期间拒绝了PDU,则CanIf会报告运行时错误给DET,错误代码为CANIF_E_INVALID_DATA_LENGTH。如果数据长度检查通过,则CanIf将PDU长度传递给上层。
轮询模式
轮询模式提供了处理CAN硬件中的发送、接收和错误事件的能力,而不使用硬件中断。因此,CanIf和CanDrv提供了通知服务,以便检测和执行相应的硬件事件。这样,上层模块就不必关心硬件事件的检测策略。如果使用不同的CanDrv,必须在配置设置和系统集成时协调调用频率。用户必须考虑CanIf既能执行由中断触发的通知服务,也能在任务级别执行调用的通知服务。如果CAN控制器的邮箱被阻塞,则会发生随后的发送缓冲。
多Can驱动程序支持
CanIf需要特定的映射来覆盖多个CanDrv,以为上层提供统一接口。因此,CanIf必须将所有操作传递给相应CanDrv和底层CAN控制器的API。对于从堆栈向上的操作,CanIf必须提供适当的回调通知,以区分多个CanDrv。是否启用对多个CanDrv的支持,可以通过参数CanIfPublicMultipleDrvSupport来启用和禁用。
部分网络支持
如果启用部分网络支持(通过CanIfPublicPnSupport),则CanIf支持每个CAN控制器的PnTxFilter,该过滤器覆盖PDU通道模式。只有当配置了每个CAN控制器的Tx L-PDU作为CanIfTxPduPnFilterPdu时,该过滤器才会生效并切换其模式(启用/禁用)。
如果CAN控制器的PnTxFilter启用,则CanIf将阻止所有对该CAN控制器的Tx请求(在调用CanIf_Transmit()时返回E_NOT_OK),直到请求的Tx L-PDU不是该控制器配置的CanIfTxPduPnFilterPdu之一。这些CanIfTxPduPnFilterPdu将始终传递给相应的CAN驱动程序。
如果调用CanIf_RxIndication()并启用PnTxFilter,则相应的PnTxFilter应禁用。如果CAN控制器的PnTxFilter禁用,则CanIf应按要求执行CanIf_SetPduMode操作。如果调用CanIf_SetPduMode将控制器设置为CANIF_TX_OFFLINE并启用部分网络(通过CanIfPublicPnSupport),则相应CAN控制器的PnTxFilter将启用。