AUTOSAR_SWS_LINInterface
Specification of LIN Interface
简介和功能概述
本文档详细说明了 AUTOSAR 基础软件模块 LIN 接口 (LinIf) 和 LIN 传输协议 (LIN TP, LinTp) 的功能、API 和配置。LIN TP 是 LIN 接口的一部分。
唤醒功能被包含在 LIN 接口、LIN 驱动程序和 LIN 收发器驱动程序中。
本文档基于 ISO 17987 规范 [19],并假设读者已经熟悉该规范。本文档将不再描述在 ISO 17987 中对 LIN 功能的定义。
LIN 接口模块适用于在 ISO 17987 中被定义的主节点和从节点(兼容 LIN 2.2 和 LIN 2.1 主节点)。本文档中所述的 AUTOSAR 中的 LIN 的实现与 ISO 17987 规范有所不同,但两者在 LIN 总线上的行为没有区别。其目的是使 AUTOSAR 中的 LIN 的实现(即 LIN 接口)能够重复利用所有现有的 LIN 节点。
LIN 接口被设计为独立于硬件。其与上层(PDU 路由器)和下层(LIN 驱动程序)模块的接口均已被明确地定义。
LIN 接口可以处理多个 LIN 驱动程序。一个 LIN 驱动程序支持多个通道。这意味着 LIN 驱动程序可以处理一个或多个 LIN 通道。
架构概述
根据分层软件架构 [2],LIN 接口在 BSW 架构中的位置如下图所示。在本例中,LIN 接口连接到两个 LIN 驱动程序。但最常见的配置是其与单个 LIN 驱动程序连接。
LIN 接口负责提供在 ISO 17987 中被定义的 LIN 的功能。这意味着:
- 作为主节点执行当前为每个“ECU 连接到的 LIN 总线”选择的调度(传输(发送)消息头和传输(发送)/接收响应)。
- 当上层请求时,切换主节点的调度表。
- 接受来自上层的帧传输(发送)请求,并在适当的 LIN 帧内将数据作为响应进行传输。
- 当在适当的 LIN 帧内接收到相应的响应时,向上层提供关于帧接收的通知。
- 休眠和唤醒服务。
- 错误处理。
- 诊断传输层服务。
- 节点配置和从节点的标识服务。
首字母缩略词和缩写
除了 ISO 17987 LIN 规范 [19] 中的首字母缩略词和缩写外,本文档还使用了以下首字母缩略词和缩写。为了更清晰地解释,特别是对于本文档中经常使用的术语,在 ISO 17987 规范中已被定义的一些术语在此处也被定义。
AUTOSAR 的交付文档
[1] List of Basic Software Modules
- AUTOSAR_TR_BSWModuleList
[2] Layered Software Architecture
- AUTOSAR_EXP_LayeredSoftwareArchitecture
[3] General Requirements on Basic Software Modules
- AUTOSAR_SRS_BSWGeneral
[4] Specification of Standard Types
- AUTOSAR_SWS_StandardTypes
[5] Specification of Default Error Tracer
- AUTOSAR_SWS_DefaultErrorTracer
[6] Requirements on LIN
- AUTOSAR_SRS_LIN
[7] Specification of LIN Driver
- AUTOSAR_SWS_LINDriver
[8] Specification of ECU Configuration
- AUTOSAR_TPS_ECUConfiguration
[9] Specification of ECU State Manager
- AUTOSAR_SWS_ECUStateManager
[10] Specification of LIN State Manager
- AUTOSAR_SWS_LINStateManager
[11] Basic Software Module Description Template
- AUTOSAR_TPS_BSWModuleDescriptionTemplate
[12] Specification of LIN Transceiver Driver
- AUTOSAR_SWS_LINTransceiverDriver
[13] Specification of PDU Router
- AUTOSAR_SWS_PDURouter
[14] Specification of Communication Stack Types
- AUTOSAR_SWS_CommunicationStackTypes
[15] Specification of Basic Software Mode Manager
- AUTOSAR_SWS_BSWModeManager
[16] General Specification of Basic Software Modules
- AUTOSAR_SWS_BSWGeneral
相关标准和规范
[17] LIN Specification Package Revision 2.1, November 24, 2006 http://www.lin-subbus.org/
[18] SAE J2602-1 (2012-11), LIN Network for Vehicle Applications
[19] ISO 17987:2016 (all parts), Road vehicles - Local Interconnect Network (LIN)
注意:
即使在 LIN 联盟关闭后,非 ISO LIN 规范(LIN 联盟制定的 LIN 2.2 A 和 LIN 2.1)仍可在 <https://www.lin-cia.org/standards/> 中被获取。
相关规范
AUTOSAR 提供了基础软件模块中的通用规范 [16](SWS BSW General),该规范也适用于 LIN 接口。
因此,SWS BSW General 规范应被视为 LIN 接口的附加规范和必需规范。
约束和假设
限制
LIN 接口模块可被用作 LIN 集群中的 LIN 主节点或 LIN 从节点。每个 ECU 中只有一个 LIN 接口实例。如果底层 LIN 驱动程序支持多个通道,则 LIN 接口可与多个集群交互。
假设所有已连接的 LIN ECU 在运行状态(LIN ECU 以 LINIF_CHANNEL_SLEEP 状态启动)下可以接收唤醒帧。
LIN 接口模块不支持:
- ConditionalChangeNAD(SID 0xB3,在 LIN 2.1 规范中被定义;在 ISO 17987-3 中为过时)
- DataDump(SID 0xB4,在 ISO 17987-3 中为可选)
注意:
在 LIN 2.2 A 之前,ConditionalChangeNAD 的定义中没有包含否定响应,在 ISO 17987-3 中其被定义为废弃,且在 ISO 17987-3 中未定义任何响应行为。因此,ISO 17987 和 LIN 规范均未定义当 ConditionalChangeNAD 不受支持时的响应行为。然而,据推测,ISO 17987-3 中针对 AssignNAD 的说明“从节点永远不得发送否定响应”也适用于 ConditionalChangeNAD。
对于从节点,LIN 接口模块不支持:
- 标识符不等于 0 和 2 的 ReadByIdentifier(SID 0xB2,在 ISO 17987-3 中是强制性的)
- 序列号(在 ISO 17987-3 第 6.2.2 条被定义)。这意味着没有相应的配置或 API 来访问序列号。
- AutoAddressingSlave(SID 0xB8,在 ISO 17987-3 中为可选),从节点位置检测(SID 0xB5,在 LIN 2.x 规范中为可选)
对于主节点,LIN 接口模块不支持:
- ReadByIdentifier(SID 0xB2,在 ISO 17987-3 中是强制性的)
注意:
ReadByIdentifier 不被视为节点配置,它更像是一种身份识别服务。因此,将 ReadByIdentifier 作为调度表命令来支持是没有意义的。诊断层负责支持 ReadByIdentifier 的功能。
注意:
在一个通道上作为主节点的 ECU 可以在另一个通道上作为从节点。LIN 接口模块不支持对预留帧的传输(在 LIN 2.1 规范中被定义)。
LIN 接口模块支持 Post-Build Variant,但不直接以“在 ISO 17987-3 第 6.3 条从节点模型中”被定义的方式支持。
如果 LinTpScheduleChangeDiag 被设置为 TRUE,则必须避免 LinTp 模块和非 LinTp(BswM 或 CDD)模块在同一时刻发出对调度表的切换请求,以防止诊断连接过早被终止。此问题将在后续版本中被修复。
对于汽车领域的适用性
该规范适用于所有使用 LIN 的汽车领域。
关于其他 LIN 标准的说明
J2602 [18] 和 LIN 2.1 [17] 是 ISO 17987 [19] 的其他体现形式。这些替代标准是 ISO 17987 的前身,并共享 ISO 17987 的概念。
ISO 17987 中被定义的节点与在 LIN 2.1 中被定义节点兼容(参见 ISO 17987-3,附件 B.2.3)。
只要上述标准与 ISO 17987 相同,AUTOSAR LinIf 就支持它们。
由于历史原因,无论从节点基于比 ISO 17987 更旧的哪个 LIN 标准(LIN 1.3、LIN 2.0、LIN 2.1 和 LIN2.2),只要遵循的标准与 ISO 17987 相同,其都会受到支持。
对其他模块的依赖
本节描述了 LIN 接口模块与基础软件中的其他模块之间的关系,并描述了将被其他模块使用的服务。
为了使 LIN 接口能够正常工作,需要以下模块:
- 默认错误追踪器 - DET
- ECU 状态管理器 - EcuM
- PDU 路由器 - PduR
- LIN 状态管理器 - LinSM
- BSW 模式管理器 - BswM
- AUTOSAR COM - Com
- LIN 驱动程序 - Lin
- LIN 收发器驱动程序 - LinTrcv
上层
PDU 路由器和 CDD
LIN 接口连接到 PDU 路由器和/或上述其他模块(例如复杂驱动程序),被用于对帧的发送和接收。假设这些模块负责复制帧的数据以供接收和发送。对于 TP,PDU 路由器是对 LIN 接口而言唯一的上层模块,它将 TP 消息缓冲区作为完整消息或分片消息来处理。
镜像
LIN 接口也与总线镜像模块连接。如果启用了镜像功能,所有被接收和发送的 LIN 帧的内容都会被报告。TP 消息不会被报告给总线镜像模块。
LIN 状态管理器
LIN 接口与 LIN 状态管理器连接,后者负责整个 LIN 堆栈的控制流。因此,对于 LIN 接口其具有以下用途:
- 对于主节点,状态管理器将对调度表的请求转发到 LIN 接口。
- 状态管理器请求对唤醒命令的传输,对于主节点,其还请求对睡眠命令的传输。
BSW 模式管理器
作为 LIN 接口的一部分的 LIN TP 与 BSW 模式管理器连接,在上层请求 LIN TP 操作时,BSW 模式管理器被用于请求对调度表的变更。
AUTOSAR COM
被用作 LIN 从节点的 LIN 接口与 COM 连接以更新 response_error 信号的值。
底层
LIN 驱动程序
LIN 接口依赖在 [7] 中被指定的底层 LIN 驱动程序提供的服务。
LIN 接口假定 LIN 驱动程序提供以下原语:
- Lin_SendFrame
- 为 LIN 主节点传输(发送)帧的报头和响应部分。假设此原语还指示帧响应的方向(传输(发送)、接收或从节点间通信)。
- Lin_GoToSleep
- 向 LIN 主节点传输(发送)进入休眠命令。
- Lin_GoToSleepInternal
- 将 LIN 通道直接设置为 LIN_CH_SLEEP 状态,无需传输(发送)进入休眠命令。
- Lin_Wakeup
- 传输(发送)唤醒命令。
- Lin_WakeupInternal
- 将 LIN 通道设置为 LIN_CH_OPERATIONAL 状态,无需传输(发送)唤醒命令。
- Lin_GetStatus
- 为 LIN 主节点查询传输状态并接收帧的响应部分。区分以下情况:
- 接收/传输(发送)成功。
- 没有接收。
- 接收/传输(发送)错误(帧错误、bit 错误、校验和错误)。
- 正在进行接收 - 至少已收到一个响应字节,但尚未收到校验和字节。
- 正在传输(发送)。
- 通道处于休眠状态(进入休眠命令已被成功地传输(发送))。
对于 LIN 从节点,LIN 接口还假设 LIN 驱动程序还提供以下原语:
- LinIf_HeaderIndication
- 指示接收到了帧的报头。假设该原语也指示帧响应的方向(传输(发送)、接收或从节点间通信)。
- LinIf_RxIndication
- 指示收到了响应。
- LinIf_TxConfirmation
- 对已被传输的响应的确认。
- LinIf_LinErrorIndication
- 指示检测到通信错误事件,区分以下情况:
- 接收报头时发生的错误。
- 响应中的帧错误。
- 校验和错误。
- 对响应进行传输过程中出现的 bit 错误。
- 不完整的响应。
- 没有响应。
LIN 接口不使用或访问 LIN 硬件,也不以任何方式获取有关它的信息,除了上面列出的 LIN 驱动程序通过函数调用所提供的信息之外。
LIN 收发器驱动器
LIN 接口(可选地)需要在 [12] 中被指定的底层 LIN 收发器驱动程序的服务。
LIN 接口将以下为所有底层 LIN 收发器驱动程序提供的服务映射到一个唯一的接口。
- 对每个 LIN 收发器驱动程序的单独的模式请求和模式读取服务,以管理每个底层 LIN 收发器设备的运行模式。
- 读取 LIN 收发器的唤醒原因。
- 模式请求服务,用于启用/禁用/清除每个正在被使用的 LIN 收发器的唤醒事件的状态。
LIN 接口不使用或访问 LIN 硬件,也不以任何方式获取有关它的信息,除了上面列出的 LIN 驱动程序通过函数调用所提供的信息之外。
文件结构
头文件结构
本章介绍 LIN 接口和其他可能的模块将包含的头文件。
[SWS_LinIf_00497]
[ ]
- LIN 接口应包含“被定义为需要被 LIN 接口所连接的所有上层 BSW 模块包含”的文件,例如,在连接到 PDU 路由器的情况下,需要包含文件 PduR_LinIf.h。
[SWS_LinIf_00561]
[ ]
- 如果启用 LIN TP(配置参数 LinIfTpSupported),则 LIN 接口应包含文件 PduR_LinTp.h。
[SWS_LinIf_00555]
[ ]
- 如果配置参数 LinIfTrcvDriverSupported 被设置为 TRUE,则 LIN 接口应包含文件 LinTrcv.h。
[SWS_LinIf_00669]
[ ]
- LIN 接口应包含文件 <CDD_Cbk.h>,用于 CDD 的回调声明。可通过配置参数 LinIfPublicCddHeaderFile 对 <CDD_Cbk.h> 进行配置。
[SWS_LinIf_00872]
[ ]
- 如果启用总线镜像(配置参数 LinIfBusMirroringSupported),LIN 接口应包含头文件 Mirror.h。
需求可追溯性
本章包含一个矩阵,显示了为 LIN 接口定义的 SWS 需求与输入需求文档 (SRS) 之间的联系。
无需重新制定 ISO 17987 规范 [19] 中已被规定的要求。但是,AUTOSAR 中有一些具体细节和部分需要被明确地说明,因为此前对它们的说明不够详细或缺失。对这些部分的说明将在此处进行。
LIN 接口应支持 ISO 17987 规范中的主从行为。以下要求是基本要求,本章中的其余要求是对这些基本要求的细化。
[SWS_LinIf_00248]
[SRS_BSW_00425]
[SRS_Lin_01576]
[SRS_Lin_01504]
[SRS_Lin_01577]
- LIN 接口应支持 ISO 17987 规范中的主节点和从节点的行为。
上述要求基本上意味着来自 ISO 17987 节点的通信和来自 LIN 接口节点的通信将是平等的。
[SWS_LinIf_00249]
[ ]
- LIN 接口应实现 LIN 行为,以便可以重复使用现有的 LIN 节点。
[SWS_LinIf_00386]
[SRS_BSW_00328]
[SRS_Lin_01551]
- LIN 接口应能够处理一个或多个 LIN 通道。
帧传输(发送)
在 ISO 17987 规范中的所有功能均已被使用。该规范的某些部分需要被进一步地澄清和补充,以适应 LIN 接口。
帧类型
以下要求适用于 ISO 17987 规范中指定的不同帧类型。现有的帧类型包括:
- 无条件帧
- 事件触发帧
- 零星帧
- 诊断帧 MRF 和 SRF
- 保留帧
对不同帧的实际传输(发送)/ 接收在章节 7.1.2 帧接收和章节 7.1.3 帧传输(发送)中被详细说明。
无条件帧
这是 LIN 集群中使用的常规帧类型。在总线上对它的传输(发送)严格遵循调度表。
事件触发帧
事件触发帧用于启动从节点的零星传输。此类帧通常被用于非时间关键型功能。
根据节点(主节点和从节点)的实现类型,对此类帧的实现要求不同。
主节点中的事件触发帧
本章仅适用于 LIN 主节点。
由于多个从节点可能响应事件触发帧的报头,因此可能会发生冲突。传输(发送)数据的从节点应检测到这种情况并退出通信。
[SWS_LinIf_00588]
[ ]
- 如果在响应事件触发帧时发生冲突,则 LIN 接口应切换到相应的冲突解决调度表。
[SWS_LinIf_00176]
[ ]
- 检测到冲突后,LIN 接口应在当前帧的处理窗口结束时切换到给定的冲突解决调度表。
[SWS_LinIf_00519]
[ ]
- 冲突解决调度表由 LIN 接口配置(配置参数 LinIfCollisionResolvingRef)给出。
从节点中的事件触发帧
本章仅适用于 LIN 从节点。
是否传输(发送)对事件触发帧的响应由上层决定。因此,必须提供 API 调用,以将对事件触发帧的响应的传输状态设置为挂起。
[SWS_LinIf_00730]
[SRS_Lin_01571]
- LIN 接口应维护一个标志来保存每个对事件触发帧的响应的传输状态(在 ISO17987 规范中被定义)。
对事件触发帧的响应(无条件帧)的首字节为保留字节,其中存放无条件帧的 PID。
[SWS_LinIf_00731]
[SRS_Lin_01571]
- 如果接收到事件触发帧的报头,且对其的响应处于挂起状态,则 LIN 接口应在响应数据的第一个字节中填充无条件帧(响应)的 PID。响应的有效数据应在后续字节中被填充。
[SWS_LinIf_00732]
[SRS_Lin_01571]
- 一旦对事件触发帧的响应被成功地传输(发送),LIN 接口应清除与其对应的标志。当响应作为无条件帧被成功地传输时,此操作同样适用。
零星帧(仅主节点)
本章仅适用于 LIN 主节点。对于 LIN 从节点而言,接收到的零星帧与接收到的无条件帧没有区别。
ISO 17987 规范定义了零散帧。这里需要对零散帧进行更精确的定义:
- 零星帧间隙 - 这是零星帧中的占位符。之所以被命名为“间隙”,是因为零星帧没有 LIN 帧 ID。
- 零星帧 - 被附加到零星帧间隙后的无条件帧。
[SWS_LinIf_00012]
[ ]
- 主节点应是唯一被允许发送零星帧(在 ISO 17987 规范中被定义)的发送者。
[SWS_LinIf_00436]
[ ]
- 只有零星帧才应包含零星帧间隙(在 ISO 17987 规范中被定义)。
是否传输(发送)零星帧由上层决定。因此,必须提供 API 调用,以将零星帧的传输状态设置为挂起。
[SWS_LinIf_00470]
[ ]
- LIN 接口应标记出待传输的零星帧(在 ISO 17987 规范中被定义)。
[SWS_LinIf_00471]
[ ]
- LIN 接口应根据零星帧的优先级,在相关的零星帧传输时段内传输特定的零星帧(在 ISO 17987 规范中定义)。
零星帧的优先级取决于零星帧在 LDF 中的排列顺序,LDF 的优先级机制在此不适用。
[SWS_LinIf_00014]
[ ]
- 在同一传输时段内被传输的零星帧的优先级(在 ISO 17987 规范中被定义)由配置参数 LinIfFramePriority 定义。
诊断帧 MRF 和 SRF
主节点请求帧(MRF)和从节点响应帧(SRF)是具有固定 ID 的帧,被用于对 ISO 17987 节点的配置服务和对 TP 消息的传输。
诊断帧 MRF 和 SRF(仅主节点)
ISO 17987 规范对于“MRF 和 SRF 何时应被传输”以及“相应的传输时段何时开启”的规定较为模糊。LIN 接口负责处理调度(调度表管理器),因此能够获知 TP 传输何时进行。因此,可以提出以下要求:
[SWS_LinIf_00066]
[ ]
- 当传输时段开启且有数据需要被传输(发送)时,如果存在正在进行的 TP 传输、LIN 接口应发送 MRF。
注意
节点配置机制也使用 MRF,但上述要求仅当在调度表中遇到 MRF 时适用。节点配置应具有如下所示的特殊传输时段。
对于从节点响应帧,主节点仅发送报头。通常情况下,主节点始终会发送报头,因为主节点无法确定在帧的响应部分是否存在任何从节点需要发送的内容。例外情况是,在传输(发送)TP 帧序列期间,主节点希望阻止对此类帧的接收,因为没有缓冲区来存储它们。
[SWS_LinIf_00023]
[ ]
- 当传输时段开启时,LIN 接口应始终发送 SRF 报头,除非 TP 指示上层暂时无法提供接收所需的缓冲区。
保留帧
ISO 17987 规范不允许保留帧。
注意:
LIN 接口模块不支持传输保留帧(在 LIN 2.1 规范中被定义)。
帧接收
主节点中的帧接收
本章仅适用于 LIN 主节点。
LIN 主节点控制调度时间表,因此总线上的所有帧由其启动。
本章中的要求适用于主节点接收的所有(如果其被调度并等待被传输)帧类型(例如,存在 SRF 的传输时段可以为静默状态或等待传输状态)。
报头
[SWS_LinIf_00419]
[ ]
- 当对帧的接收的新传输时段开启时,LIN 接口应调用 LIN 驱动程序函数 Lin_SendFrame。
响应
当报头被传输后,LIN 驱动程序将自动被设置为接收状态。
状态检查
[SWS_LinIf_00030]
[ ]
- LIN 接口应通过调用函数 Lin_GetStatus 来确定 LIN 驱动程序的状态,最早可在帧的对大传输时段结束后,最晚可在下一个传输时段开启前。
对 LIN 接口的实现需要找到一种高效的方法来确定 LIN 驱动程序的状态。通常的实现方式是,当帧的对大传输时段结束后,在每次对 LinIf_MainFunction_<LinIfChannel.ShortName> 函数的调用中检查状态。在这种情况下,如果帧传输仍在进行(LIN 驱动程序处于繁忙状态),则应在下一次对 LinIf_MainFunction_<LinIfChannel.ShortName> 函数的调用中再次检查状态(当然,前提是当前 LinIf_MainFunction_<LinIfChannel.ShortName> 未启动新的帧传输)。
图 2 显示了如何在总线上启动和确认帧传输的示例。
[SWS_LinIf_00873]
[ ]
- 如果全局启用了总线镜像(配置参数 LinIfBusMirroringSupported),并且已通过调用 LinIf_EnableBusMirroring() 在此 LIN 通道上激活此功能,当在传输时段进行帧接收时,如果 LIN 接口读取 LIN 驱动程序的状态,则应调用 Mirror_ReportLinFrame(),如果读取到的状态为 LIN_RX_OK,则同时提供接收到的数据,否则,提供 NULL 指针。
[SWS_LinIf_00033]
[SRS_Lin_01502]
[SRS_Lin_01558]
- 仅当 LIN 接口确定 LIN 驱动程序的状态为 LIN_RX_OK 时,LIN 接口才会使用接收到的数据调用 <User_RxIndication>。
[SWS_LinIf_00259]
[ ]
- 当 LIN 接口正在接收事件触发帧且 LIN 驱动程序返回的状态为 LIN_RX_BUSY 或 LIN_RX_ERROR 时,LIN 接口不应将该状态视为错误。
由于可能发生碰撞,所以在第 7.1.1.2 章对其处理方式进行描述。如果没有任何从节点对事件触发帧的报头进行回复,则适用以下内容。
[SWS_LinIf_00258]
[ ]
- 当 LIN 接口接收到事件触发帧并确定 LIN 驱动程序的状态为 LIN_RX_NO_RESPONSE 时,LIN 接口不应将此状态视为错误。
[SWS_LinIf_00254]
[ ]
- 当 LIN 接口确定 LIN 驱动程序的状态为 LIN_RX_BUSY 或 LIN_RX_ERROR 时,LIN 接口应将接收到的帧视为已丢失的帧。如果该帧是无条件帧,LIN 接口应向默认错误跟踪器报告运行时错误代码 LINIF_E_RESPONSE。
[SWS_LinIf_00466]
[ ]
- 当 LIN 接口确定 LIN 驱动程序的状态为 LIN_RX_NO_RESPONSE 时,LIN 接口应将预期到来的帧视为已丢失的帧。如果该帧是无条件帧,LIN 接口应向默认错误跟踪器报告运行时错误代码 LINIF_E_RESPONSE。
如果总线出现干扰,LIN 接口可能无法发送报头。在这种情况下,ISO 17987 规范的原则是不向上层报告错误。此原则同样适用于已发送的帧和从节点间的帧。
从节点中的帧接收
本章仅适用于 LIN 从节点。
LIN 从节点不知晓 LIN 主节点的调度安排,它仅通过报头指示回调函数 LinIf_HeaderIndication 对 LIN 驱动程序报告的已接收的 LIN 报头做出反应。
本章中的要求适用于从节点接收的所有类型的帧。MRF 是个例外,仅 7.1.2.2.1 中的报头处理机制适用于它,对它的响应处理在 7.6.2 和 7.6.3 中被描述。
报头
[SWS_LinIf_00733]
[ ]
- If the PID of a received header is evaluated and belongs to a configured receive frame, before returning from the callback LinIf_HeaderIndication the LIN Interface shall set the PduPtr->Cs and PduPtr->Dl to the configured values and shall set the PduPtr->Drc to LIN_FRAMERESPONSE_RX.
- 如果对接收标头的 PID 进行评估并且其属于已配置的接收帧,则在从回调 LinIf_HeaderIndication 返回之前,LIN 接口应将 PduPtr->Cs 和 PduPtr->Dl 设置为配置的值,并将 PduPtr->Drc 设置为 LIN_FRAMERESPONSE_RX。
响应
每次对响应的接收完成后,都会通知 LIN 接口。LIN 驱动程序使用响应指示回调函数 LinIf_RxIndication 向 LIN 接口指示成功地接收了响应,使用错误指示回调函数 LinIf_LinErrorIndication 指示不成功地接收了响应。
[SWS_LinIf_00734]
[SRS_Lin_01502]
[SRS_Lin_01558]
- 如果调用了函数 LinIf_RxIndication,LIN 接口应使用接收到的数据和有效负载的长度调用 <User_RxIndication>。
[SWS_LinIf_00838]
[ ]
- 如果全局启用了总线镜像(配置参数 LinIfBusMirroringSupported),并且已通过调用 LinIf_EnableBusMirroring() 在此 LIN 通道上激活此功能,则每次在该通道上调用 LinIf_RxIndication 时,LIN 接口都应使用状态代码 LIN_RX_OK 和指向接收到的数据的指针调用 Mirror_ReportLinFrame()。
[SWS_LinIf_00735]
[ ]
- 如果调用 LinIf_LinErrorIndication 函数,LIN 接口应将响应视为已丢失的响应。因此,除非 LinIf_LinErrorIndication 的错误代码为 LIN_ERR_HEADER,否则 LIN 接口应向默认错误跟踪器报告运行时错误代码 LINIF_E_RESPONSE。
[SWS_LinIf_00736]
[ ]
- 如果报告的错误类型为 LIN_ERR_RESP_STOPBIT、LIN_ERR_RESP_CHKSUM、LIN_ERR_RESP_DATABIT 或 LIN_ERR_INC_RESP,则 LIN 接口应设置 response_error 信号(参见 [SWS_LinIf_00764])。
[SWS_LinIf_00846]
[ ]
- 在预期收到响应指示的情况下,如果 LinIf_HeaderIndication 被调用,LIN 接口应将接收到的帧视为已丢失的帧。因此,LIN 接口应向默认错误跟踪器报告运行时错误代码 LINIF_E_RESPONSE。在这之后,应处理接收到的 LIN 报头。
[SWS_LinIf_00869]
[ ]
- 如果全局启用了总线镜像(配置参数 LinIfBusMirroringSupported),并且已通过调用 LinIf_EnableBusMirroring() 在此 LIN 通道上激活此功能,则每次在该通道上调用 LinIf_LinErrorIndication 时,如果 LinIf_LinErrorIndication 的错误代码不为 LIN_ERR_HEADER,LIN 接口都应使用错误代码和 NULL 指针调用 Mirror_ReportLinFrame()。
[SWS_LinIf_00870]
[ ]
- 在调用 Mirror_ReportLinFrame() 之前,LIN 接口应将 LinIf_LinErrorIndication 报告的错误代码转换为 Lin_StatusType 的错误代码。错误代码 LIN_ERR_RESP_STOPBIT 应被映射到 LIN_TX_ERROR 或 LIN_RX_ERROR,具体取决于当前帧的方向。错误代码 LIN_ERR_RESP_CHKSUM 和 LIN_ERR_INCOMP_RESP 应被映射到 LIN_RX_ERROR。错误代码 LIN_ERR_NO_RESP 应被映射到 LIN_RX_NO_RESPONSE。错误代码 LIN_ERR_RESP_DATABIT 应被映射到 LIN_TX_ERROR。
原理:
Mirror_ReportLinFrame() 需要一个 Lin_StatusType 参数。
帧传输
主节点中的帧传输
本章仅适用于 LIN 主节点。
当新的传输时段开启时,LIN 帧将在 LinIf_MainFunction_<LinIfChannel.ShortName> 中被传输。
本章中的要求适用于主节点发送的所有(如果其被调度并等待被传输)帧类型(例如,已被调度的无条件帧始终等待被传输,零星帧的传输时段可能为静默状态或等待传输状态)。
报头和响应
[SWS_LinIf_00225]
[ ]
- 当帧传输的传输时段开启时,LIN 接口应使用包含缓冲区数据(SduDataPtr)和缓冲区长度(SduLength)的 PduInfoPtr 指针调用函数 <User_TriggerTransmit> 来获取帧的数据部分(LIN 帧(响应)中的数据)。
[SWS_LinIf_00226]
[ ]
- 获取帧的数据部分后(当函数 <User_TriggerTransmit> 返回 E_OK 时),LIN 接口应使用指向数据部分的指针调用 LIN 驱动程序的函数 Lin_SendFrame。
[SWS_LinIf_00706]
[ ]
- 当函数 <User_TriggerTransmit> 返回 E_NOT_OK 时,LIN 接口不得通过零星帧或无条件帧传输所请求的数据。
状态检查
[SWS_LinIf_00874]
[ ]
- 如果全局启用了总线镜像(配置参数 LinIfBusMirroringSupported),并且已通过调用 LinIf_EnableBusMirroring() 在此 LIN 通道上激活此功能,则每次在该通道上通过 LIN 驱动程序读取传输时段的状态后,当状态为 LIN_TX_OK 时,LIN 接口应使用指向被传输的数据的指针调用 Mirror_ReportLinFrame(),否则使用 NULL 指针调用 Mirror_ReportLinFrame()。
[SWS_LinIf_00128]
[SRS_Lin_01502]
[SRS_Lin_01558]
- 如果函数 Lin_GetStatus 返回 LIN_TX_OK,则 LIN 接口应使用结果 E_OK 调用 <User_TxConfirmation> 回调。
[SWS_LinIf_00728]
[ ]
- 如果函数 Lin_GetStatus 返回 LIN_TX_ERROR 或 LIN_TX_BUSY,则 LIN 接口应使用结果 E_NOT_OK 调用 <User_TxConfirmation> 回调。
[SWS_LinIf_00036]
[ ]
- 当函数 Lin_GetStatus 返回 LIN_TX_ERROR 时,如果尝试对任何 LIN 帧进行传输,则 LIN 接口应将被传输的帧视为已丢失的帧,并将运行时错误代码 LINIF_E_RESPONSE 报告给默认错误跟踪器。
[SWS_LinIf_00465]
[ ]
- 在新的帧被传输之前,如果函数 Lin_GetStatus 返回 LIN_TX_BUSY,则 LIN 接口应将上一次传输的帧视为已丢失的帧,并向默认错误跟踪器报告运行时错误代码 LINIF_E_RESPONSE。
[SWS_LinIf_00463]
[ ]
- 如果 LIN 接口成功地传输了零星帧,则应重置其待处理标志。
注意
零星帧不应与 PduR FIFO(PduRTxBufferDepth > 1)结合使用。
从节点中的帧传输
本章仅适用于 LIN 从节点。
LIN 从节点不知晓 LIN 主节点的调度安排,它仅通过报头指示回调函数 LinIf_HeaderIndication 对 LIN 驱动程序报告的已接收的 LIN 报头做出反应。
本章中的要求适用于从节点传输的所有类型的帧。SRF 是个例外,其仅适用本章的 SWS_LinIf_00739 和 SWS_LinIf_00743 要求,对其的其他处理在 7.6.2 和 7.6.3 中被描述。对于事件触发帧也有特殊的处理,在 7.1.1.2.2 中被描述。
报头
[SWS_LinIf_00738]
[ ]
- 当调用 LinIf_HeaderIndication 并且 PID 被评估为待被传输的帧,则 LIN 接口应使用 PduInfoPtr->SduDataPtr 和 PduInfoPtr->SduLength 调用 <User_TriggerTransmit> 以获取帧的数据部分(LIN 帧(响应)中的数据),其中,PduInfoPtr->SduDataPtr 被设置为由 PduPtr->SduPtr 提供的缓冲区,PduInfoPtr->SduLength 被设置为配置的长度。
如果帧类型是事件触发帧,请参阅 [SWS_LinIf_00731]。
[SWS_LinIf_00739]
[ ]
- 获取帧的数据部分后(当函数 <User_TriggerTransmit> 返回 E_OK 或 SRF 数据由节点配置处理程序或传输协议提供时),在从回调 LinIf_HeaderIndication 返回之前,LIN 接口应将 PduPtr->Cs 和 PduPtr->Dl 设置为被配置的值,并将 PduPtr->Drc 设置为 LIN_FRAMERESPONSE_TX。
[SWS_LinIf_00740]
[ ]
- 当函数 <User_TriggerTransmit> 返回 E_NOT_OK 时,LIN 接口应在从回调 LinIf_HeaderIndication 返回之前将 PduPtr->Drc 设置为LIN_FRAMERESPONSE_IGNORE。
原理:
避免在总线上传输无效数据。
响应
每次响应被传输完成后,都会通知 LIN 接口。当传输成功时,LIN 驱动程序使用响应确认回调函数 LinIf_TxConfirmation 通知 LIN 接口,当传输失败时,使用错误指示回调函数 LinIf_LinErrorIndication 通知 LIN 接口。
[SWS_LinIf_00741]
[SRS_Lin_01502]
[SRS_Lin_01558]
- 如果调用函数 LinIf_TxConfirmation,LIN 接口应使用结果 E_OK 调用 <User_TxConfirmation> 回调。
[SWS_LinIf_00747]
[ ]
- 如果调用函数 LinIf_TxConfirmation,并且被传输的帧包含 response_error 信号,则 LIN 接口应清除 response_error 信号。
如果帧类型是事件触发帧或无条件帧,请参阅 [SWS_LinIf_00732]。
[SWS_LinIf_00847]
[ ]
- 在预期收到对响应的传输确认时,如果 LinIf_HeaderIndication 被调用,LIN 接口应将已传输的帧视为已丢失的帧。因此,LIN 接口应向默认错误跟踪器报告运行时错误代码 LINIF_E_RESPONSE。之后,应处理接收到的 LIN 报头。
[SWS_LinIf_00839]
[ ]
- 如果全局启用了总线镜像(配置参数 LinIfBusMirroringSupported),并且已通过调用 LinIf_EnableBusMirroring() 在此 LIN 通道上激活此功能,则每次在该通道上调用 LinIf_TxConfirmation 时,LIN 接口都应使用状态代码 LIN_TX_OK 和指向被传输的数据的指针调用 Mirror_ReportLinFrame()。
[SWS_LinIf_00742]
[ ]
- 如果函数 LinIf_LinErrorIndication 被调用,LIN 接口应使用结果 E_NOT_OK 调用 <User_TxConfirmation> 回调。
[SWS_LinIf_00743]
[ ]
- 如果函数 LinIf_LinErrorIndication 被调用,则 LIN 接口应将被传输的帧视为已丢失的帧,并向默认错误跟踪器报告运行时错误代码 LINIF_E_RESPONSE,除非 LinIf_LinErrorIndication 的错误代码为 LIN_ERR_HEADER。
[SWS_LinIf_00744]
[ ]
- 如果 LinIf_LinErrorIndication 报告的错误代码为 LIN_ERR_RESP_STOPBIT、LIN_ERR_RESP_CHKSUM 或 LIN_ERR_RESP_DATABIT,则 LIN 接口应设置 response_error 信号(参见 [SWS_LinIf_00764])。
有关调用 LinIf_LinErrorIndication 时向总线镜像模块报告的机制,请参阅 [SWS_LinIf_00869] 和 [SWS_LinIf_00870]。
从节点间通信(仅主节点)
本章仅适用于 LIN 主节点。
帧的第三种被传输方式是从节点到从节点的通信。这是受支持但不被推荐的 LIN 总线使用方式。它会在从节点之间建立不理想的依赖关系。
报头
[SWS_LinIf_00416]
[ ]
- 当从节点到从节点的通信的新传输时段开启时,LIN 接口应调用 LIN 驱动程序的函数 Lin_SendFrame。
响应
[SWS_LinIf_00417]
[ ]
- LIN 接口不应参与从节点到从节点的通信,无论是对响应的传输还是接收。
状态检查
[SWS_LinIf_00418]
[ ]
- 在传输从节点到从节点的通信的响应后,LIN 接口不应检查 LIN 驱动程序的状态。
不相关通信(仅从节点)
本章仅适用于 LIN 从节点。
响应的第三种被传输方式是不相关帧的响应。
[SWS_LinIf_00748]
[ ]
- 如果 LinIf_HeaderIndication 被调用并且 PID 被评估为与从节点无关的帧,则在从回调 LinIf_HeaderIndication 返回之前,LIN 接口应将 PduPtr->Drc 设置为 LIN_FRAMERESPONSE_IGNORE。
LIN 驱动程序不会对不相关的帧调用 LinIf_RxIndication 或 LinIf_TxConfirmation。
调度(仅主节点)
本章仅适用于 LIN 主节点。
调度表是 LIN 集群中所有通信的基础。由于 LIN 接口始终作为 LIN 主节点运行,因此必须处理调度表。
每个通道可能有单独的调度表集合。帧与帧之间的时间间隔(延迟)是特定集群的时基的倍数。
[SWS_LinIf_00261]
[ ]
- 两帧之间的时间间隔应是配置参数 LinIfMainFunctionPeriod 给出的周期时间的倍数。
[SWS_LinIf_00231]
[ ]
- LIN 接口应为每个通道提供一个预定义的调度表(名为 NULL_SCHEDULE)。
[SWS_LinIf_00263]
[ ]
- 调度表 NULL_SCHEDULE 不应包含任何条目。
调度表管理器
ISO 17987 规范中没有定义调度表管理器。
调度表管理器处理调度表并因此指示何时对帧进行传输和接收。
LIN 接口的调度表管理器支持两种类型的调度表:RUN_CONTINUOUS 和 RUN_ONCE。
支持两种调度表的思路是,有一组被定义为 RUN_CONTINUOUS 的“常规”调度表,在正常通信中被执行。RUN_ONCE 调度表被用于向 LIN 集群发出特定的请求。RUN_ONCE 调度表的使用示例如下:
- 发起诊断会话
- 进行 ISO 17987 节点配置
- 轮询事件触发帧或零星帧
[SWS_LinIf_00727]
[ ]
- 执行调度表切换的时间点取决于可选配置参数 LinIfScheduleChangeNextTimeBase。如果 LinIfScheduleChangeNextTimeBase 被禁用或缺失,则调度表应在当前活动的调度表的当前传输时段结束后被切换。如果 LinIfScheduleChangeNextTimeBase 被启用,则调度表应在传输时段中的消息被发送或接收完成(通过状态检查来确保发送和接收已完成)后被切换。
注意:
调度表切换的发生条件由 [SWS_LinIf_00176]、[SWS_LinIf_00293]、[SWS_LinIf_00393]、[SWS_LinIf_00588]、[SWS_LinIf_00617]、[SWS_LinIf_00656]、[SWS_LinIf_00660] 和 [SWS_LinIf_00664] 给出。
NULL_SCHEDULE 需要被特殊处理。因为其应该可以被随时设置。
[SWS_LinIf_00444]
[ ]
- 如果 LIN 接口的所在的总线正在请求 NULL_SCHEDULE(或在初始化或休眠的情况下被设置),则 LIN 接口的调度表管理器应在下一个可能的时间点将调度表切换为 NULL_SCHEDULE(即使当前的调度表类型是 RUN_ONCE)。
LIN 接口允许将当前调度表切换为另一个调度表或当前调度表(的开头)。函数 LinIf_ScheduleRequest 将选择要执行的调度表。切换调度表的实际操作如下:
[SWS_LinIf_00028]
[SRS_Lin_01546]
- 如果当前调度表类型为 RUN_CONTINUOUS,则 LIN 接口应在下一个可能的时间点(例如,在传输时段开始时)启动被请求的新的调度表。
注意:
可以请求切换到当前的调度表。在这种情况下,当前的调度表将被重新执行。
[SWS_LinIf_00393]
[SRS_Lin_01546]
- 对于 RUN_ONCE 类型的调度表,LIN 接口应先从第一个条目执行到最后一个条目,然后切换到新的调度表。但是,如果在对事件触发帧的响应中发生冲突,根据 [SWS_LinIf_00176],LIN 接口应切换到冲突解决调度表。
[SWS_LinIf_00495]
[SRS_Lin_01564]
- 如果调度表切换已经被执行,调度表管理器应调用函数<User>_ScheduleRequestConfirmation。
对于零星帧,调度表切换意味着这些帧的状态不受影响。
[SWS_LinIf_00029]
[ ]
- 当调度表发生切换时,不应清除零星帧的状态。
[SWS_LinIf_00397]
[ ]
- 如果在 RUN_ONCE 类型的调度表之后没有其他调度请求需要被处理,则 LIN 接口应执行最近执行的类型为 RUN_CONTINUOUS 的调度表。
[SWS_LinIf_00485]
[ ]
- 如果 RUN_CONTINUOUS 类型的调度表被 RUN_ONCE 类型的调度表打断,则“从该调度表的哪个条目继续执行”可通过配置参数 LinIfResumePosition 进行配置。
注意:
由于 LinIf_Init 函数会设置 NULL_SCHEDULE,这意味着始终存在一个最近请求的调度表。
主函数
LinIf_MainFunction_<LinIfChannel.ShortName> 是 LIN 接口的主函数。它必须定期被调用。
对于 LIN 主节点,函数 LinIf_MainFunction_<LinIfChannel.ShortName> 的任务是轮询调度表管理器、启动帧的传输和接收并与上下层交互。
对于 LIN 从节点,函数 LinIf_MainFunction_<LinIfChannel.ShortName> 的任务是监控不同的时序。帧处理以及与上下层的交互是在任务中被处理,还是在 LIN 接口回调函数中被处理,取决于具体实现。
SchM 将定期地调用函数 LinIf_MainFunction_<LinIfChannel.ShortName>,周期由配置参数 LinIfMainFunctionPeriod 给出。
网络管理
本章描述的网络管理基于 ISO 17987 网络管理,不得与 AUTOSAR 网络管理混淆。
除了唤醒请求和进入休眠命令外,网络管理还被扩展了节点管理功能。节点管理比 ISO 17987 规范更精确地描述了节点的运行方式。
节点管理
LIN 接口应作为状态机运行。连接到 LIN 接口的每个物理通道都在一个子状态机中运行。
LIN 接口状态机
[SWS_LinIf_00039]
[ ]
- LIN 接口应具有一个状态机。该状态机如图 3(主节点)和图 4(从节点)所示。
[SWS_LinIf_00438]
[SRS_BSW_00335]
- LIN 接口状态机应具有状态 LINIF_UNINIT。
[SWS_LinIf_00439]
[SRS_BSW_00335]
- LIN 接口状态机应具有状态 LINIF_INIT。
[SWS_LinIf_00381]
[ ]
- 当调用了函数 LinIf_Init 时,LIN 接口状态机应从 LINIF_UNINIT 切换到 LINIF_INIT。
LIN 通道子状态机
图 3(主节点)和图 4(从节点)分别描绘了状态 LINIF_INIT 的子状态机。
[SWS_LinIf_00290]
[ ]
- 每个 LIN 通道应具有单独的状态机。
[SWS_LinIf_00441]
[SRS_BSW_00335]
- LIN 通道子状态机应具有 LINIF_CHANNEL_OPERATIONAL 状态。
注意:
当 LIN 通道子状态机处于 LINIF_CHANNEL_OPERATIONAL 状态时,相应的 LIN 通道应被初始化并正常运行。
[SWS_LinIf_00189]
[ ]
- 仅当相应的 LIN 通道子状态机处于 LINIF_CHANNEL_OPERATIONAL 状态时,LIN 接口才应接收/发送 LIN 帧的报头和响应。
[SWS_LinIf_00053]
[ ]
- 在 LINIF_CHANNEL_OPERATIONAL 状态下,LIN 接口应在 LinIf_MainFunction_<LinIfChannel.ShortName> 函数中处理当前选中的调度表。此要求仅适用于 LIN 主节点。
[SWS_LinIf_00507]
[ ]
- 当调用函数 LinIf_Init 时,LIN 接口应从 LINIF_UNINIT 状态切换到 LINIF_CHANNEL_SLEEP 状态,而无需发送进入休眠命令。
注意:
假设外部从节点最早会在总线处于非活动状态 4 秒后自动进入休眠模式,最晚会在总线处于非活动状态 10 秒后自动进入休眠模式(如 ISO 17987 规范中所述)。AUTOSAR 从节点在休眠模式下被初始化。
[SWS_LinIf_00442]
[SRS_BSW_00335]
- LIN 通道子状态机应具有 LINIF_CHANNEL_SLEEP 状态。
[SWS_LinIf_00478]
[ ]
- 当对相应通道有效地调用 LinIf_Wakeup 并启动唤醒流程时,LIN 接口应从 LINIF_CHANNEL_SLEEP 状态切换为 LINIF_CHANNEL_OPERATIONAL 状态。
注意:
进入或退出 LINIF_CHANNEL_SLEEP 状态时,LIN 接口不得将硬件接口或单片机的电源模式设置为新的电源模式。
[SWS_LinIf_00043]
[ ]
- 当 LIN 通道处于 LINIF_CHANNEL_SLEEP 状态时,函数 LinIf_MainFunction_<LinIfChannel.ShortName> 不得在总线上为相应的 LIN 通道启动任何传输。
主节点和从节点进入休眠模式的方式有显著不同。
当上层发出请求时,LIN 主节点发出进入休眠命令,将总线上的所有从节点设置为休眠模式。
LIN 从节点通过“接收进入休眠命令的方式”或“检测到总线不活动的方式”进入休眠模式。
主节点中的进入休眠流程
本章仅适用于 LIN 主节点。
LinIf_GotoSleep 函数会在选定的通道/控制器上启动“进入休眠”的转换。该转换通过发送 LIN 诊断主节点请求帧来实现,该帧的第一个数据字节等于 0(零)。在 ISO 17987 规范中,这被称为“进入休眠”命令。
[SWS_LinIf_00453]
[ ]
- 如果在处理进入休眠命令时通道不处于 LINIF_CHANNEL_SLEEP 状态,函数 LinIf_MainFunction_<LinIfChannel.ShortName> 应在下一个传输时段开启时调用函数 Lin_GoToSleep,而不是处理待被处理的帧。
[SWS_LinIf_00597]
[ ]
- 如果在处理进入休眠命令时通道处于 LINIF_CHANNEL_SLEEP 状态,函数 LinIf_MainFunction_<LinIfChannel.ShortName> 应在下一个传输时段开启时调用函数 Lin_GoToSleepInternal,而不是处理待被处理的帧。
原理:
这将防止因传输“进入休眠”命令而唤醒连接的 LIN 从节点。
这意味着函数 LinIf_MainFunction_<LinIfChannel.ShortName> 可以在从“上一帧传输完成”到“下一个传输时段开启前”之间的时间间隔内调用函数 Lin_GoToSleep。这取决于具体实现。
[SWS_LinIf_00712]
[ ]
- 当调用函数 Lin_GoToSleep 或 Lin_GotoSleepInternal 时,函数 LinIf_MainFunction_<LinIfChannel.ShortName> 应清除所选通道的唤醒标志。(参见 [SWS_LinIf_00716])
[SWS_LinIf_00455]
[ ]
- 处理“进入休眠”命令时,函数 LinIf_MainFunction_<LinIfChannel.ShortName> 应在休眠模式帧的延迟时间结束后调用 LIN 驱动程序的 Lin_GetStatus 函数。当 Lin_GetStatus 返回 LIN_CH_SLEEP 时,函数 LinIf_MainFunction_<LinIfChannel.ShortName> 应将对应的 LIN 通道子状态机设置为 LINIF_CHANNEL_SLEEP。此时,对“进入休眠”命令的传输已成功被执行。
[SWS_LinIf_00454]
[ ]
- 处理“进入休眠”命令时,函数 LinIf_MainFunction_<LinIfChannel.ShortName> 应在休眠模式帧的延迟时间结束后调用 LIN 驱动程序的 Lin_GetStatus 函数。当 Lin_GetStatus 的返回值不是 LIN_CH_SLEEP 时,表示“进入休眠”命令传输失败。
[SWS_LinIf_00557]
[ ]
- 当“进入休眠”命令被成功地发送或函数 Lin_GoToSleepInternal 被调用时,LIN 接口应使用参数 TRUE 调用 <User>_GotoSleepConfirmation 函数。
[SWS_LinIf_00558]
[ ]
- 当“进入休眠”命令未被成功地发送时,LIN 接口应使用参数 FALSE 调用 <User>_GotoSleepConfirmation 函数。
[SWS_LinIf_00293]
[ ]
- 在处理“进入休眠”命令过程(进入 LINIF_CHANNEL_SLEEP 状态)中,函数 LinIf_MainFunction_<LinIfChannel.ShortName> 应将当前的调度表切换为 NULL_SCHEDULE。
从节点中的进入休眠流程
本章仅适用于 LIN 从节点。
从节点中有两个不同的事件会启动“进入休眠”的转换,即“接收“进入休眠”命令”和“总线空闲超时发生”。
接收“进入休眠”命令
[SWS_LinIf_00750]
[ ]
- 如果函数 LinIf_RxIndication 被调用,并且接收到的帧是 MRF,其中第一个数据字节(NAD)等于 0,则表示已收到“进入休眠”命令,则应执行“进入休眠”的转换。
总线空闲
[SWS_LinIf_00751]
[SRS_Lin_01596]
- LIN 接口应为每个通道单独提供监控总线空闲超时(配置参数 LinIfBusIdleTimeoutPeriod)的功能,以检测由总线空闲产生的“进入休眠”的转换事件。
[SWS_LinIf_00752]
[ ]
- 当进入 LINIF_CHANNEL_OPERATIONAL 状态时,LIN 接口应启动总线空闲超时监控。
[SWS_LinIf_00753]
[ ]
- 当进入 LINIF_CHANNEL_SLEEP 状态时,LIN 接口应停止总线空闲超时监控。
[SWS_LinIf_00754]
[ ]
- 如果在调用 LinIf_HeaderIndication、LinIf_RxIndication、LinIf_TxConfirmation 或 LinIf_LinErrorIndication 时伴随有任何错误码,LIN 接口都应重启正在运行的总线空闲超时监控计时器。
[SWS_LinIf_00755]
[SRS_Lin_01596]
- 如果发生总线空闲超时,则应执行“进入休眠”的转换。
“进入休眠”的转换
[SWS_LinIf_00756]
[ ]
- 由于 [SWS_LinIf_00750] 或 [SWS_LinIf_00755],LIN 接口应调用 <User>_GotoSleepIndication 函数。
[SWS_LinIf_00757]
[ ]
- 当调用 LinIf_GotoSleep 函数时,LIN 接口应直接调用 Lin_GotoSleepInternal(而不是等待在主函数的下一次调度中调用)函数。
原理:
LIN 驱动程序必须在 LIN_CH_SLEEP 状态下才能(在总线上)接收唤醒帧。
注意:
LinIf_GotoSleep 可能在 <User>_GotoSleepIndication 的上下文中被调用。
[SWS_LinIf_00758]
[ ]
- 函数 Lin_GotoSleepInternal 被调用后,LIN 接口应清除所选通道的唤醒标志。(参见 [SWS_LinIf_00716])。
[SWS_LinIf_00759]
[ ]
- 函数 Lin_GoToSleepInternal 被调用后,LIN 接口应使用参数 TRUE 调用 <User>_GotoSleepConfirmation 函数。
唤醒流程
有多种可能导致 LIN 通道被唤醒。要么由上层调用 LinIf_Wakeup 函数唤醒 LIN 通道,要么 LIN 通道因检测到总线唤醒事件而被唤醒。如果检测到总线唤醒事件,则在 LinIf_CheckWakeup 函数成功地验证唤醒源后且上层进入 FULL_COM 模式时,LinIf_Wakeup 函数会被调用。
主节点中的唤醒流程
本章仅适用于 LIN 主节点。
[SWS_LinIf_00496]
[ ]
- 当函数 LinIf_Wakeup 的返回值为 E_OK 时,LIN 接口应使用参数 TRUE 调用 <User>_WakeupConfirmation 函数。
[SWS_LinIf_00670]
[ ]
- 当函数 LinIf_Wakeup 的返回值为 E_NOT_OK 时,LIN 接口应使用参数 FALSE 调用 <User>_WakeupConfirmation 函数。
在“进入休眠”的转换中发生的唤醒(主节点)
It may happen that the upper layer requests a wake-up, when the upper layer has requested the go-to-sleep command to be transmitted and while it is pending (from the go-to-sleep request until the status check of the frame). In this case, the following shall apply:
当上层请求发送“进入休眠”命令,且该请求正在被处理(从请求“进入休眠”到检查帧的发送状态)时,上层可能会请求唤醒操作。在这种情况下,应遵循以下规则:
[SWS_LinIf_00459]
[SRS_Lin_01560]
- 如果已请求发送“进入休眠”命令,并且在“进入休眠”命令被执行之前上层请求唤醒操作,则 LIN 接口既不应发送“进入休眠”命令,也不应在总线上进行唤醒操作,并且应维持 LIN 通道的状态为 LINIF_CHANNEL_OPERATIONAL。
[SWS_LinIf_00460]
[ ]
- 在“进入休眠”命令被处理期间,当 LIN 接口使用 LIN 驱动程序的 Lin_GetStatus 函数检查硬件通道状态时,如果该函数的返回值为 LIN_CH_SLEEP,LIN 接口应调用 Lin_Wakeup 函数唤醒通道。
[SWS_LinIf_00699]
[ ]
- 对于 [SWS_LinIf_00460],LIN 接口不得调用 <User>_GotoSleepConfirmation 函数。
本章仅适用于 LIN 从节点。
在没有发生总线唤醒事件的情况下,如果上层请求唤醒操作,则唤醒流程将通过传输唤醒帧来启动,当主节点开始调度(即从节点接收到第一个 LIN 报头)时表示流程完成。
[SWS_LinIf_00761]
[ ]
- 在调用 LinIf_Wakeup 之后第一次调用函数 LinIf_HeaderIndication 时,如果返回值为 E_OK,LIN 接口应使用参数 TRUE 调用 <User>_WakeupConfirmation 函数。
[SWS_LinIf_00762]
[ ]
- 在从函数 LinIf_Wakeup 返回 E_NOT_OK 之前,LIN 接口应使用参数 FALSE 调用 <User>_WakeupConfirmation 函数。
注意:
如果 LinIf_Wakeup 返回 E_OK,但 LIN 主节点随后未开始调度,则总线唤醒失败。在这种情况下,<User>_WakeupConfirmation 不会被调用,这将导致 LIN 状态管理器发生超时。
在“进入休眠”的转换中发生的唤醒(从节点)
本章仅适用于 LIN 从节点。
在“进入休眠”转换期间,即调用 Lin_GotoSleepInternal 函数之后,进入休眠模式并调用 <User>_GotoSleepConfirmation 函数之前,上层可能会请求唤醒操作。在这种情况下,应遵循以下规则:
[SWS_LinIf_00760]
[ ]
- 当 LIN 接口已启动“进入休眠”转换,且上层在“进入休眠”转换完成之前请求唤醒时,LIN 接口不得调用 <User>_GotoSleepConfirmation 函数,而应通过调用 Lin_Wakeup 函数以启动唤醒流程并唤醒通道。
状态管理
LIN 接口必须能够按照 ISO 17987 规范描述的方式报告总线上的通信错误。然而,报告方式有所不同。
节点自身内部有一个报告机制(通过使用 ISO 17987 规范中定义的 API - l_ifc_read_status),用于设置 Error_in_response(不要与从节点 Response_Error 信号混淆)和 Succesful_transfer 位。此处的策略是仅报告错误,而不监控成功的传输。
Error_in_response 的条件将在 LIN 接口中被设置,其设置方式与 ISO 17987 规范中的描述相同,但报告方式不同。主节点对 Error_in_reponse 的处理方式在 7.1.2.1.3 和 7.1.3.1.2 章节中被描述,从节点的在 7.1.2.2.2 和 7.1.3.2.2 章节中被描述。
Response_error 信号(仅从节点)
本章仅适用于 LIN 从节点。
response_error 信号是一个数据长度为 1 位(bit)的信号,每个从节点都会在其发送的无条件帧中将其发布给主节点。该信号用于向 LIN 集群报告通信状态。
[SWS_LinIf_00763]
[SRS_Lin_01595]
- The LIN Interface shall provide the autonomous handling of the response_error signal on each slave channel.
- LIN 接口应提供每个从属通道上对 respond_error 信号的自主处理。
注意:
配置需要确保 LinIf 是唯一对 response_error 信号具有写访问权限的用户。
[SWS_LinIf_00764]
[SRS_Lin_01595]
- LIN 接口应调用函数 Com_SendSignal 来更新 response_error 信号的值。
设置 response_error 信号的条件在 [SWS_LinIf_00736] 和 [SWS_LinIf_00744] 中被定义。清除 response_error 信号的条件在 [SWS_LinIf_00747] 中定义。
[SWS_LinIf_00765]
[ ]
- 每当 response_error 信号的值发生变化时,LIN 接口应使用 response_error 信号的当前值调用 <User_ResponseErrorSignalChanged> 函数。
[SWS_LinIf_00766]
[ ]
- 对函数 <User_ResponseErrorSignalChanged> 的支持是可选的,可在预编译阶段通过配置参数 LinIfResponseErrorSignalChangedCallout 启用。
诊断和节点配置
注意,这里的节点配置是指在 ISO 17987 规范中被描述的配置,与 AUTOSAR 配置无关。
ISO17987-3 规范中的节点配置是关于配置从节点以便使其能够在 LIN 集群中运行并使 LIN 集群中无冲突存在(就配置的 NAD 和帧 ID 而言)。
ISO 17987 规范中的诊断传输层和节点配置共用 MRF 和 SRF。由于节点配置使用固定帧类型,因此这在主节点中不会造成冲突。对于从节点,必须对接收到的 MRF 和 SRF 进行评估,并将其发送给负责处理的用户(传输层或节点配置处理程序)。
主节点中的节点配置
本章仅适用于 LIN 主节点。
ISO 17987 规范规定了 LIN 主节点配置从节点的两种方式:
- 通过使用 ISO 17987 中的 API 并直接使用调度表中的服务。
- 通过使用已定义的节点配置 API。
这里的思路是将节点配置服务存储在配置中。因此,仅使用调度表方法。
[SWS_LinIf_00401]
[SRS_Lin_01590]
- LIN 接口只能通过直接使用调度表中的服务来进行节点配置(在 ISO 17987 规范中被定义)。
节点配置服务
LIN 接口提供符合 ISO 17987 规范的节点配置服务。节点配置服务使用与 LIN TP 相同的 LIN 帧结构。节点配置服务仅使用单帧 (SF) 进行传输。
[SWS_LinIf_00309]
[ ]
- LIN 接口应支持节点配置请求“分配帧 ID”(在 LIN 2.0 规范中被定义)、“分配帧 ID 范围”(在 ISO 17987 规范中被定义)、“取消分配帧 ID”(在 LIN 2.0 规范中被定义)和“保存配置”(在 ISO 17987 规范中被定义)。
[SWS_LinIf_00409]
[ ]
- LIN 接口应支持 FreeFormat(在 ISO 17987 规范中被定义)。
ISO 17987 规范中未定义 FreeFormat 的响应。因此,无法处理从节点的响应。
[SWS_LinIf_00310]
[SRS_BSW_00171]
- 对节点配置请求“分配 NAD”的支持(在 ISO 17987-3 规范中被定义)应在预编译阶段通过配置参数 LinIfNcOptionalRequestSupported 进行配置。
注意:
LIN 接口不支持对节点配置请求的数据进行转储,因为 ISO 17987 规范规定数据转储请求不得在运行中的集群中被使用。
调度表中的节点配置
ISO 17987 规范允许在调度表中进行节点配置,这将应用程序与此功能解耦。因此,可以将此功能存储在配置中。
ISO 17987 规范中定义了许多固定的 MRF。
[SWS_LinIf_00479]
[ ]
- LIN 接口处理固定的 MRF 条目时,无需与上层交互。
[SWS_LinIf_00709]
[ ]
- 当传输固定 MRF 失败时,LIN 接口不得发送 SRF 标头。
在调度表中,可以将 SRF 放在节点配置命令之后。从节点可以按照在 ISO 17987 规范中被定义的方式来响应节点配置命令。
[SWS_LinIf_00404]
[ ]
- 如果在调度表中 SRF 被放在节点配置命令之后,且从节点的响应是肯定的,则 LIN 接口不应采取任何行动。
根据 ISO 17987 规范,对于节点配置请求,从节点的响应不是可选的。但是,如果 SRF 报头位于节点配置请求之后,则认为响应是必要的。因此,应遵循以下规定:
[SWS_LinIf_00405]
[ ]
- 如果在调度表中 SRF 被放在节点配置命令之后,且没有任何从节点响应(超时),则 LIN 接口应向默认错误跟踪器报告运行时错误代码 LINIF_E_NC_NO_RESPONSE。当先前的配置命令未被成功地传输时,也应报告该错误。
注意:
如果有任何从节点响应(无论其内容如何,例如 RSID),LIN 接口将不会报告运行时错误代码 LINIF_E_NC_NO_RESPONSE。
请注意,ISO 17987 规范中定义,对节点配置请求的响应没有否定响应。只有“按标识符读取”功能支持否定响应,但由于 LIN 接口不支持此功能,因此 LIN 接口无需处理否定响应。
从节点中的节点配置
本章仅适用于 LIN 从节点。
节点模型
LIN 接口使用 ISO 17987-3 规范中定义的节点模型,该模型描述了从节点的配置的存储位置。
LIN 接口管理从节点当前被配置的 NAD 和 PID。
从节点在复位后应具有有效配置,以便节点配置服务能够对其进行寻址并使其能够处理相关的帧。
[SWS_LinIf_00767]
[ ]
- LIN 接口应在函数 LinIf_Init 中根据配置数据(配置参数 LinIfInitialNAD 和 LinIfConfiguredNAD)初始化从节点的初始 NAD 和配置 NAD。
注意:
初始 NAD 是被静态地配置的,即在运行时不会被更改,并被用于“分配 NAD”请求。已配置的 NAD 可能会在初始化后被更改,更改可能是由“分配 NAD”请求或上层造成,其被用于节点配置服务(除“分配 NAD”请求外)和传输协议。
[SWS_LinIf_00768]
[ ]
- 在函数 LinIf_Init 中,LIN 接口应根据配置数据(配置参数 LinIfFrameId)初始化从节点的配置 PID。
注意:
节点的当前配置可以由上层使用 LinIf_SetConfiguredNAD 和 LinIf_SetPIDTable(例如,使用从非易失性存储器加载的数据)更新,也可以由 LIN 主节点使用节点配置命令更新。
[SWS_LinIf_00769]
[ ]
- LIN 接口应提供 LIN 产品标识(如 ISO 17987-3 规范中所述),由供应商 ID、功能 ID 和变量 ID(配置参数 LinIfSupplierId、LinIfFunctionId 和 LinIfVariantId)组成。
节点配置服务
LIN 接口提供符合 ISO 17987-3 规范的节点配置服务。节点配置服务使用与 LIN TP 相同的 LIN 帧结构。节点配置服务仅使用单帧 (SF) 进行传输。
[SWS_LinIf_00810]
[SRS_Lin_01594]
- LIN 接口应支持“分配 NAD”(SID 0xB0,在 ISO 17987-3 规范中被定义)。对其的支持可在预编译阶段通过配置参数 LinIfNcOptionalRequestSupported 进行配置。
[SWS_LinIf_00811]
[SRS_Lin_01594]
- LIN 接口应支持“分配帧 ID 范围”(SID 0xB7,在 ISO 17987-3 规范中被定义)。
[SWS_LinIf_00812]
[ ]
- LIN 接口应支持“保存配置”(SID 0xB6,在 ISO 17987-3 规范中被定义)。对其的支持可在预编译阶段通过配置参数 LinIfSaveConfigurationCallout 进行配置。
[SWS_LinIf_00813]
[SRS_Lin_01594]
- LIN 接口应支持“通过标识符读取”(SID 0xB2,在 ISO 17987-3 规范中被定义)中的参数“标识符 0(LIN 产品标识)”。
[SWS_LinIf_00840]
[ ]
- LIN 接口应支持“通过标识符读取”(SID 0xB2,在 ISO 17987-3 规范中被定义)中的参数“标识符 2(位(bit)时序测试)”。
注意:
不直接受 LIN 接口支持的节点配置服务将通过传输层被转发至上层,并可通过集成代码对其进行实现。
诊断帧分发器
诊断通信帧(MRF 和 SRF)由 LIN 接口中的两个诊断用户共用:
- 节点配置处理程序
- 传输层
采用优先级机制将接收到的诊断通信帧传递给正确的诊断用户,其中节点配置的优先级高于传输层。
LIN 接口首先将每个 MRF 传递给节点配置处理程序,然后再将其传递给传输层。请注意,ISO 17987-2 第 7.6.4 条(接收到预期外的 N_PDU)对这两个诊断用户适用。
同样,每个接收到的 SRF 报头将首先被传递给节点配置处理程序,以发送待处理的响应。如果没有待处理的节点配置响应,则 SRF 将被传递给传输层。
[SWS_LinIf_00771]
[ ]
- LIN 接口应评估接收到的 MRF 的 NAD、PCI 和 SID。
[SWS_LinIf_00772]
[ ]
- 如果接收到的 MRF 包含有效的节点配置请求,且该请求寻址的从节点为自身,则 LIN 接口应接受该节点配置请求,并通知传输层关于该请求。
[SWS_LinIf_00773]
[ ]
- 如果接收到的 MRF 不包含有效的节点配置请求,且该请求寻址的从节点为自身,则 LIN 接口应将其传递给传输层。
[SWS_LinIf_00774]
[ ]
- 如果接收到的 MRF 的寻址地址(从节点)不为自身,则 LIN 接口应通知节点配置处理程序和传输层。
原理:
如果检测到待处理的请求的寻址地址(从节点)不为自身,则必须中止该请求。当然,诊断用户不会处理该请求。
[SWS_LinIf_00775]
[ ]
- 如果收到了 SRF 的报头,并且存在待被传输的对节点配置命令的响应,则节点配置处理程序应传输对 SRF 的响应。
[SWS_LinIf_00776]
[ ]
- 如果收到了 SRF 的报头,并且不存在待被传输的对节点配置命令的响应,则 SRF 的报头应被传递给传输层。
[SWS_LinIf_00837]
[ ]
- 在预期会收到对 MRF 或 SRF 的响应的情况下,如果函数 LinIf_LinErrorIndication 被调用,则 LIN 接口应通知节点配置处理程序和传输层关于检测到的通信错误。
节点配置处理程序
节点配置处理程序实现了评估、处理和响应 LIN 接口支持的节点配置请求的功能。
一个“有效的节点配置请求”是指一个包含“寻址从节点的 NAD(对于“分配 NAD”请求,使用初始或广播/通配符 NAD;对于其他支持的服务,使用配置或广播/通配符 NAD)”、“符合 ISO 17987-3 规范的 PCI ”以及“受支持的节点配置服务的 SID 值”的 MRF。
[SWS_LinIf_00778]
[ ]
- LIN 接口应支持节点配置请求中的功能 ID 通配符、供应商 ID 通配符和 NAD 通配符(如 ISO 17987-3 规范中所定义)。
[SWS_LinIf_00780]
[ ]
- If a positive response needs to be sent for a node configuration request, the LIN Interface shall transmit this response to the next scheduled SRF header.
- 如果需要传输对节点配置请求的肯定响应,则 LIN 接口应在下一个被调度的 SRF 报头后传输此响应。
[SWS_LinIf_00779]
[ ]
- 如果收到有效的“分配 NAD”请求,LIN 接口应使用请求中的新 NAD 更新其配置 NAD 的值,并在主节点传输 SRF 报头时提供一个肯定响应。
[SWS_LinIf_00781]
[ ]
- 如果收到有效的“分配帧 ID 范围”请求,LIN 接口应使用请求中的 PID(如 ISO 17987-3 规范中所定义)更新其 PID 配置,并在主节点传输 SRF 报头时提供一个肯定响应。
[SWS_LinIf_00809]
[ ]
- 标识符为 0x3C 和 0x3D(MRF 和 SRF)的帧的 PID 不可被更改。
[SWS_LinIf_00782]
[ ]
- 如果收到有效的“保存配置”请求,LIN 接口应调用函数<User_SaveConfigurationRequest>。根据该函数的返回值,应提供肯定响应或不提供响应。
[SWS_LinIf_00783]
[ ]
- 如果收到标识符参数为 0 的有效的“通过标识符读取”请求,则 LIN 接口应在主节点传输 SRF 报头时提供一个肯定响应(如 ISO 17987-3 规范中所定义)。
[SWS_LinIf_00841]
[ ]
- 如果收到标识符参数为 2 的有效的“通过标识符读取”请求,则 LIN 接口应在主节点传输 SRF 报头时提供一个否定响应(如 ISO 17987-3 规范中所定义)。
节点配置错误
[SWS_LinIf_00784]
[ ]
- LIN 接口应为节点配置提供 N_As 超时监控(配置参数 LinIfNasTimeout),以便在未收到 SRF 报头时取消待传输的响应。
[SWS_LinIf_00785]
[ ]
- LIN 接口应在接收到有效的节点配置请求后启动 N_As 定时器,并在成功地传输响应后停止定时器。
[SWS_LinIf_00786]
[ ]
- 如果发生 N_As 超时,LIN 接口应取消待传输的响应。
[SWS_LinIf_00787]
[ ]
- 如果收到的 MRF 具有未知的 NAD,则 LIN 接口应拒绝该请求并取消待传输的响应。
[SWS_LinIf_00788]
[ ]
- 如果收到带有功能性 NAD(0x7E)的节点配置请求,则 LIN 接口应忽略该请求。
[SWS_LinIf_00871]
[ ]
- 如果收到带有功能性 NAD(0x7E)的 MRF,且存在待传输的响应,则 LIN 接口应忽略该请求。
[SWS_LinIf_00789]
[ ]
- 如果收到有效的节点配置请求,且存在待传输的响应,则 LIN 接口应取消待传输的响应并处理新的请求。
[SWS_LinIf_00790]
[ ]
- 如果收到带有无效或未知 PCI 类型的节点配置请求,则 LIN 接口应忽略该请求。
[SWS_LinIf_00791]
[ ]
- If a node configuration response is pending and new MRF is received with an error in the response (indicated by LinIf_LinErrorIndication), the LIN Interface shall keep the pending node configuration response.
- 在存在待传输的响应的情况下,如果收到新的 MRF,且在对其的响应过程中有错误发生(由 LinIf_LinErrorIndication 指示),则 LIN 接口应保留待传输的响应。
诊断 - 传输协议
在 ISO 17987 规范中,传输协议 (TP) 是可选的。定义了三种类型的诊断:
- 基于信号的诊断
- 用户定义的诊断
- 诊断传输层
它仅与 LIN 接口中的诊断传输层(即所谓的 LIN TP)相关。基于信号的诊断毫无意义,因为此处未定义信号。不应使用用户定义的诊断,因为所有诊断通信都应使用诊断传输层。
[SWS_LinIf_00313]
[SRS_Lin_01579]
- LIN 接口应支持代表 LIN TP 的诊断传输层(在 ISO 17987 规范中被定义),但不包括其中的诊断 API。
当不使用 LIN TP 时,对 LIN TP 的支持应可被配置为关闭,以使 LIN 接口模块的体积更小。
[SWS_LinIf_00387]
[SRS_BSW_00171]
- 对 LIN TP 的支持应在预编译阶段通过配置参数 LinIfTpSupported 进行配置。
LIN 接口可能有多个通道(连接到多个 LIN 集群)。
[SWS_LinIf_00314]
[SRS_Lin_01574]
- LIN 接口应支持在每个通道上单独地对 LIN TP 消息进行传输,它们应彼此独立。
调度表的设计者应使调度表包含主节点请求帧和从节点响应帧。否则,LIN TP 传输将停滞。
LIN TP 被用于传输诊断服务的请求和响应。功能性的诊断请求与硬件物理层的请求或响应可以并行进行。
[SWS_LinIf_00062]
[SRS_Lin_01534]
[SRS_Lin_01592]
- LIN 接口应支持在同一个通道上同时进行的物理(仅半双工)连接和功能性 TP 连接,但同一时间内只能有一个物理 TP 连接处于活动状态。
主节点中的调度请求
本章仅适用于 LIN 主节点。
[SWS_LinIf_00646]
[ ]
- 如果配置参数 LinTpScheduleChangeDiag 为 TRUE,则可通过调用 BswM_LinTp_RequestMode 函数使调度表切换为诊断调度或应用调度。
[SWS_LinIf_00641]
[ ]
- 当通过对函数 LinTp_Transmit 的调用请求对“硬件物理层的请求”或“功能的请求”进行传输时,LIN 接口应使用参数 LINTP_DIAG_REQUEST 调用 BswM_LinTp_RequestMode 函数,以请求将调度表切换为诊断调度(请求)。
注意,
P2 定时器不会因传输功能请求而被重新启动。
[SWS_LinIf_00642]
[ ]
- 当对“硬件物理层的请求”的传输完成后,LIN 接口应使用参数 LINTP_DIAG_RESPONSE 调用 BswM_LinTp_RequestMode 函数,以请求将调度表切换为诊断调度(响应)。
[SWS_LinIf_00643]
[ ]
- 当对“硬件物理层的响应”的传输完成后,LIN 接口应使用参数 LINTP_APPLICATIVE_SCHEDULE 调用 BswM_LinTp_RequestMode 函数,以请求将调度表切换为应用调度。
[SWS_LinIf_00707]
[ ]
- 当对“功能的请求”的传输完成后,LIN 接口应调用 BswM_LinTp_RequestMode 函数,以请求将调度表切换为之前的调度(应用调度、诊断调度(请求)或诊断调度(响应))。
这确保了对物理 TP 消息的传输或接收在被中断后能够继续进行。
[SWS_LinIf_00708]
[ ]
- 当 LIN 接口在等待接收“硬件物理层的响应”的过程中或接收到“硬件物理层的响应”时,如果函数 LinTp_Transmit 触发了对“硬件物理层的请求”的进一步传输,则 LIN 接口应终止当前正在进行的 TP 处理(接收、N_Cr 超时监控或 P2 超时监控)并开始处理新的“硬件物理层的请求”。
状态机
下图 6 显示了 LIN TP 的状态机。
[SWS_LinIf_00316]
[SRS_BSW_00335]
- LIN TP(通道)状态机应具有状态 LINTP_UNINIT。
[SWS_LinIf_00483]
[ ]
- 复位后,LIN 接口应将所有对应通道的 LIN TP(通道)状态机的状态设置为 LINTP_UNINIT。
[SWS_LinIf_00319]
[SRS_BSW_00335]
- LIN TP(通道)状态机应具有状态 LINTP_INIT。
[SWS_LinIf_00412]
[ ]
- 当 LIN TP(通道)状态机处于 LINTP_INIT 状态时,存在一个子状态机,被用于跟踪通道的状态。
[SWS_LinIf_00450]
[ ]
- LINTP_INIT 状态中的子状态机应具有状态 LINTP_CHANNEL_IDLE。
[SWS_LinIf_00710]
[ ]
- 当 LIN TP(通道)状态机的状态被设置为 LINTP_INIT 状态时,LIN 接口应将子状态机的状态设置为 LINTP_CHANNEL_IDLE。
[SWS_LinIf_00321]
[ ]
- 当子状态机处于 LINTP_CHANNEL_IDLE 状态时,LIN 接口仅应启动对 TP 消息的传输。
[SWS_LinIf_00322]
[ ]
- LINTP_INIT 状态中的子状态机应具有状态 LINTP_CHANNEL_BUSY。
[SWS_LinIf_00323]
[ ]
- 当 LIN 接口在通道上接收到 FF 或 SF 并将其检测为 LIN TP 消息时(即,不与来自 LIN 从节点的节点配置响应或来自 LIN 主节点的节点配置请求相冲突),LIN 接口应将子状态机的状态设置为 LINTP_CHANNEL_BUSY。
[SWS_LinIf_00414]
[ ]
- 当 LIN 接口成功地完成对 LIN TP 消息的传输或接收时,LIN 接口应将子状态机的状态设置为 LINTP_CHANNEL_IDLE。
[SWS_LinIf_00688]
[ ]
- 当检测到在通道上有不可恢复的错误发生时,LIN 接口应将子状态机的状态设置为 LINTP_CHANNEL_IDLE。
LIN TP 传输
由于所有帧都必须遵循调度表,对于 LIN TP 消息也是如此。所有 LIN TP 消息都使用 MRF 和 SRF 进行传输。
LIN 主节点使用 MRF 传输诊断数据,而 LIN 从节点使用对 SRF 的响应传输诊断数据。
[SWS_LinIf_00671]
[ ]
- 收到上层的传输请求后,对于每个待传输的段,LIN 接口应使用包含数据缓冲区 (SduDataPtr) 和数据长度 (SduLength) 的 PduInfo 指针调用 PduR_LinTpCopyTxData 函数。FF 的数据长度为 5 个字节(包括 SID),SF 最多为 6 个字节,CF 最多为 6 个字节(最后一个 CF 的数据长度可以小于 6 个字节)。
上层会将传输数据复制到 PduInfo 中。
[SWS_LinIf_00329]
[ ]
- 如果函数 PduR_LinTpCopyTxData 返回 BUFREQ_E_BUSY,对于 LIN 主节点,其不得发送下一个 MRF,对于 LIN 从节点,其不得发送下一个对 SRF 报头的响应。
[SWS_LinIf_00330]
[ ]
- 如果函数 PduR_LinTpCopyTxData 返回 BUFREQ_E_BUSY,LIN 接口应重试调用 PduR_LinTpCopyTxData 函数复制传输数据。对于主节点,LIN 接口应在对 MainFunction 的下一次调度过程中重试复制传输数据,直至传输数据被提供。对于从节点,LIN 接口应在接收到 SRF 报头后重试复制传输数据,直至传输数据被提供。重试次数由配置参数 LinTpMaxBufReq 进行配置。
[SWS_LinIf_00672]
[ ]
- 当函数 PduR_LinTpCopyTxData 返回 BUFREQ_OK 时,LIN 主节点应恢复对 MRF 的传输,LIN 从节点应恢复对对 SRF 报头的响应的传输。
[SWS_LinIf_00068]
[ ]
- 当 LIN 接口成功地传输作为“MRF(LIN 主节点)或对 SRF 的响应(LIN 从节点)”的 SF 或最后一个 CF 后,它应使用结果 E_OK 调用 PduR_LinTpTxConfirmation 函数通知上层。
LIN 接口不支持重新传输损坏的数据。
[SWS_LinIf_00705]
[ ]
- 调用 PduR_LinTpCopyTxData 时,LIN 接口应始终将参数 retry 设置为 NULL。
LIN TP 传输错误
主节点和从节点中常见的传输错误处理
[SWS_LinIf_00073]
[ ]
- 如果函数 PduR_LinTpCopyTxData 返回 BUFREQ_E_NOT_OK,则 LIN 接口应中止传输并使用结果 E_NOT_OK 调用 PduR_LinTpTxConfirmation 函数来通知上层。
主节点中的传输错误处理
本章仅适用于 LIN 主节点。
[SWS_LinIf_00069]
[ ]
- 如果在对 MRF 的传输中发生错误(函数 Lin_GetStatus 的返回值为 LIN_TX_HEADER_ERROR 或 LIN_TX_ERROR),则 LIN 接口应中止传输并使用结果 E_NOT_OK 调用 PduR_LinTpTxConfirmation 函数来通知上层。
[SWS_LinIf_00673]
[ ]
- 当 LIN 接口中止传输时,它应使用参数 LINTP_APPLICATIVE_SCHEDULE 调用 BswM_LinTp_RequestMode 函数,以请求将调度表切换为应用调度(参见 [SWS_LinIf_00646])。
[SWS_LinIf_00656]
[ ]
- LIN 接口应提供 N_As 超时监控(配置参数 LinTpNas),以便在对 MRF 的传输失败的情况下将调度表从诊断调度切换为应用调度。
[SWS_LinIf_00657]
[ ]
- LIN 接口应在“为 MRF(FF 或 CF)调用 Lin_SendFrame 函数”后启动 N_As 定时器,并在“为 MRF 调用 Lin_GetStatus 函数且返回值为 LIN_TX_OK”时停止 N_As 定时器。
[SWS_LinIf_00658]
[SRS_Lin_01564]
- 如果发生 N_As 超时,LIN 接口应中止传输,并使用参数 LINTP_APPLICATIVE_SCHEDULE 调用 BswM_LinTp_RequestMode 函数,以请求将调度表切换为应用调度(参见 [SWS_LinIf_00646])。在调度表(成功或失败地)切换结束后(例如,由于当前正在进行其他调度表切换操作而导致切换失败),LIN 接口应使用结果 E_NOT_OK 调用 PduR_LinTpTxConfirmation 函数来通知上层。
[SWS_LinIf_00660]
[ ]
- LIN 接口应提供 N_Cs 超时监控(配置参数 LinTpNcs),以便在对 MRF 的传输失败的情况下将调度表从诊断调度切换为应用调度。(ISO 17987 规范定义了以下要求:(N_Cs + N_As) < 0.9 * N_Cr)
[SWS_LinIf_00661]
[ ]
- LIN 接口应在“为 MRF(FF 或 CF(除最后一个 CF 以外))调用 Lin_GetStatus 函数且返回值为 LIN_TX_OK”时启动 N_Cs 定时器,并在“为 MRF(下一个 CF)调用 Lin_SendFrame 函数”时停止 N_Cs 定时器。
[SWS_LinIf_00662]
[SRS_Lin_01564]
- 如果发生 N_Cs 超时,LIN 接口应中止传输,并使用参数 LINTP_APPLICATIVE_SCHEDULE 调用 BswM_LinTp_RequestMode 函数,以请求将调度表切换为应用调度(参见 [SWS_LinIf_00646])。在调度表(成功或失败地)切换结束后(例如,由于当前正在进行其他调度表切换操作而导致切换失败),LIN 接口应使用结果 E_NOT_OK 调用 PduR_LinTpTxConfirmation 函数来通知上层。
从节点中的传输错误处理
本章仅适用于 LIN 从节点。
[SWS_LinIf_00796]
[ ]
- 如果在对 SRF 的响应过程中发生错误(在接收到 SRF 报头后,LinIf_LinErrorIndication 被调用),则 LIN 接口应中止传输,并使用结果 E_NOT_OK 调用 PduR_LinTpTxConfirmation 函数来通知上层。
[SWS_LinIf_00797]
[ ]
- 如果在对先前触发的“硬件物理层的请求”的传输过程中,收到新的“硬件物理层的请求”(SF 或 FF),则 LIN 接口应中止传输。如果请求中的 NAD 与从节点被配置的 NAD 或广播消息的 NAD 匹配,则 LIN 接口应处理新的“硬件物理层的请求”。
[SWS_LinIf_00798]
[ ]
- 如果在对先前触发的“硬件物理层的请求”的传输过程中,收到新的“功能的请求”,则 LIN 接口应忽略该请求。
[SWS_LinIf_00799]
[ ]
- LIN 接口应提供 N_As 超时监控(配置参数 LinTpNas),以便在未收到 SRF 报头时取消待传输的响应。
[SWS_LinIf_00800]
[ ]
- 对于 SF 或 FF,LIN 接口应在函数 LinTp_Transmit 被调用且返回值为 E_OK 时启动 N_As 定时器。对于 CF,LIN 接口应在 LIN 驱动程序通过调用 LinIf_HeaderIndication 函数指示对 SRF 报头的接收时启动 N_As 定时器。LIN 接口应在 LIN 驱动程序通过调用 LinIf_TxConfirmation 函数确认对 SRF 报头的响应已被传输时停止 N_As 定时器。
[SWS_LinIf_00801]
[ ]
- 如果发生 N_As 超时,则 LIN 接口应中止传输,并使用结果 E_NOT_OK 调用 PduR_LinTpTxConfirmation 函数来通知上层。
[SWS_LinIf_00802]
[ ]
- LIN 接口应提供 N_Cs 超时监控(配置参数 LinTpNcs),以便在未收到 SRF 报头时取消待传输的响应。
注意:
ISO 17987-2 规范定义了以下要求:(N_Cs + N_As) < 0.9 * N_Cr。
[SWS_LinIf_00803]
[ ]
- LIN 接口应在 LIN 驱动程序通过调用 LinIf_TxConfirmation 函数确认对 SRF 报头的响应已被传输时启动 N_Cs 定时器,LIN 接口应在 LIN 驱动程序通过调用 LinIf_HeaderIndication 函数指示对 SRF 报头的接收时停止 N_Cs 定时器。
LIN TP 接收
LIN 接口应随时准备接收 TP 消息。
LIN 主节点通过一个或多个 SRF 接收来自从节点的 TP 消息。TP 消息中的第一个 SRF 始终为 FF 或 SF。
LIN 从节点通过一个或多个 MRF 接收来自主节点的 TP 消息。TP 消息中的第一个 MRF 始终为 FF 或 SF。
由于 LIN 接口不知道外部节点何时启动对 TP 消息的传输,因此必须提供存储部分 TP 消息的能力。
[SWS_LinIf_00075]
[ ]
- 当对 FF 或 SF 的接收指示对 TP 消息的接收开始时,LIN 接口应使用 PduInfo 指针和 TpSduLength 调用 PduR_LinTpStartOfReception 函数。PduInfo 指针指向包含待被接收的数据 (SduDataPtr) 和数据长度 (SduLength) 的缓冲区。FF 的数据长度(包括 SID)为 5 个字节,SF 的数据长度最多为 6 个字节。TpSduLength 是 Sdu 的总长度。
输出指针参数为 LIN 接口提供了当前可用的接收缓冲区的大小。
[SWS_LinIf_00076]
[ ]
- LIN 接口应将接收到的(由其他 LIN 节点传输的)消息中的 NAD 转换为上层能够理解的 N-SDU Id。
[SWS_LinIf_00674]
[ ]
- 当对一帧 TP 消息(SF、FF 和 CF)进行接收后,LIN 接口应使用包含待被接收的数据 (SduDataPtr) 和数据长度 (SduLength) 的 PduInfo 指针调用 PduR_LinTpCopyRxData 函数。FF 的数据长度(包括 SID)为 5 个字节,SF 的数据长度最多为 6 个字节,CF 的数据长度最多为 6 个字节(最后一个 CF 的数据长度可能少于 6 个字节)。
输出指针参数为 LIN 接口提供了复制后可用的接收缓冲区的大小。
[SWS_LinIf_00078]
[SRS_Lin_01564]
- 当 LIN 接口成功地接收到 TP 消息的 SF 或 TP 消息的最后一个 CF 时,它应使用参数 LINTP_APPLICATIVE_SCHEDULE 调用 BswM_LinTp_RequestMode 函数,以请求将调度表切换为应用调度(参见 [SWS_LinIf_00646])。在调度表(成功或失败地)切换结束后(例如,由于当前正在进行其他调度表切换操作而导致切换失败),LIN 接口应使用结果 E_OK 调用 PduR_LinTpRxIndication 函数来通知上层。
接收缓冲区不可用
函数 PduR_LinTpStartOfReception 和函数 PduR_LinTpCopyRxData 可能指示被请求的缓冲区不可用。
根据具体情况,LIN 接口的处理方式有所不同。
主节点和从节点中的接收缓冲区不可用
[SWS_LinIf_00676]
[ ]
- 如果函数 PduR_LinTpStartOfReception 返回值为 BUFREQ_E_NOT_OK 或 BUFREQ_E_OVFL,则 LIN 接口应中止接收,并且不会对 PduR 进行进一步的调用 。
[SWS_LinIf_00701]
[ ]
- 如果函数 PduR_LinTpStartOfReception 返回值为 BUFREQ_OK,且返回的“可用的接收缓冲区的大小”小于待接收的 TP 消息(SF 或 FF)中的数据的大小,则 LIN 接口应中止接收,并使用结果 E_NOT_OK 调用 PduR_LinTpRxIndication 函数来通知上层。
主节点中的接收缓冲区不可用
[SWS_LinIf_00792]
[ ]
- 如果函数 PduR_LinTpCopyRxData 返回值为 BUFREQ_E_NOT_OK,则 LIN 接口应使用参数 LINTP_APPLICATIVE_SCHEDULE 调用 BswM_LinTp_RequestMode 函数,以请求将调度表切换为应用调度(参见 [SWS_LinIf_00646])。
[SWS_LinIf_00879]
[SRS_Lin_01564]
- 如果函数 PduR_LinTpCopyRxData 返回值为 BUFREQ_E_NOT_OK,则 LIN 接口应中止接收,并在调度表(成功或失败地)切换结束后(例如,由于当前正在进行其他调度表切换操作而导致切换失败),使用结果 E_NOT_OK 调用 PduR_LinTpRxIndication 函数来通知上层(参见 [SWS_LinIf_00646] 和 [SWS_LinIf_00792])。
[SWS_LinIf_00679]
[ ]
- 如果函数 PduR_LinTpCopyRxData 返回值为 BUFREQ_OK,且返回的“可用的接收缓冲区的大小”小于待接收的下一个 CF 中的数据的大小,则 LIN 接口应暂停对下一个 SRF(CF)的 LIN 报头的传输。
[SWS_LinIf_00086]
[ ]
- 对于 [SWS_LinIf_00679],LIN 接口应在下一次对 MainFunction 的调度期间再次使用数据长度(SduLength)0(零)调用 PduR_LinTpCopyRxData 函数,直到返回的“可用的接收缓冲区的大小”足够大。
[SWS_LinIf_00680]
[ ]
- 对于 [SWS_LinIf_00086],当“可用的接收缓冲区的大小”足够大时,LIN 接口应通过调用 PduR_LinTpCopyRxData 函数复制接收到的数据,并恢复对下一个 SRF(CF)的 LIN 报头的传输。
从节点中的接收缓冲区不可用
[SWS_LinIf_00793]
[ ]
- 如果函数 PduR_LinTpCopyRxData 返回值为 BUFREQ_OK,且返回的“可用的接收缓冲区的大小”小于待接收的下一个 CF 中的数据的大小,则 LIN 接口应在下一次对 MainFunction 的调度期间再次使用数据长度(SduLength)0 调用 PduR_LinTpCopyRxData 函数,直到返回的“可用的接收缓冲区的大小”足够大,或接受到下一个 CF。
[SWS_LinIf_00677]
[ ]
- 如果函数 PduR_LinTpCopyRxData 返回值为 BUFREQ_E_NOT_OK,则 LIN 接口应中止接收,并使用结果 E_NOT_OK 调用 PduR_LinTpRxIndication 函数来通知上层。
[SWS_LinIf_00794]
[ ]
- 对于 [SWS_LinIf_00793],当“可用的接收缓冲区的大小”足够大时,LIN 接口应通过调用 PduR_LinTpCopyRxData 函数复制接收到的数据。
[SWS_LinIf_00795]
[ ]
- 对于 [SWS_LinIf_00793],在当前 CF 的数据能够被复制之前,如果接收到下一个 CF,则 LIN 接口应中止接收,并使用结果 E_NOT_OK 调用 PduR_LinTpRxIndication 函数来通知上层。
LIN TP 接收错误
主节点和从节点中的 LIN TP 接收错误
[SWS_LinIf_00079]
[SRS_Lin_01544]
- 如果接收到错误的序列号,LIN 接口应停止对当前 LIN TP 消息的接收。
[SWS_LinIf_00081]
[ ]
- 如果接收到错误的序列号,LIN 接口应使用结果 E_NOT_OK 调用 PduR_LinTpRxIndication 函数来向 PDU 路由器报告此故障。
[SWS_LinIf_00651]
[SRS_Lin_01544]
- 如果在不是 TP 消息的最后一个 CF 之后接收到 FF 或 SF,则 LIN 接口应停止对当前 LIN TP 消息的接收。
[SWS_LinIf_00653]
[ ]
- 如果在不是 TP 消息的最后一个 CF 之后接收到 FF 或 SF,LIN 接口应使用结果 E_NOT_OK 调用 PduR_LinTpRxIndication 函数来向 PDU 路由器报告此故障。
[SWS_LinIf_00696]
[ ]
- 当期望接收到 FF 或 SF时,接收到 CF,则 LIN 接口应忽略该 LIN 帧。
[SWS_LinIf_00697]
[ ]
- 如果接收到未知的 PCI 类型,则 LIN 接口应忽略该 LIN 帧。
[SWS_LinIf_00652]
[ ]
- 如果接收到无效数据长度(数据长度为 0 个字节或大于 6 个字节的 SF,数据长度小于 7 个字节的 FF)的 LIN TP 消息,LIN 接口应忽略此消息。
主节点中的 LIN TP 接收错误
如果在接收 SRF 时发生 LIN 错误,LIN 接口会检查 SRF 的超时时间,并且不会通知上层此 LIN 错误。如果成功地接收 SRF,LIN 接口会检查接收到的 SRF 的内容。
[SWS_LinIf_00612]
[ ]
- LIN 接口应检查是否诊断响应的 NAD(被寻址的 LIN 从节点的节点地址)与诊断请求的 NAD 不同。
[SWS_LinIf_00613]
[ ]
- 如果接收到不正确的 NAD,且配置参数 LinTpDropNotRequestedNad 为 TRUE,则 LIN 接口应停止对当前 LIN TP 消息的接收。
[SWS_LinIf_00655]
[ ]
- 如果接收到不正确的 NAD,且配置参数 LinTpDropNotRequestedNad 为 TRUE,则 LIN 接口应使用结果 E_NOT_OK 调用 PduR_LinTpRxIndication 函数来向 PDU 路由器报告此故障。
[SWS_LinIf_00648]
[ ]
- 如果接收到不正确的 NAD,且配置参数 LinTpDropNotRequestedNad 为 FALSE,则 LIN 接口应继续对当前 LIN TP 消息的接收。
[SWS_LinIf_00614]
[ ]
- 当 LIN 接口检测到在 [SWS_LinIf_00613] 中被指定的错误时,则 LIN 接口应使用参数 LINTP_APPLICATIVE_SCHEDULE 调用 BswM_LinTp_RequestMode 函数,以请求将调度表切换为应用调度(参见 [SWS_LinIf_00646])。
[SWS_LinIf_00080]
[ ]
- 当对 LIN TP 消息的接收正在进行时,如果 LIN 接口接收到 FF 或 SF,则 LIN 接口应开始对新的 LIN TP 消息的接收,旧的 LIN TP 消息应被视为已丢失的消息。
当 LIN 接口(主节点)遇到永久性错误(无论是上层发出永久性错误信号还是总线指示错误帧)时,当主节点发送 SRF 报头时,从节点会继续发送剩余的帧。从节点无法得知主节点何时遇到问题。从节点会继续发送对 SRF 报头的响应。这意味着错误恢复功能不被支持。
[SWS_LinIf_00664]
[ ]
- LIN 接口应提供 N_Cr 超时监控(配置参数 LinTpNcr),以便在对 SRF 的接收失败的情况下将调度表从诊断调度切换为应用调度。
[SWS_LinIf_00665]
[ ]
- LIN 接口应在“为 SRF(FF 或 CF(除最后一个 CF 以外))调用 Lin_GetStatus 函数且返回值为 LIN_RX_OK”时启动 N_Cr 定时器,并在“为 SRF(下一个 CF)调用 Lin_GetStatus 函数且返回值为 LIN_RX_OK”时停止 N_Cr 定时器。
[SWS_LinIf_00666]
[SRS_Lin_01564]
- 如果发生 N_Cr 超时,LIN 接口应中止接收,并使用参数 LINTP_APPLICATIVE_SCHEDULE 调用 BswM_LinTp_RequestMode 函数,以请求将调度表切换为应用调度(参见 [SWS_LinIf_00646])。并在调度表(成功或失败地)切换结束后(例如,由于当前正在进行其他调度表切换操作而导致切换失败),使用结果 E_NOT_OK 调用 PduR_LinTpRxIndication 函数来通知上层。
[SWS_LinIf_00617]
[SRS_Lin_01593]
- LIN 接口应提供 P2 超时观察(配置参数 LinTpP2Timing),以便在对 SRF 的接收失败的情况下将调度表从诊断调度切换为应用调度。
[SWS_LinIf_00618]
[ ]
- LIN 接口应在“为最后一个 MRF(SF 或 CF)调用 Lin_SendFrame 函数”时启动 P2 定时器,并在“为 SRF(SF 或 FF)调用 Lin_GetStatus 函数且返回值为 LIN_RX_OK”时停止 P2 定时器。请注意,应仅在 LIN TP 诊断模式下启动 P2 超时监控。
[SWS_LinIf_00619]
[SRS_Lin_01564]
- 在接收开始(即调用 PduR_LinTpStartOfReception 函数且返回值为 BUFREQ_OK)后,如果发生 P2 超时,LIN 接口应中止接收,并使用参数 LINTP_APPLICATIVE_SCHEDULE 调用 BswM_LinTp_RequestMode 函数,以请求将调度表切换为应用调度(参见 [SWS_LinIf_00646])。并在调度表(成功或失败地)切换结束后(例如,由于当前正在进行其他调度表切换操作而导致切换失败),使用结果 E_NOT_OK 调用 PduR_LinTpRxIndication 函数来通知上层。
[SWS_LinIf_00877]
[SRS_Lin_01564]
- 在接收开始(即未调用 PduR_LinTpStartOfReception 函数或在对其进行调用后返回值不为 BUFREQ_OK)前,如果发生 P2 超时,LIN 接口应使用参数 LINTP_APPLICATIVE_SCHEDULE 调用 BswM_LinTp_RequestMode 函数,以请求将调度表切换为应用调度(参见 [SWS_LinIf_00646])。
[SWS_LinIf_00621]
[SRS_Lin_01593]
- LIN 接口应提供处理 UDS 响应挂起的功能。因此:
- 包含 UDS 响应挂起服务数据的 TP 响应 PDU 将被接收并被转发至 PDU 路由器,如同其他响应 PDU 一样。
- 当接收包含 UDS 响应挂起服务数据的帧后,将使用“P2 定时器的超时值 * LinTpP2Max 参数被配置的值”对 P2 定时器进行重新装载。
[SWS_LinIf_00623]
[SRS_Lin_01593]
[SRS_Lin_01564]
- 如果接收到的包含 UDS 响应挂起服务数据的帧的数量超过允许的数量(配置参数 LinTpMaxNumberOfRespPendingFrames),LIN 接口应中止接收,并使用参数 LINTP_APPLICATIVE_SCHEDULE 调用 BswM_LinTp_RequestMode 函数,以请求将调度表切换为应用调度(参见 [SWS_LinIf_00646])。并在调度表(成功或失败地)切换结束后(例如,由于当前正在进行其他调度表切换操作而导致切换失败),使用结果 E_NOT_OK 调用 PduR_LinTpRxIndication 函数来通知上层。
从节点中的 LIN TP 接收错误
[SWS_LinIf_00804]
[ ]
- LIN 接口应提供 N_Cr 超时监控(配置参数 LinTpNcr),以便在对下一个 MRF 的接收失败的情况下中止正在进行的接收。
[SWS_LinIf_00805]
[ ]
- LIN 接口应在 LIN 驱动程序通过调用 LinIf_RxIndication 函数指示接收到 MRF(FF 或 CF(除最后一个 CF 以外))时(重新)启动 N_Cr 定时器,并在 LIN 驱动程序通过调用 LinIf_RxIndication 函数指示接收到 MRF(最后一个 CF)时停止 N_Cr 定时器。
[SWS_LinIf_00806]
[ ]
- 如果发生 N_Cr 超时,LIN 接口应中止接收,并使用结果 E_NOT_OK 调用 PduR_LinTpRxIndication 函数来通知上层。
[SWS_LinIf_00807]
[ ]
- 如果在接收“硬件物理层的请求”的过程中,收到新的“功能的请求”,则 LIN 接口应忽略该请求。
[SWS_LinIf_00808]
[ ]
- 如果在接收“硬件物理层的请求”的过程中,收到新的“硬件物理层的请求”(SF 或 FF),则 LIN 接口应中止对当前 LIN TP 消息的接收。如果请求中的 NAD 与被配置的 NAD 或广播消息的 NAD 匹配,则 LIN 接口应处理新的“硬件物理层的请求”。
对多通道和多驱动程序的处理
通常情况下,LIN 接口只需要一个 LIN 驱动程序(支持多个通道)。然而,在极少数情况下,ECU 包含不同的 LIN 硬件。在这种情况下,需要使用多个 LIN 驱动程序。
多通道
[SWS_LinIf_00461]
[ ]
- 即使 LIN 通道位于不同的 LIN 驱动程序中,LIN 接口的每个通道都应具有唯一的(LIN 接口)内部的通道索引。通道索引派生自 ComM 通道 (LinIfComMNetworkHandleRef)。
LIN 通道的节点类型由容器 LinIfNodeType 决定。
多个 LIN 驱动程序
为了能够区分多个 LIN 驱动程序,假设将使用 Vendor_Id 和 Type_Id 对 LIN 驱动程序的 API 名称进行扩展。
[SWS_LinIf_00462]
[ ]
- 将通道映射到 LIN 驱动程序中的通道,将通过参数 LinIfMultipleDriversSupported 在预编译阶段进行配置。
LIN 驱动程序还应具有所有已发布的参数、变量、类型和文件的名称扩展。
多个 LIN 收发器驱动程序
为了能够区分多个 LIN 收发器驱动程序,假设将使用 Vendor_Id 和 Type_Id 对 LIN 收发器驱动程序的 API 名称进行扩展。
[SWS_LinIf_00560]
[ ]
- 将通道映射到 LIN 收发器驱动程序,将通过参数 LinIfMultipleTrcvDriverSupported 在预编译阶段进行配置。
LIN 收发器驱动程序还应具有所有已发布的参数、变量、类型和文件的名称扩展。
错误分类
开发错误
[SWS_LinIf_00376]
[SRS_BSW_00406]
[SRS_BSW_00337]
[SRS_BSW_00385]
[SRS_BSW_00327]
[SRS_BSW_00480]
[SRS_BSW_00481]
注意:
此表涵盖了 LIN 接口和 LIN TP 的错误码。注意:错误码 LINIF_E_SCHEDULE_REQUEST_ERROR 仅由 LIN 主节点使用。
运行时错误
[SWS_LinIf_00729]
[SRS_BSW_00452]
[SRS_BSW_00385]
[SRS_BSW_00327]
注意:
此表涵盖了 LIN 接口和 LIN TP 的错误码。
API 规范
导入的类型
标准类型
本章列出了以下模块包含的所有类型:
[SWS_LinIf_00469]
[SRS_BSW_00413]
类型定义
本章展示了在 LIN 接口中被使用的类型的定义。
LinIf_SchHandleType
此类型仅适用于 LIN 主节点。
[SWS_LinIf_00197]
[SRS_BSW_00413]
LinIf_ConfigType
[SWS_LinIf_00668]
[ ]
LinTp_ConfigType
[SWS_LinIf_00426]
[ ]
LinTp_Mode
此类型仅适用于 LIN 主节点。
[SWS_LinIf_00629]
[ ]
LIN 接口 API
这是为上层模块提供的 API 的列表。
LinIf_Init
[SWS_LinIf_00198]
[SRS_BSW_00101]
[SRS_BSW_00416]
[SRS_BSW_00358]
[SRS_Lin_01569]
[SRS_BSW_00414]
[SWS_LinIf_00373]
[SRS_BSW_00344]
[SRS_BSW_00404]
[SRS_BSW_00405]
[SRS_BSW_00170]
- 函数 LinIf_Init 应接受引用了 LIN 接口配置描述符的参数。
[SWS_LinIf_00233]
[ ]
- 函数 LinIf_Init 应为每个已配置的通道设置调度类型 NULL_SCHEDULE。此要求仅适用于 LIN 主节点。
LinIf_GetVersionInfo
[SWS_LinIf_00340]
[SRS_BSW_00407]
[SWS_LinIf_00640]
[ ]
- 如果启用了开发错误检测并且参数 versioninfo 的值为无效值,则函数LinIf_GetVersionInfo 将报告开发错误代码 LINIF_E_PARAM_POINTER。
LinIf_Transmit
[SWS_LinIf_00201]
[SRS_Lin_01571]
注意:
TxPduId 是 LIN 帧在上层的标识符(而非 LIN 保护 ID)。此参数用于确定相应的 LIN 保护 ID(PID)的值,并隐式地确定对应的 LIN 驱动程序的实例以及对应的 LIN 控制器设备。
[SWS_LinIf_00105]
[ ]
- 函数 LinIf_Transmit 指示由参数 TxPduId 指定的上层对帧的传输请求。
[SWS_LinIf_00341]
[ ]
- 函数 LinIf_Transmit 仅将零星帧(LIN 主节点)或事件触发帧(LIN 从节点)标记为待传输的帧,并忽略其他帧类型。
[SWS_LinIf_00700]
[ ]
- 如果 PDU 不属于零星帧(LIN 主节点)或事件触发帧(LIN 从节点),并且 LIN 接口已被初始化,则函数 LinIf_Transmit 也应返回 E_OK。
[SWS_LinIf_00106]
[ ]
- 当零星帧(LIN 主节点)或事件触发帧(LIN 从节点)处于待传输状态时,函数 LinIf_Transmit 应允许对其进行重入。
[SWS_LinIf_00570]
[ ]
- 如果启用了开发错误检测并且参数 PduInfoPtr 的值为无效值,则函数 LinIf_Transmit 将报告开发错误代码 LINIF_E_PARAM_POINTER。
[SWS_LinIf_00575]
[ ]
- 如果启用了开发错误检测并且参数 TxPduId 的值为无效值,则函数 LinIf_Transmit 将报告开发错误代码 LINIF_E_PARAMETER。
[SWS_LinIf_00719]
[ ]
- 如果 LinIf 当前的调度表为 NULL_SCHEDULE,LinIf_Transmit 应返回 E_NOT_OK。此要求仅适用于 LIN 主节点。
注意:
在调用此 API 之前,必须先调用 LinIf_Init 函数对 LIN 接口进行初始化,请参阅 [SRS_BSW_00487]。
LinIf_ScheduleRequest
LinIf_ScheduleRequest 仅适用于 LIN 主节点(仅当 ECU 具有任何作为 LIN 主节点的通道时可用)。
[SWS_LinIf_00202]
[SRS_Lin_01564]
调度表由 LIN 接口配置中的 LinIfScheduleTable 容器配置。
[SWS_LinIf_00389]
[ ]
- 函数 LinIf_ScheduleRequest 应请求对调度表管理器的执行。
每个通道可能有多个调度表。每个通道都有一组在运行时可被选择的调度表。
[SWS_LinIf_00563]
[ ]
- 如果启用了开发错误检测并且给定的通道为无效通道,则函数 LinIf_ScheduleRequest 将报告开发错误代码 LINIF_E_NONEXISTENT_CHANNEL。
[SWS_LinIf_00567]
[ ]
- 如果启用了开发错误检测并且给定的调度表为无效调度表或给定的通道处于 LINIF_CHANNEL_SLEEP 状态,则函数 LinIf_ScheduleRequest 将报告开发错误代码 LINIF_E_SCHEDULE_REQUEST_ERROR。
[SWS_LinIf_00858]
[ ]
- 仅当 LinIf 模块具有至少一个作为 LIN 主节点的通道时,LinIf_ScheduleRequest 函数才可用。如果在配置中不具有作为 LIN 主节点的通道,则该函数不可用。通道类型由配置参数 LinIfNodeType 进行配置。
注意:
在调用此 API 之前,必须先调用 LinIf_Init 函数对 LIN 接口进行初始化,请参阅 [SRS_BSW_00487]。
LinIf_GotoSleep
[SWS_LinIf_00204]
[SRS_Lin_01523]
[SWS_LinIf_00488]
[ ]
- 函数 LinIf_GotoSleep 应在给定的通道上启动“进入休眠”的转换(参见 [SWS_LinIf_00453]、[SWS_LinIf_00597] 和 [SWS_LinIf_00757])。
[SWS_LinIf_00564]
[ ]
- 如果启用了开发错误检测并且给定的通道为无效通道,则函数 LinIf_GotoSleep 将报告开发错误代码 LINIF_E_NONEXISTENT_CHANNEL。
[SWS_LinIf_00113]
[ ]
- 如果给定的通道已经处于休眠状态,则函数 LinIf_GotoSleep 不会对该通道产生任何影响。
对于 LIN 主节点,函数 LinIf_GotoSleep 将使集群启动“进入休眠”的转换,该转换不会立即被执行。
对于 LIN 从节点,在主节点发出“进入休眠”的指示后,函数 LinIf_GotoSleep 将使集群直接“进入休眠”。
注意:
在调用此 API 之前,必须先调用 LinIf_Init 函数对 LIN 接口进行初始化,请参阅 [SRS_BSW_00487]。
LinIf_Wakeup
[SWS_LinIf_00205]
[SRS_Lin_01515]
[SWS_LinIf_00432]
[ ]
- 当给定的通道未处于睡眠状态时,函数 LinIf_Wakeup 不会调用 LIN 驱动程序。在这种情况下,它将通过返回 E_OK 来模拟成功地唤醒操作。
[SWS_LinIf_00296]
[ ]
- 如果给定的通道处于 LINIF_CHANNEL_SLEEP 状态且通道的唤醒标志未被设置(参见 [SWS_LinIf_00716]),则函数 LinIf_Wakeup 将调用 LIN 驱动程序的 Lin_Wakeup 函数以将唤醒请求传递给给定的通道。
[SWS_LinIf_00713]
[ ]
- 如果给定的通道处于 LINIF_CHANNEL_SLEEP 状态且通道的唤醒标志已被设置(参见 [SWS_LinIf_00716]),则函数 LinIf_Wakeup 将调用 LIN 驱动程序的 Lin_WakeupInternal 函数以将给定的通道设置为唤醒状态。
[SWS_LinIf_00714]
[ ]
- 函数 LinIf_Wakeup 将清除给定的通道的唤醒标志。
[SWS_LinIf_00720]
[ ]
- 如果函数 Lin_Wakeup 返回 E_NOT_OK,则函数 LinIf_Wakeup 应返回 E_NOT_OK 并且不会更改相关通道的唤醒标志。
[SWS_LinIf_00721]
[ ]
- 如果函数 Lin_WakeupInternal 返回 E_NOT_OK,则函数 LinIf_Wakeup 应返回 E_NOT_OK 并且不会更改相关通道的唤醒标志。
[SWS_LinIf_00565]
[ ]
- 如果启用了开发错误检测并且给定的通道为无效通道,则函数 LinIf_Wakeup 将报告开发错误代码 LINIF_E_NONEXISTENT_CHANNEL。
注意:
在调用此 API 之前,必须先调用 LinIf_Init 函数对 LIN 接口进行初始化,请参阅 [SRS_BSW_00487]。
LinIf_SetTrcvMode
[SWS_LinIf_00544]
[SRS_Lin_01584]
[SRS_Lin_01585]
[SRS_Lin_01586]
[SWS_LinIf_00536]
[ ]
- 该服务应为所请求的对应 LIN 收发器调用底层函数 LinTrcv_SetOpMode(LinNetwork, OpMode)。
[SWS_LinIf_00537]
[ ]
- 此 API 适用于所有 LIN 收发器,且参数 TransceiverMode 的取值不受收发器硬件细节的限制。
[SWS_LinIf_00538]
[ ]
- LinIf_SetTrcvMode 返回的值为 LinTrcv_SetOpMode 返回的值。
[SWS_LinIf_00539]
[ ]
- 如果启用了开发错误检测并且给定的通道为无效通道,则函数 LinIf_SetTrcvMode 将报告开发错误代码 LINIF_E_NONEXISTENT_CHANNEL。
[SWS_LinIf_00540]
[ ]
- 如果启用了开发错误检测并且参数 TransceiverMode 的值为无效值,则函数 LinIf_SetTrcvMode 将报告开发错误代码 LINIF_E_TRCV_INV_MODE。
[SWS_LinIf_00634]
[ ]
- 仅当至少一个 LIN 通道使用 LIN 收发器驱动程序时,才需要调用 LinIf_SetTrcvMode 函数。应在预编译阶段通过配置参数 LinIfTrcvDriverSupported 对是否对其进行支持进行配置。
注意:
在调用此 API 之前,必须先调用 LinIf_Init 函数对 LIN 接口进行初始化,请参阅 [SRS_BSW_00487]。
LinIf_GetTrcvMode
[SWS_LinIf_00545]
[SRS_Lin_01587]
[SWS_LinIf_00541]
[ ]
- 该服务应为所请求的对应 LIN 收发器调用底层函数 LinTrcv_GetOpMode(LinNetwork, OpMode)。
[SWS_LinIf_00546]
[ ]
- 如果启用了开发错误检测并且给定的通道为无效通道,则函数 LinIf_GetTrcvMode 将报告开发错误代码 LINIF_E_NONEXISTENT_CHANNEL。
[SWS_LinIf_00571]
[ ]
- 如果启用了开发错误检测并且参数 TransceiverModePtr 的值为无效值,则函数 LinIf_GetTrcvMode 将报告开发错误代码 LINIF_E_PARAM_POINTER。
[SWS_LinIf_00635]
[ ]
- 仅当至少一个 LIN 通道使用 LIN 收发器驱动程序时,才需要调用 LinIf_GetTrcvMode 函数。应在预编译阶段通过配置参数 LinIfTrcvDriverSupported 对是否对其进行支持进行配置。
注意:
在调用此 API 之前,必须先调用 LinIf_Init 函数对 LIN 接口进行初始化,请参阅 [SRS_BSW_00487]。
LinIf_GetTrcvWakeupReason
[SWS_LinIf_00547]
[SRS_Lin_01588]
[SWS_LinIf_00548]
[ ]
- 该服务应为所请求的对应 LIN 收发器调用底层函数 LinTrcv_GetBusWuReason(LinNetwork, Reason),并返回 LIN 收发器驱动程序已检测到的唤醒原因。
[SWS_LinIf_00549]
[ ]
- 如果启用了开发错误检测并且给定的通道为无效通道,则函数 LinIf_GetTrcvWakeupReason 将报告开发错误代码 LINIF_E_NONEXISTENT_CHANNEL。
[SWS_LinIf_00573]
[ ]
- 如果启用了开发错误检测并且参数 TrcvWuReasonPtr 的值为无效值,则函数 LinIf_GetTrcvWakeupReason 将报告开发错误代码 LINIF_E_PARAM_POINTER。
[SWS_LinIf_00572]
[ ]
- 如果启用了开发错误检测并且当前的模式不是 LINTRCV_TRCV_MODE_NORMAL,则函数 LinIf_GetTrcvWakeupReason 应向默认错误跟踪器报告 LINIF_E_TRCV_NOT_NORMAL。
[SWS_LinIf_00636]
[ ]
- 仅当至少一个 LIN 通道使用 LIN 收发器驱动程序时,才需要调用 LinIf_GetTrcvWakeupReason 函数。应在预编译阶段通过配置参数 LinIfTrcvDriverSupported 对是否对其进行支持进行配置。
注意:
在调用此 API 之前,必须先调用 LinIf_Init 函数对 LIN 接口进行初始化,请参阅 [SRS_BSW_00487]。
请注意,如果有多个可用的网络,每个网络可能会报告不同的唤醒原因。此 API 以“单个网络”作为视角,不会在内部以投票的方式决定唤醒原因的重要性或顺序。例如,如果一个收发器控制电源,而另一个收发器只是被通电或被断电,则情况可能也是如此。此时,一个收发器返回的唤醒原因可能是 LINTRCV_TRCV_WU_POWER_ON,而另一个收发器返回的唤醒原因可能是 LINTRCV_TRCV_WU_RESET 等状态。对唤醒信息的处理由 EcuM 决定。
LinIf_SetTrcvWakeupMode
[SWS_LinIf_00550]
[SRS_Lin_01589]
[SWS_LinIf_00551]
[ ]
- 该服务应调用底层函数 LinTrcv_SetWakeupMode(LinNetwork, TrcvWakeupMode),以启用、禁用或清除在被寻址的网络上的唤醒事件的通知。
[SWS_LinIf_00595]
[ ]
- 如果启用了开发错误检测并且给定的通道为无效通道,则函数 LinIf_SetTrcvWakeupMode 将报告开发错误代码 LINIF_E_NONEXISTENT_CHANNEL。
[SWS_LinIf_00596]
[ ]
- 如果启用了开发错误检测并且参数 LinTrcvWakeupMode 的值为无效值,则函数 LinIf_SetTrcvWakeupMode 将报告开发错误代码 LINIF_E_PARAMETER。
[SWS_LinIf_00637]
[ ]
- 仅当至少一个 LIN 通道使用 LIN 收发器驱动程序时,才需要调用 LinIf_SetTrcvWakeupMode 函数。应在预编译阶段通过配置参数 LinIfTrcvDriverSupported 对是否对其进行支持进行配置。
注意:
在调用此 API 之前,必须先调用 LinIf_Init 函数对 LIN 接口进行初始化,请参阅 [SRS_BSW_00487]。
具体实现方式,例如,可以是禁用唤醒中断源。如果中断是由电平触发的,则在再次启用通知后,先前被自动地存储的待处理中断将被再次上报。在通知被禁用期间保证唤醒事件不被丢失是十分重要的。
LinIf_GetPIDTable
LinIf_GetPIDTable 仅适用于 LIN 从节点(仅当 ECU 具有任何作为 LIN 从节点的通道时可用)。
[SWS_LinIf_91002]
[ ]
[SWS_LinIf_00816]
[ ]
- 此 API 将返回与从节点相关的所有帧的已被配置的 PID。PID 的顺序应根据配置参数 LinIfFrameIndex 按升序进行排列。PidBufferLength 的值应根据实际被配置的 PID 的数量被更新。
[SWS_LinIf_00817]
[ ]
- 返回的 PID 列表不得包含 MRF 和 SRF 的 PID。
原理:
MRF 和 SRF 将始终被隐式地分配给每个从节点,并且其 PID 不得被更改(另请参阅 [SWS_LinIf_00809])。
[SWS_LinIf_00828]
[ ]
- 如果缓冲区的长度(由参数 PidBufferLength 提供)为 0,则该函数应在参数 PidBufferLength 中返回从节点被配置的 PID 的数量,且不使用 PID 更新 PID 缓冲区。
[SWS_LinIf_00818]
[ ]
- 如果启用了开发错误检测并且给定的通道为无效通道,则函数 LinIf_GetPIDTable 将报告开发错误代码 LINIF_E_NONEXISTENT_CHANNEL。
[SWS_LinIf_00819]
[ ]
- 如果启用了开发错误检测并且参数 PidBuffer 的值为无效值,则函数 LinIf_GetPIDTable 将报告开发错误代码 LINIF_E_PARAM_POINTER。
[SWS_LinIf_00820]
[ ]
- 如果启用了开发错误检测并且参数 PidBufferLength 的值为无效值,则函数 LinIf_GetPIDTable 将报告开发错误代码 LINIF_E_PARAM_POINTER。
[SWS_LinIf_00821]
[ ]
- 如果启用了开发错误检测并且缓冲区的长度(由参数 PidBufferLength 提供)小于从节点被配置的 PID 数量(0 除外,参见 [SWS_LinIf_00828]),则函数 LinIf_GetPIDTable 将报告开发错误代码 LINIF_E_PARAMETER。
[SWS_LinIf_00859]
[ ]
- 仅当 LinIf 模块具有至少一个作为 LIN 从节点的通道时,LinIf_GetPIDTable 函数才可用。如果在配置中不具有作为 LIN 从节点的通道,则该函数不可用。通道类型由配置参数 LinIfNodeType 进行配置。
LinIf_SetPIDTable
LinIf_SetPIDTable 仅适用于 LIN 从节点(仅当 ECU 具有任何作为 LIN 从节点的通道时可用)。
[SWS_LinIf_91003]
[ ]
[SWS_LinIf_00823]
[ ]
- 此 API 将使用给定的 PID 列表更新在 LIN 接口中的被内部配置的 PID 列表。
注意:
用户有责任确保在缓冲区中被提供的 PID 的顺序已根据配置参数 LinIfFrameIndex 按升序进行排列。
[SWS_LinIf_00824]
[ ]
- 被提供的 PID 列表不得包含 MRF 和 SRF 的 PID。
原理:
MRF 和 SRF 将始终被隐式地分配给每个从节点,并且其 PID 不得被更改(另请参阅 [SWS_LinIf_00809])。
[SWS_LinIf_00825]
[ ]
- 如果启用了开发错误检测并且给定的通道为无效通道,则函数 LinIf_SetPIDTable 将报告开发错误代码 LINIF_E_NONEXISTENT_CHANNEL。
[SWS_LinIf_00826]
[ ]
- 如果启用了开发错误检测并且参数 PidBuffer 的值为无效值,则函数 LinIf_SetPIDTable 将报告开发错误代码 LINIF_E_PARAM_POINTER。
[SWS_LinIf_00827]
[ ]
- 如果启用了开发错误检测并且缓冲区的长度(由参数 PidBufferLength 提供)小于从节点被配置的 PID 数量,则函数 LinIf_SetPIDTable 将报告开发错误代码 LINIF_E_PARAMETER。
[SWS_LinIf_00860]
[ ]
- 仅当 LinIf 模块具有至少一个作为 LIN 从节点的通道时,LinIf_SetPIDTable 函数才可用。如果在配置中不具有作为 LIN 从节点的通道,则该函数不可用。通道类型由配置参数 LinIfNodeType 进行配置。
LinIf_GetConfiguredNAD
LinIf_GetConfiguredNAD 仅适用于 LIN 从节点(仅当 ECU 具有任何作为 LIN 从节点的通道时可用)。
[SWS_LinIf_00829]
[ ]
[SWS_LinIf_00830]
[ ]
- 此 API 应返回从节点被配置的 NAD。
[SWS_LinIf_00831]
[ ]
- 如果启用了开发错误检测并且给定的通道为无效通道,则函数 LinIf_GetConfiguredNAD 将报告开发错误代码 LINIF_E_NONEXISTENT_CHANNEL。
[SWS_LinIf_00832]
[ ]
- 如果启用了开发错误检测并且参数 Nad 的值为无效值,则函数 LinIf_GetConfiguredNAD 将报告开发错误代码 LINIF_E_PARAM_POINTER。
[SWS_LinIf_00861]
[ ]
- 仅当 LinIf 模块具有至少一个作为 LIN 从节点的通道时,LinIf_GetConfiguredNAD 函数才可用。如果在配置中不具有作为 LIN 从节点的通道,则该函数不可用。通道类型由配置参数 LinIfNodeType 进行配置。
LinIf_SetConfiguredNAD
LinIf_SetConfiguredNAD 仅适用于 LIN 从节点(仅当 ECU 具有任何作为 LIN 从节点的通道时可用)。
[SWS_LinIf_00833]
[ ]
[SWS_LinIf_00834]
[ ]
- 此 API 将更新从节点被配置的 NAD。
[SWS_LinIf_00835]
[ ]
- 如果启用了开发错误检测并且给定的通道为无效通道,则函数 LinIf_SetConfiguredNAD 将报告开发错误代码 LINIF_E_NONEXISTENT_CHANNEL。
[SWS_LinIf_00836]
[ ]
- 如果启用了开发错误检测并且参数 Nad 的值为 0,则函数 LinIf_SetConfiguredNAD 将报告开发错误代码 LINIF_E_PARAM。
[SWS_LinIf_00862]
[ ]
- 仅当 LinIf 模块具有至少一个作为 LIN 从节点的通道时,LinIf_SetConfiguredNAD 函数才可用。如果在配置中不具有作为 LIN 从节点的通道,则该函数不可用。通道类型由配置参数 LinIfNodeType 进行配置。
LinTp_Init
[SWS_LinIf_00350]
[SRS_BSW_00101]
[SRS_BSW_00414]
[SRS_BSW_00416]
[SRS_BSW_00358]
[SRS_Lin_01540]
[SWS_LinIf_00427]
[ ]
- LinTp_Init 函数的 ConfigPtr 参数仅与配置变量 VARIANT-POST-BUILD 相关。对于配置变量 VARIANT-PRE-COMPILE 和配置变量 VARIANT-LINK-TIME, 参数 ConfigPtr 应被忽略。
LIN 接口所在的环境应在使用任何其他 LIN TP 功能之前调用函数 LinTp_Init。
[SWS_LinIf_00320]
[ ]
- 函数 LinTp_Init 应将每个被配置的通道的状态机设置 LINTP_INIT 状态,并将通道的子状态机设置为 LINTP_CHANNEL_IDLE 状态。
[SWS_LinIf_00681]
[ ]
- 对函数 LinTp_Init 的支持应在预编译阶段通过配置参数 LinIfTpSupported 对其进行进行配置。
LinTp_Transmit
[SWS_LinIf_00351]
[ ]
[SWS_LinIf_00326]
[ ]
- 函数 LinTp_Transmit 将为待传输的 LIN TP 消息提供准备措施。
LIN 接口所在的环境应在使用函数 LinTp_Transmit 之前调用函数 LinIf_Init 以初始化相应的通道。
[SWS_LinIf_00413]
[ ]
- 函数 LinTp_Transmit 应将相应的通道的子状态机设置为 LINTP_CHANNEL_BUSY 状态。
[SWS_LinIf_00422]
[ ]
- LinTp_Transmit 函数应通过 N-SDU Id(由参数 TxPduId 给出)找出对应的通道,以及目标(从节点的) NAD。此要求仅适用于 LIN 主节点。
[SWS_LinIf_00584]
[ ]
- 当在给定的通道上存在正在被处理的 TP 消息时,如果收到新的对“功能的请求”的传输请求,LinTp_Transmit 函数应接受该请求。此要求仅适用于 LIN 主节点。
[SWS_LinIf_00616]
[ ]
- 如果在对先前触发的“硬件物理层的请求”的传输过程中,收到新的对“硬件物理层的请求”的传输请求,则 LIN 接口应中止正在进行的传输,并开始处理新的请求。
注意:
根据 ISO 17987 规范,NAD 0x7E 应被用于对“功能的请求”的传输。
[SWS_LinIf_00586]
[ ]
- LIN 接口应使用 NAD 0x7E 传输 LIN 主节点的“功能的请求”。
[SWS_LinIf_00702]
[SRS_Lin_01564]
- 当 LinTp_Transmit 被成功地执行(返回 E_OK)时,LIN 接口应在调度表(成功或失败地)切换结束后(例如,由于当前正在进行其他调度表切换操作而导致切换失败),使用肯定或否定的结果调用 PduR_LinTpTxConfirmation 函数(参见 [SWS_LinIf_00646],[SWS_LinIf_00642],[SWS_LinIf_00643],[SWS_LinIf_00707])。当 LinTp_Transmit 没有被成功地执行时,不应对 PduR_LinTpTxConfirmation 进行调用。
[SWS_LinIf_00878]
[SRS_Lin_01564]
- 当为调度表请求对 LinIf_ScheduleRequest 进行调用时(对 LinIf_ScheduleRequest 的调用将在 BswM_LinTp_RequestMode 的上下文中进行,并且此调用由对 LinTp_Transmit 的调用导致,参见 [SWS_LinIf_00646],[SWS_LinIf_00641]),如果返回值为 E_NOT_OK,则函数 LinTp_Transmit 应返回 E_NOT_OK。
[SWS_LinIf_00574]
[ ]
- 如果启用了开发错误检测并且参数 PduInfoPtr 的值为无效值,则函数 LinTp_Transmit 将报告开发错误代码 LINIF_E_PARAM_POINTER。
[SWS_LinIf_00576]
[ ]
- 如果启用了开发错误检测并且参数 TxPduId 的值为无效值,则函数 LinTp_Transmit 将报告开发错误代码 LINIF_E_PARAMETER。
[SWS_LinIf_00682]
[ ]
- 对函数 LinTp_Transmit 的支持应在预编译阶段通过配置参数 LinIfTpSupported 对其进行进行配置。
注意:
在调用此 API 之前,必须先调用 LinIf_Init 函数和 LinTp_Init 函数,请参阅 [SRS_BSW_00487]。
LinTp_GetVersionInfo
[SWS_LinIf_00352]
[SRS_BSW_00407]
[SWS_LinIf_00639]
[ ]
- 如果启用了开发错误检测并且参数 versioninfo 的值为无效值,则函数 LinTp_GetVersionInfo 将报告开发错误代码 LINIF_E_PARAM_POINTER。
LinTp_Shutdown
[SWS_LinIf_00355]
[SRS_BSW_00336]
[SWS_LinIf_00356]
[ ]
- 函数 LinTp_Shutdown 将关闭 LIN TP 的所有待处理的传输协议连接并释放 LIN TP 的所有资源。
[SWS_LinIf_00433]
[ ]
- 函数 LinTp_Shutdown 将影响所有已被配置的通道。
[SWS_LinIf_00484]
[ ]
- 函数 LinTp_Shutdown 应将所有通道的状态机设置为 LINTP_UNINIT 状态。
[SWS_LinIf_00683]
[ ]
- 对函数 LinTp_Shutdown 的支持应在预编译阶段通过配置参数 LinIfTpSupported 对其进行进行配置。
注意:
在调用此 API 之前,必须先调用 LinIf_Init 函数和 LinTp_Init 函数,请参阅 [SRS_BSW_00487]。
LinTp_ChangeParameter
[SWS_LinIf_00501]
[ ]
注意:
对于此函数没有对应的实现,此举为了符合上层的规范。
[SWS_LinIf_00592]
[ ]
- 更改参数请求应始终被拒绝,并返回 E_NOT_OK。
[SWS_LinIf_00578]
[ ]
- 如果启用了开发错误检测并且参数 id 的值为无效值,则函数 LinTp_ChangeParameter 将报告开发错误代码 LINIF_E_PARAMETER。
[SWS_LinIf_00685]
[ ]
- 对函数 LinTp_ChangeParameter 的支持应在预编译阶段通过配置参数 LinIfTpSupported 对其进行进行配置。
注意:
在调用此 API 之前,必须先调用 LinIf_Init 函数和 LinTp_Init 函数,请参阅 [SRS_BSW_00487]。
LinIf_CheckWakeup
[SWS_LinIf_00378]
[SRS_Lin_01514]
[SRS_BSW_00375]
LIN 接口将通过函数 LinIf_CheckWakeup 的参数识别唤醒源,从而识别此调用的目的地。
[SWS_LinIf_00503]
[ ]
- 函数 LinIf_CheckWakeup 将根据给定的参数 WakeupSource 对函数 Lin_CheckWakeup 或函数 LinTrcv_CheckWakeup 进行调用。
[SWS_LinIf_00566]
[ ]
- 如果启用了开发错误检测并且参数 WakeupSource 的值为无效值,则函数 LinIf_CheckWakeup 将报告开发错误代码 LINIF_E_PARAM_WAKEUPSOURCE。
对函数 LinIf_CheckWakeup 的调用方式可以为中断的方式或轮询的方式。
LinIf_EnableBusMirroring
[SWS_LinIf_00876]
[ ]
[SWS_LinIf_00875]
[ ]
- 如果总线镜像(配置参数 LinIfBusMirroringSupport)未被启用,则可以省略 API LinIf_EnableBusMirroring。
通知接口
这是为其他模块提供的函数接口列表。
LinIf_WakeupConfirmation
[SWS_LinIf_00715]
[ ]
[SWS_LinIf_00716]
[ ]
- 函数 LinIf_WakeupConfirmation 应根据给定的参数 WakeupSource 设置对应的通道的唤醒标志。应为每个通道都提供一个唤醒标志。
[SWS_LinIf_00717]
[ ]
- 如果启用了开发错误检测并且参数 WakeupSource 的值为无效值,则函数 LinIf_WakeupConfirmation 将报告开发错误代码 LINIF_E_PARAM_WAKEUPSOURCE。
LinIf_HeaderIndication
LinIf_HeaderIndication 仅适用于 LIN 从节点。
[SWS_LinIf_91004]
[ ]
[SWS_LinIf_00843]
[ ]
- 如果启用了开发错误检测并且给定的通道为无效通道,则函数 LinIf_HeaderIndication 将报告开发错误代码 LINIF_E_NONEXISTENT_CHANNEL。
[SWS_LinIf_00844]
[ ]
- 如果启用了开发错误检测并且参数 PduPtr 的值为无效值,则函数 LinIf_HeaderIndication 将报告开发错误代码 LINIF_E_PARAM_POINTER。
[SWS_LinIf_00845]
[ ]
- 如果启用了开发错误检测并且 PID 被评估为待传输的帧,当参数 PduPtr->SduPtr 的值为无效值,则函数 LinIf_HeaderIndication 将报告开发错误代码 LINIF_E_PARAM_POINTER。
[SWS_LinIf_00863]
[ ]
- 仅当 LinIf 模块具有至少一个作为 LIN 从节点的通道时,LinIf_HeaderIndication 函数才可用。如果在配置中不具有作为 LIN 从节点的通道,则该函数不可用。通道类型由配置参数 LinIfNodeType 进行配置。
LinIf_RxIndication
LinIf_RxIndication 仅适用于 LIN 从节点。
[SWS_LinIf_91005]
[ ]
[SWS_LinIf_00848]
[ ]
- 如果之前没有指示对报头的接收(没有预期会发生对响应的接收),当对函数 LinIf_RxIndication 进行调用时,函数 LinIf_RxIndication 应直接返回。
原理:
对 LinIf_RxIndication 的意外调用应被忽略。
[SWS_LinIf_00849]
[ ]
- 如果启用了开发错误检测并且给定的通道为无效通道,则函数 LinIf_RxIndication 将报告开发错误代码 LINIF_E_NONEXISTENT_CHANNEL。
[SWS_LinIf_00850]
[ ]
- 如果启用了开发错误检测并且参数 Lin_SduPtr 的值为无效值,则函数 LinIf_RxIndication 将报告开发错误代码 LINIF_E_PARAM_POINTER。
[SWS_LinIf_00864]
[ ]
- 仅当 LinIf 模块具有至少一个作为 LIN 从节点的通道时,LinIf_RxIndication 函数才可用。如果在配置中不具有作为 LIN 从节点的通道,则该函数不可用。通道类型由配置参数 LinIfNodeType 进行配置。
LinIf_TxConfirmation
LinIf_TxConfirmation 仅适用于 LIN 从节点。
[SWS_LinIf_91006]
[ ]
[SWS_LinIf_00852]
[ ]
- 如果之前没有指示对报头的接收(没有预期会发生对响应的传输),当对函数 LinIf_TxConfirmation 进行调用时,函数 LinIf_TxConfirmation 应直接返回。
原理:
对 LinIf_TxConfirmation 的意外调用应被忽略。
[SWS_LinIf_00853]
[ ]
- 如果启用了开发错误检测并且给定的通道为无效通道,则函数 LinIf_TxConfirmation 将报告开发错误代码 LINIF_E_NONEXISTENT_CHANNEL。
[SWS_LinIf_00865]
[ ]
- 仅当 LinIf 模块具有至少一个作为 LIN 从节点的通道时,LinIf_TxConfirmation 函数才可用。如果在配置中不具有作为 LIN 从节点的通道,则该函数不可用。通道类型由配置参数 LinIfNodeType 进行配置。
LinIf_LinErrorIndication
LinIf_LinErrorIndication 仅适用于 LIN 从节点。
[SWS_LinIf_91007]
[ ]
[SWS_LinIf_00855]
[ ]
- 如果启用了开发错误检测并且给定的通道为无效通道,则函数 LinIf_LinErrorIndication 将报告开发错误代码 LINIF_E_NONEXISTENT_CHANNEL。
[SWS_LinIf_00866]
[ ]
- 仅当 LinIf 模块具有至少一个作为 LIN 从节点的通道时,LinIf_LinErrorIndication 函数才可用。如果在配置中不具有作为 LIN 从节点的通道,则该函数不可用。通道类型由配置参数 LinIfNodeType 进行配置。
调度函数
这些函数由基础软件调度程序直接调用。以下函数不应包含返回值和参数。所有函数均应为不可重入的。
LinIf_MainFunction_<LinIfChannel.ShortName>
[SWS_LinIf_00384]
[SRS_BSW_00373]
[SRS_Lin_01546]
[SRS_Lin_01561]
[SRS_Lin_01555]
设计提示:
LinIf_MainFunction_<LinIfChannel.ShortName> 函数可能会被其他 LIN 接口函数中断。其他函数在修改临界区时应受到保护。其他可能接触到临界区的 LIN 接口 API 包括 LinIf_GotoSleep、LinIf_Transmit、LinIf_ScheduleRequest 和 LinIf_Wakeup,以及可能潜在地接触临界区的 API 包括 LinIf_Init、LinTp_Init 和 LinTp_Shutdown。
[SWS_LinIf_00725]
[ ]
- 在 LIN 接口的每个通道中都应存在一个 LinIf_MainFunction_<LinIfChannel.ShortName> 函数。
[SWS_LinIf_00726]
[ ]
- LinIf MainFunction 的每个实例的名称应为 LinIf_MainFunction_<LinIfChannel.ShortName>,其中 <LinIfChannel.ShortName> 为各个通道 (LinIfChannel) 的名称。
[SWS_LinIf_00473]
[ ]
- 函数 LinIf_MainFunction_<LinIfChannel.ShortName> 应只对对应的某个通道进行操作。
[SWS_LinIf_00286]
[ ]
- 函数 LinIf_MainFunction_<LinIfChannel.ShortName> 应轮询调度表管理器,以确定需要被传输的帧。此需求仅适用于 LIN 主节点。
[SWS_LinIf_00287]
[ ]
- 仅函数 LinIf_MainFunction_<LinIfChannel.ShortName> 才应处理对帧的传输(发送和接收)。此需求仅适用于 LIN 主节点。
预期接口
本章列出了需要其他模块提供的所有接口。
强制接口
本章定义了实现核心功能所需的所有接口。
[SWS_LinIf_00359]
[ ]
可选接口
本章定义了实现模块可选功能所需的所有接口。
[SWS_LinIf_00360]
[ ]
可配置的接口
本章列出了所有接口,其中任何需要被调用的上层的目标函数都必须通过配置进行设置。这些函数由上层通信模块定义并实现,这些模块使用符合 AUTOSAR BSW 架构的 LIN 接口。具体的通知函数在相应的 SWS 文档中被指定(参见章节 [3 相关文档])。
如果未强制指定接口的名称,当未配置 API 的名称时,表示不会对其进行调用。本章仅描述通知函数的内容、LIN 接口内的调用上下文以及调用事件发生的确切时间。
<User>_NotificationName 为将在上层(“用户”)中被实现并由 LIN 接口调用的接口。此函数名称为调用服务中的功能组在上层中的符号名称。每个上层可以为同一功能(例如,传输确认)定义零个、一个或多个调用函数。
<User>_ScheduleRequestConfirmation
[SWS_LinIf_00520]
[ ]
对 <User>_ScheduleRequestConfirmation 的配置:
LIN 接口模块将调用的 API <User>_ScheduleRequestConfirmation 的名称应通过参数 LinIfScheduleRequestConfirmationUL 进行配置。
<User>_GotoSleepConfirmation
[SWS_LinIf_00521]
[ ]
对 <User>_GotoSleepConfirmation 的配置:
LIN 接口模块将调用的 API <User>_GotoSleepConfirmation 的名称应通过参数 LinIfGotoSleepConfirmationUL 进行配置。
<User>_WakeupConfirmation
[SWS_LinIf_00522]
[ ]
对 <User>_WakeupConfirmation 的配置:
LIN 接口模块将调用的 API <User>_WakeupConfirmation 的名称应通过参数 LinIfWakeupConfirmationUL 进行配置。
<User>_GotoSleepIndication
[SWS_LinIf_00880]
[ ]
对 <User>_GotoSleepIndication 的配置:
LIN 接口模块将调用的 API <User>_GotoSleepIndication 的名称应通过参数 LinIfGotoSleepIndicationUL 进行配置。
<User_TriggerTransmit>
[SWS_LinIf_00528]
[ ]
对 <User_TriggerTransmit> 的配置:
LIN 接口模块将调用的 API <User_TriggerTransmit> 的名称应通过参数 LinIfTxTriggerTransmitUL 进行配置。
[SWS_LinIf_00722]
[ ]
- 对 <User_TriggerTransmit> 的配置:如果 LinIfUserTxUL 被设置为 PDUR,则 LinIfTxTriggerTransmitUL 必须为 PduR_LinIfTriggerTransmit。
<User_TxConfirmation>
[SWS_LinIf_00529]
[ ]
对 <User_TxConfirmation> 的配置:
LIN 接口模块将调用的 API <User_TxConfirmation> 的名称应通过参数 LinIfTxConfirmationUL 进行配置。
[SWS_LinIf_00723]
[ ]
- 对 <User_TxConfirmation> 的配置:如果 LinIfUserTxUL 被设置为 PDUR,则 LinIfTxConfirmationUL 必须为 PduR_LinIfTxConfirmation。
<User_RxIndication>
[SWS_LinIf_00530]
[ ]
对 <User_RxIndication> 的配置:
LIN 接口模块将调用的 API <User_RxIndication> 的名称应通过参数 LinIfRxIndicationUL 进行配置。
[SWS_LinIf_00724]
[ ]
- 对 <User_RxIndication> 的配置:如果 LinIfUserRxIndicationUL 被设置为 PDUR,则 LinIfRxIndicationUL 必须为 PduR_LinIfRxIndication。
Callout 定义
<User_ResponseErrorSignalChanged>
函数 <User_ResponseErrorSignalChanged> 仅适用于 LIN 从节点。
[SWS_LinIf_00856]
[ ]
此接口为可选接口,请参阅 [SWS_LinIf_00766]。
对 <User_ResponseErrorSignalChanged> 的配置:
LIN 接口模块将调用的 API <User_ResponseErrorSignalChanged> 的名称应通过参数 LinIfResponseErrorSignalChangedCallout 进行配置。
<User_SaveConfigurationRequest>
函数 <User_SaveConfigurationRequest> 仅适用于 LIN 从节点。
[SWS_LinIf_00857]
[ ]
此接口为可选接口,是否对其进行支持取决于是否需要直接对 SaveConfiguration 节点配置服务(配置参数 LinIfSaveConfigurationCallout)进行支持。
对 <User_SaveConfigurationRequest> 的配置:
LIN 接口模块将调用的 API <User_SaveConfigurationRequest> 的名称应通过参数 LinIfSaveConfigurationCallout 进行配置。
注意:
函数 LinIf_GetConfiguredNAD 和函数 LinIf_GetPIDTable 的功能仅为在收到 SaveConfiguration 请求后读取当前 LIN 的配置。
评论
发表评论