目录
一、介绍
二、说明
三、功能说明
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末端的中断标志(如果不是由硬件自动完成)。
一个Can模块提供了对一个可能由多个Can控制器组成的Can硬件单元的访问。
【规范】对于不同类型的CAN硬件单元,应采用不同的CAN模块
【规范】如果必须在一个ECU上支持多个不同的CAN控制器类型,则只能在这种情况下使用命名约定。
Can模块有一个非常简单的状态机,有两个状态为CAN_UNINIT和CAN_READY。
每个CAN控制器都有在硬件中实现的复杂状态机。为了简化,在此描述中,状态的数量减少到以下四种基本状态: UNINIT, STOPPED, STARTED和SLEEP。
在L-PDU传输上,Can模块将L-PDU内容ID和数据长度转换为一个特定的硬件格式(如果必要),并触发传输。
【规范】通过CAN到内存的数据映射被定义为,首先发送的CAN数据字节是数组元素0,在CAN FD的情况下,最后发送的CAN数据字节是数组元素7或63。
【规范】如果CAN硬件缓冲区内的表示与自动存储器定义不同,则CAN模块必须为上层提供一个自适应的SDU-Buffer。
【规范】可以配置几个具有唯一HTHs的TX硬件对象。CanIf模块提供了HTH作为TX请求的参数。
【规范】函数Can_Write应该存储在参数PduInfo中给出的swPdu句柄,直到Can模块调用CanIf_TxConfirmation,其中swPdu句柄作为参数给出。
【规范】Can模块应调用CanIf_TxConfirmation,表示传输成功。它应由相应HW资源的tx中断服务程序调用,或者在轮询模式下在Can_MainFunction_Write内部调用
【规范】在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帧。
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模块的任何帮助。
Can模块仅为CanIf模块提供了一个事件触发的通知接口。每个通知都由一个回调函数表示。
【规范】硬件事件可以通过中断或通过轮询硬件对象的状态标志来检测。有关轮询的配置可能性依赖于硬件(即,哪些事件可以被轮询,哪些事件需要被轮询),而不受此标准的限制。
基于硬件的时间戳,如果由CAN控制器支持,可以使用,例如提高CAN同步时间基础的精度。如果支持基于硬件的时间戳,则提供以下CAN驱动程序api:
这些api需要通过配置参数可以全局时间支持来启用。
CAN控制器的基于硬件的时间戳功能应提供一个自由运行的计数器,用于获取CAN消息接收和传输的时间戳。自由运行的计数器是一个计数器,在达到指定的最大值后计算并溢出到零。CiA 603标准中规定,自由运行的计数器可计数时钟周期;分辨率应至少为1µs,最多为1 ns。强烈建议提供32位时间戳寄存器和32位计数器。
详情请参考规范手册。
CAN FD还支持扩展有效负载,允许最多64字节。此特性还取决于CAN FD配置。因此,如果CAN控制器处于CAN FD模式,并且CAN FD标志设置为Can_Write(),CanDrv支持长度高达64字节的pdu传输。如果有发送CAN FD帧的请求,并且CAN控制器没有处于CAN FD模式,则该帧作为传统的CAN帧发送,只要PDU长度为