【AUTOSAR技术详解】CanIf组件的核心概念与工作机制
【AUTOSAR技术详解】CanIf组件的核心概念与工作机制
在汽车电子领域,AUTOSAR(Automotive Open System Architecture)是一种广泛使用的开放式系统架构标准,用于规范汽车电子软件的开发。其中,CanIf(CAN Interface)组件作为通信硬件抽象层的重要组成部分,负责处理CAN(Controller Area Network)数据的收发和模式控制。本文将详细介绍CanIf组件的核心概念、工作机制及其在实际应用中的配置和使用。
前言
本文基于S32K312芯片和Vector提供的CBD包,通过DaVinci Configurator工具进行配置,深入解析CP AUTOSAR架构下的CanIf组件。CanIf组件位于Communication Hardware Abstraction层,是Can Driver的接口层,主要负责MCU的CAN数据收发、模式控制,并被上层CanTp、Dcm、CanNm等组件调用。
上图为CP AUTOSAR CAN网络架构。
一、核心概念
(一)L-SDU、L-PDU、L-PDU Handle
- L-SDU(Link Service Data Unit):CAN数据链路层的服务数据单元,是L-PDU中的一个字段。
- L-PDU(Link Protocol Data Unit):CAN数据链路层的协议数据单元,由Identifier(标识符)、DLC(数据长度码)、L-SDU组成。
- L-PDU Handle:L-PDU句柄,由CanIf定义并提供。
(二)CanHardwareUnit、CanController、CanTransceiver、PhysicalChannel
- PhysicalChannel:CAN物理通道,表示CAN网络的接口。MCU的某一组CAN TX和RX引脚与CanTransceiver相连,CanTransceiver再与总线上的CANH和CANL相连,形成一段CAN驱动的物理通道。同一个CAN硬件单元的不同物理通道可以访问不同的CAN网络。
- CanTransceiver:CAN收发器,通常是一个芯片,负责将MCU的数字信号转换为CAN总线上的电平信号。
- CanController:CAN控制器,一个CAN控制器连接一个CAN物理通道,负责数据的收发、波特率设置等。MCU通常包含多个CAN控制器。
- CanHardwareUnit:CAN硬件单元,由一个或多个CAN控制器和一个或多个CAN邮箱组成,可以是片上也可以是外部设备。例如,车辆中某一段CAN网络连接的ECU就是一个CAN硬件单元。
(三)HardwareObject、HOH、HTH、HRH
- HardwareObject:Can驱动程序的硬件对象,定义为CAN硬件单元内的CAN RAM的消息缓冲区。硬件对象包含控制器、CAN邮箱、帧类型、过滤器等属性。
- HOH(Hardware Object Handle):硬件对象句柄,由Can驱动程序定义和提供,一个HOH代表一个硬件对象。
- HTH(Hardware Transmit Handle):硬件传输句柄,由Can驱动程序定义和提供,一个HTH能代表一个或多个发送类别的硬件对象。
- HRH(Hardware Receive Handle):硬件接收句柄,由Can驱动程序定义和提供,一个HRH能代表一个或多个接收类别的硬件对象。
二、CanIf与其他组件的关系
上层组件进行CAN收发不会直接调用Can驱动程序,而是通过CanIf的接口进行收发。因此,CanIf需要有策略或算法来确定要发送接收的CANID对应的是Can驱动里的哪个HTH或HRH。
CanIf的上层组件包括PduR、CanNm、CanTp、CanSm、EcuM、CanTsyn、J1939Tp、J1939Nm、Xcp等。CanIf在EcuM里进行初始化,CanSm调用CanIf的控制器管理。CanIf的下层组件则有Can、CanTrcv。
三、CanIf发送缓冲区和优先级反转
CanIf组件里的每个L-PDU支持带有发送缓冲区。当CanIf_Transmit()调用Can_Write()时,如果返回BUSY且CanIfBufferSize不为0,表示Can驱动里的HTH还没发送完,此时会把当前的L-PDU存到发送缓冲区里。等到该HTH发送完调用CanIf_TxConfirmation()时,如果发现发送缓冲区有数据,会再次调用Can_Write()发送缓冲区里的数据。
如果Can驱动里的HTH被多个L-PDU引用,且多个L-PDU的数据在缓冲区待发送,CanIf会根据L-PDU的CANID优先级决定先发送哪一个。更新发送缓冲区时,需要通过Can_EnableControllerInterrupts()或Can_DisableControllerInterrupts()形成临界区,确保更新过程不被打断。
如果发送缓冲区已满,新的数据会覆盖旧的数据来填充缓冲区。FullCan类型的Pdu没有发送缓冲区。
当低优先级的CAN消息因为HTH占用而未发送,而高优先级的CAN消息请求发送时,会发生内部优先级反转。Vector的代码里可以启用Controller Driver Tx Cancellation,当发生这种情况时,CanIf将调用Can驱动层的发送取消函数,取消低优先级的请求,如果当前缓冲区空闲,则将放置缓冲区里否则丢弃,这样高优先级的消息请求便会排在前面。
四、CanIf接收过滤
如果多个L-PDU共享同一个HRH,当HRH接收到数据时,会先判断收到的报文ID是否在预设范围内(CanIfHrhRangeRxPduLowerCanId和CanIfHrhRangeRxPduUpperCanId)。如果在范围内,再通过滤波算法(如linear search、table search、hash search)寻找对应的L-PDU。如果没有对应的L-PDU,则退出CanIf_RxIndication();找到对应的L-PDU后,会进入该L-PDU上层组件的指示函数。
五、CanIf接收DLC检查
当HRH收到数据调用CanIf_RxIndication()时,会检查数据长度码(DLC)是否符合预期。如果DLC不符合预期,CanIf会根据配置进行相应的处理,例如丢弃数据或触发错误处理机制。
六、总结
CanIf组件在AUTOSAR架构中扮演着关键角色,负责CAN数据的收发和模式控制。通过理解CanIf的核心概念、工作机制及其与其他组件的关系,开发者可以更好地进行汽车电子系统的开发和调试。
本文内容基于S32K312芯片和Vector的CBD包,通过DaVinci Configurator工具进行配置,具有较高的参考价值。对于从事汽车电子开发的工程师来说,深入理解CanIf组件的原理和应用,有助于提升系统开发效率和可靠性。
本文原文来自CSDN