【AUTOSAR 基础软件】Can模块详解(Can栈之驱动模块)

文章包含了AUTOSAR基础软件(BSW)中Can模块相关的内容详解。本文从AUTOSAR规范解析,ISOLAR-AB配置以及模块相关代码三个维度来帮读者清晰的认识和了解Can驱动软件模块。文中涉及的ISOLAR-AB配置以及生成的ARXML均依托于ETAS工具链,而MCAL部分是使用tresos Studio来导入ARXML并生成对应的驱动配置代码,驱动则是使用对应MCAL安装的MC-ISAR_AS422_TC3xx_BASIC_2.20.0下的源码。以上各个部分与AUTOSAR规范之间可能会有些许的出入,但总体的功能要点与处理流程都应该是一致的。

Can驱动模块主要作为MCAL中的一个模块,在这里并非重复的介绍了一遍,而是按照实际的工作顺序,从ISOLAR-B中对应CAN模块的角度来讲述这个驱动模块。ISOLAR-B中的Can模块虽然不生成具体代码,但是它不仅被其他模块引用,用于生成对应模块的动态代码,其对应的ARXML还可以导入EB tresos中用于生成对应MCAL中CAN驱动模块的部分配置。

顾名思义,CAN驱动模块的主要工作就是完成了CAN控制器的一个驱动工作,因为Can控制器往往具有接收报文的过滤功能(如果把所有总线上收到的报文都进行缓存会事半功倍),所以CAN驱动的配置在一定程度上依赖于本ECU通信矩阵中接收的报文ID,于是就有了从ISOLAR生成CAN模块的ARXML导入EB tresos生成MailBox配置的需要(当然,当前的ISOLAR不仅仅生成了MailBox的配置)。

目录

AUTOSAR规范解析

缩略语与概念 

优先级反转

CAN硬件单元

模块依赖 

功能规范说明  

驱动适用范围

驱动状态机

Can控制器状态机

Can模块/控制器初始化

L-PDU 发送

L-PDU 接收

唤醒概念

通知概念     

重入问题  

虚拟网络

CAN FD支持

ISOLAR-AB配置

CAN

CanGeneral

CanController

CanHwObjectCount 

代码解析

动态配置代码

集成代码 

静态代码


AUTOSAR规范解析

Can驱动模块规范规定了AUTOSAR基本软件模块CAN驱动程序的功能、API和配置(本文称为“CAN模块”)。
Can模块是CAN栈中最低层的一部分代码实现,它用来执行具体的硬件访问,并为上层提供一个与硬件无关的API。唯一可以访问Can模块的上层是Canlf模块。
CAN模块提供发送/接收CAN帧的服务,并调用CanIf模块的回调函数来通知事件,这独立于硬件。此外,它还提供分别控制同一CAN硬件单元中CAN控制器的行为和状态的服务(多个CAN控制器可以由单个CAN模块控制,只要它们属于同一个CAN硬件单元,由一个Can驱动进行管理)。


缩略语与概念 

  • CAN controller:CAN控制器完全服务于一个物理通道。
  • CAN Hardware Unit:CAN硬件单元可以由一个或多个相同类型的CAN控制器和一个或多个CAN RAM区域组成。CAN硬件单元可以是片上设备或外部设备。CAN硬件单元由一个CAN驱动程序表示。
  • CAN L-PDU:数据链路层协议数据单元。由标识符、数据长度和数据组成(SDU)。
  • CAN L-SDU:数据链路层服务数据单元。表示在L-PDU内传输的数据。
  • DLC:数据长度(L-PDU中描述SDU的长度)。
  • Hardware Object:CAN硬件对象被定义为CAN硬件单元/CAN控制器的CAN RAM中的PDU缓冲区硬件对象,用作缓存L-PDU。
  • Hardware Receive Handle (HRH):硬件接收句柄(HRH)由CAN驱动程序定义和提供。每个HRH通常只代表一个硬件对象,也可以表示硬件对象的集合(接收FIFO)。HRH可用于优化软件过滤。
  • Hardware Transmit Handle (HTH):硬件发送句柄(HTH)由CAN驱动程序定义和提供。每个HTH可以代表一个或多个硬件对象(多路传输),这些对象被配置为硬件传输缓冲池。
  • Inner Priority Inversion:内部优先级反转,指的是由于在同一发送硬件对象中存在待发的低优先级L-PDU,高优先级L-PDU的传输被阻止的情况。
  • ISR:Interrupt Service Routine,中断服务例程。
  • L-PDU Handle:L-PDU句柄被定义并放置在Canlf模块层内。通常每个句柄代表一个L-PDU,这是一个包含用于Tx/Rx处理的信息的结构体常量。
  • MCAL:Microcontroller Abstraction Layer。
  • Outer Priority Inversion:外部优先级反转,指的是由于在两个连续发送的L-PDU之间会出现时间间隔,当此时另一个节点优先级较低的L-PDU尝试发送报文,并赢得了仲裁之后,则可以阻止本节点发送自己优先级较高的L-PDU。
  • Physical Channel:物理信道表示从CAN控制器到CAN网络的接口。不同的CAN硬件单元的物理信道可以访问不同的网络。
  • Priority:CAN的L-PDU的优先级由CAN标识符表示。标识符的数字值越低,优先级越高。
  • SFR:Special Function Register,特殊功能寄存器,控制控制器行为的硬件寄存器。
  • SPAL:Standard Peripheral Abstraction Layer。
  • ICOM:Intelligent Communication Controller。

优先级反转

上图标黄的解释为本节点要发送一个低优先级的信息,但是因为总线上的高优先级信息而被阻塞了。如果只使用单个发送缓冲区,内部优先级反转可能会发生。由于优先级低,存储在缓冲区中的消息需要等待直到“总线平静下来”。在等待期间,该消息可能会阻止同一微控制器生成的优先级更高的消息通过总线传输。

在某些CAN实现中可能会发生外部优先级反转的问题。假设一个CAN节点希望传输一系列具有较高优先级的CAN帧,这些消息存储在不同的消息缓冲区中,如果在CAN网络上这些消息之间的帧间空间大于CAN标准定义的最低空间,则第二个节点在趁着这个帧间空隙可以开始传输优先级较低的消息。最小间空间由CAN帧中ITM(3bit,Intermission)确定,由3个隐性位组成。当一个消息在传输另一个消息时处于等待状态,它将在总线空闲期间启动,最早在间隙字段之后的位上开始传输(有的节点可能会在第三个位不传输SOF,直接传帧ID进行仲裁)。为了避免在间隙中总线被别的节点报文抢走,这就要求CAN模块的内部处理时间必须足够短,以在最小帧间间隔内连续发送消息,以避免所有提到的场景下的外部优先级反转。


CAN硬件单元

CAN硬件单元将一个或多个CAN控制器与公共或独立的硬件对象结合在一起,这些控制器可以位于芯片上或作为同类型的外部独立设备。下图显示了一个CAN硬件单元,该单元由分别连接到两个物理通道的两个CAN控制器组成。


模块依赖 

首先,Can驱动作为MCAL的一个模块,我们可以采用手动配置的方式,但是工作量较大,一般采用的直接导入ISOLAR生成的arxml文件,首先打开对应的MCAL工程,选择im-and Exporters选项,如下图。

然后我们选择AUTOSAR Options页签,将生成的ISOLAR生成的CAN模块的ARXML导入,即可。注意:导入过程会将我们手配的一些参数覆盖,如果不一致需要我们手动复原。

然后,CAN驱动还会依赖一些驱动服务。函数Can_Init应初始化CAN控制器使用的所有片上硬件资源。唯一的例外是数字I/O引脚配置(用于CAN的引脚),这由端口驱动程序完成。在初始化Can模块之前,应先初始化Mcu模块,MCU驱动模块提供一些例如时钟等通用的功能配置给到CAN驱动。如果使用外部CAN控制器,则CAN模块应使用其他MCAL驱动程序(例如SPI)的服务。CAN驱动的实现还依赖ISR模块,我们应该正确的分配CAN控制器对应节点的中断优先级情况。一个CAN控制器对应了四个中断(分别对应接收,发送,BusOff,接收FIFO中断),如下图。

最后,CAN驱动还依赖一些系统服务,包括需要周期调度一些轮询的函数(Can_MainFunction_Write、Can_MainFunction_Read、Can_MainFunction_BusOff等),以及当硬件未在预期时间内响应(硬件故障)时,Can模块应使用系统服务提供的OsCounter进行超时检测,以防止无限循环(等待超时时间应小于对应主函数的调度周期)。


功能规范说明  

在L-PDU传输中,CAN模块将L-PDU写入CAN控制器硬件内的适当缓冲区。在L-PDU接收中,Can模块调用以ID、数据长度和L-SDU的指针为参数的RX指示回调函数。
CAN模块提供了一个接口,作为定期处理功能,并且必须由基础软件定期调用。此外,CAN模块提供控制CAN控制器状态的API,并通过回调函数通知总线断开和唤醒事件。Can模块应为所有需要的CAN硬件单元中断实现中断服务例程。CAN模块应禁用CAN控制器中所有未使用的中断。CAN模块应在ISR结束时重置中断标志(如果硬件没有自动完成),CAN模块不应设置向量表项的配置(即优先级)。


驱动适用范围

一个CAN模块提供对一个CAN硬件单元的访问,该硬件单元可能由多个CAN控制器组成。对于不同类型的CAN硬件单元,应实施不同的Can模块。如果在一个ECU中实现多个CAN硬件单元(相同或不同供应商),则CAN模块的功能名称和全局变量应独立实现,以便不会产生两个具有相同名称的功能。命名惯例如下:<Can module name>_<vendorID>_<Vendor specific API name><driver abbreviation>()。如果只使用一个控制器类型,则没有任何<driver abbreviation>扩展的原始命名约定就足够了。


驱动状态机

Can模块有一个非常简单的状态机,有CAN_UNINIT和CAN_READY两种状态。下图显示了状态
机。在power-up/reset后,Can模块应处于CAN _UNINIT状态。函数Can_Init应在初始化硬件单元内的所有控制器后将模块状态更改为CAN_READY。

Can_Init函数应根据其配置初始化所有CAN控制器。每个CAN控制器必须通过调用函数Can_SetControllerMode(CAN_CS_STARTED)单独启动。对硬件单元中的所有CAN控制器有影响的硬件寄存器设置只能在Can_Init函数中设置。ECU状态管理器模块在运行时最多应调用Can_Init一次。Can_Delnit应在去初始化硬件单元内的所有控制器之前将模块状态更改为CAN_UNINIT。


Can控制器状态机

每个CAN控制器都有在硬件IP核中实现的复杂状态机。为了简化,本描述中将状态数减少到以下四个基本状态:UNINIT、STOPPED、STARTED和SLEEP。任何CAN硬件访问都由Can模块的功能API封装,但Can模块不会存储状态更改。CAN模块提供Can_Init、Can_SetBaudrate和Can_SetControllerMode等服务。这些服务执行配置必要的寄存器,从而引起硬件CAN控制器状态完成所需的更改。外部事件触发状态变化的可能性有两种:

  • Bus-off event
  • HW wakeup event

这些事件可以通过中断或在Can_MainFunction_BusOff或Can_MainFunction_Wakeup中轮询的状态位来指示。Can模块会在中断处理中进行必要的寄存器设置,以实现所需的行为(例如在BusOff终端中取消挂起的发送请求),它还会用相应的回调函数通知Canlf模块,然后Canlf模块会在这个回调函数中改变对应软件状态。如果启用了开发错误,并且上层要求进行不允许的转换,Can模块将回复开发错误CAN_E_TRANSITION。Can模块在执行Can_Write或引发回调之前不会检查Can控制器实际状态。下面我们分别介绍一下这四种状态。

  • UNINIT:CAN控制器未初始化。所有属于CAN模块的寄存器处于重置状态,CAN中断被禁用。CAN控制器未参与CAN总线。
  • STOPPED:在这种状态下,CAN控制器被初始化,但不参与总线。此外,逻辑链路层上的错误帧不会发送,ACK也不会响应。(对于许多控制器来说,初始化之后控制器为停止状态。)
  • STARTED:控制器处于正常操作模式并具有完整功能,这意味着它参与网络。
  • SLEEP:对于支持睡眠模式(CAN硬件直接支持在CAN总线上唤醒)的CAN硬件,才有这个模式,否则与STOPPED状态表现一致。当CAN硬件支持睡眠模式并被触发进入SLEEP状态时,CAN模块应将控制器设置为SLEEP状态,硬件可以从该状态通过CAN总线唤醒。当CAN硬件不支持睡眠模式并被触发进入睡眠状态时,CAN模块应模拟一个逻辑睡眠状态,只有当软件触发它进入停止状态时它才会返回。

下面我们介绍一下CAN控制器状态机的转换逻辑。状态转换Can_SetControllerMode()函数触发,转换的状态由参数传入。软件触发的成功状态转换由回调函数CanIf_ControllerModeIndication通知。管理请求的状态是否实现是上层模块的一部分,不是CAN模块的一部分。一些状态转换是由总线(硬件)上的事件触发的。这些转换通过回调函数(CanIf_ControllerBusOff,EcuM_CheckWakeup)通知。下图描述了各个状态可能的转化关系。下面我们介绍不同触发条件引起的状态转换:

  • Can_Init():它应该引起初始化的CAN硬件单元内所有控制器UNINIT到STOPPED的状态转换。所有控制寄存器的配置都是根据MCAL生成的动态配置来配置的。如果调用的控制器没有在UNINIT状态,则上报CAN_E_TRANSITION错误。
  • Can_SetBaudrate():他应该引起控制器维持在STOPPED、SLEEP以及STARTED状态。它会改变当前的通信速率。如果Can_SetBaudrate()的调用会导致CAN控制器的重新初始化,并且CAN控制器没有处于STOPPED状态,它将返回E_NOT_OK。
  • Can_SetControllerMode():Can_SetControllerMode函数触发CAN控制器的状态转换。根据CAN硬件的不同,将寄存器设置更改以切换到新的CAN控制器状态可能需要延迟。在成功状态转换后,Can模块会通过CanIf_ControllerModeIndication()通知上层。请求的状态是否实现是上层模块要关心的,不是Can模块的一部分。Can_Mainfunction_Mode函数应轮询CAN状态寄存器的标志,直到标志表示更改生效,并通过上层函数CanIf_ControllerModeIndication()通知成功的状态转换,参数为Canlf相应的CAN控制器抽象Controllerld。 函数Can_SetControllerMode()应使用系统服务GetCounterValue()进行超时监视,以避免阻塞函数。如果转换标志位表示更改无效且已到达最大时间CanTimeoutDuration,则应退出Can_SetControllerMode()函数,而CanMainfunction_Mode函数应继续轮询转换标志位。
    • Can_SetControllerMode (CAN_CS_STARTED):由软件触发从STOPPED状态转化为STARTED状态。在CAN控制器开始工作之前发出的请求会丢失。。发送可能会遇到确认超时,上层需要能够处理这种情况。
    • Can_SetControllerMode (CAN_CS_STOPPED):由软件触发从STARTED/SLEEP状态到STOPPED状态。Can_SetControllerMode(CAN_CS STOPPED)应设置CAN硬件内的位,以便CAN控制器停止参与网络,并取消待处理消息。
    • Can_SetControllerMode(CAN_CS_SLEEP):从STOPPED状态到SLEEP状态。如果CAN硬件支持睡眠模式,则函数Can_SetControllerMode(CAN_CS_SLEEP)应等待有限的时间,直到CAN控制器处于睡眠状态,并确保CAN硬件是可唤醒的。如果CAN硬件不支持休眠模式,函数Can_SetControllerMode(CAN_CS_SLEEP)将CAN控制器设置为逻辑休眠模式。当调用Can_SetControllerMode(CAN_CS_SLEEP)函数且CAN控制器既非处于STOPPED状态也非处于SLEEP状态时,应检测到无效状态转换
  • Hardware Events:下面介绍一下硬件触发的CAN控制器状态变化:
    • Hardware Wakeup:状态从SLEEP到STOPPED切换,通过CAN总线上接收到的L-PDUs,然后通过EcuM_CheckWakeup()通知EcuM唤醒事件(CAN模块应在中断上下文中或在Can_MainFunction_Wakeup的上下文中调用EcuM_CheckWakeup函数)。Can模块不得进一步处理导致唤醒的L-PDU。
    • Bus-Off:触发状态从STARTED到STOPPED切换,如果CAN控制器达到总线关闭状态,则由硬件触发。在达到停止状态后,通过Canlf_ControllerBusOff函数通知CanIf模块,并传递与相应的CAN控制器关联的抽象Controllerld。在检测到总线关闭后,Can模块应取消仍待处理的消息。Can模块应禁用或抑制控制器IP核自带的自动总线Bus-Off恢复。
  • Can_DeInit():触发状态从STOPPED/SLEEP到UNINIT状态切换。当调用函数Can_Delnit()且Can模块中任何 CAN 控制器不在状态STARTED时,应引发错误CAN_E_TRANSITION。

Can模块/控制器初始化

EcuM模块应首先在启动阶段通过调用Can_Init函数来初始化Can模块,然后再使用Can模块的任何其他功能。Can_Init应初始化:静态变量、包含标志、对于硬件单元的通用配置以及对每个Can控制器的独立配置。Can_Init不得更改CAN控制器的寄存器未使用的硬件资源。Can模块应在控制器寄存器的初始化方面应用以下规则:

  • 如果硬件只允许使用寄存器一次,则实现该功能的Can模块负责初始化寄存器。
  • 如果寄存器可以影响多个硬件模块,如果是I/O寄存器,则应由PORT模块初始化。
  • 如果寄存器可以影响多个硬件模块,如果它不是I/O寄存器,则应由MCU模块初始化。
  • 重置后需要直接初始化的一次性可写寄存器应由启动代码初始化。
  • 所有其他寄存器都应由启动代码初始化。

如果Can_SetBaudrate()引起的目标配置更改需要重新初始化且CAN控制器处于停止状态,则Can_SetBaudrate应重新初始化CAN控制器和控制器特定设置。如果需要重新初始化,在应用新的波特率配置之前必须将CAN控制器切换到停止状态。

配置是一个指向存储在ROM中的特定于实现的数据结构数组的指针。不同的控制器配置设置作为数据结构位于ROM中。Can模块配置定义了全局CAN硬件单元设置和对默认CAN控制器配置集的引用。


L-PDU 发送

在L-PDU传输中,Can模块将L-PDU的数据内容、ID和数据长度转换为硬件特定格式(如有必要),并触发传输。CAN到内存的数据映射定义如下:首先发送的是CAN数据字节的数组元素0,最后发送的CAN数据字节是数组元素DLC-1。如果CAN硬件缓冲区内的格式表示与AUTOSAR定义不同Can模块必须为上层提供一个适应的SDU-Buffer。常用的是一个HTH对应一个TX hardware objects,如下图展示。

CAN模块应调用Canlf_TxConfirmation()以指示成功传输。它要么由相应硬件资源的TX中断服务例程调用,要么在轮询模式下在Can_MainFunction_Write中调用。

CAN模块的函数Can_Write()应存储在CanIf提供的参数Pdulnfo中给出的swPduHandle,直到Can模块为该请求调用Canlf_TxConfirmation(),其中将swPduHandle作为参数回给CanIf模块,这么做的目的是在Canlf模块实现中减少搜索时间。

多传输通道是必要的,以防止优先级倒置。Can模块应允许功能“Multiplexed Transmission”在编译前是静态可配置的。

多个传输硬件对象(定义为“CanHwObjectcount”)应分配到一个HTH,以代表一个传输实体到上层。Can模块应支持按L-PDU优先级顺序发送L-PDU的设备的多路传输。应避免对优先级进行软件处理,因为开销会使多路传输的优势化为乌有。

Can模块应直接从上层缓冲区复制数据。在函数调用返回之前,上层负责保持缓冲区的一致性(Can Write)


L-PDU 接收

在L-PDU接收时,CAN模块应调用CanIf_RxIndication(const Can_HwType *Mailbox, const PduInfoType *PduInfoPtr)回调函数,Mailbox指针指向结构体包含CanId(Standard/Extended CAN ID of CAN L-PDU)、Hoh(ID of the corresponding Hardware Object)以及ControllerId(ControllerId provided by CanIf);PduInfoPtr指针指向结构体包含swPduHandle(SW Handle that will identify the request in the confirmation callback function.)、length(DLC)、id(Identifier of L-PDU)以及sdu(Pointer to L-SDU)。

在扩展CAN帧的情况下,接收到的CAN帧ID通过或上0x80000000,以将接收到的CAN帧标记为扩展。首先接收到的CAN数据字节是数组元素0,最后接收到的CAN数据字节是7,在CAN FD的情况下最后接收到的CAN数据字节是数组元素是63。Can模块同样应指示接收到的消息是常规CAN帧还是CAN FD帧,通过CANID或上0x40000000表示。CANID的这种表示方式对发送也同样适用。

为了防止接收到的消息丢失,一些控制器支持从一组硬件对象来构建接收FIFO,而在其他控制器上,可以配置具有相同属性的另一个硬件对象,该对象作为影子缓冲区工作,并在主对象忙碌时介入。CAN驱动程序应支持实现控制器硬件接收FIFO,FIFO的大小通过CanHwObjectCount配置。不支持硬件FIFO的控制器通常提供实现影子缓冲区机制的能力,当主硬件对象繁忙时,额外的硬件对象接管。硬件对象的数量通过CanHwObjectCount进行配置。下图展示了三个硬件对象来构建一个HRH的例子。

CAN模块在接收后,如果RX缓冲区不能被CAN硬件保护(锁定)以防止被新接收的消息覆盖,则应在阴影缓冲区中复制L-SDU。 如果CAN硬件无法被全局访问,Can模块应复制L-SDU的影子缓冲区供全局访问,完整的接收处理(包括复制到目标模块,例如COM)是在接收中断或CanMainFunction_Read上下文中完成的。CAN模块应保证ISR和函数CanMainFunction_Read不会被其自身中断。CAN硬件(或影子)缓冲区始终保持一致,因为它在一个从未被其自身中断的函数中按顺序写入和读取。如果CAN硬件无法在接收后配置锁定RX硬件对象(硬件功能),则可能发生硬件缓冲区被新到达的消息覆盖的情况。在这种情况下,如果硬件支持,CAN控制器会检测到“overwrite”事件。如果CAN硬件在接收后可以配置为锁定RX硬件对象,则可能发生新到达的消息无法存储到硬件缓冲区的情况。在这种情况下,如果硬件支持,CAN控制器会检测到“overrun”事件。Can模块应该检测到“overwrite”或者“overrun”事件之后上报运行时错误CAN_E_DATALOST。系统设计人员应确保消息接收(中断或轮询处理)的运行时间应尽可能的快。


唤醒概念

Can模块处理可由Can控制器本身检测而非Can收发器的唤醒。这有两种可能的情况:通过中断唤醒和通过轮询唤醒。对于中断唤醒,当硬件检测到唤醒时,会调用Can模块的ISR。如果唤醒事件的ISR被调用,它应调用EcuM_CheckWakeup,传递给EcuM_CheckWakeup的参数应是CanWakeupSourceRef配置参数引用的唤醒源ID。当通过轮询检测到唤醒事件时,ECU状态管理器将像以前一样通过CAN接口周期性调用Can_CheckWakeup。在这两种情况下,Can_CheckWakeup将检查CAN控制器是否检测到唤醒事件,并返回结果。然后,CAN驱动程序将通过EcuM_SetWakeupEvent将唤醒事件通知ECU状态管理器。唤醒验证的目的是以防止错误的唤醒事件,它将由ECU状态管理器和CanIf模块完成,不需要Can模块的任何帮助。


通知概念     

Can模块仅向Canlf模块提供一个事件触发通知接口。每个通知都由一个回调函数来表示。硬件事件可以通过中断或轮询硬件对象的标志来检验。关于轮询的配置可能性取决于硬件(即哪些事件可以轮询,哪些事件需要轮询),不受本标准的限制。应该可以配置驱动程序,使其完全不使用中断(完全轮询)。CAN模块配置什么会被轮询,什么不会被轮询是驱动器的内部信息,在块外部是不可见的。轮询是在CAN主函数(Can MainFunction xxx)内部完成的。轮询事件也由适当的回调函数通知。因此,轮询的通知调用上下文不是ISR,而是CAN主函数,但是所有回调函数的实现应像调用上下文是ISR一样完成。有关进一步的详细信息,请参阅CAN主要功能API的描述,包括Can_MainFunction_Read,Can_Mainfunction_Write,Can_Mainfunction_BusOff和Can_Mainfunction_Wakeup。


重入问题  

函数必须满足下列条件才能具有重入性:

  • 它以原子的方式使用所有共享变量,除非每个变量被分配到函数的特定实例。
  • 它不调用非重入函数。
  • 它不以非原子的方式使用硬件。

传输请求只需由Canlf模块中的Canlf_Transmit函数转发。Canlf_Transmit函数是可重入的。因此Can_Write函数需要以线程安全的方式实现(例如使用互斥)。当无法再次执行写入时,将返回前一步调用,并返回CAN_BUSY。在CAN_BUSY的情况下,Canlf模块会排队等待请求。(行为与所有硬件对象都忙碌相同)。Can_EnableCanInterrupts和Can_DisableCanInterrupt可以在重入函数内调用,因此这些函数也需要重入。CAN主功能(即Can_MainFunction_Read)不得被自身中断,因此这些CAN主功能是不可重入的。


虚拟网络

在汽车领域,优化能源效率变得越来越重要,因为能源消耗直接影响燃油消耗、二氧化碳排放量和混合动力或全电动汽车的续航里程。虚拟网络的概念在ECU级别上具有很高的节能潜力。

Intelligent Communication Controllers(智能通信控制器,ICOM)的实施支持这些功能(没有强制性的特定硬件实现)。基于车辆状态,如果ECU的某些或全部功能暂时不需要,ECU可以进入“虚拟联网”模式。在此模式下,MCU和/或外围设备被切换到低功耗模式。只有ICOM和连接的收发器保持活动状态。当ICOM判断ECU需要恢复操作时,会生成唤醒事件,例如由总线上接收到消息引起。根据ICOM的实现方式,接收到消息的报文ID和有效载荷可能在硬件中完全进行评估和过滤,或者在软件中需要回调机制。如下图所示,ECU的实现可以分为三种可能的变体:第一种软件方法a,没有特定的硬件来利用实现虚拟网络。方法b描述了基于通信控制器的功能硬件扩展实现,方法c显示了具有第二个扩展通信控制器的硬件变体实现,用于唤醒处理。

根据硬件实现,ICOM也能够发送消息(状态消息)。此外,虚拟网络旨在减少唤醒响应时间,即唤醒事件和ECU有效行为之间的时间。通过在激活期间使用ICOM保存相关消息,应用程序在恢复操作后可以直接访问最后有效的信号值。因此,ECU可以在唤醒后立即响应用户请求,而不必等待再次收到相应消息。

CAN驱动应该在初始化CAN控制器之后退出虚拟网络,虚拟网络应该通过调用Can_SetIcomConfiguration()实现,CAN驱动负责正确配置CAN控制器。切换完成调用CanIf_CurrentIcomConfiguration(),回调函数中包含对应控制器ID和切换状态,如果切换成功,则为ICOM_SWITCH_E_OK,失败则为ICOM_SWITCH_E_FAILED。在虚拟网络模式下,只有接收的报文符合CanIcomConfig的唤醒条件才会调用CanIf_RxIndication();发送报文则直接拒绝,返回CAN_BUSY。CAN控制器在通过SetControllerMode(CAN_CS_STARTED)启动前,应退出虚拟网络。

如果Can_SetIcomConfiguration()中传入的configuration ID等于0,则退出虚拟网络。退出之后,CAN驱动应该正常处理报文。CAN控制器在通过SetControllerMode(CAN_CS_STOPPED)配置控制器状态为STOPPED时,应退出虚拟网络。如果ICOM在软件中实现,控制器不得在虚拟网络发送消息。CAN驱动应该转发在虚拟网络中接收到的报文到CanIf。CanIcomVariant参数定义是否有额外的硬件支持ICOM自动发送报文。


CAN FD支持

出于性能原因,一些CAN控制器允许使用称为CAN FD的灵活数据速率功能。通过在仲裁阶段的特定帧位域指示,在有效载荷和CRC期间可以切换到更高的波特率。第二个波特率必须通过扩展的CanControllerBaudrateConfig子容器CanControllerFdBaudrateConfig进行配置。驱动判断如果存在CanControllerFdBaudrateConfig配置,则将为该控制器启用CAN FD功能。需要使用指定的第二波特率完成具有位率切换(BRS)的CAN FD帧的接收。是否使用第二波特率进行传输取决于配置参数CanControllerTxBitRateSwitch。
然而,在某些情况下,可能需要在网络中传输支持CAN-FD消息的常规CAN 2.0消息,例如为了完成CAN选择性唤醒。在这些情况下,有必要支持将交错的常规CAN消息与CAN FD消息一起传输。这可以通过在帧级别上使用在CanWrite()传递的Canld来或上0x40000000来表示使用CAN FD帧。

CAN FD还支持扩展载荷,最多允许传输64字节。因此,如果CAN控制器处于CAN FD模式(有效的CanControllerFdBaudrateConfig)且在Can Write()中传递的Canld设置了CANFD标志,则CAN驱动支持传输长度可达64字节的PDU。如果请求传输CAN FD帧但是CAN控制器未处于CAN FD模式(没有配置CanControllerFdBaudrateConfig),但是只要PDU长度小于或等于8字节,则该帧将以常规CAN帧的形式发送。


ISOLAR-AB配置

CAN

该模块在生成BSW Code,BSWMDs, and SWCDs后并不生成静态/动态代码,它只向ISOLAR-AB内部提供必要的底层驱动配置项(其他模块需要引用),并如前文所示提供给EB tresos工具对应底层驱动配置项的arxml用作配置导入,省去重复的人工配置(诸如MailBox等),并能保证底层驱动与ISOLAR-B的配置统一。

CAN模块的配置由Automatically Configure BSW from System Description自动生成。


CanGeneral

本容器主要包含CAN模块的一些通用配置,如下图所示:

下面介绍一些该容器常见配置:

  • CanDevErrorDetection:切换默认错误跟踪器(Det)检测和通知的开启或关闭。
  • Canlndex:指定此模块实例的Instanceld。如果只有一个实例存在,则其ID为0。 
  • CanMainFunctionModePeriod:此参数描述循环调用Can_MainFunction_Mode的周期。单位为秒。
  • CanMultiplexedTransmission:指定是否支持多路传输。打开或关闭。
  • CanPubliclcomsupport:在Can驱动程序中选择对虚拟网络功能的支持。
  • CanTimeoutDuration:指定阻塞函数的最大时间,直到报超时错误。单位为秒(这个参数默认生成1秒,且生成的调度周期小于1秒是相互矛盾的,它会导致OS重复调度同一Task从而关闭OS,用户应根据实际的情况正确配置MCAL里的这个参数)。
  • CanSupportTTCANRef:该参数指CAN接口模块配置中的CanlfSupportTTCAN参数。

CanController

本子容器包含CAN模块包含的控制器配置。

下面我们介绍一下常见的配置:

  • CanBusoffProcessing:启用/禁用Can_MainFunction_BusOff()来处理在轮询模式下的BusOff事件。
  • CanControllerActivation:定义配置中是否使用CAN控制器。
  • CanControllerBaseAddress:CAN控制器的基地址。
  • CanRxProcessing:启用/禁用Can_MainFunction_Read(),进行轮询模式下处理
    PDU接收事件。
  • CanTxProcessing:启用/禁用Can_MainFunction_Write()来处理在轮询模式下的PDU传
    输事件。
  • CanWakeupFunctionalityAPl:从代码中添加/删除Can_CheckWakeup()函数。
  • CanWakeupProcessing:启用/禁用Can_MainFunction_Wakeup(),用于在轮询模式下处理唤醒事件。
  • CanWakeupsupport:CAN驱动程序是否支持通过CAN总线进行唤醒。
  • CanControllerDefaultBaudrate:参考为Can控制器配置的波特率配置容器。

这个容器还有一个子容器,名为CanControllerBaudrateConfig,是控制器的波特率配置,如下图所示。

可以看出,默认的是500波特率的配置,下图是在CAN控制器频率为40Mhz的一个500k波特率的配置,其采样点计算为((1+62+1)/(1+62+1+15+1))=80%。

因为我们工程没有使用CAN FD,所以没有CanControllerFdBaudrateConfig子容器相关配置。


CanHwObjectCount 

该容器存储根据DBC生成的MailBox配置信息。

可以根据上图看到,一共生成了6个MailBox,3收3发,我们针对常见的配置项加以说明。

  • CanHandleType:说明这个MailBox是Full-Can的还是Basic-Can的。默认为Full-Can。
  • CanHwObjectCount:用于实现一个HOH的硬件对象数量。在HRH的情况下,该参数定义硬件FIFO中的元素数量或影子缓冲区的数量;在HTH的情况下,它定义用于多路传输或用于FuIICAN HTH的硬件FIFO的硬件对象数量。
  • CanldType:Can帧ID的类型,是标准帧还是扩展帧。
  • CanObjectld:此参数的值是唯一的,应该以0开头,并无间隙地继续,来表示MailBox。
  • CanObjectType:指定硬件对象是用作发送对象还是接收对象。
  • CanControllerRef:当前MailBox所对应的控制器。

当这个硬件对象是接收类型的时候,这个容器里还有个子容器,CanHwFilter,会根据默认的Full-Can类型,生成对应的过滤Mask和匹配ID。

例如上图,它是标准真,Mask是0x7FF,则需要帧ID的所有位匹配0x5DE才会接收这个报文到这个MailBox中。


代码解析

这部分代码体现在使用tresos Studio工具(MCAL)生成的动态配置和底层驱动代码。


动态配置代码

下图为Can驱动MCAL配置生成的动态代码。

我们针对一些常用的文件内容说明:

  • Can_17_McmCan_PBcfg.c:包含了Can控制器的配置信息,包括类型为Can_17_McmCan_ControllerConfigType的控制器配置,类型为Can_17_McmCan_ControllerMsgRAMConfigType的控制器RAM相关配置,类型为Can_17_McmCan_ControllerBaudrateConfigType的控制器波特率配置,以及类型为Can_17_McmCan_EventHandlingType的CAN事件处理类型,类型为Can_17_McmCan_SIDFilterConfigType和Can_17_McmCan_XIDFilterConfigType的标准与扩展过滤配置,类型为Can_17_McmCan_TxHwObjectConfigType的发送硬件对象配置等一系列配置,这里就不赘述了。
  • Can_17_McmCan_Cfg.h:CAN驱动模块的一些通用配置,与MailBox的ID(集成可能会用到)。
    /*******************************************************************************
    **                                                                            **
    ** Copyright (C) Infineon Technologies (2018)                                 **
    **                                                                            **
    ** All rights reserved.                                                       **
    **                                                                            **
    ** This document contains proprietary information belonging to Infineon       **
    ** Technologies. Passing on and copying of this document, and communication   **
    ** of its contents is not permitted without prior written authorization.      **
    **                                                                            **
    ********************************************************************************
    **                                                                            **
    **  FILENAME  : Can_17_McmCan_Cfg.h                                           **
    **                                                                            **
    **  VERSION   : 1.40.0_8.0.0                                                  **
    **                                                                            **
    **  DATE, TIME: 2024-12-23, 13:54:59          !!!IGNORE-LINE!!!               **
    **                                                                            **
    **  GENERATOR : Build b170330-0431            !!!IGNORE-LINE!!!               **
    **                                                                            **
    **  BSW MODULE DECRIPTION : Can_17_McmCan.bmd                                 **
    **                                                                            **
    **  VARIANT   : Variant PB                                                    **
    **                                                                            **
    **  PLATFORM  : Infineon AURIX2G                                              **
    **                                                                            **
    **  AUTHOR    : DL-AUTOSAR-Engineering                                        **
    **                                                                            **
    **  VENDOR    : Infineon Technologies                                         **
    **                                                                            **
    **  DESCRIPTION  : Can configuration generated out of ECUC file               **
    **                                                                            **
    **  SPECIFICATION(S) : Specification of Can Driver, AUTOSAR Release 4.2.2     **
    **                                                                            **
    **  MAY BE CHANGED BY USER : no                                               **
    **                                                                            **
    *******************************************************************************/#ifndef CAN_17_MCMCAN_CFG_H
    #define CAN_17_MCMCAN_CFG_H/*******************************************************************************
    **                      Includes                                              **
    *******************************************************************************/
    /*******************************************************************************
    **                      Common Published Information                          **
    *******************************************************************************/
    /* [cover parentID={7BE20AAE-30B8-46f5-ABBC-F2E65FBCEEE8}]
    [/cover] */
    #define CAN_17_MCMCAN_AR_RELEASE_MAJOR_VERSION          (4U)
    /* [cover parentID={B0D7A378-F23B-4f83-86A7-50682CB089E5}]
    [/cover] */
    #define CAN_17_MCMCAN_AR_RELEASE_MINOR_VERSION          (2U)
    /* [cover parentID={F34E3ADE-341D-4e08-9A3B-B454B00382E4}]
    [/cover] */
    #define CAN_17_MCMCAN_AR_RELEASE_REVISION_VERSION       (2U)/* [cover parentID={98E1F5ED-AA8E-49af-8DBB-E84CD1B0960B}]
    [/cover] */
    #define CAN_17_MCMCAN_SW_MAJOR_VERSION                  (10U)
    /* [cover parentID={EAB7012E-044A-4fb7-84E1-245B81493A73}]
    [/cover] */
    #define CAN_17_MCMCAN_SW_MINOR_VERSION                  (40U)
    /* [cover parentID={4763C7E9-3BE5-4b3b-96DA-1E92B11A9191}]
    [/cover] */
    #define CAN_17_MCMCAN_SW_PATCH_VERSION                  (2U)
    /*******************************************************************************
    **          Global Macro Definitions                                          **
    *******************************************************************************//* L-PDU receive callout support enabled or not */
    #define CAN_17_MCMCAN_LPDU_RX_CALLOUT                    (STD_OFF)/* Master core is allocated with CAN controllers */
    #define CAN_17_MCMCAN_MASTER_CORE_ALLOCATION                       (STD_ON)/* Multicore Enabled or not */
    #define CAN_17_MCMCAN_MULTICORE_ERROR_DETECT                       (STD_ON)/* Maximum number of CAN Controllers configured in a ConfigSet */
    #define CAN_17_MCMCAN_NOOF_CONTROLLER                       (uint8)(5U)/* Maximum number of CAN Controllers configured in a ConfigSet for CORE0 */
    #define CAN_17_MCMCAN_CORE0_NOOF_CONTROLLER      (uint8)(5U)/* The number of hardware objects (includes Tx and Rx) configured in a
    ConfigSet */
    #define CAN_17_MCMCAN_NOOF_HARDWARE_OBJECTS          (Can_HwHandleType) (15U)/* [cover parentID={22BF2529-8DA1-4094-9A12-F0EEFE184EF5}]
    [/cover] */
    /* Trigger transmit Enabled or not */
    #define CAN_17_MCMCAN_TRIG_TRANSMIT                                 (STD_OFF)/* Maximum number of main function RW periods configured in a ConfigSet */
    #define CAN_17_MCMCAN_NOOF_RX_TX_PERIODS_CONFIG              (1U)/* Multiple cycle period for Recieve is configured in a ConfigSet */
    #define CAN_17_MCMCAN_RX_MULTI_PERIODS_SUPPORT               (STD_OFF)/* Multiple cycle period for Transmit is configured in a ConfigSet */
    #define CAN_17_MCMCAN_TX_MULTI_PERIODS_SUPPORT               (STD_OFF)/* Initialization and De-Initilaization user mode configuration */
    #define CAN_17_MCMCAN_INIT_DEINIT_API_MODE   (CAN_17_MCMCAN_MCAL_SUPERVISOR)/*******************************************************************************
    **                      CAN General Information                               **
    *******************************************************************************/
    /* Configuration: CAN_17_MCMCAN_INSTANCE_ID
    - Specifies the InstanceId of this module instance
    */
    #define CAN_17_MCMCAN_INSTANCE_ID                     (0U)/* Configuration: CAN_17_MCMCAN_DEV_ERROR_DETECT
    - STD_ON  - DET is enabled
    - STD_OFF - DET is disabled
    */
    #define CAN_17_MCMCAN_DEV_ERROR_DETECT                            (STD_ON)/* Configuration: CAN_17_MCMCAN_VERSION_INFO_API
    - STD_ON  - Can_17_McmCan_GetVersionInfo API is enabled
    - STD_OFF - Can_17_McmCan_GetVersionInfo API is disabled
    */
    #define CAN_17_MCMCAN_VERSION_INFO_API                            (STD_ON)/* Configuration: CAN_17_MCMCAN_MULTIPLEXED_TRANSMISSION
    - STD_ON  - Multiplexed transmission feature is enabled
    - STD_OFF - Multiplexed transmission feature is disabled
    */
    #define CAN_17_MCMCAN_MULTIPLEXED_TRANSMISSION                    (STD_OFF)/* Configuration: CAN_17_MCMCAN_TIMEOUT_DURATION
    - Specifies the maximum amount of time for a blocking function until
    a time-out is raised in short term wait loops
    */
    #define CAN_17_MCMCAN_TIMEOUT_DURATION                            (2999U)/* Configuration: CAN_17_MCMCAN_SET_BAUDRATE_API
    - STD_ON  - Can_17_McmCan_SetBaudrate API is enabled
    - STD_OFF - Can_17_McmCan_SetBaudrate API is Disabled
    */
    #define CAN_17_MCMCAN_SET_BAUDRATE_API                            (STD_ON)/* Configuration: CanControllerFdBaudrateConfig
    - STD_ON  - FD Operation is Enabled
    - STD_OFF - FD Operation is Disabled
    */
    #define CAN_17_MCMCAN_FD_ENABLE                                   (STD_ON)
    /* Configuration: CAN_17_MCMCAN_DEINIT_API
    - STD_ON  - CAN De-initialization API is enabled
    - STD_OFF - CAN De-initialization API is not enabled
    */
    #define CAN_17_MCMCAN_DEINIT_API                                  (STD_ON)/* Configuration: CAN_17_MCMCAN_PUBLIC_ICOM_SUPPORT
    - STD_ON  - CAN Pretended networking is enabled
    - STD_OFF - CAN Pretended networking is not enabled
    */
    #define CAN_17_MCMCAN_PUBLIC_ICOM_SUPPORT                         (STD_OFF)/******************************************************************************/
    /* CAN Controller Configurations */
    /******************************************************************************/
    /* CAN Activation on CORE0
    - STD_ON  - A CAN Kernel is activated on Core 0
    - STD_OFF - No CAN Kernel is activated on Core 0
    */
    #define CAN_17_MCMCAN_CORE0_ACTIVATION                     (STD_ON)
    /* CAN Activation on CORE1
    - STD_ON  - A CAN Kernel is activated on Core 1
    - STD_OFF - No CAN Kernel is activated on Core 1
    */
    #define CAN_17_MCMCAN_CORE1_ACTIVATION                     (STD_OFF)
    /* CAN Activation on CORE2
    - STD_ON  - A CAN Kernel is activated on Core 2
    - STD_OFF - No CAN Kernel is activated on Core 2
    */
    #define CAN_17_MCMCAN_CORE2_ACTIVATION                     (STD_OFF)
    /* CAN Activation on CORE3
    - STD_ON  - A CAN Kernel is activated on Core 3
    - STD_OFF - No CAN Kernel is activated on Core 3
    */
    #define CAN_17_MCMCAN_CORE3_ACTIVATION                     (STD_OFF)
    /* CAN Activation on CORE4
    - STD_ON  - A CAN Kernel is activated on Core 4
    - STD_OFF - No CAN Kernel is activated on Core 4
    */
    #define CAN_17_MCMCAN_CORE4_ACTIVATION                     (STD_OFF)
    /* CAN Activation on CORE5
    - STD_ON  - A CAN Kernel is activated on Core 5
    - STD_OFF - No CAN Kernel is activated on Core 5
    */
    #define CAN_17_MCMCAN_CORE5_ACTIVATION                     (STD_OFF)/*BusOff Processing Event used as Interrupt
    - STD_ON - BusOff event is notified through Interrupt mechanism by the
    configured controller
    - STD_OFF - BusOff event is notified through Interrupt mechanism by the
    configured controller
    */
    #define CAN_17_MCMCAN_BO_INTERRUPT_PROCESSING                     (STD_ON)/* Transmission Processing Event used as Interrupt
    - STD_ON - Transmission event is notified through Interrupt mechanism by the
    configured controller
    - STD_OFF - Transmission event is notified through Interrupt mechanism by the
    configured controller
    */
    #define CAN_17_MCMCAN_TX_INTERRUPT_PROCESSING                     (STD_ON)/* Reception Processing Event used as Interrupt
    - STD_ON - Reception event is notified through Interrupt mechanism by the
    configured controller
    - STD_OFF - Reception event is notified through Interrupt mechanism by the
    configured controller
    */
    #define CAN_17_MCMCAN_RX_INTERRUPT_PROCESSING                     (STD_ON)/*BusOff Processing Event used as POLLING
    - STD_ON - BusOff event is notified through Polling mechanism by the
    configured controller
    - STD_OFF - BusOff event is notified through Polling mechanism by the
    configured controller
    */
    #define CAN_17_MCMCAN_BO_POLLING_PROCESSING                       (STD_OFF)/* Transmission Processing Event used as POLLING
    - STD_ON - Transmission event is notified through Polling mechanism by the
    configured controller
    - STD_OFF - Transmission event is notified through Polling mechanism by the
    configured controller
    */
    #define CAN_17_MCMCAN_TX_POLLING_PROCESSING                       (STD_OFF)/* Reception Processing Event used as POLLING
    - STD_ON - Reception event is notified through Polling mechanism by the
    configured controller
    - STD_OFF - Reception event is notified through Polling mechanism by the
    configured controller
    */
    #define CAN_17_MCMCAN_RX_POLLING_PROCESSING                       (STD_OFF)/* WakeUp Processing Event used as POLLING
    - STD_ON - WakeUp event is notified through Polling mechanism by the
    configured controller
    - STD_OFF - WakeUp event is notified through Polling mechanism by the
    configured controller
    */
    #define CAN_17_MCMCAN_WU_POLLING_PROCESSING                       (STD_OFF)/* Controller Handle Id *//* MISRA2012_RULE_5_1_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_2_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_4_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_5_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    #define Can_17_McmCanConf_CanController_Can_Network_CANNODE_0             0/* MISRA2012_RULE_5_1_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_2_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_4_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_5_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    #define Can_17_McmCanConf_CanController_Can_Network_CANNODE_1             1/* MISRA2012_RULE_5_1_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_2_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_4_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_5_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    #define Can_17_McmCanConf_CanController_Can_Network_CANNODE_2             2/* MISRA2012_RULE_5_1_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_2_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_4_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_5_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    #define Can_17_McmCanConf_CanController_Can_Network_CANNODE_3             3/* MISRA2012_RULE_5_1_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_2_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_4_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_5_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    #define Can_17_McmCanConf_CanController_Can_Network_CANNODE_4             4/* Hardware object Handle Id *//* MISRA2012_RULE_5_1_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_2_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_4_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_5_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    #define Can_17_McmCanConf_CanHardwareObject_Can_Network_CANNODE_0_Rx_Std_MailBox_1         0/* MISRA2012_RULE_5_1_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_2_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_4_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_5_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    #define Can_17_McmCanConf_CanHardwareObject_Can_Network_CANNODE_0_Rx_Std_MailBox_2         1/* MISRA2012_RULE_5_1_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_2_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_4_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_5_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    #define Can_17_McmCanConf_CanHardwareObject_Can_Network_CANNODE_0_Rx_Std_MailBox_3         2/* MISRA2012_RULE_5_1_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_2_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_4_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_5_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    #define Can_17_McmCanConf_CanHardwareObject_Can_Network_CANNODE_0_Rx_Std_MailBox_4         3/* MISRA2012_RULE_5_1_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_2_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_4_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_5_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    #define Can_17_McmCanConf_CanHardwareObject_Can_Network_CANNODE_0_Rx_Std_MailBox_5         4/* MISRA2012_RULE_5_1_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_2_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_4_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_5_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    #define Can_17_McmCanConf_CanHardwareObject_Can_Network_CANNODE_0_Rx_Std_MailBox_6         5/* MISRA2012_RULE_5_1_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_2_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_4_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_5_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    #define Can_17_McmCanConf_CanHardwareObject_Can_Network_CANNODE_0_Rx_Std_MailBox_7         6/* MISRA2012_RULE_5_1_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_2_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_4_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_5_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    #define Can_17_McmCanConf_CanHardwareObject_Can_Network_CANNODE_0_Rx_Std_MailBox_8         7/* MISRA2012_RULE_5_1_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_2_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_4_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_5_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    #define Can_17_McmCanConf_CanHardwareObject_Can_Network_CANNODE_0_Rx_Std_MailBox_9         8/* MISRA2012_RULE_5_1_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_2_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_4_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_5_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    #define Can_17_McmCanConf_CanHardwareObject_Can_Network_CANNODE_0_Rx_Std_MailBox_A         9/* MISRA2012_RULE_5_1_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_2_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_4_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_5_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    #define Can_17_McmCanConf_CanHardwareObject_Can_Network_CANNODE_0_Tx_Std_MailBox_1         10/* MISRA2012_RULE_5_1_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_2_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_4_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_5_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    #define Can_17_McmCanConf_CanHardwareObject_Can_Network_CANNODE_0_Tx_Std_MailBox_2         11/* MISRA2012_RULE_5_1_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_2_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_4_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_5_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    #define Can_17_McmCanConf_CanHardwareObject_Can_Network_CANNODE_0_Tx_Std_MailBox_3         12/* MISRA2012_RULE_5_1_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_2_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_4_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_5_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    #define Can_17_McmCanConf_CanHardwareObject_Can_Network_CANNODE_0_Tx_Std_MailBox_4         13/* MISRA2012_RULE_5_1_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_2_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_4_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    /* MISRA2012_RULE_5_5_JUSTIFICATION: External identifiers going beyond 32 chars.
    in generated code due to Autosar Naming constraints.*/
    #define Can_17_McmCanConf_CanHardwareObject_Can_Network_CANNODE_0_Tx_Std_MailBox_5         14/*******************************************************************************
    **                      Global Type Definitions                               **
    *******************************************************************************//*******************************************************************************
    **                      Global Constant Declarations                          **
    *******************************************************************************//*******************************************************************************
    **                      Global Variable Declarations                          **
    *******************************************************************************//*******************************************************************************
    **                      Global Function Declarations                          **
    *******************************************************************************//*******************************************************************************
    **                      Global Inline Function Definitions                    **
    *******************************************************************************/#endif  /* CAN_17_MCMCAN_CFG_H */
  • Can_17_McmCan_PBcfg.h:包含CAN模块全局静态变量的声明。
    /*******************************************************************************
    **                                                                            **
    ** Copyright (C) Infineon Technologies (2018)                                 **
    **                                                                            **
    ** All rights reserved.                                                       **
    **                                                                            **
    ** This document contains proprietary information belonging to Infineon       **
    ** Technologies. Passing on and copying of this document, and communication   **
    ** of its contents is not permitted without prior written authorization.      **
    **                                                                            **
    ********************************************************************************
    **                                                                            **
    **  FILENAME  : Can_17_McmCan_PBcfg.h                                         **
    **                                                                            **
    **  VERSION   : 5.0.0                                                         **
    **                                                                            **
    **  DATE, TIME: 2024-11-30, 15:54:16          !!!IGNORE-LINE!!!               **
    **                                                                            **
    **  GENERATOR : Build b170330-0431            !!!IGNORE-LINE!!!               **
    **                                                                            **
    **  BSW MODULE DECRIPTION : Can_17_McmCan.bmd                                 **
    **                                                                            **
    **  VARIANT   : Variant PB                                                    **
    **                                                                            **
    **  PLATFORM  : Infineon AURIX2G                                              **
    **                                                                            **
    **  AUTHOR    : DL-AUTOSAR-Engineering                                        **
    **                                                                            **
    **  VENDOR    : Infineon Technologies                                         **
    **                                                                            **
    **  DESCRIPTION  : Can configuration generated out of ECUC file               **
    **                                                                            **
    **  SPECIFICATION(S) : Specification of CAN Driver, AUTOSAR Release 4.2.2     **
    **                                                                            **
    **  MAY BE CHANGED BY USER : no                                               **
    **                                                                            **
    *******************************************************************************/
    #ifndef CAN_17_MCMCAN_PBCFG_H
    #define CAN_17_MCMCAN_PBCFG_H
    /*******************************************************************************
    **                      Includes                                              **
    *******************************************************************************//*******************************************************************************
    **                      Global Const Declaration                              **
    *******************************************************************************/
    #define CAN_17_MCMCAN_START_SEC_CONFIG_DATA_QM_GLOBAL_UNSPECIFIED
    /*[cover parentID={566ED99C-0D96-46ac-97BF-E97B04E2C700}]
    [/cover] */
    /*[cover parentID={4579FE20-92DA-4848-93DB-7AD4FD35DD50}]
    [/cover] */
    /*[cover parentID={5713A17A-3FA1-427f-A0B6-89125A17689A}]
    [/cover] */
    /*[cover parentID={E4047F9A-8865-4b2c-9D3C-385479854EAD}]
    [/cover] */
    /*[cover parentID={EA0715EE-3E3C-4aac-A42E-4B5CFC96CEED}]
    [/cover] */
    /*[cover parentID={A4F3B858-B167-4b5c-AB7F-390C5F5D2185}]
    [/cover] */
    /*MISRA2012_RULE_4_10_JUSTIFICATION: Memmap header usage as per Autosar
    guideline.*/
    #include "Can_17_McmCan_MemMap.h"
    /* Extern declaration of Can Config Root */
    extern const Can_17_McmCan_ConfigType Can_17_McmCan_Config;
    #define CAN_17_MCMCAN_STOP_SEC_CONFIG_DATA_QM_GLOBAL_UNSPECIFIED
    /*[cover parentID={566ED99C-0D96-46ac-97BF-E97B04E2C700}]
    [/cover] */
    /*[cover parentID={4579FE20-92DA-4848-93DB-7AD4FD35DD50}]
    [/cover] */
    /*[cover parentID={5713A17A-3FA1-427f-A0B6-89125A17689A}]
    [/cover] */
    /*[cover parentID={E4047F9A-8865-4b2c-9D3C-385479854EAD}]
    [/cover] */
    /*[cover parentID={EA0715EE-3E3C-4aac-A42E-4B5CFC96CEED}]
    [/cover] */
    /*[cover parentID={A4F3B858-B167-4b5c-AB7F-390C5F5D2185}]
    [/cover] */
    /*MISRA2012_RULE_4_10_JUSTIFICATION: Memmap header usage as per Autosar
    guideline.*/
    /* MISRA2012_RULE_20_1_JUSTIFICATION: Memmap header usage as per Autosar
    guideline. */
    #include "Can_17_McmCan_MemMap.h"
    #endif  /* CAN_17_MCMCAN_PBCFG_H */

集成代码 

Can模块的集成代码包含以下几个文件。

  • Can_17_McmCan_MemMap.h:Can模块的MemMap文件,定义了相关的宏定义,指定代码与变量到链接文件指定位置。
  • SchM_Can_17_McmCan.c:Can模块的SchM文件,用作开关中断,防止调度引起的重入问题。
  • CanIf.c/CanIf.h:CAN模块需要CanIf模块提供的函数与宏定义,在跟ISOLAR生成的BSW代码集成时应删除。
  • CanIf_Types.h:CAN模块需要CanIf模块提供的类型定义,在跟ISOLAR生成的BSW代码集成时应删除。
  • CanIf_Cbk.c/CanIf_Cbk.h:CAN模块需要CanIf模块提供的回调函数,此为空模板,在跟ISOLAR生成的BSW代码集成时应删除。
    /******************************************************************************
    **                                                                           **
    ** Copyright (C) Infineon Technologies (2021)                                **
    **                                                                           **
    ** All rights reserved.                                                      **
    **                                                                           **
    ** This document contains proprietary information belonging to Infineon      **
    ** Technologies. Passing on and copying of this document, and communication  **
    ** of its contents is not permitted without prior written authorization.     **
    **                                                                           **
    *******************************************************************************
    **                                                                           **
    **  FILENAME   : CanIf_Cbk.c                                                 **
    **                                                                           **
    **  VERSION    : 5.0.0                                                       **
    **                                                                           **
    **  DATE       : 2021-11-12                                                  **
    **                                                                           **
    **  VARIANT    : NA                                                          **
    **                                                                           **
    **  PLATFORM   : Infineon AURIX2G                                            **
    **                                                                           **
    **  AUTHOR      : DL-AUTOSAR-Engineering                                     **
    **                                                                           **
    **  VENDOR      : Infineon Technologies                                      **
    **                                                                           **
    **  DESCRIPTION : Implementation of CAN Interface callback functions         **
    **                  This file is for Evaluation Purpose Only                 **
    **                                                                           **
    **  MAY BE CHANGED BY USER [yes/no]: Yes                                     **
    **                                                                           **
    ******************************************************************************/
    #include "Mcal_Version.h"
    #if (MCAL_AR_VERSION == MCAL_AR_422)
    #include "CanIf_Cbk.h"
    #else
    #include "CanIf_Can.h"
    #include "CanIf.h"
    #endif /*#if (MCAL_AR_VERSION == MCAL_AR_422)*/
    #ifdef APP_SW
    #if (APP_SW == DEMO_APP)
    #include "Test_Print.h"
    #endif
    #endif/* Macro to set MSB for Extended messages */
    #define CAN_EXTENDED_MSB_SET            (0x80000000U)#ifdef CAN_ID_CONFIG_TYPE
    #if (CAN_ID_CONFIG_TYPE == CAN_ID_STANDARD)
    #define CAN_FD_STANDARD               ((uint16)0x4000U)
    #else
    #define CAN_FD_STANDARD               ((uint32)0x40000000U)
    #endif
    #endif#define TEST_CANTRCV_MODULE_ID        (70U)  /* 0x46 */extern uint8 Test_RxConfirmCount;
    extern uint8 Test_TxConfirmCount;
    extern uint8 CanRxDataBuff[20][64];#ifdef  APP_SW
    #if ( (APP_SW == TEST_APP) && (BASE_TEST_MODULE_ID == TEST_CANTRCV_MODULE_ID))
    extern void CanIf_TestTrcvModeIndication(uint8 TransceiverId, CanTrcv_TrcvModeType TransceiverMode);
    extern void CanIf_TestConfirmPnAvailability(uint8 TransceiverId);
    extern void CanIf_TestClearTrcvWufFlagIndication(uint8 TransceiverId);
    extern void CanIf_TestCheckTrcvWakeFlagIndication(uint8 Transceiver);
    #endif
    #endif/*******************************************************************************CanIf_RxIndication                                      **
    *******************************************************************************/
    #define CAN_17_MCMCAN_START_SEC_CODE_QM_GLOBAL
    #include "Can_17_McmCan_MemMap.h"#if ((!defined(APP_SW)) || (APP_SW != TEST_APP))void CanIf_RxIndication(const Can_HwType *Mailbox, const PduInfoType *PduInfoPtr)
    {#if ((defined(APP_SW)) && (APP_SW == DEMO_APP))uint8 i;uint16 MsgdlcCnt;uint16 CanDlc;Can_HwHandleType Hrh;Can_IdType CanId;uint8 *CanSduPtr;Hrh = Mailbox->Hoh;CanId = Mailbox->CanId;CanSduPtr = PduInfoPtr->SduDataPtr;CanDlc = PduInfoPtr->SduLength;#if ((defined CAN_FD_ENABLE) && (CAN_FD_ENABLE  == STD_ON))if (CAN_FD_STANDARD == (CanId & CAN_FD_STANDARD)){print_f("\n CAN FD Message Received ");}else{print_f("\n Classical CAN Message Received ");}#endifMsgdlcCnt =  CanDlc;if(CanId & CAN_EXTENDED_MSB_SET){print_f("\n Received a Extended Id Message! ");print_f("\n Hrh = %d, ID = 0x%x, DLC = %d", Hrh, CanId & 0x1FFFFFFF, MsgdlcCnt);}else{print_f("\n Received a Standard Id Message! ");print_f("\n Hrh = %d, ID = 0x%x, DLC = %d", Hrh, CanId, MsgdlcCnt );}print_f(" Msg = ");for (i = 0; i < MsgdlcCnt ; i++){print_f("%x ", CanSduPtr[i]);CanRxDataBuff[Test_RxConfirmCount][i] = CanSduPtr[i];}Test_RxConfirmCount++ ;print_f("\n");#endif
    }/*******************************************************************************CanIf_TxConfirmation
    *******************************************************************************/
    void CanIf_TxConfirmation (PduIdType CanTxPduId)
    {#if ((defined(APP_SW)) && (APP_SW == DEMO_APP))print_f("\n Transmitted a message! CanTxPduId = %d", CanTxPduId);Test_TxConfirmCount++ ;#endif
    }/*******************************************************************************CanIf_ControllerBusOff
    *******************************************************************************/
    void CanIf_ControllerBusOff(uint8 ControllerId)
    {#if ((defined(APP_SW)) && (APP_SW == DEMO_APP))print_f("\n Callback function Can_ControllerBusOff is called!");print_f("ControllerId = %d", ControllerId);#endif
    }
    #if (MCAL_AR_VERSION == MCAL_AR_422)
    /*******************************************************************************CanIf_ControllerModeIndication
    *******************************************************************************/
    void CanIf_ControllerModeIndication( uint8 ControllerId,CanIf_ControllerModeType ControllerMode )
    {#if ((defined(APP_SW)) && (APP_SW == DEMO_APP))print_f("\n Callback function CanIf_ControllerModeIndication is called!\n");print_f(" ControllerId = %d \n", ControllerId);print_f(" ControllerMode = %d \n", ControllerMode);#endif
    }
    #else
    void CanIf_ControllerModeIndication( uint8 ControllerId,Can_ControllerStateType ControllerMode )
    {#if ((defined(APP_SW)) && (APP_SW == DEMO_APP))print_f("\n Callback function CanIf_ControllerModeIndication is called!\n");print_f(" ControllerId = %d \n", ControllerId);print_f(" ControllerMode = %d \n", ControllerMode);#endif}
    #endif
    /*******************************************************************************CAN L-PDU Rx Callout Function Definition
    *******************************************************************************/
    boolean Appl_LPduRxCalloutFunction(Can_HwHandleType Hrh,Can_IdType CanId,uint8 CanDlc,const uint8 *CanSduPtr)
    {#if ((defined(APP_SW)) && (APP_SW == DEMO_APP))print_f("\n Callback function Appl_LPduRxCalloutFunction is called!");#endifreturn(TRUE);
    }/*******************************************************************************CanIf_CurrentIcomConfiguration
    *******************************************************************************/
    void CanIf_CurrentIcomConfiguration(uint8 ControllerId,IcomConfigIdType ConfigurationId,IcomSwitch_ErrorType Error)
    {#if ((defined(APP_SW)) && (APP_SW == DEMO_APP))print_f("\n Callback function CanIf_CurrentIcomConfiguration is called!");print_f(" Error = %d \n", Error);#endif
    }/*******************************************************************************CanIf_TriggerTransmit
    *******************************************************************************/
    Std_ReturnType CanIf_TriggerTransmit(PduIdType TxPduId,PduInfoType* PduInfoPtr)
    {#if ((defined(APP_SW)) && (APP_SW == DEMO_APP))uint8  Data[8] = {0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79, 0x89};if ((TxPduId == 20) || (TxPduId == 21) || (TxPduId == 22) || (TxPduId == 23)){PduInfoPtr->SduDataPtr = &Data[0];PduInfoPtr->SduLength =  8;print_f("\n Callback function CanIf_TriggerTransmit is called!\n");print_f("\n Data and Dlc is updated!\n");}#endifreturn(E_OK);
    }#endif /* #if (APP_SW != TEST_APP) */void CanIf_CheckTrcvWakeFlagIndication(uint8 Transceiver)
    {
    #ifdef  APP_SW
    #if ( (APP_SW == TEST_APP) && (BASE_TEST_MODULE_ID == TEST_CANTRCV_MODULE_ID))CanIf_TestCheckTrcvWakeFlagIndication(Transceiver);
    #endif
    #endif
    }/*******************************************************************************
    ** Syntax : void CanIf_TrcvModeIndication                                     **
    **(uint8 Transceiver, CanTrcv_TrcvModeType TransceiverMode)                   **
    **                                                                            **
    ** Service ID: none                                                           **
    **                                                                            **
    ** Sync/Async:  none                                                          **
    **                                                                            **
    ** Reentrancy:  none                                                          **
    **                                                                            **
    ** Parameters (in): none                                                      **
    **                                                                            **
    ** Parameters (out):  none                                                    **
    **                                                                            **
    ** Return value:  none                                                        **
    **                                                                            **
    ** Description : CanIf_TestTrcvModeIndication function                        **
    **                   is called in cantrcv9251/9255 test code                  **
    **                                                                            **
    **                                                                            **
    *******************************************************************************/void CanIf_TrcvModeIndication(uint8 TransceiverId, CanTrcv_TrcvModeType TransceiverMode)
    {#ifdef  APP_SW
    #if ( (APP_SW == TEST_APP) && (BASE_TEST_MODULE_ID == TEST_CANTRCV_MODULE_ID))CanIf_TestTrcvModeIndication(TransceiverId,TransceiverMode);#endif
    #endif}void CanIf_ConfirmPnAvailability(uint8 TransceiverId )
    {
    #ifdef  APP_SW
    #if ( (APP_SW == TEST_APP) && (BASE_TEST_MODULE_ID == TEST_CANTRCV_MODULE_ID))CanIf_TestConfirmPnAvailability(TransceiverId);
    #endif
    #endif
    }void CanIf_ClearTrcvWufFlagIndication(uint8 TransceiverId)
    {
    #ifdef  APP_SW
    #if ( (APP_SW == TEST_APP) && (BASE_TEST_MODULE_ID == TEST_CANTRCV_MODULE_ID))CanIf_TestClearTrcvWufFlagIndication(TransceiverId);
    #endif
    #endif
    }#define CAN_17_MCMCAN_STOP_SEC_CODE_QM_GLOBAL
    #include "Can_17_McmCan_MemMap.h"

静态代码

主要介绍常见的静态代码涉及API说明,具体详细完整的介绍读者可以参考《AUTOSAR_SWS_CANDriver.pdf》以及《RTA-BSWReferenceGuide.pdf》和《MC-ISAR_TC3xx_UM_Can_17_McmCan.pdf》。

  • Can_Init/Can_DeInit:CAN驱动初始化/去初始化函数。
  • Can_SetControllerMode:此功能触发CAN控制器状态机的状态转换。
  • Can_EnableControllerInterrupts/Can_DisableControllerInterrupts:使能/失能CAN控制器中断。
  • Can_Write:使用对应Hth发送CAN报文。
  • Can_MainFunction_Write:当CAN_TX_PROCESSING设置为POLLING时,此函数执行TX确认的轮询。
  • Can_MainFunction_Read:当CAN_RX_PROCESSING设置为POLLING时,此函数执行RX指示的轮询。
  • Can_MainFunction_BusOff:此函数执行静态配置为“待轮询”的总线关闭事件的轮询。

上面的驱动实现的功能函数,驱动本身的命名可能不是这样的,需要我们集成工程师对名称做一下映射,如下。

#define Can_SetControllerMode(a,b) 				Can_17_McmCan_SetControllerMode(a,b)
#define Can_DisableControllerInterrupts(a) 		Can_17_McmCan_DisableControllerInterrupts(a)
#define Can_EnableControllerInterrupts(a) 		Can_17_McmCan_EnableControllerInterrupts(a)
#define Can_Write(a,b) 							Can_17_McmCan_Write(a,b)#define Can_MainFunction_Wakeup()  				Can_17_McmCan_MainFunction_Wakeup()
#define Can_MainFunction_Mode() 				Can_17_McmCan_MainFunction_Mode()
#define Can_CheckWakeup(a)  					Can_17_McmCan_CheckWakeup(a)
#define Can_IsrBusOffHandler(a)  				Can_17_McmCan_IsrBusOffHandler(a)
#define Can_IsrReceiveHandler(a)  				Can_17_McmCan_IsrReceiveHandler(a)
#define Can_IsrTransmitHandler(a) 				Can_17_McmCan_IsrTransmitHandler(a)#define Can_MainFunction_Write(void) 			Can_17_McmCan_MainFunction_Write(void)
#define Can_MainFunction_Read(void) 			Can_17_McmCan_MainFunction_Read(void)
#define Can_MainFunction_BusOff(void)			Can_17_McmCan_MainFunction_BusOff(void)#define CanConf_CanController_Can_Network_CANNODE_0   (Can_17_McmCanConf_CanController_Can_Network_CANNODE_0)
#define CanConf_CanController_Can_Network_CANNODE_1   (Can_17_McmCanConf_CanController_Can_Network_CANNODE_1)
#define CanConf_CanController_Can_Network_CANNODE_2   (Can_17_McmCanConf_CanController_Can_Network_CANNODE_2)
#define CanConf_CanController_Can_Network_CANNODE_3   (Can_17_McmCanConf_CanController_Can_Network_CANNODE_3)
#define CanConf_CanController_Can_Network_CANNODE_4   (Can_17_McmCanConf_CanController_Can_Network_CANNODE_4)
#define CanConf_CanController_Can_Network_CANNODE_5   (Can_17_McmCanConf_CanController_Can_Network_CANNODE_5)
#define CanConf_CanController_Can_Network_CANNODE_6   (Can_17_McmCanConf_CanController_Can_Network_CANNODE_6)
#define CanConf_CanController_Can_Network_CANNODE_7   (Can_17_McmCanConf_CanController_Can_Network_CANNODE_7)
#define CanConf_CanController_Can_Network_CANNODE_1_VCAN  (Can_17_McmCanConf_CanController_Can_Network_CANNODE_1_VCAN)
#define CanConf_CanController_Can_Network_CANNODE_2_MCAN  (Can_17_McmCanConf_CanController_Can_Network_CANNODE_2_MCAN)
#define CanConf_CanController_Can_Network_CANNODE_3_CCAN  (Can_17_McmCanConf_CanController_Can_Network_CANNODE_3_CCAN)
#define CanConf_CanController_Can_Network_CANNODE_5_BCAN  (Can_17_McmCanConf_CanController_Can_Network_CANNODE_5_BCAN)
#define CanConf_CanController_Can_Network_CANNODE_8_ECAN  (Can_17_McmCanConf_CanController_Can_Network_CANNODE_8_ECAN)#define Can_Network_CANNODE_0_Tx_Std_MailBox_1 Can_17_McmCanConf_CanHardwareObject_Can_Network_CANNODE_0_Tx_Std_MailBox_1
#define Can_Network_CANNODE_0_Tx_Std_MailBox_2 Can_17_McmCanConf_CanHardwareObject_Can_Network_CANNODE_0_Tx_Std_MailBox_2
#define Can_Network_CANNODE_0_Tx_Std_MailBox_3 Can_17_McmCanConf_CanHardwareObject_Can_Network_CANNODE_0_Tx_Std_MailBox_3
#define Can_Network_CANNODE_0_Tx_Std_MailBox_4 Can_17_McmCanConf_CanHardwareObject_Can_Network_CANNODE_0_Tx_Std_MailBox_4
#define Can_Network_CANNODE_0_Tx_Std_MailBox_5 Can_17_McmCanConf_CanHardwareObject_Can_Network_CANNODE_0_Tx_Std_MailBox_5
#define Can_Network_CANNODE_0_Tx_Std_MailBox_6 Can_17_McmCanConf_CanHardwareObject_Can_Network_CANNODE_0_Tx_Std_MailBox_6
#define Can_Network_CANNODE_0_Tx_Std_MailBox_7 Can_17_McmCanConf_CanHardwareObject_Can_Network_CANNODE_0_Tx_Std_MailBox_7
#define Can_Network_CANNODE_1_Tx_Std_MailBox_1 Can_17_McmCanConf_CanHardwareObject_Can_Network_CANNODE_1_Tx_Std_MailBox_1
#define Can_Network_CANNODE_1_Tx_Std_MailBox_2 Can_17_McmCanConf_CanHardwareObject_Can_Network_CANNODE_1_Tx_Std_MailBox_2
#define Can_Network_CANNODE_1_Tx_Std_MailBox_3 Can_17_McmCanConf_CanHardwareObject_Can_Network_CANNODE_1_Tx_Std_MailBox_3
#define Can_Network_CANNODE_1_Tx_Std_MailBox_4 Can_17_McmCanConf_CanHardwareObject_Can_Network_CANNODE_1_Tx_Std_MailBox_4

 十六宿舍 原创作品,转载必须标注原文链接。

©2023 Yang Li. All rights reserved.

欢迎关注 『十六宿舍』,大家喜欢的话,给个👍,更多关于嵌入式相关技术的内容持续更新中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/501417.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【从零开始入门unity游戏开发之——unity篇05】unity6基础入门——运行游戏按钮、Game游戏窗口和Project项目窗口介绍

文章目录 运行游戏按钮、Game游戏窗口和Project项目窗口一、运行游戏按钮二、Game游戏窗口1、右上角设置1.1 如果没有相机渲染则发出警告1.2 在”编程模式”下清除每一帧1.3 窗口最大化 2、上方工具&#xff08;1&#xff09;切换手机模拟器&#xff08;2&#xff09;切换不同显…

【服务器】上传文件到服务器并训练深度学习模型下载服务器文件到本地教程

前言&#xff1a;本文教程为&#xff0c;上传文件到服务器并训练深度学习模型&#xff0c;与下载服务器文件到本地。演示指令输入&#xff0c;完整的上传文件到服务器&#xff0c;并训练模型过程&#xff1b;并演示完整的下载服务器文件到本地的过程。 本文使用的服务器为云服…

Linux下部署ElasticSearch集群

Elasticsearch7.17.8集群的搭建 节点host名称节点ip节点部署内容k8s-m192.168.40.142主节点 数据节点k8s-w1192.168.40.141主节点 数据节点k8s-w2192.168.40.140数据节点 一、准备安装环境 1.下载安装包 官网 www.elastic.co 下载所有版本地址 点击跳转 下载elasticsearch-7.…

Unity2022接入Google广告与支付SDK、导出工程到Android Studio使用JDK17进行打包完整流程与过程中的相关错误及处理经验总结

注&#xff1a;因为本人也是第一次接入广告与支付SDK相关的操作&#xff0c;网上也查了很多教程&#xff0c;很多也都是只言片语或者缺少一些关键步骤的说明&#xff0c;导致本人也是花了很多时间与精力踩了很多的坑才搞定&#xff0c;发出来也是希望能帮助到其他人在遇到相似问…

Linux中隐藏操作身法

从历史记录中删除指定的命令 假设历史记录中已经包含了一些你不希望记录的命令。这种情况下我们怎么办&#xff1f;很简单。通过下面的命令来删除&#xff1a; history | grep "keyword"例如:history | grep set o history 批量第二条和第四条删除&#xff1a; sed…

【期末复习】一、操作系统概论

题型 选择题 论述题 综合分析题(计算,证明) 算法分析题(根据程序代码分析) 1.方面 操作系统在计算机系统中主要涉及硬件、软件和数据这三个重要方面。 2.操作系统发展历史 手工操作阶段(1940s) 联机批处理系统阶段(1950s) 脱机批处理系统阶段(1950s) 多道…

弧形导轨如何避免生锈?

弧形导轨是机械设备中重要的组成部分&#xff0c;负责支撑和引导运动部件。由于长时间的使用和外部环境的影响&#xff0c;导轨容易出现锈蚀现象&#xff0c;从而影响机械设备的正常运行。因此&#xff0c;导轨的防锈处理是非常重要的&#xff0c;以下是一些有效的防锈方法&…

游泳溺水识别数据集,对25729张图片进行YOLO,COCO JSON, VOC XML 格式的标注,溺水平均识别率在89.9%

游泳溺水识别数据集&#xff0c;对25729张图片进行YOLO&#xff0c;COCO JSON, VOC XML 格式的标注&#xff0c;溺水识别率在92&#xff05; 训练结果 数据集和标签 验证 游泳测试视频 根据测试的视频来获取检测结果&#xff1a; 游泳测试视频的置信度设置60% 检测结果如下&…

一个hive插入数据失败的问题

背景 在生产业务中一个简单的sql(hive on tez)如下: insert overwrite table AAA partition(groupcode) select * from BBB; 突然报错如下: Caused by: org.apache.hadoop.hive.ql.metadata.Hive :xception: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.…

探索Wiki:开源知识管理平台及其私有化部署

在如今的信息时代&#xff0c;企业和团队的知识管理变得愈发重要。如何有效地存储、整理、共享和协作&#xff0c;是提高团队效率和创新能力的关键因素之一。今天&#xff0c;我要为大家介绍一款非常有用的github上开源知识管理工具——Wiki&#xff0c;并分享它的私有化部署方…

Unity UGUI使用技巧与经验总结(不定期更新)

Text自动缩放参考连接&#xff1a; Unity -UGUI中Text文本框的自动调整&#xff0c;字体大小的自适应调节_unity添加的字体大小锁定-CSDN博客 Toggle按钮选择时&#xff0c;显示对应的UI界面&#xff1a; 为Toggle组件的On Value Change事件添加对需要显示的对象的SetActive…

吐卡机开发——指令合集—未来之窗行业应用跨平台架构

序号指令10A 09 02 01 01 0D DE20A 09 02 02 01 FD DE30A 09 02 03 01 6D DF40A 09 02 04 01 5D DD50A 09 02 05 01 CD DC60A 09 02 06 01 3D DC70A 09 02 07 01 AD DD80A 09 02 08 01 5D D890A 09 02 09 01 CD D9100A 09 02 10 01 5D D2110A 09 02 11 01 CD D3120A 09 02 12 0…

简单使用linux

1.1 Linux的组成 Linux 内核&#xff1a;内核是系统的核心&#xff0c;是运行程序和管理 像磁盘和打印机等硬件设备的核心程序。 文件系统 : 文件存放在磁盘等存储设备上的组织方法。 Linux 能支持多种目前浒的文件系统&#xff0c;如 ext4 、 FAT 、 VFAT 、 ISO9660 、 NF…

38 Opencv HOG特征检测

文章目录 HOGDescriptor 构造函数setSVMDetector 设置支持向量机&#xff08;SVM&#xff09;检测器&#xff0c;用于目标检测。compute 用于计算图像区域的HOG描述符。detectMultiScale 多尺度检测目标。示例 HOGDescriptor 构造函数 HOGDescriptor(); HOGDescriptor(const S…

SweetAlert2 - 漂亮可定制的 JavaScript 弹窗

https://sweetalert2.github.io/ https://github.com/sweetalert2/sweetalert2 安装&#xff1a; npm install sweetalert2封装&#xff1a; import Swal from sweetalert2/dist/sweetalert2.js import sweetalert2/src/sweetalert2.scss/*** * param {string} icon - ico…

ros2 py文件间函数调用

文章目录 写在前面的话生成python工程包命令运行python函数命令python工程包的目录结构目录结构&#xff08;细节&#xff09; 报错 1&#xff08; no module name ***&#xff09;错误示意 截图终端输出解决方法 报错 2&#xff08; AttributeError: *** object has no attrib…

CentOS7安装配置JDK保姆级教程(图文详解)

1. 安装OpenJDK 直接使用yum命令安装&#xff0c;这里安装的版本是openjdk 11 &#xff08;具体版本根据自己操作系统选择&#xff09; # 查找安装包 yum search java-11# 安装jdk, 同时安装了依赖 java-11-openjdk-headless yum install java-11-openjdk.x86_64# 安装开发工…

默认ip无法访问,利用dhcp功能获取ip进行访问的方法

应用场景&#xff1a; ac的默认ip如192.168.1.1在pc与ac的eth2以后网口直连无法ping通&#xff0c;而且pc改为dhcp自动获取ip也获取不到ip地址&#xff0c;无法进行web配置和命令行操作。 原因是ac或其他设备被修改了默认ip或者端口vlanid&#xff0c;现在的端口vlan对应子接…

库伦值自动化功耗测试工具

1. 功能介绍 PlatformPower工具可以自动化测试不同场景的功耗电流&#xff0c;并可导出为excel文件便于测试结果分析查看。测试同时便于后续根据需求拓展其他自动化测试用例。 主要原理&#xff1a;基于文件节点 coulomb_count 实现&#xff0c;计算公式&#xff1a;电流&…

QQ长截屏

QQ长截屏 第一步&#xff1a;CtrlAltA 第二步&#xff1a;点击剪刀之后&#xff0c;再滑动滚轮就可以了。 展示