前言
目前汽车尾灯上面使用LIN总线已经是司空见惯的了,有些预算高的甚至会上CAN总线。然而有些车灯客户的电子工程师对LIN总线未曾深入了解,在实际做项目时遇到LIN相关的问题会不知所措。建议大家阅读瑞萨的《LIN总线入门.pdf》或者笔者之前整理的《LIN总线介绍PPT》
目前笔者支持的车灯客户遇到最多的是和LDF文件相关的问题。当车厂甩过来一个LDF文件,客户使用开发工具导入该LDF时会弹出很多错误,由于对LDF文件不够熟悉,无法确定问题出在哪里,使得开发的进度受阻。
下文将介绍不同版本的LDF文件,以及一些常见的LDF文件导入错误的解决办法。
1.LIN版本更迭
lin的版本更迭如下图:
版本 | 发布时间 | 备注 |
---|---|---|
LIN1.0 | 1999-07-01 | LIN规范的初始版本 |
LIN1.1 | 2000-03-06 | 增加协议规范,配置语言规范和API规范 |
LIN1.2 | 2000-11-17 | |
LIN1.3 | 2002-12-13 | 主要对物理层进行修改,提高了节点之间的兼容性 |
LIN2.0 | 2003-09-16 | 大的版本变动,支持配置,增加诊断规范,规定了节点性能文件 |
LIN2.1 | 2006-11-24 | 澄清LIN2.0,增加节点配置规范,传输层和诊断独立成章 |
LIN2.2 | 2010-12-31 | 弱化位采样规范,移除起始位的采样规范 |
LIN2.2A | 2010-12-31 | 更正了第 2.6.2 章中的唤醒信号定义 |
2.LDF简介
从LIN2.0版本开始已经有了节点性能文件的规范,从LIN规范中的工作流(如下图)可以看出,LIN子网设计工具会收集节点性能文件的信息,自动生产LIN描述文件,即LDF。
一般的LDF编辑查看工具可选的版本有5个,如下所示。
- LIN1.3
- LIN2.0
- J2602
- LIN2.1
- LIN2.2/LIN2.2A
LDF版本虽然很多,但是调用LDF配置的LIN协议栈使用的API就两个版本,LIN2.1的API和J2602的API。
目前国内车厂用的比较多的是LIN2.1和LIN2.2版本的LDF,北美车厂用的比较多的是J2602版本的LDF。下面介绍下这三个版本的LDF。
2.1 LIN2.1版本LDF
LIN2.1的出现主要是为了澄清LIN2.0,同时增加了节点配置规范,传输层和诊断独立成章。
LIN2.1规范中对LDF的定义如下:
下面针对上图划分的六部分结合示例进行说明。
示例LDF选择S32DS for ARM2.2(安装在D盘)自带的LIN例程使用的LDF,地址如下:
D:\NXP\S32DS_ARM_v2.2\S32DS\software\S32SDK_S32K1xx_RTM_3.0.0\examples\S32K144\demo_apps\lin_master\Sources\LIN21.ldf
2.1.1 全局定义
如上图所示,这一段首先定义该文件为LDF,然后选择LIN协议版本和语言版本,最后确定LIN波特率。
注意:通道名称是可选项,当同一个主节点连接了多个LIN集群,即使用多个LDF,将通道名称作为后缀用以区分。一般情况用不上。
2.1.2 节点定义
如上图所示,这一段分别定义主节点和从节点:
- 主节点:名称,时基,抖动
- 从节点:每个从节点的名称
2.1.3 信号定义
信号原本有三类,标准信号,诊断信号和信号组,但是信号组只在LIN1.3中使用,LIN2.x版本不再使用。
2.1.3.1 标准信号定义
标准信号编码类型有两种,一种是标量信号(scalar signal),长度范围为1bit~16bit;一种是数组信号(array signal),长度为8bit的倍数且最大64bit。
如上图所示,该段用于编写标准信号,包含信号名称,长度,初始值,发布节点和收听节点,array signals的初始值用数组表示,数组的元素个数N = Size / 8bit。
特别说明:每个从节点都需要预先定义一个长度为1bit的响应错误信号,这个在节点属性定义时需要用到
2.1.3.2 诊断信号定义(可选)
如上图所示,由于诊断信号不需要定义发布者和接收者,所以需要和标准信号分开定义。
2.1.4 帧定义
帧一共有五类,分为无条件帧,事件触发帧,零星帧,诊断帧和保留帧。保留帧(帧ID为0x3E和0x3F)在LIN2.x版本不使用。
2.1.4.1 无条件帧定义
无条件帧是具有单一发布节点,无论信号是否发生变化,帧头都被无条件应答的帧。无条件帧的帧ID范围为0~0x3B。
如上图所示,这一段主要定义了帧名称,帧ID,发布节点,数据段字节数以及包含的信号名称和偏移量。
2.1.4.2 事件触发帧定义(可选)
事件触发帧是主机节点在一个帧时隙中查询各从机节点的信号是否发生变化时使用的帧,当存在多个发布节点时,通过冲突解决进度表来解决冲突。帧ID范围同上。
如上图所示(由于示例LDF没有定义这部分,截取的LIN2.1规范的例程),主要包含了帧名称,冲突解决进度表,帧ID,关联的无条件帧。
2.1.4.3 零星帧定义(可选)
零星帧帧是主机节点在同一帧时隙中当自身信号发生变化时向总线启动发送的帧。当存在多个关联的应答信号变化时,通过事先设定的优先级来仲裁。帧ID范围同上。
如上图所示,这一段主要定义帧名称以及选择关联的无条件帧,关联的无条件帧的发布节点必须是主节点。
2.1.4.4 诊断帧定义(可选)
诊断帧包括主机请求帧和从机应答帧,主要用于配置、识别和诊断用。
如上图所示,这一段用于配置主机请求帧(帧ID为0x3C)和从机应答帧(帧ID为0x3D),数据段规定为8个字节,一律采用标准型校验和。
2.1.5 节点属性定义
这一段主要定义从节点的属性,包含从节点名称,LIN协议版本,NAD配置值,NAD初始值,产品ID(供应商ID,功能ID,变量),选择响应错误信号,P2_min,ST_min,N_As_timeout,,N_Cr_timout,可配置的帧列表。
2.1.6 调度表
调度表的功能有很多,包含调度帧,分配NAD,保存配置等。这个例程只使用了调度帧的功能。
最后一段进行调度表的定义,包含调度表名称,帧名称,帧时隙。
2.2 J2602版本LDF
SAE J2602的目标是通过解决LIN2.0的模糊、矛盾或可选的要求来提高网络中不同LIN设备之间的可互操作性和可交互能力。
LIN2602的LDF和LIN2.1的LDF主要区别如下:
【全局定义部分】:
- 波特率固定在10.417Kbps。
【帧定义部分】:
-
从节点发布的帧消息第一个字节必须是状态字节,由5bit的应用信息字段(低5位)和3bit的错误字段(高3位)组成。如下图所示:
-
不允许使用事件触发帧 。
【节点属性定义部分】:
- 节点属性不需要N_As_timeout和N_Cr_timeout;
- NAD的值范围为96到110;
- 错误响应(Response error)为3bit。
2.3 LIN2.2/2.2A版本LDF
上图是S32K1xx的LIN协议栈的介绍,结合LIN2.2A规范的变更介绍可知(1.1.7.6章节),LIN2.2/2.2A只是在LIN2.1的基础上进行了一些拼写修正和澄清。LIN2.2/2.2A版本的LDF文件相比LIN2.1版本的LDF并没有什么区别。
3. LIN Stack介绍
目前笔者用过的LIN Stack就两种,一个是S32DS自带的S32K1xx_LIN_Stack,一个NXP官网推荐的S12_LIN_Stack。两个LIN Stack对比情况如下:
LIN Stack | S32K1xx_LIN_Stack | S12_LIN_Stack |
---|---|---|
支持的版本 | LIN1.3,LIN2.0,J2602,LIN2.1,LIN2.2、2.2A | LIN2.0,J2602,LIN2.1 |
LDF源文件 | 不支持高亮显示和编辑 | 支持高亮显示,可以编辑 |
LDF图形配置 | 查错效果更好,但是编辑功能体验较差 | 支持查错和编辑 |
协议栈源码 | 开放 | 开放 |
查看LDF文件是否有格式错误时,建议使用Processor Expert的LIN组件;如果需要编辑LDF,建议使用S12_LIN_Stack自带的NCF Tools。主要原因是Processor Expert的LIN组件修改LDF的参数时经常卡死,使用体验较差。
3.1 S08/S12/KEA的LIN Stack
S12_LIN_Stack支持S08/S12/KEA三个平台,详细介绍参考文章《如何使用S32DS开发KEA系列的LIN功能(一)》
3.2 S32K1xx的LIN Stack
S32K1xx的开发环境自带LIN Stack,Processor Expert中有配套的LIN组件(如下图),和S12_LIN_Stack自带的NCF Tool差不多,参考NCF Tool即可。
3.3 两个LIN stack配置工具的冲突
在使用上述两款工具时,发现两款工具对LDF文件某些参数的处理有些冲突,下面简单介绍下笔者已经发现的冲突。为了描述方便,Processor Expert中配套的LIN组件简称LIN组件,S12_LIN_Stack自带的NCF Tool简称NCF工具。
- Message ID:
LIN组件加载J2602版本的LDF时,会要求加上message ID,NCF工具不需要添加。奇怪的是LIN组件在Message ID文字下面显示“只有LIN2.0支持Message ID”,查阅J2602-1规范中文版,里面又有信息标识符的描述,但是没有LIN2.0描述清晰。 - 状态字节:
LIN组件会检查J2602版本LDF的无条件帧(从节点发布)的第一个字节是否是状态字节,但是NCF工具不会进行检查。查阅J2602-1规范中文版,5.8.6章节描述的要求和LIN工具一致。个人建议编写J2620的LDF时遵循规范。 - 产品ID:
LIN工具对Product ID中的Supplier ID和Function ID的范围定义分别为0 ~ 0x7FFE和0 ~ 0xFFFE,但是LIN工具对其定义的范围都是0 ~ 0xFFFF。查阅LIN2.0规范中文版,2.2.2章节描述的要求和LIN工具一致;查阅LIN2.1和LIN2.2A规范,4.2.1.1章节给出的通配符值分别为0x7FFF和0xFFFF。 - 位宽和容忍度:
LIN工具在J2602版本LDF的主节点定义部分,不需要定义Bit length和Tolerant,但是NCF工具需要定义。查阅J2602-1规范中文版,没有找到这两个参数的定义。
4.常见导入错误类型
下面简单介绍一些在支持客户时常见的问题。
4.1 缺少参数
1.需要使用NCF工具加载J2602的LDF,但是没有添加Bit length和Tolerant:
2.节点定义部分没有进行可配置的帧的定义:
3.LDF更改导致原来的主节点变成从节点,忘记加上响应错误信号:
4.2 参数格式错误
1.使用J2602版本的LDF时,状态字节的格式错误:
5.参考资料
- LIN规范包 版本2.0;
- SAE J2602-1 2005年9月修订;
- SAE J2602-2 Issued SEP2005;
- 瑞萨的《LIN总线入门.pdf》;
- LIN Specification Package Revision 2.1;
- LIN Specification Package Revision 2.2A;