【AUTOSAR】【Lin通信】LinSM

目录

一、概述

二、说明

三、功能说明

3.1 LinSM状态机的状态和转换

3.1.1 LINSM_UNINIT

3.1.2 LINSM_INIT

3.1.3 LINSM_NO_COM

3.1.4 LINSM_FULL_COM

3.1.5 Goto sleep

3.1.6 更改调度表

3.1.7 唤醒过程

3.1.8 请求超时

3.2 处理多个网络和驱动程序

3.3 错误分类

3.3.1 开发错误

3.3.2 运行错误

四、API接口

4.1 API定义

4.2 调度接口

4.3 回调通知


一、概述

        该规范指定了AUTOSAR基本软件模块LIN状态管理器(LinSM)的功能、API和配置。LinSM与LIN接口、LIN驱动程序、LIN收发器驱动程序一起形成了完整的LIN协议。

        LIN状态管理器被设计为是硬件独立的。

        LinSM负责LIN总线的控制流程:

  • 在上层请求时切换计划表(仅适用于LIN主节点)
  • 当上层要求或下层指示时,进入睡眠和唤醒处理
  • 当输入新的状态时,通知到上层。

二、说明

        在每个ECU中最多有一个LinSM的实例。如果底层的LIN驱动程序支持多个网络,则LinSM可能是多个集群上的LIN主节点或LIN从节点。所有对(切换)计划表的引用仅适用于LIN主节点;没有针对LIN从节点的计划表。

三、功能说明

        LinSM的主要职责是:

  • 控制所有LIN网络的通信状态(无通信或完全通信)
  • 处理调度更改请求(仅适用于LIN主节点)
  • 处理通信模式请求
  • 通知上层的状态更改

3.1 LinSM状态机的状态和转换

        LinSM模块将在一个状态机中运行。每个连接的网络都将在一个独立的子状态机中运行。

【规范】LinSM模块应具有一个包含状态LINSM_UNINIT和LINSM_INIT的状态机。

【规范】在LINSM_INIT中,每个网络都应该有一个状态为LINSM_NO_COM和LINSM_FULL_COM状态的子状态机。

【规范】在LINSM_INIT中,每个网络都可以独立地处于子状态LINSM_NO_COM或LINSM_FULL_COM中。

主节点状态机:

从节点状态机:

3.1.1 LINSM_UNINIT

        单初始化状态是在LinSM模块中激活的第一个状态。

【规范】在调用任何API之前,状态LINSM_UNINIT应在启动时处于激活状态。

3.1.2 LINSM_INIT

        初始化完成后,LinSM模块将激活init状态。在这个状态下有两个子状态。一种是无通信状态,即在LIN总线上没有进行通信,另一种是正在进行所有通信的完全通信,并且对于LIN主节点,调度表是活动的。每个网络可以没有通信或完全通信。

【规范】当调用LINSM_INIT时,LinSM状态机应从任何状态或子状态转换到状态LINSM_INIT。

【规范】当LinSM_Init被调用时,所有网络的LinSM状态机应从任何状态或子状态传输到子状态LINSM_NO_COM。

【规范】当进入LINSM_INIT时,LinSM应处于init状态。Init状态是指应将全局变量等设置为默认值(重置值)。

【规范】当调用LINSM_INIT时,对于所有网络,子状态LINSM_NO_COM在进入LINSM_INIT状态时应被激活。

【规范】LinSM_Init函数应为每个配置的通道设置调度类型NULL_SCHEDULE。此要求仅适用于LIN主节点。

3.1.3 LINSM_NO_COM

        初始化后、ComM模块请求无通信(LIN主节点)或LinIf指示总线休眠事件(LIN从节点)时,无通信状态处于活动状态。

【规范】当进入LINSM_NO_COM时,LinSM模块应使用特定网络的参数COMM_NO_COMMUNICATION调用ComM_BusSM_ModeIndication通知通信模块状态的变化。

【规范】当输入LINSM_NO_COM时,LinSM模块应通过调用特定网络的参数LINSM_NO_COM的BswM_LinSM_CurrentState来通知BswM状态发生了变化。

【规范】当LinSM正在执行LinSM_Init函数时,LinSM模块不得通知状态变更到LINSM_NO_COM,即LinSM_Init函数既不能调用ComM_BusSM_ModeIndication,也不能调用BswM_LinSM_CurrentState。

【规范】当LINSM_NO_COM被激活时,LinSM模块不得命令LinIf模块对所选网络进行通信,即总线应为静音。

【规范】进入LINSM_NO_COM时,如果LinSMTransceiverPassiveMode为true,收发器应设置为待机,否则使用LinIf_SetTrcvMode休眠。此要求仅适用于为通道配置了LinSMTransceiverPassiveMode时。

【规范】不得从函数LinSM_Init中调用LinIf_SetTrcvMode。

3.1.4 LINSM_FULL_COM

        LINSM_FULL_COM是唯一允许在LIN总线上进行通信的状态。每个网络都可以在LINSM_FULL_COM中相互独立。以下所有要求都适用于每个网络。

【规范】当输入LINSM_FULL_COM时,应通过调用指定网络的参数COMM_FULL_COMMUNICATION来通知ComM状态变化。

【规范】当输入LINSM_FULL_COM时,应通过调用指定网络的参数LINSM_FULL_COM调用BswM_LinSM_CurrentState,通知BswM状态变化。

【规范】当进入LINSM_FULL_COM时,应使用LinIf_SetTrcvMode将收发器设置为激活状态。此要求仅适用于为通道配置了LinSMTransceiverPassiveMode时。

【规范】当输入LINSM_FULL_COM时,将输入子状态LINSM_RUN_COMMUNICATION。

3.1.5 Goto sleep

        主节点和从节点之间的去睡眠序列是不同的。在主节点中,当ComM模块请求无通信模式时,LinSM将请求在LIN总线上发送去休眠命令。在从属节点中,LIN接口指示到LinSM的总线休眠事件,要么是由接收到转到休眠命令引起的,要么是由检测到总线空闲条件引起的。如果ComM模块之前请求无通信模式,总线睡眠事件被转发到ComM。否则,如果ComM模块请求的完整通信模式处于活动状态,则总线休眠事件不会转发给ComM,但在进入休眠序列结束后,LinSM将重新启动唤醒过程。

【规范】当LinIf和子状态LINSM_RUN_COMMUNICATION处于活动状态时,LinSM模块只能在LinIf中调用LinIf_GotoSleep API。

【规范】当调用LinSM_GotoSleepConfirmation,当前状态/子状态为LINSM_FULL_COM/LINSM_GOTOSLEEP时,LinSM应将状态设置为LINSM_NO_COM,无论“success”参数如何。在任何其他状态下,LinSM_GotoSleepConfirmation都应被忽略。

【规范】如果LinIf_GotoSleep返回E_OK,LinSM设置子状态LINSM_GOTOSLEEP

3.1.6 更改调度表

【规范】如果函数LinSM_ScheduleRequest被调用,LinSM模块将使用函数调用LinIf_ScheduleRequest将(而不是等待下一个主函数调用)的请求转发到LinIf模块。

【规范】当LinSM从调用LinSM_ScheduleRequest调用LinIf_ScheduleRequest时,它将将返回值转发给调用者。

【规范】如果LinIf_ScheduleRequest随E_NOT_OK返回,则LinSM模块将在下一个主函数调用中使用旧的调度表调用BswM_LinSM_CurrentSchedule。

【规范】当LinSM模块从LinIf模块中确认设置一个计划表时,如果没有经过计时器,则应调用BswM_LinSM_CurrentSchedule。

【规范】如果计时器已经过去,LinSM模块应使用不变的时间表表调用BswM_LinSM_CurrentSchedule。

【规范】如果LinIf确认了一个调度开关,而没有事先调用来请求新的调度表,则应调用BswM_LinSM_CurrentSchedule。

3.1.7 唤醒过程

        如果ComM模块通过LinSM_RequestComMode呼叫请求唤醒,或者如果LIN节点在网络上发送唤醒信号,则LIN网络将被唤醒。集群唤醒不由LinSM模块处理,由EcuM模块处理,将导致ComM请求网络。在这两种情况下,ComM都将请求与特定网络的LinSM模块进行完全通信。

【规范】如果ComM请求COMM_FULL_COMMUNICATION,LinSM应直接调用LinIf_Wakeup(而不是等待下一个主函数调用)。

【规范】当LinIf通知唤醒发送成功(成功= true)时,状态应设置为LINSM_FULL_COM。

【规范】如果LinIf_Wakeup返回E_NOT_OK,则LinSM_RequestComMode将直接返回E_NOT_OK,而无需进行进一步的操作。

3.1.8 请求超时

(1)适用于LIN主节点

        在调用LinIf_GotoSleep、LinIf_Wakeup或LinIf_ScheduleRequest后,LinSM模块正在等待LinIf模块确认goto睡眠命令的传输,从而改变了总线或调度上的唤醒时间。有可能没有收到确认,因此LinSM模块将永远等待。造成这种情况的唯一原因是软件中的问题,即没有总线事件或类似的事件可以导致这种情况。

(2)适用于LIN从节点

        LinSM模块调用LinIf_GotoSleep或LinIf_Wakeup后,LinSM模块正在等待LinIf模块确认过渡到睡眠模式或在总线上传输唤醒。有可能没有收到确认,因此LinSM模块将永远等待。缺少睡眠模式确认的唯一原因是软件中的问题,即没有总线事件或类似的事件可能导致这种情况。

3.2 处理多个网络和驱动程序

        通常在一个ECU中只需要一个LIN驱动程序模块(支持多个网络)就可以处理所有的LIN网络。然而,很少,ECU包含不同的LIN硬件(例如,高级LIN控制器和UART)。在这种情况下,需要多个不同的LIN驱动程序。这将不会影响LinSM模块,因为LIN驱动程序只接口LinIf模块,而不是直接接口LIN驱动程序模块。

        LinSM将只处理网络,而不关心网络映射到哪个驱动程序,这将由LinIf来处理。

【规范】当与LinIf模块接口时,LinSM模块应使用相同的网络句柄值(当需要LIN网络作为参数时)。

3.3 错误分类

3.3.1 开发错误

3.3.2 运行错误

四、API接口

4.1 API定义

  1. LinSM_Init
  2. LinSM_ScheduleRequest ——上层请求在一个LIN网络上更改一个调度表。
  3. LinSM_GetVersionInfo
  4. LinSM_GetCurrentComMode ——查询当前的通信模式。
  5. LinSM_RequestComMode ——请求一种通信模式。

4.2 调度接口

  1. LinSM_MainFunction ——运行不同请求超时的计时器的周期函数

4.3 回调通知

  1. LinSM_ScheduleRequestConfirmation ——当新请求的调度表处于活动时,LinIf模块将调用此回调。
  2. LinSM_GotoSleepIndication ——网络上接收到gotosleept命令或发生总线空闲超时时回调
  3. LinSM_GotoSleepConfirmation ——当网络上的go to sleep命令发送成功或未成功发送时回调通知
  4. LinSM_WakeupConfirmation ——当唤醒信号命令在网络上发送不成功/不成功时,回调通知。

猜你喜欢

转载自blog.csdn.net/qq_42357877/article/details/129972402