AUTOSAR通信篇—CanIf模块

汽车控制与人工智能

AUTOSAR通信篇—CanIf模块:原文配图 1

让人工智能更好地服务出行,智行天下

AUTOSAR通信篇—CanIf模块:原文配图 2

今天介绍硬件抽象层的CAN接口模块 —— CanIf模块。

1 位置和作用

如图1所示,CAN接口模块(下文简“CanIf”)位于底层CAN驱动(CanDrv)、CAN收发器(CanTrcv)和

上层通信服务层(CanSm、CanNm)、CAN传输协议(CanTp)、PDU路由器(PduR)之间。它表示上

层通信层的CAN驱动程序服务接口。

AUTOSAR通信篇—CanIf模块:原文配图 3

图1 CanIf的位置

CanIf提供了独特的接口来管理不同CAN硬件,如CAN控制器和CAN收发器。同时,基于物理CAN通道相

关的CAN状态管理器模块(CanSm)可以控制多个底层内部和外部的CAN控制器或CAN收发器。

CanIf由与CAN硬件无关的任务组成,属于ECU CAN通信驱动程序。CanIf满足PduR和AUTOSAR COM

栈上层通信模块的控制流和数据流要求:发送请求处理、发送确认、接收指示、错误通知和CAN控制器的

启动/停止,从而唤醒或参与网络。它的数据处理和通知API基于CAN L-SDU,用于控制和模式处理的API

提供了CAN控制器相关的视图。

AUTOSAR通信篇—CanIf模块:原文配图 4

图2 CanIf模块和其他模块的关系

在发送请求时,CanIf用相应的参数完成L-PDU的传输,并通过对应CanDrv将CAN L-PDU转发给CAN控

制器。在接收端,CanIf将接收到的I-PDU作为I-SDU分发到上层模块。接收L-SDU和上层之间的分配是

静态配置的。在传输确认时,CanIf负责向上层发送传输成功的信息。

CanIf提供对CAN驱动程序的通信抽象访问和CAN收发驱动程序服务,用于对CAN网络的控制和监视。

CAN接口将CAN状态管理器的状态向下转发到底层CAN驱动程序,向上CAN接口模块将CAN驱动程序或

CAN收发器驱动程序传递到相应的NM模块。

2 上下层关系

上层

AUTOSAR BSW分层架构中,CanIf的上层可以是PduR,可以是CanNm,可以CanTp,可以CanSm,

EcuM或复杂的驱动模块CDD,普遍标定协议模块XCP,全局时间同步模块CanTSyn ,J1939传输层模块

J1939Tp和J1939网络管理模块 J1939Nm。

CanIf使用的API由通知服务组成,它们将CAN相关数据传输到目标上层。这些服务的调用参数指向

CanDrv中的缓冲信息,或者直接指向CAN硬件。另外,CanIf支持对总线镜像模块的调出,来报告接收和

传输帧的内容。EcuM会初始化CanIf。

下层

CanIf的下层模块主要是CAN驱动程序CanDrv。由于CanIf在AUTOSAR BSW架构中的地位,它与

CanDrv有着密切的关系。CanDrv只提供对CAN控制器的硬件抽象访问,但是CanDrv会检测和处理CAN

控制器的事件,并将这些事件通知到CanIf。CanIf将CanSm的操作模式请求传递给相应的底层CAN控制

器。

AUTOSAR通信篇—CanIf模块:原文配图 5

CanDrv提供了标准化的L-PDU,以确保CanIf的硬件独立性。指向这个规范化的L-PDU的指针要么指向

一个临时缓冲区,要么指向依赖于CAN硬件的CanDrv。CanDrv调用的回调服务是在CanIf中声明和实现

的。由CanIf调用的回调服务被声明并放置在对应的上层通信服务层中,如PduR、CanNm、CanTp。

配置的CAN控制器的数量不一定是使用的CAN收发器的数量。如果多个不同类型的CAN控制器在同一个

CAN网络上运行,一个CAN收发器是足够的,但是根据CAN控制器设备的类型,需要一个或两个不同的

CanDrv。

第二个可用的底层CAN设备驱动程序是CAN收发器CanTrcv。

每个CanTrcv对CAN收发器进行操作模式的控制。CanIf只是将几个底层CanTrcv的API映射到一个惟一的

API,因此,CanSm能够触发相应CAN收发模式的转换。CanIf中不执行属于CanTrcv所控制的功能。

CanIf将所有底层CanTrcv的下列服务映射到一个惟一的接口:

唯一的CanTrcv模式请求和读取服务来管理每个底层CAN收发设备的操作模式;为CAN收发器读取服务,唤醒原因支持;

模式请求服务启用、禁用、清除唤醒事件状态使用的每个CAN收发器(CanIf_SetTrcvMode)。

3 配置

CanIf的设计经过优化,以管理CAN协议的特定功能和用于底层CAN控制器的处理。

CanIf不需要重构就可以更改CAN配置。函数CanIf_Init()从配置容器和参数中获取所需的CAN配置信息。

AUTOSAR通信篇—CanIf模块:原文配图 6

可以获取到的信息包括:CAN控制器的数量。CAN控制器的数量对于发送和接收I-PDU的调度以及对可用CAN驱动程序状态的控制是非常必要的,如下图CanIfCtrlDrvCfg。

AUTOSAR通信篇—CanIf模块:原文配图 7

硬件对象句柄的数目。为了监督发送请求,CAN接口需要知道HTH的数量以及每个HTH与相应的CAN控制器之间的分配,如下图CanIfHthCanCtrlIdRef和CanIfHthIdSymRef。

AUTOSAR通信篇—CanIf模块:原文配图 8
AUTOSAR通信篇—CanIf模块:原文配图 9

通过每个硬件对象的过滤器所接收到的CAN ID的范围。CAN接口使用HRH和L-PDU之间的固定分配 , 在 相 应 的 硬 件 对 象 中 接 收 , 进 行 搜 索 算 法 , 见 下 图 CanIfHrhSoftwareFilter ,CanIfHrhCanCtrlIdRef和 CanIfHrhIdSymRef。

AUTOSAR通信篇—CanIf模块:原文配图 10
AUTOSAR通信篇—CanIf模块:原文配图 11
AUTOSAR通信篇—CanIf模块:原文配图 12

CanIf需要所有已使用的上层通信服务层和L-SDU的信息来分配。为了在AUTOSAR COM栈中集成

CanIf,必须在配置时设置以下信息:

传递上层模块,并为每个传输L-SDU传输I-PDU,用于发送确认服务的调度,参见CanIfTxPduId。

AUTOSAR通信篇—CanIf模块:原文配图 13

接收上层模块并为每个L-SDU接收I-PDU。用于接收指示期间的L-SDU调度,参见 CanIfRxPduId。

AUTOSAR通信篇—CanIf模块:原文配图 14

ECU连接到一个或多个CAN网络,CanIf需要控制器和ECU的描述。因此,以下信息是从AUTOSAR系统

配置的一部分CAN通信矩阵中获取得到,见CanIfTxPduCfg和CanIfRxPduCfg:

ECU物理通道上接收的所有I-PDU,用于软件过滤和接收L-SDU调度;

所有I-SDU应由ECU上的每个物理通道传递,用于发送请求和发送L-PDU调度;

L-PDU的属性,包括ID和数据长度,用于软件滤波,接收指示服务,数据长度检查;

传输L-SDU的传递模块,即PduR、CanNm和CanTp,用于发送确认服务;

接收L-SDU的接收器,即PduR、CanNm和CanTp,用于L-PDU的调度;

L-PDU和L-SDU名称,用于表示Rx/Tx数据缓冲区的地址;

AUTOSAR通信篇—CanIf模块:原文配图 15
AUTOSAR通信篇—CanIf模块:原文配图 16

4 功能服务

CanIf的服务可以分为以下几个主要内容:

初始化

发送请求服务

发送确认服务

接待指示服务

控制器模式控制服务

PDU模式控制服务

CanIf的应用模式:

中断模式:

CanDrv处理由CAN控制器触发的中断。CanIf在事件发生时得到触发,在这种情况下,在CanDrv中相应

的ISR中调用相关的CanIf服务。

轮询模式:

由SchM触发CanDrv,并执行后续进程。在这种情况下,必须在定义的时间间隔内,调用下列函数:

Can_MainFunction_Write Can_MainFunction_Read Can_MainFunction_BusOff Can_MainFunction_Wakeup Can_MainFunction_Transceiver

CanIf由CanDrv通知事件接收、发送、BusOff和超时),这些事件发生在一个CAN控制器中等同于中断驱

动操作。CanDrv更新属于CAN控制器中发生事件的相应信息,如接收L-PDU。

混合模式:中断和轮询驱动CanDrv。根据所使用的CAN控制器,该功能可以分为中断驱动和轮询驱动两种操作模

式。比如,轮询驱动的FullCAN接收和中断驱动的基本CAN接收,轮询驱动的传输和中断驱动的接收等。

AUTOSAR提供了独特的接口,对三种类型的操作模式都有效。无论是在中断、轮询还是混合处理事件

时,CanIf都以相同的方式工作,区别是调用内容不同,还有通知中断的方式:抢占式或协作式。所有服务

都是按照配置执行的。

初始化

EcuM调用CanIf的函数CanIf_Init()来初始化整个CanIf。在初始化过程,将对所有全局变量和数据结构初

始化,包括标示和缓冲区。EcuM分别通过调用相应的初始化服务来执行CanDrv和CanTrcv的初始化。

在初始化完成后,CAN控制器保持在启动复位后的停止模式。在这种模式下,CanIf和CanDrv既不能发送

也不能接收L-PDU。

如果在运行期间需要重新初始化整个CAN模块,EcuM会调用CanSm,通过调用CAN接口模块的API服务

CanIf_SetControllerMode()来启动CAN控制器所需的状态转换,具体过程后续介绍CAN状态管理时会展

开。CanIf将来自CanSm的调用映射到Candrv的调用上。

发送请求服务

CanIf的发送请求函数CanIf_Transmit()是上层模块传输L-PDU的通用接口。上层通信层模块需要通过

CanIf的服务启动传输,无法直接访问CanDrv。如果CanDrv能够将L-PDU数据写入CAN硬件传输对象

中,则发起的传输请求成功完成。上层模块使用API服务CanIf_Transmit ()来发起一个传输请求。

CanIf在调用服务CanIf_Transmit()时对L-PDU传输执行以下操作:

检查,初始化CanIf的状态

当使用多个CanDrv时,识别CanDrv

确定访问CAN硬件传输对象的HTH

调用CanDrv的Can_Write()

如果传输请求服务CanIf_Transmit()返回E_OK,则传输成功完成。

如果一个L-PDU被请求通过一个PDU通道模式来传输,这个模式等于CANIF_OFFLINE,那么CanIf应该

向 DET 的 Det_ReportRuntimeError() 服 务 报 告 运 行 时 的 错 误 代 码 CANIF_E_STOPPED , 而

CanIf_Transmit() 将返回E_NOT_OK。

发送数据流

发送请求服务CanIf_Transmit ()是基于L-PDU的。对L-SDU特定数据的访问按以下参数组织:

传输L-PDU =>L-SDU ID

引用包含L-SDU相关数据的数据结构:指向L-SDU的指针,指向元数据的指针和L-SDU长度。

对L-SDU数据结构的引用被用作几个CanIf API服务中的一个参数,例如CanIf_Transmit()或回调服务

<User_RxIndication> ()。如果L-PDU配置为触发传输,则L-SDU指针为空指针。

AUTOSAR通信篇—CanIf模块:原文配图 17

图3 发送数据流

CanIf会存储为传输而配置的硬件对象信息。函数CanIf_Transmit()将CanTxPduId映射到对应的HTH,并

调用函数Can_Write()。

如 果 总 线 镜 像 是 全 局 启 用 的 CanIfBusMirroringSupport() , 并 且 通 过 调 用 CAN 控 制 器 的

CanIf_EnableBusMirroring()来激活,那么CanIf通过Can_Write()在控制器上传输每帧内容之前将其存

储。只有在实际发送时,才提供总线镜像模块。因此,为了能够从CanIf_TxConfirmation()将其提供给总

线镜像模块,必须考虑存储内容。

发送缓冲

在CanIf的范围内,传输过程从调用CanIf_Transmit()开始,到调用上层模块的回调服务

<User_TxConfirmation>()结束。在传输过程中,CanIf、CanDrv和CAN Mailbox一起存储L-PDU,只

在一个位置传输一次。根据传送方式的不同,分为:

CAN硬件传输对象

如果发送缓冲使能,发送L-PDU缓冲区在CanIf内。

对于触发传输,CanIf只需要存储给定L-PDU的传输请求,而不需要存储它的数据。当HTH空闲时,通过

触发器传递函数及时获取数据。一个单独的发送 L-PDU,请求传输,永远不会被存储两次。这种行为对

应于CAN网络上常用的周期性通信方式。

如果CanIf在传输请求时被CanDrv拒绝,CanIf将启用传输缓冲,并将在传输L-PDU缓冲区

(CanIfBufferCfg)中存储一个发送 L-PDU。

基本上,用于缓冲发送L-PDU的整个CanIf中的缓冲区包含一个或多个CanIfBufferCfg。而每个

CanIfBufferCfg被分配给一个或多个专用的CanIfBufferHthRef,可以配置为缓冲一个或多个发送I-

PDU。但是,在CanIfBufferCfg的总体数量中,每个发送 L-PDU只能缓冲一个实例。

在相应的发送 L-PDU配置中是否启用传输缓冲,CanIf在L-PDU传输期间对应的行为是不同的。如果发

送缓冲被禁用,并且发送到CanDrv的请求失败,那么L-PDU不会被复制到CAN控制器,

CanIf_Transmit()将返回值E_NOT_OK。如果启用了传输缓冲,并且发送到CanDrv的请求失败,根据

CanIfTxBuffer配置,L-PDU可以存储在CanIfTxBuffer中。在这种情况下,尽管无法执行传输,API

CanIf_Transmit()返回E_OK值。在这种情况下,CanIf通过CanIf_TxConfirmation()回调和处理L-PDU

未完成的传输,而上层不必重试传输请求。

传输CanIf 发送L-PDU缓冲区的数量,可以独立于CAN网络描述文件中定义的传输L-PDU的数量来配

置。

发送L-PDU通过CanIfBufferCfg配置容器引用HTH,如果不需要传输缓冲,也是有效的。在这种情况

下,必须将CanIfBufferCfg的缓冲区大小设置为0,然后CanIfBufferCfg配置容器仅用于引用一个HTH。

发送确认服务

如果前一个传输请求成功完成,CanDrv会通过调用CanIf_TxConfirmation()将其通知给CanIf。

如 果 对 于 CAN 控 制 器 , 启 用 了 全 局 总 线 镜 像 CanIfBusMirroringSupport 和 激 活 调 用

CanIf_EnableBusMirroring(), CanIf将会调用Mirror_ReportCanFrame()对每一帧传输控制器确认CanIf_TxConfirmation(),提供存储内容和实际的ID。

调用回调函数CanIf_TxConfirmation()时,CanIf标识与成功传输L-PDU相连的上层通信层,通过调用

CanIf的传输确认服务(E_OK)来通知其传输执行情况。回调服务()是由通知的上层模块实现的。

可以配置上层通信层模块,通过对不同的I-PDU或I-PDU组使用单个或多个回调服务来处理发送确认。所

有那些服务在发送确认L-PDU传输请求时,会被CanIf调用。传输L-PDU允许分派与目标上层模块关联的

不同确认服务,该分配是在静态配置期间完成。

一个发送L-PDU只能分配给一个发送确认回调服务。

如 果 启 用 了 CanIfPublicTxConfirmPollingSupport , 那 么 每 个 CAN 控 制 器 的 模 式 处 于

CAN_CS_STARTED状态,CanIf将缓冲接收到的TxConfirmation的信息。

接收指示服务

根据AUTOSAR BSW架构,接收到的数据将在上层通信模块,即AUTOSAR COM、CanNm、CanTp和

DCM中进行评估和处理。这意味着,上层模块既不能使用CanDrv的缓冲区,也不能访问CanIf的缓冲区。

只有当CanIfPublicReadRxPduDataApi设置为TRUE时,CanIf才会在接收路径中提供内部缓冲。解决了

发送缓冲问题,并考虑动态I-PDU。

如果接收到CanDrv L-PDU,则调用CanIf的CanIf_RxIndication ()。对L-PDU特定数据的访问由以下参

数组织:

硬件接收句柄(HRH)接收CAN标识符(CanId)接收数据长度参考已收到的L-PDU

接收到的L-PDU依赖于硬件,并分配给通信系统的最低层CanDrv。HRH是CanDrv和使用L-PDU的上层

模块之间的链接。HRH标识CAN硬件接收句柄,接收新的CAN L-PDU。

在CanDrv调用CanIf_RxIndication(),指示接收到的L-PDU后,CanIf将按照接收指示进行处理。CanIf

无法识别CanDrv是使用临时缓冲还是直接访问硬件。它期望在调用CanIf_RxIndication()时得到标准化的

L-PDU数据。

CAN硬件接收句柄被锁定,直到复制到临时或上层模块缓冲区的过程结束。硬件对象将在CanIf的

CanIf_RxIndication()返回后立即释放,以避免数据丢失。

CanDrv、CanIf和属于接收到L-PDU的上层模块访问相同的临时缓冲区,该临时缓冲区可以位于CAN控制

器的硬件接收对象中,也可以位于CanDrv中的临时缓冲区中。

AUTOSAR通信篇—CanIf模块:原文配图 18

图4 接收的信号流

调用CanIf_RxIndication()引用新接收到的L-PDU的参数,如果调用了函数CanIf_RxIndication(),CanIf

将对CAN L-PDU进行评估接收,并准备L-SDU供上层通信层访问。CanIf使用<User_RxIndication>()通知上层模块这个异步事件,如果配置成功,并且检测到L-PDU进行处理。

如果总线镜像是全局启用的,并且通过调用CAN控制器的CanIf_EnableBusMirroring()激活,那么CanIf

应该为该控制器上用CanIf_RxIndication()来表示的每一帧接收调用Mirror_ReportCanFrame()。

如果调用函数CanIf_RxIndication(),CanIf会按照指定的方式处理接收到的L-PDU。如果软件过滤拒绝

接收到的L-PDU,CanIf会结束对canif_rxindicator()调用的接收指示。

如果CanIf在软件过滤过程中接受通过CanIf_RxIndication()接收到的L-PDU, CanIf随后会处理数据长度

检查。如果CanIf在数据长度检查期间使用CanIf_RxIndication()接收L-PDU, CanIf将根据配置的数据长

度的字节数复制到静态接收缓冲区。

如果为接收的L-SDU配置了元数据,CanIf将PDU有效负载复制到静态接收缓冲区,并将CANID复制到类

型为CAN_ID_32的MetaDataItem。

在数据长度检查期间,如果CanIf接受通过CanIf_RxIndication()接收到的L-PDU,CanIf会识别是否配置

了目标上层模块(CanIfRxPduUserRxIndicationUL,CanIfRxPduUserRxIndicationName),并为接收

到的L-SDU提供接收指示服务。

如 果 目 标 上 层 模 块 被 配 置 为 提 供 接 收 指 示 服 务 , CanIf 称 之 为 配 置 接 收 指 示 回 调 服 务

CanIfRxPduUserRxIndicationName,提供所需的参数上层通知回调函数的参数CanIf_RxIndication ()。

CanIf在调用CanIf_RxIndication()时执行以下步骤:

软件过滤(只有BasicCAN)数据长度检查缓冲接收L-SDU调用上层接收指示回调服务

读取接收到的数据APICanIf_ReadRxPduData()是上层模块读取CANL-SDU最近从CAN网络接收到的公

共接口。上层模块只通过CanIf服务发起接收请求,而不直接访问CanDrv。发起的接收请求成功完成,

CanIf将接收到的L-SDU写入上层模块I-PDU缓冲区。

函数CanIf_ReadRxPduData()使得在不依赖接收事件的情况下读取数据成为可能。在配置时启用它,不一

定为相同L-SDU配置接收指示服务。如果需要,可以启用接收指示服务。

通过这种方式的类型机制获得L-SDU,可以选择由参数CanIfRxPduUserRxIndicationUL和

CanIfRxPduReadData,在配置时根据上层模块的需求,相应的接收L-SDU。

如果配置参数CanIfPublicReadRxPduDataApi设置为TRUE,则CanIf将接收到的L-SDU(在此情况下

CanIfRxPduReadData是启用的)存储到接收到的L-SDU缓冲区。这意味着,如果配置参数CanIfRxPduReadData设置为TRUE,CanIf必须为这个接收L-SDU分配接收L-SDU缓冲区。

在调用CanIf_RxIndication()并通过软件过滤和数据长度检查后,CanIf将接收到的L-SDU存储在这个接

收到的L-SDU缓冲区中。在调用CanIf_ReadRxPduData()指定的接收L-SDU缓冲区时,CanIf应避免抢

占接收L-SDU缓冲区的访问事件。

控制器模式控制服务

CanIf提供用于控制由CanDrv支持的CAN控制器通信模式的服务。这意味着所有CAN控制器都由相应的

API服务来控制,以请求和读取当前控制器模式。

可以通过调用CanIf_SetControllerMode()服务,来根据上层的请求更改CAN控制器状态。请求通过CanIf

经过CanDrv API传递到指定的CAN控制器。在CAN网络上对所有CAN控制器的一致性管理是CanSm的任

务。通过这种方式,CanSm负责将CAN网络的所有CAN控制器按顺序设置为睡眠模式或唤醒。

CanIf通过调用函数CanIf_SetControllerMode()或CanIf_ControllerBusOff()接受每个状态转换请求。

CanIf不决定CAN控制器请求的模式转换是否有效。CanIf仅通过获取当前模式和执行请求的模式转换来与

CanDrv交互。

该网络相关状态机在CanSm中实现。CanIf只存储请求的模式并执行请求的转换。

为 了 避 免 频 繁 请 求 CanDrv , 可 以 对 每 个 控 制 器 存 储 CanIf_ControllerModeIndication() 和

Can_GetControllerMode()所指示的最后状态。需要注意的是,不仅CanSm能够请求CAN控制器模式的

改变。根据CanSm请求的操作模式,CanIf转发请求CanDrvs。

如果ControllerId引用的控制器模式处于CAN_CS_STOPPED状态,并且如果CanIf_Transmit()调用中的

PduIdType参数被分配给该CAN控制器,那么CanIf_Transmit()调用不会导致Can_Write()调用,而是返

回E_NOT_OK。如果ControllerId引用的控制器模式进入CAN_CS_STOPPED状态,CanIf会清除分配给

CAN控制器相应的CanIf传输缓冲区。

如果ControllerId引用的控制器模式进入CAN_CS_STOPPED状态,那么CanIf通过调用(id, E_NOT_OK)

为分配给CAN控制器的每个未完成的TxConfirmation,通知相应的上层模块传输失败。如果启用了

CanIfPublicTxConfirmPollingSupport,那么CanIf还会清除关于TxConfirmation的信息。

这确保了对于每个PDU,都会调用一个正的或负的<User_TxConfirmation>()。当调用回调

CanIf_ControllerBusOff(ControllerId) 时 , CanIf 调 用 CanSm 或 CDD 的

CanSM_ControllerBusOff(ControllerId)。

PDU模式控制服务

每个L-PDU分配给一个专用的物理CAN通道,该通道连接CAN控制器和CAN网络。通过这种方式,所有

属于物理通道的L-PDU都可以在处理逻辑上,单一的L-PDU通道组上进行控制。这些逻辑组表示ECU连

接到底层CAN网络的所有I-PDU。图 展示了L-PDU信道组与上层或网络的关系。

AUTOSAR通信篇—CanIf模块:原文配图 19

图5 PDU组的通道

一个L-PDU只能分配给一个信道组。PduR或网络管理等典型用户负责控制PDU的操作模式。CanIf提供了

服务CanIf_SetPduMode()和CanIf_GetPduMode()来防止处理:

所有的I-PDU都属于一个逻辑通道,所有发送I-PDU和接收I-PDU属于一个逻辑通道。

只允许在对应的控制器模式等于CAN_CS_STARTED时,更改PDU通道模式。而CANIF_ONLINE和

CANIF_OFFLINE在PDU信道模式下影响整个通信,分别启用和禁用CANIF_TX_OFFLINE和

CANIF_TX_OFFLINE_ACTIVE传输路径。CanIf通过服务CanIf_GetPduMode()提供关于当前PDU通道模

式的信息。

AUTOSAR通信篇—CanIf模块:原文配图 20

图6 PDU组的通道模式控制

在初始化期间,CanIf应该将每个通道切换到CANIF_OFFLINE。如果调用CanIf_SetControllerMode(),

则CanIf会将对应通道的PDU通道模式设置为CANIF_OFFLINE。

对于切换到CANIF_OFFLINE模式的物理通道,CanIf应该:

防止将相关L-PDU的传输请求CanIf_Transmit()转发给CanDrv,清除相应的CanIf传输缓冲区,防止调用上层模块的接收指示回调服务,防止调用上层模块的传输确认回调服务。

如果调用CanIf_SetControllerMode()或CanIf_ControllerBusOff(),则CanIf应将相应通道的PDU通道模

式设置为CANIF_TX_OFFLINE。

对于切换到CANIF_TX_OFFLINE模式的物理通道,CanIf应该:

防止将相关L-PDU的传输请求CanIf_Transmit()转发给CanDrv,清除相应的CanIf传输缓冲区,防止调用上层模块的传输确认回调服务。支持调用上层模块的接收指示回调服务。

在CANIF_OFFLINE和CANIF_TX_OFFLINE的情况下,BusOff通知被隐式地抑制,因为没有I-PDU可以

被传输,因此CAN控制器不能通过新请求的L-PDU进入BusOff模式进行传输。

如果已经在CAN transmission硬件对象中等待传输的L-PDU在切换到CANIF_TX_OFFLINE或

CANIF_OFFLINE模式并发生后续BusOff事件后立即被传输,那么CanIf不禁止执行BusOff通知。唤醒通

知不受PDU通道模式更改的影响。

对于切换到CANIF_ONLINE模式的物理信道,CanIf应该:

允许将相关L-PDU的传输请求CanIf_Transmit()转发到CanDrv,支持调用上层模块的接收指示回调服务,允许调用上层模块的传输确认回调服务。如果CanIfTxOfflineActiveSupport为TRUE,CanIf提供通过CANIF_TX_OFFLINE_ACTIVE模式成功传

输的模拟。该模式是通过调用CanIf_SetPduMode()来启用的,并且只影响传输路径。

对于每个被分配到CANIF_TX_OFFLINE_ACTIVE模式信道的L-PDU, CanIf会立即调用上层模块的传输确

认回调服务,而不是在调用CanIf_Transmit()时将L-PDU缓冲或转发到CanDrv。

在CANIF_TX_OFFLINE_ACTIVE模式下,上层必须处理传输确认的执行。发送确认处理在发送请求结束

时立即执行。这个功能对于实现特殊的操作模式(如诊断无源模式)是有用的,以避免总线流量而不影响

通知机制。此模式通常用于诊断。

5 API

API这里罗列一下,就不展开赘述了,后续有机会再串起来介绍。

CanIf_Init CanIf_DeInit CanIf_SetControllerMode CanIf_GetControllerMode CanIf_GetControllerErrorState CanIf_Transmit CanIf_ReadRxPduData CanIf_ReadTxNotifStatus CanIf_ReadRxNotifStatus CanIf_SetPduMode CanIf_GetPduMode CanIf_GetVersionInfo CanIf_SetDynamicTxId CanIf_SetTrcvMode CanIf_GetTrcvMode CanIf_GetTrcvWakeupReason CanIf_SetTrcvWakeupMode CanIf_CheckWakeup CanIf_CheckValidation CanIf_GetTxConfirmationState CanIf_ClearTrcvWufFlag CanIf_CheckTrcvWakeFlag CanIf_SetBaudrate CanIf_SetIcomConfiguration CanIf_GetControllerRxErrorCounter CanIf_GetControllerTxErrorCounter CanIf_EnableBusMirroring

回调函数

CanIf_TriggerTransmit CanIf_TxConfirmation CanIf_RxIndication CanIf_ControllerBusOff CanIf_ConfirmPnAvailability CanIf_ClearTrcvWufFlagIndication CanIf_CheckTrcvWakeFlagIndication CanIf_ControllerModeIndication CanIf_TrcvModeIndication CanIf_CurrentIcomConfiguration

总结

CanIf位于底层CAN驱动、CAN收发器和上层通信服务层、CanTp、PduR之间。它表示上层通信层的

CAN驱动程序服务接口。其中涉及众多API函数和回调函数,具体功能最好结合函数的定义和应用场景理

解。

缩略词:

L-PDU: CAN Protocol Data Unit,

CAN协议数据单元

L-SDU: CAN Service Data Unit,

CAN服务数据单元

CanDrv: CAN Driver module,

CAN驱动模块

CAN FD: CAN with Flexible Data-Rate

CanId: CAN Identifier,

CAN标识符

CanIf: CAN Interface module,

CAN接口模块

CanNm: CAN Network Management module,

CAN网络管理模块

CanSm: CAN State Manager module,

CAN状态管理模块

CanTp: CAN Transport Layer module,CAN传输层模块

CanTrcv: CAN Transceiver Driver module,

CAN收发器驱动模块

CanTSyn: Global Time Synchronization overCAN,

ComM: Communication Manager module,

通信管理模块

DCM: Diagnostic Communication Manager module,诊断通信管理模块

EcuM: ECU State Manager module,

ECU状态管理模块

HOH: CAN hardware object handle,

硬件对象句柄

HRH: CAN hardware receive handle,

硬件接收句柄

HTH: CAN hardware transmit handle,

硬件发送句柄

PduR: PDU Router module,

PDU路由模块

SchM: Scheduler Module,

进程模块

汽车ECU设计

AUTOSAR通信篇—CanIf模块:原文配图 21

一个菜鸟程序猿的成长之路。116篇原创内容

公众号

🌏 微 信:@氨气中的战斗机✍🏻 知 乎:@吃完饭后不刷牙👬 公众号:@汽车ECU设计

历史精华文章集合:

【汽车ECU设计】汽车总线文章合集

【汽车ECU设计】Autosar文章合集

【汽车ECU设计】工作思考合集

【汽车ECU设计】第101~150期目录

【汽车ECU设计】第51~100期目录

【汽车ECU设计】第1~50期目录

← 返回文章列表