【AUTOSAR】【Can通信】CanDriver

目录

一、介绍

二、说明

三、功能说明

3.1 驱动程序范围

3.2 驱动程序状态机

3.3 CAN控制器状态机

3.4 L-PDU传输

3.5 L-PDU接收

3.6 唤醒概念

3.7 通知概念

3.8 硬件时间戳

3.9 错误分类        

3.10 CAN FD支持

四、API接口

4.1 API功能

4.2 调度函数


一、介绍

        该规范规定了AUTOSAR基本软件模块CAN驱动程序的功能、API和配置。

        Can模块是最低层的一部分,执行硬件访问,并向上层提供一个硬件独立的API。唯一可以访问Can模块的上层是CanIf模块。Can模块提供启动传输的服务,并调用CanIf模块的回调函数,以独立于硬件通知事件。此外,它还提供服务来控制属于同一CAN硬件单元的CAN控制器的行为和状态。几个CAN控制器可以由一个CAN模块来控制,只要它们属于同一CAN硬件单元。

二、说明

        一个CAN控制器总是对应于一个物理通道。允许连接总线侧连接物理通道。无论CanIf模块都将分别处理相关的CAN控制器。

        一些CAN硬件单元支持通过使用CAN RAM来组合几个CAN控制器,以扩展一个CAN控制器的消息对象的数量。这些组合的CAN控制器由CAN模块作为一个控制器进行处理。

        Can模块不支持Can远程帧。

【规范】Can模块不得传输由远程传输请求触发的消息。

【规范】Can模块应初始化CAN HW,以忽略任何远程传输请求

三、功能说明

        Can模块提供了一个作为定期处理功能的接口,并且必须由基本软件调度器模块定期调用。此外,Can模块还提供了控制Can控制器状态的服务。总线关闭和唤醒事件将通过回调函数进行通知。Can模块是一个访问硬件资源的基本软件模块。

        在L-PDU传输时,Can模块将L-PDU写入Can控制器硬件内部的适当缓冲区中。

        在L-PDU接收时,Can模块调用以ID、数据长度和L-SDU指针为参数的RX指示回调函数。

【规范】Can模块应为所有需要的Can硬件单元中断实现中断服务例程。

【规范】Can模块应禁用Can控制器中所有未使用的中断。

【规范】Can模块应重置ISR末端的中断标志(如果不是由硬件自动完成)。

3.1 驱动程序范围

        一个Can模块提供了对一个可能由多个Can控制器组成的Can硬件单元的访问。

【规范】对于不同类型的CAN硬件单元,应采用不同的CAN模块

【规范】如果必须在一个ECU上支持多个不同的CAN控制器类型,则只能在这种情况下使用命名约定。

3.2 驱动程序状态机

        Can模块有一个非常简单的状态机,有两个状态为CAN_UNINIT和CAN_READY。

【AUTOSAR】【Can通信】CanDriver_第1张图片

3.3 CAN控制器状态机

        每个CAN控制器都有在硬件中实现的复杂状态机。为了简化,在此描述中,状态的数量减少到以下四种基本状态: UNINIT, STOPPED, STARTED和SLEEP。

【AUTOSAR】【Can通信】CanDriver_第2张图片

3.4 L-PDU传输

        在L-PDU传输上,Can模块将L-PDU内容ID和数据长度转换为一个特定的硬件格式(如果必要),并触发传输。

【规范】通过CAN到内存的数据映射被定义为,首先发送的CAN数据字节是数组元素0,在CAN FD的情况下,最后发送的CAN数据字节是数组元素7或63。

【规范】如果CAN硬件缓冲区内的表示与自动存储器定义不同,则CAN模块必须为上层提供一个自适应的SDU-Buffer。

【规范】可以配置几个具有唯一HTHs的TX硬件对象。CanIf模块提供了HTH作为TX请求的参数。

【AUTOSAR】【Can通信】CanDriver_第3张图片

【规范】函数Can_Write应该存储在参数PduInfo中给出的swPdu句柄,直到Can模块调用CanIf_TxConfirmation,其中swPdu句柄作为参数给出。

【规范】Can模块应调用CanIf_TxConfirmation,表示传输成功。它应由相应HW资源的tx中断服务程序调用,或者在轮询模式下在Can_MainFunction_Write内部调用

3.5 L-PDU接收

【规范】在L-PDU接收时,Can模块应调用RX指示回调函数CanIf_RxIndication、ID、Hoh、抽象的参数邮箱控制器Id,以及参数PDuInfoPtr中指向L-SDU缓冲区的数据长度和指针。

【规范】在使用扩展CAN帧时,CAN模块应将ID转换为标准化格式,因为上层(CANIF)不知道接收到的CAN格式是标准CAN格式还是扩展CAN格式。在扩展的CAN帧中,需要将接收到的CAN帧ID的MSB标记为“1”,以将接收到的CAN帧标记为扩展的帧。

【规范】对应HW资源的RX-中断服务例程或轮询模式下的中断函数Can_MainFunction_Read应调用回调函数CanIf_RxIndication。

【规范】CAN到内存的数据映射定义为,首先接收的CAN数据字节是数组元素0,对于CAN FD,最后接收的CAN数据字节是数组元素7或63。如果CAN硬件缓冲区内的表示与自动存储器定义不同,则CAN模块必须为上层提供一个自适应的SDU-Buffer。

【规范】CanDrv应指示接收到的消息是常规的CAN帧还是如Can_IdType中所述的CAN FD帧。

3.6 唤醒概念

        Can模块处理唤醒可以由Can控制器本身而不是通过Can收发器。有两种可能的情况:通过中断唤醒和通过轮询唤醒。

        对于中断唤醒,当硬件检测到唤醒时,将调用Can模块的ISR。

【规范】如果调用了唤醒事件的ISR,则应依次调用EcuM_CheckWakeup。传递给EcuM_CheckWakeup的参数应为“可唤醒源参考”的配置参数所引用的唤醒源的ID。然后,ECU状态管理器将设置MCU,并通过Can接口重新调用Can模块,从而调用到Can_CheckWakeup。当通过轮询检测到唤醒事件时,ECU状态管理器将像以前一样通过Can接口循环调用Can_CheckWakeup。

        在这两种情况下,Can_CheckWakeup都将检查是否有由Can控制器检测到的唤醒,并返回结果。然后,CAN驱动程序将通过EcuM_SetWakeupEvent通知ECU状态经理唤醒事件。

        唤醒验证以防止错误的唤醒事件,将由ECU状态管理器和Can接口之后完成,而无需来自Can模块的任何帮助。

3.7 通知概念

        Can模块仅为CanIf模块提供了一个事件触发的通知接口。每个通知都由一个回调函数表示。

【规范】硬件事件可以通过中断或通过轮询硬件对象的状态标志来检测。有关轮询的配置可能性依赖于硬件(即,哪些事件可以被轮询,哪些事件需要被轮询),而不受此标准的限制。

3.8 硬件时间戳

        基于硬件的时间戳,如果由CAN控制器支持,可以使用,例如提高CAN同步时间基础的精度。如果支持基于硬件的时间戳,则提供以下CAN驱动程序api:

  • Can_GetCurrentTime
  • Can_EnableEgressTimeStamp
  • Can_GetEgressTimeStamp
  • Can_GetIngressTimeStamp

        这些api需要通过配置参数可以全局时间支持来启用。

        CAN控制器的基于硬件的时间戳功能应提供一个自由运行的计数器,用于获取CAN消息接收和传输的时间戳。自由运行的计数器是一个计数器,在达到指定的最大值后计算并溢出到零。CiA 603标准中规定,自由运行的计数器可计数时钟周期;分辨率应至少为1µs,最多为1 ns。强烈建议提供32位时间戳寄存器和32位计数器。

3.9 错误分类        

        详情请参考规范手册。

3.10 CAN FD支持

        CAN FD还支持扩展有效负载,允许最多64字节。此特性还取决于CAN FD配置。因此,如果CAN控制器处于CAN FD模式,并且CAN FD标志设置为Can_Write(),CanDrv支持长度高达64字节的pdu传输。如果有发送CAN FD帧的请求,并且CAN控制器没有处于CAN FD模式,则该帧作为传统的CAN帧发送,只要PDU长度为

四、API接口

4.1 API功能

  1. Can_Init ——初始化
  2. Can_GetVersionInfo
  3. Can_DeInit
  4. Can_SetBaudrate
  5. Can_SetControllerMode ——控制器模式设置
  6. Can_DisableControllerInterrupts
  7. Can_EnableControllerInterrupts
  8. Can_CheckWakeup
  9. Can_GetControllerErrorState
  10. Can_GetControllerMode ——获取控制器模式
  11. Can_GetControllerRxErrorCounter
  12. Can_GetControllerTxErrorCounter
  13. Can_GetCurrentTime
  14. Can_EnableEgressTimeStamp
  15. Can_GetEgressTimeStamp
  16. Can_GetIngressTimeStamp
  17. Can_Write ——将CAN消息传递给CanDrv进行传输

4.2 调度函数

  1. Can_MainFunction_Write ——此函数执行对TX确认的轮询。
  2. Can_MainFunction_Read ——此函数执行对RX指示的轮询。
  3. Can_MainFunction_BusOff ——总线关闭事件的轮询。
  4. Can_MainFunction_Wakeup ——唤醒事件进行轮询。
  5. Can_MainFunction_Mode ——此函数执行对CAN控制器模式转换的轮询。

你可能感兴趣的:(AUTOSAR,R21-11,开发语言,嵌入式硬件,单片机,系统架构,mcu)