【小猫爪】AUTOSAR学习笔记03-Communication Stack之CanIf模块

前言

  前一章简单的对Communication Stack作了一个介绍,了解到了在AUTOSAR中通信的层级架构。这一章来看看这通信架构中的属于ECU抽象层的interface,还是以CAN为例,那对应的就是CanIf(CAN Interface)。

  补充:本来是应该从处于AUTOSAR最底层的MCAL层开始进行介绍,因为MCAL是跟MCU强相关的,每个MCU原厂的MCU都会有点不一样的东西,这些异处自然也会体现在MCAL层上,再因为MCAL层其实就是底层驱动,所以在这个专栏里,就不再对MCAL中详细介绍了。感兴趣的小伙伴可以参考文章:《AUTOSAR CAN Driver(CAN驱动程序)》

1 CanIf简介

  Can的Communication Stack结构图如下图所示:
在这里插入图片描述
  在MCAL层,看到了不仅仅有CanDriver, 还有SPI和I/O Driver,其中SPI针对的是那些需要外挂CAN controller的应用,除了外部CAN controller芯片需要IO来进行输入输出,有些特殊的CAN Tranceiver也需要IO来进行输入输出,比如经典的TJA1043,就有一个EN引脚和STB引脚,所以就需要IO Driver来控制。

  CanIf模块位于MCAL层(CAN Driver)和上层通信服务层(如 CAN Network Management, CAN Transport Protocol 等)的中间,其充当 CAN Driver 和上层通信服务层的接口层。所以它位于BSW层中的ECU抽象层,为了让上层软件与ECU硬件设计无关。

2 功能介绍

  CAN Interface 模块主要功能如下:
  1. 初始化
  2. 发送请求服务
  3. 发送确认服务
  4. 接收指示服务
  5. Controller 模式控制服务
  6. Transceiver 模式控制服务
  7. PDU channel mode 控制服务

2.1 发送缓冲区

  首先介绍一个叫做(HOH)Hardware Object handles的这个概念,这个其实在MCAL层出现的较多,对MCAL的上层软件来说,HOH其实就是一个CAN报文的消息缓冲区,上层软件想发送报文的时候,就把报文往里面塞就好了,MCAL会负责发送出去,同理,接收报文就是从缓冲区里读取。但是在MCAL层,这个HOH的实现就五花八门了,这里就不多解释了。后文出现的HTH意思就是用来发送的HOH,而HRH意思就是用来接收的HOH。

  再来介绍一下BasicCAN 和FullCAN的概念,BasicCAN 就是说一个HOH可以同时接收和发送多个CAN ID报文,而FullCAN则是一个HOH直接接收和发送单个CAN ID报文。这里不妨衍生以下,这两个的定义其实起源颇深,大家可参考文章:《Full-CAN vs. Basic-CAN》

  当 CANIF_PUBLIC_TX_BUFFERING 配置为 ON 的时候, CanIf 会为 Basic 类型(多个 PDU 共享一个 HTH)的 PDU 分配发送缓冲区。
  当 CanIf 调用 Can_Write 返回 CAN_BUSY 的时候,说明当前的 HTH 正在发送上一帧数据,不能写入新的数据。此时, CanIf 将会把新的数据储存在 CanIf 的缓冲区。在 Can 的发送确认中,针对刚刚发送成功的 HTH(此时已经处于空闲状态,可以写入新的数据), CanIf 将查询分配给该 HTH 的 PDU,是否有数据在缓冲区中,如果有的话, CanIf 将自动把缓冲区中的数据写入 HTH,并发送出去。

  CanIf 发送缓冲区具有如下特性:
  1. Full 类型的 PDU 不会分配缓冲区;
  2. 每个 Basic 类型的 PDU 有且只有一级缓存,因此,新的数据覆盖旧的数据;
  3. 当 CANIF_PUBLIC_TX_BUFFERING 配置为 OFF 时,所有的 PDU 都没有发送缓冲区;
  4. 如果同一 HTH 的缓冲区中有多个 PDU,将按照 PDU 的优先级(CANID 从小到大的顺序)进行发送。

2.2 CAN Controller 模式控制

  CAN controller 在硬件实现上的状态抽象为以下四种基本状态: UNINIT、 STOPPED、STARTED 和 SLEEP。对每个 CAN Controller,在 Can Interface 模块上有一个对应的“软件”状态机,其有以下几种状态: CANIF_CS_UNINIT,CANIF_CS_STOPPED, CANIF_CS_STARTED 和CANIF_CS_SLEEP。上层可以通过调用 CanIf_SetControllerMode()服务来改变 CAN Controller 的状态。下表展示了用户使用CanIf_SetControllerMode()时的状态转换:

CanIf 当前模式用户请求模式传递给 Can 的模式
XCANIF_CS_STARTEDCAN_T_START
CANIF_CS_SLEEPCANIF_CS_STOPPEDCAN_T_WAKEUP
CANIF_CS_STOPPEDCANIF_CS_STOPPEDCAN_T_STOP
CANIF_CS_STARTEDCANIF_CS_STOPPEDCAN_T_STOP
XCANIF_CS_SLEEPCAN_T_SLEEP

  不合法的状态转换请求,例如 SLEEP 到 START, START 到 SLEEP,将在 Can 模块被检测到,并返回 E_NOT_OK。在转换阶段, Can Interface 模块中软件状态机的状态可能会与 CAN controller 中的硬件状态不一致。

  调用 CanIf_SetControllerMode 进行模式切换,如果硬件的模式能够在较短的时间内完成,那么模式转换可以是同步的,也就是说,在 CanIf_SetControllerMode 返回之前,模式转换已经完成,并且通过 User_ControllerModeIndication 通知了上层。否则,模式转换是异步完成的,用户需周期调用 Can_MainFunction_Mode 来完成模式转换并通知上层。

2.3 PDU Mode控制

   CanIf中,可调用 CanIf_SetPduMode 控制某个 CAN 通道上 PDU 的接收和发送,各 CAN通道可分别控制。CanIf支持的Pdu Mode 模式和特征描述如下所示:

PDU Mode描述
CANIF_OFFLINE1.阻止发送请求,调用CanIf_Transmit()时,返回 E_NOT_OK。
2.清除相关通道的发送缓冲区。
3.阻止调用上层的接收指示回调函数。
4.阻止调用上层的发送确认回调函数。
CANIF_TX_OFFLINE_ACTIVE1. 调用的 CanIf_Transmit()时,返回 E_OK,但是不调用 Can 的发送接口发送报文。
2. 调用的 CanIf_Transmit()时,直接调用上层的发送确认函数。
3. 阻止调用上层的接收指示回调函数。
CANIF_TX_OFFLINE1. 阻止发送请求,调用 CanIf_Transmit()时,返回 E_NOT_OK。
2. 清除相关通道的发送缓冲区。
3. 允许调用上层的接收指示回调函数。
4. 阻止调用上层的发送确认回调函数。
CANIF_ONLINE1. 调用 CanIf_Transmit()时,正常发送报文,返回 E_OK 。
2. 报文发送成功时,调用上层的发送确认函数。
3. 接收到报文时,调用上层的接收指示回调函数。

2.4 DLC检查

   当 CanIf 从 Can Drviver接收到一帧报文,可以对报文的 DLC 进行检查,如果 DLC 不合法,可以报错,并进行相应的处理。DLC 检查的方法有两种:

  1. AUTOSAR 标准算法:当实际接收到的 DLC 小于配置的 DLC 时,认为 DLC 不合法;
  2. 用户自定义算法:用户需要完成 CanIf_DlcCheckCallout 函数,自行进行检查。

   若 DLC 检查失败,等同于该报文没有接收到,不会调用上层的接收指示回调函数。

2.5 查询状态

  当相关配置参数使能后, CanIf 提供了接口,可通过这些接口查询 CanIf PDU 的的状态和数据,这包括:

  1. CanIf_ReadRxNotifStatus 查询某个 PDU 是否接收到;
  2. CanIf_ReadTxNotifStatus 查询某个 PDU 是否发送成功;
  3. CanIf_ReadRxPduData,读取某个 PDU 的接收数据;
  4. CanIf_GetTxConfirmationState,获取是否有报文发送成功,主要用于 Busoff 恢复。

  补充:除了以上简单介绍的几大点,CanIf模块还有一大堆的细节,大家如果想更深入了解CanIf模块,可参考AUTOSAR官方文档《AUTOSAR_SWS_CANInterface.pdf》。

END

Autosar-CAN NM是一种用于网络管理的通信协议,旨在实现CAN总线系统的高效管理和控制。Autosar-CAN NM支持多个节点共享相同的CAN总线,通过提供网络管理功能来确保节点之间的通信可靠性和稳定性。 Autosar-CAN NM的主要功能包括节点的电源管理、通信总线状态的监控和管理、节点之间的网络通信和报文的传输。首先,节点的电源管理功能包括监测节点的供电状态和能力,并根据需要进行电源管理,以确保节点之间的正常通信。其次,通过监控和管理CAN总线的状态,Autosar-CAN NM可以检测并处理潜在的通信故障,如总线冲突和错误帧。此外,还可以对总线负载进行监控和管理,以避免总线过载和通信延迟。 在节点之间的网络通信方面,Autosar-CAN NM通过提供网络管理帧(用于节点之间的通信)和网络管理报文(用于各个节点之间传输数据)来实现。网络管理帧用于在节点之间传递通信状态和配置信息,并支持节点之间的网络拓扑管理。网络管理报文是主要用于节点之间的数据传输和通信,通过CAN总线进行传输。这样可以确保节点之间的数据通信具有高可靠性和实时性。 总的来说,Autosar-CAN NM提供了一种有效的方法来管理和控制CAN总线系统中节点之间的通信。它通过电源管理、总线监控和状态管理、网络通信和报文传输等功能,实现了节点之间的可靠通信。这不仅提高了CAN总线系统的性能和稳定性,还为制造商和开发人员提供了一种有效的方法来设计和管理CAN网络。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小猫爪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值