AUTOSAR_SWS_LINDriver
AUTOSAR_SWS_LINDriver
简介和功能概述
该规范指定了 AUTOSAR 基础软件模块 LIN 驱动程序的功能、API 和配置。
范围
本文档的基础是 ISO 17987 规范(ISO 17987:2016(所有部分),道路车辆 - 本地互连网络 (LIN))。假设读者熟悉该规范。本文档不会再次描述 ISO 17987 LIN 功能。
LIN 驱动程序适用于 ISO 17987 主节点和从节点。AUTOSAR 中的 LIN 实现与 ISO 17987 规范有所不同,如本 LIN 驱动程序规范中所述,但 LIN 总线上的行为不会发生变化。目的是能够与 AUTOSAR LIN 实现(即 LIN 驱动程序)一起重用所有现有 LIN 节点。
[SWS_Lin_00063]
[SRS_Lin_01547]
- 它旨在支持从简单的 SCI/UART 到复杂的 LIN 硬件控制器的整个 LIN 硬件范围。使用 SW-UART 实现超出了本文的范围。有关 LIN 硬件单元的详细说明,请参阅第 2.3 章。
架构概述
LIN 驱动程序是微控制器抽象层 (MCAL) 的一部分,负责访问硬件,并向上层提供独立于硬件的 API。唯一可以访问 LIN 驱动程序的上层是 LIN 接口。
一个 LIN 驱动程序可以支持多个通道。对于 LIN 驱动程序,这意味着只要 LIN 通道属于其控制的 LIN 硬件单元,LIN 驱动程序就可以控制该 LIN 通道。
以下示例中,三个不同的 LIN 驱动程序被连接到 LIN 接口。但在常见的配置中将只存在一个 LIN 驱动程序。
首字母缩略词、缩写和词汇表
首字母缩略词和缩写
本文档中,不被包含在 AUTOSAR 词汇表中的对于 LIN 驱动程序的首字母缩略词、缩写和定义将在此处被列出。
词汇表
除了 AUTOSAR 术语外,本文档还使用了在 ISO 17987 规范 [16] 中被定义的术语,例如 LIN 帧、报头和消息。
LIN 硬件单元分类
片上 LIN 硬件单元可组合一个或多个 LIN 通道。
下图显示了连接了多个 LIN 物理通道的不同 LIN 硬件类型的分类:
AUTOSAR 的交付文档
[1] List of Basic Software Modules
- AUTOSAR_TR_BSWModuleList.pdf
[2] Layered Software Architecture
- AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf
[3] General Requirements on Basic Software Modules
- AUTOSAR_SRS_BSWGeneral.pdf
[4] Specification of Standard Types
- AUTOSAR_SWS_StandardTypes.pdf
[5] Specification of Default Error Tracer
- AUTOSAR_SWS_DefaultErrorTracer.pdf
[6] General Requirements on SPAL
- AUTOSAR_SRS_SPALGeneral.pdf
[7] Requirements on LIN
- AUTOSAR_SRS_LIN.pdf
[8] Specification of LIN Interface
- AUTOSAR_SWS_LINInterface.pdf
[9] Specification of ECU Configuration
- AUTOSAR_TPS_ECUConfiguration.pdf
[10] Specification of MCU driver
- AUTOSAR_SWS_MCUDriver.pdf
[11] Specification of Diagnostic Event Manager
- AUTOSAR_SWS_DiagnosticEventManager.pdf
[12] Specification of ECU State Manager
- AUTOSAR_SWS_ECUStateManager.pdf
[13] Basic Software Module Description Template
- AUTOSAR_TPS_BSWModuleDescriptionTemplate.pdf
[14] Specification of LIN Transceiver Driver
- AUTOSAR_SWS_LINTransceiverDriver.pdf
[15] General Specification of Basic Software Modules
- AUTOSAR_SWS_BSWGeneral.pdf
相关标准及规范
[16] ISO 17987:2016 (all parts), Road vehicles - Local Interconnect Network (LIN)
相关规范
AUTOSAR 提供了关于基础软件模块 [15] 的通用规范,该规范也适用于 LIN 驱动程序。
因此,[15] 应被视为 LIN 驱动程序的附加规范和必需规范。
约束和假设
对于一个的 LIN 集群,在每个 ECU 中仅允许一个 LIN 通道被连接到该集群。除非 ECU 中存在未使用(未连接)的通道,否则 LIN 通道的数量应等于 LIN 集群的数量。
驱动程序范围
[SWS_Lin_00045]
[SRS_BSW_00347]
- 一个 LIN 驱动程序可以访问一种 LIN 硬件单元类型(简单 UART 或专用 LIN 硬件),该类型的硬件单元可能包含多个 LIN 通道。
[SWS_Lin_00201]
[ ]
- 对于不同的 LIN 硬件单元,需要单独地实现该单元的 LIN 驱动程序。是否使驱动程序适配相似类型的 LIN 通道的实例取决于驱动程序实现者。
[SWS_Lin_00177]
[ ]
- 如果在一个 ECU 中实现了多个 LIN 驱动程序实例(来自相同或不同的供应商),则必须修改文件名、API 名称和已发布的参数,以确保不会生成两个同名的定义。名称应根据 [SRS_BSW_00347] 被扩展为一个包含供应商 ID(用于区分不同供应商的 LIN 驱动程序)和供应商特定名称(用于区分同一供应商实现的不同硬件单元)的名称:<模块缩写>_<供应商 ID>_<供应商特定名称>。
LIN 接口负责调用正确的函数。在配置期间,应在 XML 文件中提供必要的信息。有关 LIN 接口如何处理多个 LIN 驱动程序的描述,请参阅 [8]。
对于汽车领域的适用性
该规范适用于所有使用 LIN 的汽车领域。
对其他模块的依赖
MCU 模块 [10]
内部 LIN 硬件单元的硬件类型取决于系统时钟、预分频器和 PLL。因此,LIN 传输一个位(bit)的时间长度取决于 MCU 模块中的时钟设置。
LIN 驱动模块不会在其初始化函数中设置系统时钟、预分频器和 PLL 的寄存器(例如,打开/关闭 PLL)。这些操作必须由 MCU 模块完成。
Port 模块
Port 驱动程序将 LIN 驱动程序使用的端口引脚配置为输入或输出。因此,在调用 LIN 函数之前,必须初始化 Port 驱动程序。否则,LIN 驱动程序的函数将出现未定义的行为。
DET(默认错误追踪器)模块 [5]
在开发模式下,LIN 驱动程序通过 DET 模块的 Det_ReportError 函数报告开发错误。(参见 [SWS_Lin_00048])
DEM(诊断事件管理器)模块 [11]
LIN 驱动程序向 DEM 模块报告产品错误。(参见 [SWS_Lin_00058])
OS(操作系统)
LIN 驱动程序使用中断,因此其依赖于配置中断源的 OS。
LIN 驱动程序用户
LIN 接口(由 [8] 指定)是 LIN 驱动程序的唯一用户。
文件结构
代码文件结构
[SWS_Lin_00268]
[ ]
- 本规范内不应定义代码文件结构。
头文件结构
[SWS_Lin_00054]
[SRS_BSW_00302]
- 文件 Lin.h 仅包含 LIN 驱动程序 SWS 中指定的常量、全局数据、类型定义和函数的外部声明。
[SWS_Lin_00207]
[ ]
- 仅在 LIN 驱动程序内部被使用的常量、数据、类型定义和函数在 Lin.c 中被声明。
需求可追溯性
LIN 驱动程序需要管理与“与驱动程序所在节点相连”的 LIN 集群进行通信的相关硬件。
这包括接收在总线上被传输的报头数据、响应帧数据,以及在其中检索寻址地址为本节点的数据。
节点和集群都具有休眠模式。这意味着需要具备检测并生成在 ISO 17987 规范中被定义的“唤醒”脉冲的功能。如果底层硬件支持低功耗模式,则进入和退出该模式也被包含在内。
一般需求
LIN 模块(LIN 驱动程序)是可以直接对硬件资源进行访问的基础软件(BSW)模块。
[SWS_Lin_00005]
[SRS_Lin_01576]
[SRS_Lin_01504]
[SRS_Lin_01577]
- LIN 模块应符合 ISO 17987 规范 [16],LIN 模块适用于 ISO 17987 LIN 主节点和从节点。
[SWS_Lin_00055]
[SRS_BSW_00306]
[SRS_BSW_00308]
[SRS_BSW_00309]
- LIN 模块应满足在 [3] 中被描述的所有设计和实施指南。
[SWS_Lin_00155]
[SRS_BSW_00164]
- LIN 模块应为所有具有中断需求的 LIN 硬件单元实现 ISR。
[SWS_Lin_00156]
[ ]
- LIN 模块应确保所有未被使用的中断都处于被禁用的状态。
[SWS_Lin_00157]
[ ]
- LIN 模块应在 ISR 返回时重置中断标志(如果此操作没有被硬件自动地完成)。
LIN 模块不应配置中断(即优先级)也不应设置向量表。
版本检查
需求
详细信息请参阅 SWS_BSWGeneral 中的第 5.1.8 章“版本检查”。
LIN 模块和通道初始化
背景与理由
在 LIN 总线上进行通信之前,必须初始化 LIN 模块和相关的 LIN 通道。
驱动程序初始化(参见 Lin_Init)将处理与 LIN 硬件单元中所有通道相关的初始化操作。这可能包括初始化所有可用 LIN 通道的通用静态变量或硬件寄存器。此外,还必须根据被提供的配置信息对每个通道进行初始化。例如,这将包括(但不限于)波特率。
[SWS_Lin_00225]
[ ]
- 必须为 LIN 模块提供至少一个可用的静态配置数据集。当 EcuM 调用(LIN 模块的)初始化函数时,必须为其提供一个指向配置集的指针。
需求
LIN 模块不应初始化或配置未被使用的 LIN 通道。LIN 模块应允许在运行状态下对配置(被使用的静态配置数据)进行切换。
[SWS_Lin_00011]
[SRS_BSW_00405]
[SRS_Lin_01572]
[SRS_Lin_01573]
- LIN 模块的配置应包含由静态配置数据定义的数据通信速率。
[SWS_Lin_00013]
[SRS_BSW_00345]
[SRS_BSW_00404]
[SRS_BSW_00405]
- LIN 模块的被用于硬件寄存器的配置数据应被存储在 ROM 中,且其数据结构的类型(参见 Lin_ConfigType)应特定于硬件。
[SWS_Lin_00014]
[ ]
- 每个 LIN PID 都应与一个校验和模型(“增强型”( PID 被包含在校验和中),或“经典型”(仅对响应数据进行校验和计算))相关联(参见 Lin_PduType)。
[SWS_Lin_00015]
[ ]
- 每个 LIN PID 都应与一个响应数据长度(以字节为单位)相关联(参见 Lin_PduType)。
状态图
LIN 模块有一个状态机,如图 7-1 所示。
[SWS_Lin_00146]
[ ]
- LIN_UNINIT -> LIN_INIT:当函数 Lin_Init 被调用时,LIN 模块应将其状态从 LIN_UNINIT 切换到 LIN_INIT。
LIN 模块的运行时环境应仅对 Lin_Init 函数进行一次调用。
[SWS_Lin_00171]
[ ]
- 进入 LIN_INIT 状态时,LIN 模块应将每个通道的状态设置为 LIN_CH_SLEEP,如果对参数 LinChannelWakeupSupport 的配置使其支持对外部唤醒的检测,则应在该通道上启用在总线上的唤醒请求监控,并可选择性地将 LIN 硬件单元设置为低功耗模式(如果硬件支持)。
[SWS_Lin_00263]
[ ]
- LIN_CH_OPERATIONAL -> LIN_CH_SLEEP_PENDING:如果 LIN 接口请求“进入休眠”(对 Lin_GoToSleep 进行调用),LIN 模块应确保 LIN 集群的其余部分也“进入休眠”。这可以通过在进入 LIN_CH_SLEEP_PENDING 状态之前,在总线上发出“进入休眠”命令来实现。此需求仅适用于 LIN 主节点。
[SWS_Lin_00264]
[ ]
- LIN_CH_SLEEP_PENDING -> LIN_CH_SLEEP:当 Lin_GetStatus 被调用时,即使“进入休眠”命令尚未被发送,LIN 模块也应直接进入 LIN_CH_SLEEP 状态。此需求仅适用于 LIN 主节点。
[SWS_Lin_00265]
[ ]
- LIN_CH_OPERATIONAL -> LIN_CH_SLEEP:如果 LIN 接口请求内部“进入休眠”(对 Lin_GoToSleepInternal 进行调用),则 LIN 模块应直接进入 LIN_CH_SLEEP 状态。
[SWS_Lin_00174]
[ ]
- LIN_CH_SLEEP -> LIN_CH_OPERATIONAL:如果 LIN 通道处于 LIN_CH_SLEEP 状态,则当对 Lin_Wakeup 进行调用时,应将 LIN 通道的状态设置为 LIN_CH_OPERATIONAL。
[SWS_Lin_00261]
[ ]
- LIN_CH_SLEEP -> LIN_CH_OPERATIONAL:如果 LIN 通道处于 LIN_CH_SLEEP 状态,则当对 Lin_WakeupInternal 进行调用时,应将 LIN 通道的状态设置为 LIN_CH_OPERATIONAL。
[SWS_Lin_00209]
[ ]
- Lin_Wakeup:在状态从 LIN_CH_SLEEP 切换到 LIN_CH_OPERATIONAL 期间,LIN 模块应确保 LIN 集群的其余部分也处于唤醒状态。这可以通过发出唤醒请求来实现(强制总线处于显性状态,持续 250 μs 至 5 ms)。
[SWS_Lin_00184]
[ ]
- 发出模式切换请求(目标模式与当前模式相同)是被允许的,并且不会导致错误,即使 DET 已被启用。
帧处理
背景与理由
LIN 帧由两部分组成:LIN 报头和响应。报头始终由 LIN 主节点发送,并指示 LIN 帧的开始,其中包含 LIN PID。在报头之后,响应在总线上被传输,其可以由 LIN 主节点或某个 LIN 从节点发送(参见 [16])。
LIN 模块还必须能够访问与每个 LIN PID 的校验和模型和数据长度相关的数据。LIN 2.0 版本及之后版本的校验和模型与 LIN 1.3 版本的不同,但 LIN 主节点必须能够与所有类型的 LIN 从节点(LIN 1.3、LIN 2.0、LIN 2.1、LIN 2.2 和 ISO 17987)进行通信。但是,基于 LIN 1.3 版本的 LIN 主节点无法与基于 LIN 2.0 版本及之后版本的 LIN 从节点进行通信。
校验和是响应的一部分,其中可能包含或不包含 PID,具体取决于相关 PID 的校验和模型。LIN ID 为 60(0x3C)至 63(0x3F)的响应必须始终使用经典校验和模型(参见 [16])。
LIN 模块以 LIN 帧作为基础。对于 LIN 模块而言,帧处理的方式因具体被实现的节点的类型而异:
- 对于 LIN 主节点,LIN 接口会请求在调度表中的某个传输时段内传输特定的帧(报头)。对该帧的任何响应应最迟在下一个帧(报头)被传输之前可用。如果 LIN 主节点也负责传输对帧的响应,则在请求对帧(报头)进行传输的同时会发出(对响应进行传输的)指示 (PduInfoPtr->Drc = LIN_FRAMERESPONSE_TX)。
- LIN 从节点等待对报头的接收。收到报头后会向 LIN 接口发出指示,LIN 接口会对 PID 进行评估并返回关于响应的信息。如果 LIN 从节点负责传输对帧的响应,则 LIN 接口也会同时提供待传输的数据。
LIN 模块必须能够从响应中检索数据并将其提供给 LIN 接口。它必须以无阻塞地的方式从响应中检索所有数据。
需求
仅 LIN 主节点
以下需求仅适用于 LIN 主节点。
[SWS_Lin_00016]
[ ]
- LIN 模块应将标识符解释为 PID。然后,该标识符将(以 PID 的形式)在 LIN 报头中被传输(参见 Lin_SendFrame)。
[SWS_Lin_00017]
[SRS_Lin_01578]
- LIN 模块应能够发送 LIN 报头。该报头由“中断”字段、“同步字节”字段和“受保护的标识符字节”字段组成,详见 [16](参见 Lin_SendFrame)。
[SWS_Lin_00018]
[ ]
- LIN 模块应能够发送 LIN 报头和响应。
[SWS_Lin_00021]
[ ]
- 如果 LIN 接口发出新的对帧的传输请求(参见 Lin_SendFrame),LIN 模块应中止当前正在进行的对帧的传输(无论其成功与否)。
[SWS_Lin_00022]
[ ]
- 函数 Lin_GetStatus 将返回通道当前对帧的传输的状态。
[SWS_Lin_00024]
[SRS_Lin_01555]
[SRS_Lin_01503]
- LIN 模块应将接收到的数据提供给 LIN 接口。在成功地对整个 LIN 帧进行接收后,应将接收到的数据准备好以供 LIN 接口使用(参见 Lin_GetStatus)。
[SWS_Lin_00025]
[SRS_Lin_01522]
[SRS_Lin_01503]
- LIN 模块应传输 LIN 接口提供的响应数据(参见 Lin_SendFrame)。
仅 LIN 从节点
以下需求仅适用于 LIN 从节点。
[SWS_Lin_00272]
[SRS_Lin_01578]
- 在 LIN_CH_OPERATIONAL 状态下,LIN 模块应随时能够对 LIN 报头进行接收。该报头由“中断”字段、“同步字节”字段和“受保护的标识符字节”字段组成,详见 [16]。
[SWS_Lin_00280]
[ ]
- 在对 LIN 报头进行接收时,LIN 模块应调用 LinIf_HeaderIndication 函数,并将 PduPtr->Pid 设置为接收到的 PID 值,将 PduPtr->SduPtr 设置为 LIN 模块的(硬件或影子)缓冲区,上层应将响应写入该缓冲区。
注意:
如果 LIN 硬件单元提供的是 ID(不带奇偶校验位的帧的标识符)而不是 PID,则 LIN 模块应负责根据 ID 计算出 PID,以满足接口函数的要求。
[SWS_Lin_00271]
[ ]
- 如果 LIN 硬件单元无法检测出无效的 PID,则 LIN 模块不应对 PID(即不应在具体实现中对奇偶校验位进行校验)进行评估。LIN 模块应将接收到的 PID 直接提供给 LIN 接口。
[SWS_Lin_00281]
[ ]
- 在对 LIN 报头进行接收时,如果 LIN 模块检测到与有效 LIN 报头不相符的总线事件(例如,不完整的 LIN 报头),则应使用参数 LIN_ERR_HEADER 调用 LinIf_LinErrorIndication 函数。
[SWS_Lin_00273]
[SRS_Lin_01578]
- LIN 模块应能够传输、接收或忽略 LIN 响应。
[SWS_Lin_00282]
[ ]
- 当 LinIf_HeaderIndication 的返回值为 E_OK 时,LIN 模块应对 PduPtr->Drc 进行评估以确定 LIN 响应的类型。
[SWS_Lin_00284]
[ ]
- 如果对 LIN 响应(LIN_FRAMERESPONSE_RX)进行接收,LIN 模块应对参数 PduPtr 中的 Cs 和 Dl 成员(在 LinIf_HeaderIndication 返回 E_OK 后)进行评估以配置接收操作。
[SWS_Lin_00274]
[SRS_Lin_01555]
[SRS_Lin_01503]
- 成功地接收 LIN 响应后,LIN 模块应调用 LinIf_RxIndication 函数并将 Lin_SduPtr 参数设置为接收到的数据,以直接将接收到的数据提供给 LIN 接口。
[SWS_Lin_00283]
[SRS_Lin_01503]
[SRS_Lin_01522]
- 如果对 LIN 响应(LIN_FRAMERESPONSE_TX)进行传输,LIN 模块应对参数 PduPtr 中的 Cs、Dl 和 SduPtr 成员(在 LinIf_HeaderIndication 返回 E_OK 后)进行评估以配置和传输 LIN 响应。
[SWS_Lin_00286]
[ ]
- 如果 LinIf_HeaderIndication 的返回值为 E_NOT_OK 或返回的 PduPtr->Drc 为 LIN_FRAMERESPONSE_IGNORE,则 LIN 模块应忽略该 LIN 响应。
[SWS_Lin_00275]
[SRS_Lin_01555]
- 成功地传输 LIN 响应后,LIN 模块应调用 LinIf_TxConfirmation 函数以直接将传输确认传递给 LIN 接口。
[SWS_Lin_00276]
[ ]
- 如果忽略 LIN 响应,则在接收到新的 LIN 报头之前,LIN 模块不得向 LIN 接口报告任何事件。
[SWS_Lin_00277]
[ ]
- 在对响应进行传输和接收的过程中,LIN 模块应检测通信错误。一旦检测到错误,应中止当前正在进行的处理,并调用 LinIf_LinErrorIndication 函数。
[SWS_Lin_00285]
[ ]
- 必须通过对函数 LinIf_RxIndication、函数 LinIf_TxConfirmation 或函数 LinIf_LinErrorIndication 进行调用来完成对 LIN 响应的处理,最迟应在对“对新的 LIN 报头的接收”的指示(函数 Lin_HeaderIndication 被调用)发生之前完成。
常见需求
[SWS_Lin_00019]
[ ]
- LIN 模块应能够根据当前 LIN PDU 的校验和模型计算“经典型”校验和或“增强型”校验和。
[SWS_Lin_00026]
[ ]
- 如果 LIN 硬件单元(例如简单的 UART 实现)无法对待传输或待接收的字节进行入队操作,则 LIN 模块应提供一个临时的缓冲区。
[SWS_Lin_00027]
[ ]
- LIN 模块应以无阻塞的方式启动传输(仅当上一次接收操作成功时),包括对下一个待被传输的字节的校验。
[SWS_Lin_00028]
[ ]
- LIN 模块应以无阻塞的方式接收数据。
数据完整性
传输数据的完整性
[SWS_Lin_00053]
[SRS_Lin_01522]
[SRS_Lin_01526]
- LIN 模块应直接从上层缓冲区中复制数据。
[SWS_Lin_00210]
[ ]
- 对于 LIN 主节点,LIN 模块的上层必须保证缓冲区中的数据的完整性,直到对函数的调用返回。对于 LIN 从节点,LIN 模块的上层必须保证缓冲区中的数据的完整性,直到对响应的传输结束。
接收数据的完整性
以下需求适用于 LIN 主节点和从节点。
对于 LIN 响应的接收,SDU 缓冲区中的字节的地址应按照连续递增的方式被分配。LIN 帧的数据的长度决定了 SDU 缓冲区的最小大小。
[SWS_Lin_00060]
[SRS_Lin_01522]
- 对 LIN 帧的接收的处理的完整过程(包括将数据复制到目标所在的层)可以在 ISR 中被实现。应保持接收的数据的完整性,直到成功地接收到下一个 LIN 帧或 LIN 通道的状态发生变化。
只要保证 ISR 或 Lin_GetStatus(仅限主节点)不会被自身中断,就可以始终保持 LIN 硬件(或影子)缓冲区的完整性,因为它在一个永远不会被自身中断的函数中按顺序被写入和读取。
接收数据的完整性(仅主节点)
[SWS_Lin_00211]
[ ]
- 对 LIN 帧的接收的处理的完整过程(包括将数据复制到目标所在的层)可以在函数 Lin_GetStatus 中被实现。应保持接收的数据的完整性,直到成功地接收到下一个 LIN 帧或 LIN 通道的状态发生变化。
数据字节映射
[SWS_Lin_00096]
[ ]
- 内存和 LIN 帧之间的数据映射的定义如下:数组元素 [0] 包含 LSB(首先发送/接收的数据字节),数组元素 [n-1] 包含 MSB(最后发送/接收的数据字节)。
休眠和唤醒功能
LIN 硬件通道被唤醒的原因有两种:
- 内部(自上而下)唤醒:上层调用 Lin_Wakeup 函数请求唤醒。
- 外部(自下而上)唤醒:检测到总线唤醒事件,并通过对 Lin_CheckWakeup 函数的调用将其转发至上层,该函数必须由 LIN 接口调用。成功对唤醒源进行验证后,会对函数 Lin_WakeupInternal 进行调用。
对唤醒模式的选择由配置参数 LinChannelWakeupSupport 决定:
- 当参数 LinChannelWakeupSupport 被配置为 TRUE 时,LIN 硬件通道支持内部和外部唤醒模式。
- 当参数 LinChannelWakeupSupport 被配置为 FALSE 时,LIN 硬件通道仅支持内部唤醒模式。
背景与理由
以下需求仅适用于 LIN 主节点:
LIN 主节点可以由某个从节点发出的唤醒信号或来自上层(LIN 接口)的唤醒请求(参见 [SWS_Lin_00209])唤醒。LIN 接口控制调度表,因此同时负责通过调用 LIN 模块的接口使硬件单元进入休眠或将其唤醒(参见 [SWS_LinIf_00296]、[SWS_LinIf_00488])。
为此,LIN 模块提供了将 LIN 通道置于 LIN_CH_SLEEP 状态的函数(参见 Lin_GoToSleep/Lin_GoToSleepInternal)。
以下需求仅适用于 LIN 从节点:
LIN 从节点可以由主节点或某个从节点发出的唤醒信号或来自上层(LIN 接口)的唤醒请求(参见 [SWS_Lin_00209])唤醒。
LIN 接口对进入休眠的条件进行检测,因此同时负责通过调用 LIN 模块的接口使硬件单元进入休眠或将其唤醒(参见 [SWS_LinIf_00296]、[SWS_LinIf_00488])。
为此,LIN 模块提供了将 LIN 通道置于 LIN_CH_SLEEP 状态的函数(参见 Lin_GoToSleepInternal)。由于从节点无法发送进入休眠的命令,因此 Lin_GoToSleep 函数不适用于从节点。
以下需求适用于 LIN 主节点和从节点:
在进入休眠或被唤醒时,主节点必须通知网络的其它节点有关状态的变化。
需求
[SWS_Lin_00032]
[SRS_Lin_01524]
- 当 LIN 通道进入休眠时,它应使 LIN 硬件单元进入低功耗(如果可用)模式(参见 Lin_GoToSleep/Lin_GoToSleepInternal)。
[SWS_Lin_00033]
[SRS_Lin_01560]
[SRS_Lin_01566]
- 每个 LIN 通道应能够独立于其他通道进入休眠(参见 Lin_GoToSleep/Lin_GoToSleepInternal)。
[SWS_Lin_00037]
[ ]
- 当 LIN 通道处于 LIN_CH_SLEEP 状态,且对参数 LinChannelWakeupSupport 的配置使其支持对唤醒的检测时,LIN 硬件单元应对(LIN 通道所在的)总线上的唤醒请求进行监控。
[SWS_Lin_00043]
[ ]
- 对于函数 Lin_Wakeup,如果 LIN 模块收到 LIN 接口的唤醒请求,则所请求的通道应向 LIN 总线传输唤醒脉冲(参见 Lin_Wakeup)。
[SWS_Lin_00262]
[ ]
- 对于函数 Lin_WakeupInternal,如果 LIN 模块收到 LIN 接口的内部唤醒请求,则所请求的通道不应向 LIN 总线传输唤醒脉冲。(参见 Lin_WakeupInternal)
对于 LIN 主节点,函数 Lin_GetStatus 返回给定的 LIN 通道的当前状态。
错误分类
开发错误
[SWS_Lin_00048]
[SRS_BSW_00323]
[SRS_BSW_00327]
[SRS_BSW_00337]
[SRS_BSW_00385]
产品错误
LIN_E_TIMEOUT
[SWS_Lin_00290]
[ ]
[SWS_Lin_00058]
[ ]
- LIN 模块可以报告的唯一产品错误是 LIN_E_TIMEOUT 错误。
API 规范
导入的类型
本章列出了所有由其他模块导入的类型:
[SWS_Lin_00226]
[ ]
类型定义
[SWS_Lin_00245]
[ ]
- Lin_GeneralTypes.h 的内容应由 LIN_GENERAL_TYPES 宏定义控制。
[SWS_Lin_00246]
[ ]
- 如果使用了不同的 LIN 驱动程序,则在工程中只需保留此文件的一个实例。对于实现,前面提到的所有与 Lin_GeneralTypes.h 文件相关的类型声明都应被考虑在内。
Lin_ConfigType
[SWS_Lin_00227]
[ ]
Lin_FramePidType
[SWS_Lin_00228]
[ ]
Lin_FrameCsModelType
[SWS_Lin_00229]
[ ]
Lin_FrameResponseType
[SWS_Lin_00230]
[ ]
注意
对于 LIN 主节点,到先前定义的映射如下:
- LIN_MASTER_RESPONSE
- LIN_FRAMERESPONSE_TX
- LIN_SLAVE_RESPONSE
- LIN_FRAMERESPONSE_RX
- LIN_SLAVE_TO_SLAVE
- LIN_FRAMERESPONSE_IGNORE
Lin_FrameDlType
[SWS_Lin_00231]
[ ]
Lin_PduType
[SWS_Lin_00232]
[ ]
对 Lin_PduType 的元素的描述如下:
- 第 8.2.2 节:Lin_FramePidType
- 第 8.2.3 节:Lin_FrameCsModelType
- 第 8.2.4 节:Lin_FrameResponseType
- 第 8.2.5 节:Lin_FrameDlType
Lin_StatusType
[SWS_Lin_00233]
[ ]
Lin_SlaveErrorType
[SWS_Lin_91140]
[ ]
函数定义
这是提供给上层模块的函数的列表。
对整个 LIN 硬件单元产生影响的服务
Lin_Init
[SWS_Lin_00006]
[SRS_BSW_00406]
[SRS_BSW_00101]
[SWS_Lin_00084]
[ ]
- 函数 Lin_Init 将初始化 LIN 模块(即静态变量,包括标志位以及对 LIN 硬件单元的全局设置)以及 LIN 通道。
可能存在多个不同的静态配置集。
[SWS_Lin_00150]
[ ]
- 函数 Lin_Init 将根据参数 Config 指向的配置集初始化 LIN 模块。
[SWS_Lin_00008]
[SRS_Lin_01556]
- 函数 Lin_Init 将初始化对 LIN 硬件单元上的所有可用通道的通用硬件寄存器的设置。
[SWS_Lin_00190]
[SRS_Lin_01556]
- 函数 Lin_Init 还将初始化对 LIN 通道的特定设置。
[SWS_Lin_00106]
[ ]
- 在调用 Lin_Init 之前,不得调用 LIN 模块的其他函数,Lin_GetVersionInfo 除外。
[SWS_Lin_00099]
[ ]
- 如果启用了 LIN 模块的开发错误检测:函数 Lin_Init 应检查参数 Config 的值是否在被允许的范围内。如果 Config 的值不在被允许范围内,则函数 Lin_Init 应上报 LIN_E_INVALID_POINTER 开发错误。
[SWS_Lin_00105]
[ ]
- 如果启用了 LIN 模块的开发错误检测:函数 Lin_Init 应检查 LIN 模块是否处于 LIN_UNINIT 状态。如果 LIN 模块未处于 LIN_UNINIT 状态,则函数 Lin_Init 应上报 LIN_E_STATE_TRANSITION 开发错误。
[SWS_Lin_00097]
[ ]
- 如果需要通过(以阻塞的方式)检测状态来确认对 LIN 硬件寄存器的更改是否生效,则应通过可配置的超时检测机制 (LinTimeoutDuration) 对其进行保护。如果发生超时,则应向 DET 或 DEM 上报 LIN_E_TIMEOUT 错误。这种情况仅在 LIN 硬件单元出现故障时发生,并应通知系统的其余部分关于此错误。
LIN_E_TIMEOUT 错误将影响整个 LIN 通信堆栈,这意味着 LIN 模块必须被重新初始化或其功能必须被关闭。
Lin_CheckWakeup
[SWS_Lin_00160]
[ ]
对唤醒进行检测的方式有两种:一种是通过 LIN 控制器(MCU 外设)进行,另一种是通过LIN 收发器进行。
当 LIN 收发器被总线唤醒后,LIN 接口将调用 Lin_CheckWakeup 函数以确认被唤醒的对应通道(例如,当多个 LIN 收发器被连接到同一个 MCU 唤醒引脚时,参见 [SWS_LinIf_00503])。在这种情况下,LIN 模块仅负责对唤醒信号进行验证。
[SWS_Lin_00098]
[SRS_BSW_00375]
[SRS_Lin_01563]
- 函数 Lin_CheckWakeup 将对给定的 LIN 通道上的唤醒事件进行评估。当检测到给定的 LIN 通道上的唤醒事件(例如,RxD 引脚持续处于低电平状态)时,函数 Lin_CheckWakeup 将立即通过函数 EcuM_SetWakeupEvent 通知 EcuM 模块,并通过函数 LinIf_WakeupConfirmation 通知 LIN 接口。
[SWS_Lin_00251]
[ ]
- 如果启用了 LIN 模块的开发错误检测:当参数 channel 的值为无效值时,函数 Lin_CheckWakeup 将上报 LIN_E_INVALID_CHANNEL 开发错误,否则(如果 DET 被禁用),应返回 E_NOT_OK。
[SWS_Lin_00107]
[ ]
- 如果启用了 LIN 模块的开发错误检测:当在初始化 LIN 模块之前,调用函数 Lin_CheckWakeup,函数 Lin_CheckWakeup 将上报 LIN_E_UNINIT 开发错误。
Lin_GetVersionInfo
[SWS_Lin_00161]
[ ]
[SWS_Lin_00001]
[SRS_BSW_00407]
- 函数 Lin_GetVersionInfo 将返回 LIN 模块的版本信息。版本信息包括:
- 两个字节用于供应商 ID
- 两个字节用于模块 ID
- 三个字节用于版本号,其编号由供应商指定。它包括:
- 模块的主版本号、次版本号和补丁版本号。
- 不应在其中包含 AUTOSAR 规范的版本号。在编译时会对 AUTOSAR 规范的版本号进行检查,因此无需在此函数中对其进行包含。
[SWS_Lin_00248]
[ ]
- 如果启用了 LIN 模块的开发错误检测:当参数 versioninfo 的值为 NULL,函数 Lin_GetVersionInfo 将上报 LIN_E_PARAM_POINTER 开发错误。
对单个 LIN 通道产生影响的服务
Lin_SendFrame
注意
此服务仅适用于 LIN 主节点。
[SWS_Lin_00191]
[ ]
[SWS_Lin_00192]
[ ]
- 函数 Lin_SendFrame 应发送报头部分(中断字段、同步字节字段和 PID 字段),并根据响应方向,在被寻址的 LIN 通道上发送(对报头的)响应部分。
[SWS_Lin_00193]
[ ]
- 在接收数据时,当调用 Lin_SendFrame 函数之后,LIN 接口必须通过轮询 Lin_GetStatus 函数的方式,等待对 LIN 帧的响应。
[SWS_Lin_00194]
[ ]
- 当通道处于 LIN_CH_OPERATIONAL 状态或 LIN_CH_OPERATIONAL 状态下的子状态时,才可对该通道调用 Lin_SendFrame 函数。
[SWS_Lin_00239]
[ ]
- 如果在对报头的传输过程中出现错误,则对模块的具体实现应决定如何处理这些错误(停止传输/继续传输),并评估对报头的响应是否有效。
[SWS_Lin_00240]
[ ]
- 如果在对响应的传输过程中出现错误,在帧处理状态机章节中,ISO 17987 规范描述了如何处理此类错误。其中规定,需要在对错误字节进行发送之前检测出错误字节。此外,ISO 17987 规范还规定在该情况下应中止传输。
[SWS_Lin_00195]
[ ]
- 如果启用了 LIN 模块的开发错误检测:当在初始化 LIN 模块之前,调用函数 Lin_SendFrame,函数 Lin_SendFrame 将上报 LIN_E_UNINIT 开发错误,否则(如果 DET 被禁用),应返回 E_NOT_OK。
[SWS_Lin_00197]
[ ]
- 如果启用了 LIN 模块的开发错误检测:当参数 channel 的值为无效值时,函数 Lin_SendFrame 将上报 LIN_E_INVALID_CHANNEL 开发错误,否则(如果 DET 被禁用),应返回 E_NOT_OK。
[SWS_Lin_00198]
[ ]
- 如果启用了 LIN 模块的开发错误检测:当参数 PduInfoPtr 的值为 NULL,函数 Lin_SendFrame 将上报 LIN_E_PARAM_POINTER 开发错误。否则(如果 DET 被禁用),应返回 E_NOT_OK。
[SWS_Lin_00199]
[ ]
- 如果启用了 LIN 模块的开发错误检测:如果 LIN 通道处于 LIN_CH_SLEEP 状态,则函数 Lin_SendFrame 应上报 LIN_E_STATE_TRANSITION 开发错误。否则(如果 DET 被禁用),应返回 E_NOT_OK。
[SWS_Lin_00287]
[ ]
- 仅当 LIN 模块具有至少一个作为 LIN 主节点的通道时,Lin_SendFrame 函数才可用。如果在配置中不具有作为 LIN 主节点的通道,则该函数不可用。通道类型由配置参数 LinNodeType 进行配置。
Lin_GoToSleep
注意
此服务仅适用于 LIN 主节点。
[SWS_Lin_00166]
[ ]
[SWS_Lin_00089]
[ ]
- 按照 LIN 规范 2.1 中的定义,函数 Lin_GoToSleep 应向被寻址的 LIN 通道发送“进入休眠”命令。
[SWS_Lin_00266]
[SRS_Lin_01566]
- 即使在错误地传输“进入休眠”命令的情况下,函数 Lin_GoToSleep 也应将 LIN 通道设置为 LIN_CH_SLEEP_PENDING 状态。
[SWS_Lin_00220]
[ ]
- 如果对参数 LinChannelWakeupSupport 的配置支持对外部唤醒的检测,则函数 Lin_GoToSleep 应在该通道中启用对总线唤醒请求的监测,即使在错误地传输“进入休眠”命令的情况下也是如此。
[SWS_Lin_00221]
[ ]
- 即使在错误地传输“进入休眠”命令的情况下,函数 Lin_GoToSleep 也可以选择性地将 LIN 硬件单元设置为低功耗模式(如果硬件支持)。
[SWS_Lin_00255]
[ ]
- 在函数 Lin_GoToSleep 被调用之后,当调用 Lin_GetStatus 函数时,LIN 通道应进入 LIN_CH_SLEEP 状态,无论在总线上对“进入休眠”命令的传输是否成功。
[SWS_Lin_00074]
[ ]
- 函数 Lin_GoToSleep 应终止在该函数被调用之前的传输请求,即使对该请求的处理正在进行。
[SWS_Lin_00129]
[ ]
- 如果启用了 LIN 模块的开发错误检测:当在初始化 LIN 模块之前,调用函数 Lin_GoToSleep,函数 Lin_GoToSleep 将上报 LIN_E_UNINIT 开发错误。
[SWS_Lin_00131]
[ ]
- 如果启用了 LIN 模块的开发错误检测:当参数 channel 的值为无效值时,函数 Lin_GoToSleep 将上报 LIN_E_INVALID_CHANNEL 开发错误。
[SWS_Lin_00288]
[ ]
- 仅当 LIN 模块具有至少一个作为 LIN 主节点的通道时,Lin_GotoSleep 函数才可用。如果在配置中不具有作为 LIN 主节点的通道,则该函数不可用。通道类型由配置参数 LinNodeType 进行配置。
Lin_GoToSleepInternal
[SWS_Lin_00167]
[ ]
[SWS_Lin_00095]
[ ]
- 函数 Lin_GoToSleepInternal 应将 LIN 通道设置为 LIN_CH_SLEEP 状态。
[SWS_Lin_00222]
[ ]
- 如果对参数 LinChannelWakeupSupport 的配置支持对外部唤醒的检测,则函数 Lin_GoToSleepInternal 应在该通道中启用对总线唤醒请求的监测。
[SWS_Lin_00223]
[ ]
- 函数 Lin_GoToSleepInternal 可以选择性地将 LIN 硬件单元设置为低功耗模式(如果硬件支持)。
[SWS_Lin_00133]
[ ]
- 如果启用了 LIN 模块的开发错误检测:当在初始化 LIN 模块之前,调用函数 Lin_GoToSleepInternal,函数 Lin_GoToSleepInternal 将上报 LIN_E_UNINIT 开发错误。
[SWS_Lin_00135]
[ ]
- 如果启用了 LIN 模块的开发错误检测:当参数 channel 的值为无效值时,函数 Lin_GoToSleepInternal 将上报 LIN_E_INVALID_CHANNEL 开发错误。
Lin_Wakeup
[SWS_Lin_00169]
[ ]
[SWS_Lin_00137]
[ ]
- 如果启用了 LIN 模块的开发错误检测:当在初始化 LIN 模块之前,调用函数 Lin_Wakeup,函数 Lin_Wakeup 将上报 LIN_E_UNINIT 开发错误。
[SWS_Lin_00139]
[ ]
- 如果启用了 LIN 模块的开发错误检测:当参数 channel 的值为无效值或参数 channel 对应的通道未被激活时,函数 Lin_Wakeup 将上报 LIN_E_INVALID_CHANNEL 开发错误。
[SWS_Lin_00140]
[ ]
- 如果启用了 LIN 模块的开发错误检测:如果 LIN 通道未处于 LIN_CH_SLEEP 状态,则函数 Lin_Wakeup 应上报 LIN_E_STATE_TRANSITION 开发错误。
注意
仅当 LIN 通道处于 LIN_CH_SLEEP 状态时才应调用 Lin_Wakeup 函数。
Lin_WakeupInternal
[SWS_Lin_00256]
[ ]
[SWS_Lin_00257]
[ ]
- 函数 Lin_WakeupInternal 将被寻址的 LIN 通道设置为 LIN_CH_OPERATIONAL 状态,且不发送唤醒脉冲。
[SWS_Lin_00258]
[ ]
- 如果启用了 LIN 模块的开发错误检测:当在初始化 LIN 模块之前,调用函数 Lin_WakeupInternal,函数 Lin_WakeupInternal 将上报 LIN_E_UNINIT 开发错误。
[SWS_Lin_00259]
[ ]
- 如果启用了 LIN 模块的开发错误检测:当参数 channel 的值为无效值或参数 channel 对应的通道未被激活时,函数 Lin_WakeupInternal 将上报 LIN_E_INVALID_CHANNEL 开发错误。
[SWS_Lin_00260]
[ ]
- 如果启用了 LIN 模块的开发错误检测:如果 LIN 通道未处于 LIN_CH_SLEEP 状态,则函数 Lin_WakeupInternal 应上报 LIN_E_STATE_TRANSITION 开发错误。
注意
仅当 LIN 通道处于 LIN_CH_SLEEP 状态时才应调用 Lin_WakeupInternal 函数。
Lin_GetStatus
注意
此服务仅适用于 LIN 主节点。
[SWS_Lin_00168]
[ ]
[SWS_Lin_00091]
[ ]
- 函数 Lin_GetStatus 将返回 LIN 模块当前的传输、接收或运行状态。
[SWS_Lin_00200]
[ ]
- 以下状态是 LIN_CH_OPERATIONAL 状态的子状态:
- LIN_TX_OK
- LIN_TX_BUSY
- LIN_TX_HEADER_ERROR
- LIN_TX_ERROR
- LIN_RX_OK
- LIN_RX_BUSY
- LIN_RX_ERROR
- LIN_RX_NO_RESPONSE
- LIN_OPERATIONAL
[SWS_Lin_00092]
[ ]
- 如果成功地接收了 SDU,函数 Lin_GetStatus 应将 SDU 存储在映射到由 Lin_SduPtr 引用的 LIN 硬件接收缓冲区的影子缓冲区或内存中。该缓冲区仅在函数 Lin_SendFrame 被再次调用之前有效,且在函数 Lin_SendFrame 被再次调用之前必须对其进行读取。
[SWS_Lin_00238]
[ ]
- 函数 Lin_GetStatus 将返回 LIN_TX_OK,当:
- 对主节点的响应已被成功地发送,其中包括对 LIN 报头以及对报头的响应的传输。
- 从节点对从节点的响应已被成功地发送,其中包括对 LIN 报头的传输。
[SWS_Lin_00141]
[ ]
- 如果启用了 LIN 模块的开发错误检测:当在初始化 LIN 模块之前,调用函数 Lin_GetStatus,函数 Lin_GetStatus 将上报 LIN_E_UNINIT 开发错误。否则(如果 DET 被禁用),应返回 LIN_NOT_OK。
[SWS_Lin_00143]
[ ]
- 如果启用了 LIN 模块的开发错误检测:当参数 channel 的值为无效值或参数 channel 对应的通道未被激活时,函数 Lin_GetStatus 将上报 LIN_E_INVALID_CHANNEL 开发错误。否则(如果 DET 被禁用),应返回 LIN_NOT_OK。
[SWS_Lin_00144]
[ ]
- 如果启用了 LIN 模块的开发错误检测:当参数 Lin_SduPtr 的值为 NULL,函数 Lin_GetStatus 将上报 LIN_E_PARAM_POINTER 开发错误。否则(如果 DET 被禁用),应返回 LIN_NOT_OK。
[SWS_Lin_00289]
[ ]
- 仅当 LIN 模块具有至少一个作为 LIN 主节点的通道时,Lin_GetStatus 函数才可用。如果在配置中不具有作为 LIN 主节点的通道,则该函数不可用。通道类型由配置参数 LinNodeType 进行配置。
预期接口
本章列出了需要其他模块提供的所有接口。
强制接口
本章定义了实现模块核心功能所需的所有接口。
[SWS_Lin_00234]
[ ]
可选接口
本章定义了实现模块可选功能所需的所有接口。
[SWS_Lin_00235]
[ ]
[SWS_Lin_00176]
[ ]
- 当检测到有效的 LIN 唤醒脉冲时,LIN 模块应在相应通道的唤醒 ISR 中调用 EcuM_CheckWakeup 函数。
限制:
仅在 LIN 硬件支持的情况下,唤醒 ISR 才能被触发。因此,如果至少一个通道支持唤醒功能(参见配置参数 LinChannelWakeUpSupport),则函数 EcuM_CheckWakeup 有效。
Sequence diagrams
Complete sequence diagrams for transmission, reception and error handling can be found in the LIN Interface Specification [8].
Receiving a LIN Frame
LIN Master
In general, this chapter defines configuration parameters and their clustering into containers. In order to support the specification Chapter 10.1 describes fundamentals.
Chapter 10.2 specifies the structure (containers) and the parameters of the module LIN driver.
Chapter 10.3 specifies published information of the module LIN driver.
How to read this chapter
For details refer to the chapter 10.1 "Introduction to configuration specification" in SWS_BSWGeneral.
Containers and configuration parameters
The following chapters summarize all configuration parameters. The described parameters are inputs for the LIN driver configurator.
[SWS_Lin_00029]
[SRS_BSW_00159]
- The code configurator of the LIN driver is LIN hardware Unit specific.
[SWS_Lin_00039]
[SRS_BSW_00167]
- Values that can be configured are hardware dependent. Therefore, the rules and constraints cannot be given in the standard.
[SWS_Lin_00224]
[ ]
- The configuration tool is responsible to do a static configuration checking, also regarding dependencies between modules (e.g. Port driver, MCU driver etc.)
[SWS_Lin_00269]
[ ]
- The Lin Driver module shall reject configurations with partition mappings which are not supported by the implementation.
[SWS_Lin_CONSTR_00270]
[ ]
- The module will operate as an independent instance in each of the partitions, means the called API will only target the partition it is called in.
LinChannel
The configuration parameter LinChannelWakeupSupport can be ignored during validation of wakeup signal.
[SWS_Lin_CONSTR_00278]
[ ]
- The ECUC partitions referenced by LinChannelEcucPartitionRef shall be a subset of the ECUC partitions referenced by LinEcucPartitionRef.
[SWS_Lin_CONSTR_00291]
[ ]
- If LinEcucPartitionRef references one or more ECUC partitions, LinChannelEcucPartitionRef shall have a multiplicity of one and reference one of these ECUC partitions as well.
[SWS_Lin_CONSTR_00279]
[ ]
- LinChannel and LinTrcvChannel of one communication channel shall all reference the same ECUC partition.
评论
发表评论