LIN UDS诊断

CAN总线与LIN总线是典型的车载网络总线。其两者的区别在于诊断时,CAN总线诊断遵循UDS协议,而LIN总线诊断在遵循UDS协议的基础上,还遵循LIN 2.2协议。

LIN 2.x vs LIN 1.3 协议区别

LIN2.x 与LIN1.3节点模型的差别在于LIN1.3没有Transport layer(传输层),所以也就没有流控、传输时间控制的功能,LIN1.3协议中没有对诊断及节点配置进行规范,所以在LIN1.3中完成相应的功能都放在自定义诊断中完成。为了支持UDS这样的高级诊断服务,需要一个传输层来处理多帧数据传输的问题,而这正是LIN 1.3所缺少的特性之一。后续的LIN版本如2.0、2.1以及2.2等增加了对传输层的支持,并标准化了诊断功能,这使得它们能够更好地支持UDS诊断服务。

在 LIN 中用于发送和接收大于 8 字节的部分数据。 LIN 传输协议与 CAN 中使用的“ISO 15765-2”基本相同,它是通过在数据字节的一部分中存储特殊信息来传输的。

LIN2.x 使用此传输协议进行诊断、节点配置和识别。

LIN 2.0、LIN 2.1、LIN2.2--- LIN协议变更

LIN 2.0规范: LIN 2.0是在LIN 1.3的基础上发展起来的,LIN 2.0和LIN 1.3从节点可以在网络中并存,但是需要避免一些新特性(例如改进的检验和自动波特率检测)。以下是一些关键的改进:

  1. 响应错误状态监控:添加节点自我状态监测和故障报告(规定每个从机节点需在其发布的某个无条件帧中包含一个长度为一位的标量信号 response_error 以向主机节点报告自身状态),有助于快速定位问题并提高系统的可靠性,当从节点发送或接收的帧(事件触发的帧响应除外)在帧响应中包含错误时,应设置 response error 信号,当包含 response_error 信号的无条件帧成功传输时,response error 信号将被清除。 

  2. 规格中新增自动比特率检测:增加了自动比特率检测的功能,使得节点能够自动识别网络的比特率。

  3. 支持字节数组信号 :信号组被删除,取而代之的是使用字节数组,LIN 2.0 引入了对字节数组信号的支持,LIN一帧数据最大可以传8bytes,LIN1.3 规定可以传输的LIN字节数可选是2,4,8 LIN 2.0 可以为1-8内任意一个数字。一般而言,最常用比如每帧都传8个字节。

  4. 睡眠模式和唤醒功能 (Sleep and Wakeup):网络管理时间以秒为单位,而不是位时间。支持节点进入低功耗睡眠模式,以减少能源消耗,同时具备外部事件触发的唤醒LIN网络机制,提高了能效。

  5. 增加诊断和故障处理 (Diagnostic Specification):增强了诊断功能,添加了强制性节点配置命令(可以通过诊断指令重新配置从属节点 ), 以及一些可选命令。添加了对应的诊断API。

  6. LIN总线节点能力语言(Node Capability Language, NCF): 是一种专门用于描述LIN从节点能力的文件格式。作为LIN 2.0的新特征,提供了一个标准化的语法结构,用于远程从机节点技术规格的描述。这可以简化标准节点的获取,并使机群的生成自动化。NCF文件详细定义了LIN网络中各个节点的属性和行为,包括但不限于节点名称、物理特性、帧和信号的定义等信息。这些信息对于配置和生成LIN子网至关重要。

  7. 每个从节点的LIN 产品标识是标准化的:取消了受保护标识符(PID)中的数据长度字段,即传输长度不再受限于ID,并将最后一个字节视为校验和

PS: 增强的校验和(包括受保护的标识符PID)作为对 LIN 1.3 经典校验和的改进;对零星帧进行了定义。

LIN V1.3 ID Range:

( 帧长取决于标识符)


LIN 2.1规范: LIN 2.1是对LIN 2.0的进一步优化和完善,

  1. 主要改进包括:

    1. 分配框架ID配置服务修改:分配框架ID配置服务(SID:0xB1)被移除,同时增加了分配框架ID范围配置服务(SID:0xB7)以及保存配置服务(Save Configuration (SID:0xB6)) 。

    2. 节点能力语言规范(NCF):对节点能力语言规范进行扩展,增加了新的参数,添加节点属性、节点组成、事件触发帧和配置。

    3. 诊断类别和服务实现:实施了诊断类别1至3及相应的诊断服务,进一步增强了系统的诊断能力。添加了“功能寻址”规范,该规范可在单个主请求帧中向所有从节点发出诊断请求。 当使用功能寻址发送时,节点地址包含 “ 功能节点地址 (0x7E)”

    4. NAD 0x7E(功能性NAD)保留为功能性地址用于诊断:LIN2.0将NAD 7E作为已配置的从节点NAD

    5. 节点诊断0xB2服务:读取服务(Read by Identifier )的ID 2 到31 被保留

PS: 


LIN 2.2规范: LIN2.2针对LIN2.1的错误进行了修正。


不同LIN 协议版本的节点混合时的行为

在 LIN 网络中,主节点控制通信,因此主节点的协议版本决定了从节点可以使用哪些协议版本。

1. 当主节点的协议版本为 LIN1.3 时

不能使用 LIN 2.x 的从节点。

2. 当主节点的协议版本为 LIN2.x 时

可以使用 LIN1.3 和 LIN2.x 的从节点。 但是,如果从节点是 LIN1.3,则主节点不能使用 LIN2.x 规范,例如扩展校验和和诊断。 同样,在 LIN 2.0/2.1 混合的情况下,协议版本之间的不同规范(例如功能寻址和节点配置和识别服务)不可用。

LDF是实现LIN诊断的充分条件

CAN总线诊断只需要有控制器(ECU)、诊断数据库(cdd&pdx等等)与诊断仪(Tester),通过请求ID与响应ID进行诊断。而LIN总线在此基础上,还必须通过LDF(LIN描述文件)进行调度,以经典ID(0x3c与0x3D)进行LIN诊断。

NAD 用于区分现有的LIN网络拓扑的节点

LIN网络拓扑是“一主多从”的结构,通过NAD区分从节点。CAN一般以Request/Response ID区分从节点。而LIN则是以NAD进行区分,利用一个ID(0x3C) 即实现多个从节点诊断服务;此方式节约了ID的使用,但是浪费了一个Byte,造成数据有效载荷降低。诊断帧的第一个字节是NAD(诊断用节点地址),这是一个字节长的诊断用节点地址。值范围从1到127(0x01~ 0x7F) ,0被保留

NAD(Node Address), 用于区分不同从机地址,下表是NAD的取值范围

范围描述
0x00用于休眠指令
0x01~0x7D从机节点地址,即NAD
0x7E功能节点地址(功能NAD)
0x7F广播节点地址(广播NAD)

1. 7E是通配功能寻址ID,在诊断报文中用于广播诊断请求,不能用在节点配置中(功能寻址:一般是一对多,一个主机对应多个从机(0X7E通配功能寻址ID))(物理寻址:一般是点对点通讯,一个主机,一个特定的从机)

2. 7F是作为NAD通配符,正常情况下不在诊断中使用,因为从节点收到7F和它自身的NAD是一样的,所以会导致冲突。7F在从节点配置中使用,以及物理寻址(自动寻址)中使用。

3. 用户定义的诊断可用来满足特定设备的要求,但是这同时表示它不能用作通用目的。这种方法使用128到255范围(0x80~0xFF)的NAD。

LIN诊断服务与报文

Service Identifier (SID):

A mandatory 1-byte field (0x00 to 0x3E) identifying the requested service.

在协议中给出了下表中 LIN从节点 诊断服务列表 0~0xAF0xB8~0xFE 用于诊断(Reserved保留 ),而0xB0到0xB7用于节点配置服务(由于节点能力文件是为一个 Slave 节点定义的,因此它可能会与其他 Slave 节点的节点地址和帧 ID 重叠。为了解决 slave 节点之间重复设置的问题,节点配置和识别服务是一个额外的规范。节点配置和识别是一种高效重用 slave 节点的服务。 节点配置和识别使用单帧传输协议,从节点逐个配置。 节点配置和标识中定义的服务 (SID) 从 “0xB0” 到 “0xB7”)

1. 0xB0到0xB7用于节点配置服务

节点配置SID服务名称
0~0xAFReserved
0xB0Assign NAD (重新配置节点地址NAD)
0xB1(必需服务)Assign frame identifier (使用节点定义文件中设置的消息 ID 重置每帧 1 个 PID。 这将解决重复的帧 ID。 仅限 LIN 2.0,在 LIN 2.1 中,使用“分配帧 ID 范围 (SID:0xB7)”用于重置帧 ID)
0xB2(必需服务)Read by Identifier(读取从属节点的产品标识号等信息)
0xB3Conditional Change NAD (检测 LIN 网络中的恶意从节点(例如,如果连接了错误的节点)并更改 NAD)
0xB4Data Dump(使用它来执行开发所需的任何诊断)
0xB5Assign NAD via SNPD(Slave Node Position Detection)自动寻址指令
0xB6Save Configuration (仅限 LIN 2.1) 设置的 NAD 和 PID 将存储在非易失性 RAM 中
0xB7Assign frame identifier range (仅限 LIN 2.1)

每帧最多可重新配置 4 个 PID。 这将解决重复的帧 ID。 由于可以在一帧中重置多个帧 ID,因此与 LIN 2.0 的“分配帧 ID (SID:0xB1)”服务相比,可以缩短设置时间)

0xB8~0xFFReserved

2. 0x00到0xAF用于其他必要的UDS服务(ISO14229-1的其他服务)

> 诊断类别 3(III类节点支持)(6大类,一共26种服务)

备注:

SID ( Service Identifier )表示了从机节点应完成的服务请求。节点配置服务的 SID 区间为 0xB0~0xB7, 诊断服务的 SID 区间为 0x00~0xAF,0xB8~0xFE 。RSID ( Response Service Identifier )表示从机节点应答的内容,它的值是 SID+0x40 。

LIN诊断类型

  LIN从节点所支持的不同诊断分类被定义在ISO17987中,ISO14229-7-UDSonLIN协议参考了ISO14229-1和ISO14229-2,并明确了以下内容:

(1)LIN的诊断服务;

(2)通过外部测试设备进行LIN车载服务器内存编程。

(3)ISO17987协议配置LIN从节点

ISO14229-7参考ISO14229-1,ISO14229-2,ISO17987全部

  逻辑节点功能越复杂,支持的服务越多,对逻辑节点的计算能力要求就越高。 依据诊断服务的数量,LIN规范划分出三种不同的诊断类型——I类、II类和III类,适用于不同条件的逻 辑节点。I类最低,III类最高,较高类型完全包含较低类型的功能。

  1. I 类是所有诊断类型的公共部分,诊断服务仅限于节点配置 ,故障都由主节点读取分析处理保存,只支持unsegmented诊断 ,提供信号处理、识别、配置功能,诊断功能采用单帧传输,这也是每个逻辑节点必备的服务。

  2. II类节点增加了UDS定义的识别服务,故障同样由主节点来获取,分析处理和保存,区别在于支持unsegmented诊断和segmented诊断,必须支持支持ISO 14229-1定义的22服务和2E服务,必须支持节点配置服务,  诊断方式一般采用的完整帧传输协议。

  3. III类节点相比II类节点,又增加了UDS定义的部分其它服务,具有较强应用功能的节点,除了基本的节点配置服务以外,还支持ISO14229-1的其他服务(该部分服务可视主机厂的需求而定),具有内部故障存储设备,有些还支持在线刷写,需要完整的BOOT-loder工具和相应的诊断服务去实现,支持unsegmented诊断和segmented诊断,ECU程序可以支持LIN总线在线升级 的功能。

参考资料

知乎 @Jenny ISO14229-7-UDSonLIN - 知乎

优快云 车载lin通信协议栈_浅谈LIN诊断-优快云博客

<think>我们正在处理关于LIN协议栈的实现、使用和配置方法的查询。根据提供的引用,我们可以总结出以下关键点:1.**引用[1]**描述了AUTOSAR架构下的LIN状态管理器(LIN StateManager)的功能和依赖关系。它负责控制LIN总线的通信状态,包括调度表切换(主节点)、睡眠/唤醒处理等,并与ComM、LinIf等模块交互。2.**引用[2]**提供了一个基于S32K的LIN诊断功能实现示例(主机节点)。代码展示了初始化、设置调度表以及一个处理UDS诊断任务的函数。用户需求:查找LIN协议栈的实现、使用和配置方法。 回答结构: -首先介绍LIN协议栈的基本概念和组件。 -然后分步骤说明如何实现、配置和使用LIN协议栈,结合引用中的信息。 -最后生成相关问题。注意:由于引用内容有限,我们将基于已知信息进行回答,并指出引用来源。 ###LIN协议栈的实现、使用与配置####1.LIN协议栈概述LIN(LocalInterconnectNetwork)是一种低成本串行通信协议,常用于汽车电子中的辅助系统(如车窗、座椅等)。LIN协议栈通常包括以下组件[^1]:- **LIN接口(LinIf)**:提供标准接口给上层应用。- **LIN状态管理器(LINState Manager)**:管理LIN总线的状态(唤醒、睡眠等)。- **LIN传输层(LinTp)**:用于诊断报文传输(如UDS onLIN)。- **底层驱动(LinLLD)**:硬件抽象层,负责直接操作LIN控制器。 ####2. LIN协议栈的实现实现LIN协议栈通常需要以下步骤:**a.初始化**-调用初始化函数配置协议栈和硬件接口。如引用[2]所示:```cl_sys_init();//系统初始化l_ifc_init(LI0);//初始化LIN接口(LI0为通道标识)ld_init(LI0);//初始化LIN驱动```**b.配置调度表(主节点)**-主节点需要配置调度表以控制报文发送时序。如引用[1]和[2]所示:```cl_sch_set(LI0,LI0_NormalTable1,0u); //设置通道LI0使用调度表LI0_NormalTable1``` **c.实现应用逻辑**-例如,实现诊断功能(如UDS onLIN)。引用[2]提供了一个任务函数示例,处理主节点请求和从节点响应:```cUDS_ON_LIN_RESPONSEUDS_ON_LIN_task() {//...缓冲区定义、发送诊断命令等if (检测到主节点请求标志){清除标志并发送帧头(0x3D为诊断帧ID)}if (检测到从节点响应标志) {清除标志并检查响应数据}return响应状态;}```####3.配置要点-**状态管理**:LIN状态管理器需与ComM协作,根据上层请求切换通信模式(如唤醒总线、进入睡眠)[^1]。 -**调度表配置(主节点)**:在AUTOSAR工具中(如Vector Configurator),需定义调度表包含的帧及其时序。 -**诊断配置**:若需支持诊断(如ISO14229),需配置LinTp参数(如报文长度、超时时间)。####4.使用示例- **唤醒/睡眠操作**:通过LIN状态管理器触发。-**发送数据**:主节点通过调度表自动发送;从节点响应帧头。- **诊断通信**:如引用[2]所示,通过特定帧ID(如0x3D)传输诊断请求/响应。###注意事项-**主从节点差异**:主节点控制调度表和总线状态;从节点仅响应帧头。 -**实时性**:调度表需根据应用需求设计,确保关键帧的周期。- **错误处理**:需实现错误回调(如使用DEM模块记录错误)[^1]。 §§相关问题§§1. LIN协议栈中调度表如何配置(主节点)?2.如何实现LIN总线的唤醒和睡眠功能?3.LIN诊断UDSon LIN)的帧结构是怎样的?4.在AUTOSAR架构中,LIN状态管理器与ComM如何交互?</think>### LIN协议栈的实现、使用与配置方法 #### 一、LIN协议栈基础概念 LIN(Local Interconnect Network)是一种低成本串行通信协议,主要用于汽车电子中的辅助系统(如车窗、座椅控制等)。其协议栈在AUTOSAR架构下包含以下核心组件[^1]: 1. **LIN状态管理器 (LIN State Manager)** - 控制总线通信状态(唤醒/睡眠) - 管理调度表切换(仅主节点) - 与上层通信管理器(ComM)交互 2. **LIN接口 (LinIf)** - 提供标准化的API接口 - 处理报文收发和帧管理 3. **LIN驱动层 (Lin LLD)** - 硬件抽象层,直接操作LIN控制器 #### 二、实现步骤(以S32K平台为例) ```c /* 1. 初始化协议栈 */ l_sys_init(); // 系统级初始化 l_ifc_init(LI0); // 初始化LIN接口(LI0为通道标识) ld_init(LI0); // 初始化底层驱动 /* 2. 配置调度表(主节点专用)*/ l_sch_set(LI0, LI0_NormalTable1, 0u); // 绑定调度表到通道 /* 3. 实现诊断功能(主机示例)*/ UDS_ON_LIN_RESPONSE UDS_ON_LIN_task() { uint8_t linTxBuff[8] = {0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18}; diag_write_data_by_identifier(LI0,74,5,linTxBuff); // 发送诊断命令(0x2E) if(l_flg_tst_LI0_MasterReq_flag()) { // 检测主节点请求标志 l_flg_clr_LI0_MasterReq_flag(); lin_lld_tx_header(LI0, 0X3D); // 发送帧头(PID=0x3D) } if(l_flg_tst_LI0_SlaveResp_flag()) { // 检测从节点响应 l_flg_clr_LI0_SlaveResp_flag(); if(linRxBuff[1]==0x11) return Positive_response; } return Negitive_response; } ``` > 关键点:需通过`l_flg_tst_XX`标志位同步状态,诊断帧ID需符合ISO 14229规范[^2] #### 三、配置要点 1. **调度表配置** - 主节点需定义帧时序:`ScheduleTable → Frame → Signal` - 示例配置(AUTOSAR格式): ```xml <LIN-SCHEDULE-TABLE> <FRAME ID="0x10" LENGTH="8" TYPE="UNCONDITIONAL"/> <FRAME ID="0x3D" LENGTH="8" TYPE="DIAGNOSTIC"/> </LIN-SCHEDULE-TABLE> ``` 2. **状态切换逻辑** ```mermaid graph LR A[唤醒请求] -->|ComM通知| B(LIN State Manager) B --> C{主节点?} C -->|是| D[启动调度表] C -->|否| E[等待帧头] D --> F[总线活动] F -->|超时/睡眠指令| G[进入睡眠模式] ``` 3. **从节点配置** - 只需实现帧响应处理: ```c void Lin_SlaveResponse(uint8_t PID) { if(PID == 0x10) Lin_SendFrame(0x10, slaveData); } ``` #### 四、使用注意事项 1. **定时约束** LIN帧响应时间需满足:$$ t_{response} \leq 1.5 \times t_{bit} \times 10 $$ 其中$t_{bit}$为单比特传输时间 2. **诊断实现** - 使用保留PID范围(0x3C-0x3F) - 需实现流控帧(ISO 15765-2) 3. **错误处理** 通过DEM模块记录错误码: - LIN_ERR_HEADER_TIMEOUT - LIN_ERR_RESPONSE_TIMEOUT #### 五、调试建议 1. 使用LIN分析仪捕获总线波形 2. 通过`l_sch_get_status()`监控调度表状态 3. 在睡眠模式前调用`l_ifc_goto_sleep()`确保电压稳定
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值