【AUTOSAR】【Lin通信】Lin
目录
一、介绍
二、说明
三、功能说明
3.1 基本需求
3.2 LIN驱动程序和通道初始化
3.2.1 前提
3.2.2 需求
3.2.3 状态机
3.4 帧处理
3.4.1 主节点
3.4.2 从节点
3.5 睡眠和唤醒功能
四、API接口
4.1 API定义
一、介绍
该规范规定了自动共享基本软件模块LIN驱动程序的功能、API和配置。
LIN驱动程序是微控制器抽象层(MCAL)的一部分,执行硬件访问,并为上层提供一个硬件独立的API。唯一可以访问LIN驱动程序的上层是LIN接口。
一个LIN驱动程序可以支持多个通道。这意味着LIN驱动程序可以处理一个或多个LIN通道,只要它们属于同一个LIN硬件单元。
二、说明
ECU中只有一个LIN通道可以连接到特定的LIN集群。除非在ECU中有未使用(未连接)的通道,否则LIN通道的数量将等于LIN集群的数量。
【规范】一个LIN驱动程序提供了对一种LIN硬件单元类型(简单的UART或专用的LIN硬件)的访问,它可能由几个LIN通道组成。
【规范】对于不同的LIN硬件单元,需要实现一个单独的LIN驱动程序。由实现者来使驱动程序适应类似LIN通道的不同实例。
【规范】如果在一个ECU中实现了多个LIN驱动程序实例(具有相同或不同供应商的实例),则必须修改文件名、API名称和已发布的参数,以便不生成具有相同名称的两个定义。该名称应根据SRS_BSW_00347进行扩展,包括供应商Id(需要区分LIN驱动程序和不同的供应商)和供应商特定名称(需要区分由一个供应商实现的不同硬件单元):。
三、功能说明
LIN驱动程序模块需要通过连接到驱动程序驻留的节点上的任何LIN集群来管理依赖于硬件的通信方面。这包括接受用于向总线传输的头数据、用于传输的响应帧数据、检索头信息和拟用于节点的响应帧数据。
3.1 基本需求
Lin模块是一个可以直接访问硬件资源的基本软件模块。
【规范】Lin模块应符合ISO 17987规范[16]。这适用于ISO 17987 LIN主节点和从节点。
【规范】Lin模块应为所有需要的所有Lin硬件单元中断实现ISR。
【规范】Lin模块应确保所有未使用的中断都被禁用。
【规范】Lin模块应在ISR末端重置中断标志(如果不是由硬件自动完成)。
Lin模块不得配置中断(即优先级),也不得设置向量表条目。
3.2 LIN驱动程序和通道初始化
3.2.1 前提
在LIN总线上启动通信之前,必须同时初始化LIN驱动程序和相关的LIN信道。
驱动程序初始化(参见Lin_Init)处理与LIN硬件单元中存在的所有通道相关的初始化的所有方面。这可能包括所有可用的LIN通道所共有的任何静态变量或硬件寄存器设置。此外,每个通道还必须根据所提供的配置进行初始化。例如,这将包括(但不限于)总线上的波特率。
【规范】LIN驱动程序必须至少有一个可用的静态定义的配置集。当EcuM调用初始化函数时,它必须提供一个指向它希望使用的配置的特定指针。
3.2.2 需求
Lin模块不得初始化或配置未被使用的Lin通道。Lin模块应允许环境在运行时选择不同的静态配置数据。
【规范】Lin模块的配置应包括由静态配置数据定义的数据通信速率集。
【规范】Lin模块的配置数据应作为硬件特定的数据结构存储在ROM中。
【规范】每个LIN PID应与一个校验和模型相关联(PID中包含PID的“增强”,或只有响应数据被校验和的“经典”)。
【规范】每个LIN PID都应与一个以字节表示的响应数据长度相关联。
3.2.3 状态机
LIN驱动程序的状态机:
3.4 帧处理
一个LIN框架由两部分组成,LIN报头和LIN响应。LIN报头始终由LIN主节点传输,并指示帧的开始,包括LIN PID。LIN响应在LIN报头之后的总线上传输,并且可以由主节点或其中一个从节点传输。
【规范】LIN驱动程序应该能够根据当前LIN PDU的校验和模型计算出“经典”或“增强”校验和。
【规范】如果LIN硬件单元不能对字节进行传输或接收(例如简单的UART实现),LIN驱动程序应提供临时通信缓冲区。
【规范】LIN驱动程序应在不阻塞的情况下启动传输,包括在成功接收前一个字节(接收)下检查下一个字节传输。
【规范】LIN驱动器在接收数据时应不受阻塞。
【规范】LIN驱动程序应直接从上层缓冲区复制数据。
【规范】对于LIN主节点,LIN驱动程序的上层必须保持缓冲区数据的一致,直到返回函数调用。对于LIN从属节点,LIN驱动程序的上层必须使缓冲区数据保持一致,直到响应传输结束。
【规范】完整的LIN帧接收处理(包括复制到目标层)可以在ISR中实现。接收到的数据应一致,直到下一个LIN帧成功接收或LIN通道状态发生改变。
【规范】完整的LIN帧接收处理(包括复制到目标层)可以在Lin_GetStatus函数中实现。接收到的数据应一致,直到下一个LIN帧被成功接收或LIN通道状态发生改变。
3.4.1 主节点
【规范】LIN驱动程序应将所提供的标识符解释为PID。然后,按照在LIN报头中提供的方式传输标识符。
【规范】LIN驱动程序应能够发送一个LIN报头。这是由断开字段、同步字节字段和受保护的标识符字节字段组成的。
【规范】LIN驱动程序应能够发送一个LIN报头和响应。
【规范】如果LIN接口请求新的帧传输,以及如果正在进行的传输或未成功完成,LIN驱动程序应中止当前的帧传输。
【规范】函数Lin_GetStatus应返回该信道的当前帧传输请求的状态。
【规范】LIN驱动程序应提供LIN接口模块。成功接收到整个LIN帧后,应准备接收到的数据进行LIN接口的函数调用。
【规范】LIN驱动程序应发送由LIN接口模块提供的响应数据。
3.4.2 从节点
【节点】LIN驱动程序应能够在LIN_CH_OPERATIONAL状态下随时接收到LIN报头。报头由中断字段、同步字节字段和受保护的标识符字节字段组成。
【规范】在LIN头接收时,LIN驱动程序应调用头指示回调函数LinIf_HeaderIndication,PduPtr->Pid设置为接收的PID值,PduPtr->SduPtr设置为LIN驱动程序的(硬件或阴影)缓冲区,从响应应由上层写入。
【规范】如果LIN硬件单元无法检测到无效的PID,LIN驱动程序不得评估PID值(即不得验证软件中的奇偶校验位)。LIN驱动程序应向LIN接口模块提供所接收到的PID。
【规范】在等待新的LIN标头时,当LIN驱动程序检测到不符合有效的LIN标头(如不完整的LIN标头)时,应调用带有错误参数LIN_ERR_HEADER的错误指示回调函数LinIf_LinErrorIndication。
【规范】LIN驱动程序应能够发送、接收或忽略LIN响应。
【规范】当返回值为E_OK时,调用LinIf_HeaderIndication后,LIN驱动程序应评估PduPtr->Drc,以确定LIN响应的类型。
【规范】如果要接收到LIN响应(LIN_FRAMERESPONSE_RX),LIN驱动程序应评估参数PduPtr(调用LinIf_HeaderIndication,返回值为E_OK后)中的Cs和Dl成员,以配置LIN响应接收。
【规范】成功接收到LIN响应后,LIN驱动程序应通过调用将Lin_SduPtr参数设置到接收数据中的Rx指示回调函数LinIf_RxIndication,将接收到的数据直接提供给LIN接口模块。
【规范】如果要传输LIN响应(LIN_FRAMERESPONSE_TX),LIN驱动程序应评估参数PduPtr(返回值为E_OK后)中的Cs、Dl和SduPtr成员,以设置和传输LIN响应。
【规范】如果LinIf_HeaderIndication的返回值为E_NOT_OK或返回的PduPtr->Drc为LIN_FRAMERESPONSE_IGNORE,则LIN驱动程序应忽略该响应。
【规范】在一个LIN响应传输成功后,应通过调用Tx确认回调函数LinIf_TxConfirmation,直接确认传输到LIN接口模块。
【规范】如果LIN响应忽略到新的LIN报头,LIN驱动程序不得向LIN接口模块报告任何事件。
【规范】LIN驱动程序应在响应传输和响应接收过程中检测到通信错误。一旦检测到错误,将中止当前的帧处理,并调用错误指示回调函数LinIf_LinErrorIndication。
【规范】每个相关(即不忽略)LIN响应的处理必须通过对LinIf_RxIndication、LinIf_TxConfirmation或LinIf_LinErrorIndication的调用完成,直到新的LIN头接收由Lin_HeaderIndication的调用指示。
3.5 睡眠和唤醒功能
有两种不同的可能性来唤醒LIN的硬件通道:
- 内部(自上而下)唤醒上层通过调用Lin_Wakeup请求唤醒。
- 外部(自底向上)唤醒检测总线唤醒事件并通过Lin_CheckWakeup API转发到上层,必须由模块LinIf调用。在成功验证唤醒源后,也被称为Lin_WakeupInternal。
四、API接口
4.1 API定义
- Lin_Init
- Lin_CheckWakeup ——此函数检查在已寻址的LIN通道上是否发生了唤醒。
- Lin_GetVersionInfo
- Lin_SendFrame ——如果需要,发送LIN标头和LIN响应。
- Lin_GoToSleep ——该服务指示驱动程序在被寻址的LIN通道上传输一个进入睡眠状态的命令。
- Lin_GoToSleepInternal ——将信道状态设置为LIN_CH_SLEEP,启用唤醒检测,并可选择将LIN硬件单元设置为降低功率运行模式
- Lin_Wakeup ——生成唤醒脉冲,并将信道状态设置为LIN_CH_可操作。
- Lin_WakeupInternal ——将信道状态设置为LIN_CH_OPERATIONAL,而不产生唤醒脉冲。
- Lin_GetStatus ——获取LIN驱动程序的状态。仅用于LIN主节点