当前位置: 首页 > article >正文

【干货分享】Autosar CanIf 模块的应用干货笔记1

  

目录

  

往期推荐

什么是 CanIf

相关常见缩略语和缩写

硬件对象句柄(HOHs)

HRH

HTH

静态L-Pdu

CAN硬件单元

基本CAN和完全CAN

初始化

传输请求

CanIf的传输请求

传输缓冲

General Behavior

缓冲区特性

传输缓冲区初始化 当调用CanIf_Init时,CanIf将执行缓冲区的初始化。

传输确认

接收数据流

接收指示

Read Received Data

Pdu通道模式控制 

Pdu通道模式 

软件接收过滤 

轮询模式

多Can驱动程序支持

部分网络支持 


往期推荐

  1. ETAS工具链自动化实战指南<一>
  2. ETAS工具链自动化实战指南<二>
  3. ETAS工具链自动化实战指南<三>
  4. AUTOSAR工程师必读:Artop的核心功能
  5. Vector工具链自动化实战指南<一>
  6. isolar高手秘籍| ECU Configuration三分钟速成!
  7. 掌握核心步骤:RTA-BSW以太网配置全解析
  8. 一文详解TC399 CAN MCAL 配置
  9. LSL常见应用场景及示例<一>
  10. LSL常见应用场景及示例<二>
  11. LSL常见应用场景及示例<三>
  12. 为什么Autosar钟情arxml而非json?大揭秘!
  13. 深入浅出:SOME/IP-SD的工作原理与应用
  14. 【技术进阶】|一文掌握Autosar ComStack的精髓!
  15. Autosar培训笔记整理<一>
  16. 【AutoSAR进阶】|实战详解ETAS工具链UDS 0x2f服务核心配置!
  17. 实战详解ETAS工具链CanTp模块自动化配置
  18. 一文搞懂AUTOSAR架构9种通信方式

  19. 一文搞懂AUTOSAR架构中的BSW Configuration Class

  20. 实战干货|详解ETAS工具链之 intra-ECU通信的数据转换

  21. 【实战干货】基于ETAS工具链添加以太网信号的正确姿势!



  22. 【干货】一文详解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执行以下操作:

  1. 检查CanIf的初始化状态。

  2. 确定CanDrv。

  3. 确定HTH(硬件传输对象)来访问CAN硬件传输对象。

  4. 在CanDrv中调用Can_WriteCanXL_Write

  5. 若传输成功,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_WriteCanIf_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将启用。       


http://www.kler.cn/a/555131.html

相关文章:

  • Python使用过程中哪些字符是非法的?
  • 【Linux】多线程 -> 线程同步与基于BlockingQueue的生产者消费者模型
  • 分割回文串力扣--131
  • virtualbox怎么把主机剪切板里的内容复制进来
  • 人工智能之视频分割模型sam2源码解读
  • DeepSeek全栈技术体系解密:从算法源码到企业级智能体开发实战
  • [Windows] WPS 2024冬季更新版(版本号19770)
  • MYSQL总结(3)
  • 测试WSS服务器
  • 在UBUNTU下搭建Deepseek
  • 爬虫获取数据后的清洗与校验:完整指南
  • 【Elasticsearch】搜索时排序规则
  • Android Http-server 本地 web 服务
  • PyTorch Tensor 形状变化操作详解
  • 使用Spring Boot构建电商订单系统API的实践
  • 磐维数据库双中心容灾流复制集群搭建
  • dockerfile 使用环境变量
  • 新品 | 杰和科技最新发布搭载英特尔N95处理器的一体机主板CB4-208-U1
  • STL 在线转 3MF,开启 3D 模型转换新体验
  • PLC通信交互系统技术分享