LIN总线协议详解11(LIN的工作流)

LIN的工作流

本章介绍了 LIN 工作流的概念,以及节点性能文件和 LIN 描述文件的内容,对应着 LIN 规范的以下部分:
● LIN Node Capability Language Specification
● LIN Configuration Language Specification
为了实现从机节点入网的“即插即用”,LIN 规范标准化了 LIN 网络从设计到生成的工作流程 ,如图 7.1 所示。

         其中节点性能文件(NCF)定义了节点名称和节点的属性值,包括产品代号、位速率、帧的定义等信息。LIN子网设计工具收集到节点性能文件的信息,自动生成 LIN 描述文件(LDF)。LDF 包含了整个子网的信息,包括所有的信号和帧的声明,以及进度表等信息。LDF 文件还可以作为调试时总线分析仪和仿真器的输入。 LIN 子网生成工具根据 LDF 生成各种通信驱动,可以建立起通信子网,也可以将具备节点性能文件的现成节点加入到已经建立好的通信子网中,并在网络进入运行前排除掉可能产生的冲突。

1、节点性能文件

节点性能文件包含节点的物理特性、帧和信号的定义等内容,如表 7.1 所示。

        (蓝色笔标出的部分为可选项,红色笔标出的部分为选择其中的一项或几项。)

注: 1. 一个节点描述文件可以定义多个节点,在同一个文件中的节点不能重名。
        2. P2_min: 从 LIN 子网接收到主机请求帧到 LIN 的从机节点准备好数据发送应答之间的最小时间间隔。
        3. ST_min: 从机节点准备接收下一个帧(主机请求帧)或准备发送下一个帧(从机应答帧)的应答部分所需要的最小准备时间。
        4. N_As_timeout: 从传输层向 LIN 子网请求一个帧开始到传输层确认请求的帧传输结束之间的超时间隔,即从发送方看,发送 LIN 帧(MRF 或 SRF)的超时间隔。
        5. N_Cr_timeout: 在复合帧(首帧+续帧的形式,参照 5.3 节)的传输中,传输层接收到的首帧和续帧、续帧和续帧之间的超时间隔。
        6. 信号在字节中的偏移量如表 7.2 举例。

         7. 物理值 = 缩放倍数 × 原始值 + 偏移量

1.1节点性能文件举例说明

 以下为一个节点性能文件的例子和说明。

node_capability_file;                         //节点性能文件
LIN_language_version = “2.1”;         //LIN 语言版本 2.1 
node step_motor                               //节点定义。节点名称 step_motor
{  
    general                           //摘要定义
    { 
        LIN_protocol_version = “2.1”;                       //LIN 协议版本 2.1 
        supplier = 0x0005; function = 0x0020; variant = 1;  //厂商 ID,功能 ID,可变 ID 
        bitrate = automatic min 10 kbps max 20 kbps; //比特率自动选择范围[10kbps-20kbps] 
        sends_wake_up_signal = “yes”; //该节点可以发送 wakeup 信号
    } 
diagnostic                            //诊断定义

    NAD = 1 to 3;                     //初始 NAD 可以选择的值:1~3 
    diagnostic_class = 2;             //支持的诊断类别为第 2 类
    P2_min = 100 ms; ST_min = 40 ms;  //参照表 7.1 注释
    support_sid { 0xB0, 0xB2, 0xB7 }; //节点支持的全部 SID

frames//帧定义 

    publish node_status //帧名称为 node_status,作为发布节点
    { 
        length = 4; min_period = 10 ms; max_period = 100 ms; 
        //帧长度 4 字节,传输最小、最大时间
    signals //信号定义(该帧中包含的信号)
    {  
        state {size = 8; init_value = 0; offset = 0;} //state 信号:长度 8bit,
        //初始值为 0,偏移量为 0(即 bit[7:0]) 
        fault_state {size = 2; init_value = 0; offset = 9; fault_enc;} 
         //fault_state 信号:长度 2bit,初始值为 0,
//偏移量为 9(即 bit9、bit10),
//编码类型名称为 fault_enc 
error_bit {size = 1; init_value = 0; offset = 8;} 
//error_bit 信号:长度 1bit,
//初始值为 0,偏移量为 8 
angle {size = 16; init_value = {0x22, 0x11}; offset = 16;} 
//angle 信号:长度 16bit,
//初始值为 0x22,0x11,偏移量 16 


subscribe control { //帧名称为 control,作为收听节点
length = 1; max_period = 100 ms; //帧长度 1 字节,传输最大时间 100ms 
signals { //信号定义(该帧中包含的信号) 
command {size = 8; init_value = 0; offset = 0; position;} 
//command 信号:长度 8bit,初始值为 0,
//偏移量为 0,编码类型名称为 position 



encoding { //信号编码类型
position {physical_value 0, 199, 1.8, 0, “deg”;} //编码类型名称为 position: 
//物理值,最小值 0,最大值 199,
//缩放倍数 1.8,偏移量为 0,
//文本信息为“deg” 
fault_enc {logical_value, 0, “no result”; 
//编码类型名称为 fault_enc: 
//逻辑值,信号值 0,文本信息为“no result” 
logical_value, 1, “failed”; //逻辑值,信号值 1,文本信息为“failed” 
logical_value, 2, “passed”;} //逻辑值,信号值 2,文本信息为“passed” 

status_management { response_error = error_bit; //状态管理:表示 response_error 的信号名称
fault_state_signals = fault_state; } //表示 fault_state_signals 的信号名称
free_text { “step_motor signal values outside 0 - 199 are ignored” } 
//自由文本定义
}

1.2、 LIN 描述文件

        LIN 描述文件对整个 LIN 网络进行了描述,也包含了要监测 LIN 网络所必需的信息,包含 LIN 网络内所有 节点、帧和信号的信息以及进度表等内容,如表 7.3 所示。

(蓝色笔标出的部分为可选项,红色笔标出的部分为选择其中的一项或几项。)
注:1. 当一个主机ECU 与多个LIN 通信子网相连时,会包含多个LDF 文件,为了避免命名冲突,规定LDF文件中的所有对象必须使用通道后缀名称。
2. 当存在从机物理节点对应多个逻辑节点时,节点组合定义可以让主机节点用同一软件无需作任何改变就可处理多个从机节点的配置。
3. 只应用于依据LIN1.3 版本设计的节点。 

1.3 LIN 描述文件举例说明

        以下为一个LIN 描述文件的例子和说明。

LIN_description_file; //LIN 描述文件
LIN_protocol_version = “2.1”; //LIN 协议版本
LIN_language_version = “2.1”; //LIN 语言版本
LIN_speed = 19.2 kbps; //LIN 通信速度
Channel_name = “DB”; // 通道后缀名称 “DB”
Nodes { // 节点定义
Master: CEM, 5 ms, 0.1 ms; // 主机节点,名称: CEM ,时基: 5ms ,抖动: 0.1ms
Slaves: LSM, RSM; // 从机节点, LSM RSM
}
Node_attributes { // 节点属性定义
LSM { // 节点名称为 LSM 的节点的定义
LIN_protocol = “2.1”; // 该节点依据 LIN 协议 2.1 设计
configured_NAD = 0x20; // 配置 NAD 0x20
initial_NAD = 0x01; // 初始 NAD 0x01
product_id = 0x4A4F, 0x4841; // 产品 ID :厂商 ID 0x4A4F ,功能 ID 0x4841
response_error = LSMerror; // 应答错误名称为: LSMerror
fault_state_signals = IntTest; // 错误状态信号为 IntTest
P2_min = 150 ms; // 参照节点性能文件注释
ST_min = 50 ms; // 参照节点性能文件注释
configurable_frames { CEM_Frm1; LSM_Frm1; LSM_Frm2;}
// 可配置的帧列表
}
RSM { // 节点名称为 RSM 的节点的定义
LIN_protocol = “2.0”; // 该节点依据 LIN 协议 2.0 设计
configured_NAD = 0x20; // 配置 NAD 0x20
product_id = 0x4E4E, 0x4553, 1; // 产品 ID :厂商 ID 0x4E4E
// 功能 ID 0x4553 ,可变 ID 1
response_error = RSMerror; // 应答错误名称: RSMerror
P2_min = 150 ms; // 参照节点性能文件注释
ST_min = 50 ms; // 参照节点性能文件注释
configurable_frames {CEM_Frm1 = 0x0001; LSM_Frm1 = 0x0002; LSM_Frm2 = 0x0003;}
// 可配置的帧列表
}
}
Signals { // 信号定义
IntLightsReq: 2, 0, CEM, LSM, RSM; // 信号名称: IntLightsReq
// 长度: 2 ,初始值: 0
// 发布节点: CEM ,收听节点: LSM RSM
RightIntLightsSwitch: 8, 0, RSM, CEM; // 信号名称: RightIntLightsSwitch
// 长度: 8 ,初始值: 0
// 发布节点: RSM ,收听节点: CEM
LeftIntlLightsSwitch: 8, 0, LSM, CEM; // 信号名称: LeftIntlLightsSwitch
// 长度: 8 ,初始值: 0
// 发布节点: LSM ,收听节点: CEM
LSMerror, 1, 0, LSM, CEM; // 信号名称: LSMerror ,长度: 1 ,初始值: 0
// 发布节点: LSM ,收听节点: CEM
RSMerror, 1, 0, LSM, CEM; // 信号名称: RSMerror ,长度: 1 ,初始值: 0
// 发布节点: LSM ,收听节点: CEM
IntTest, 2, 0, LSM, CEM; // 信号名称: IntTest ,长度: 2 ,初始值: 0
// 发布节点: LSM ,收听节点: CEM
}
Frames { // 帧定义
CEM_Frm1: 0x01, CEM, 1 { // 帧名称: CEM_Frm1 ,帧 ID 0x01
// 该帧的发布节点: CEM ,数据段为 1 个字节
InternalLightsRequest, 0; // 包含的信号名称
// InternalLightsRequest
// 在帧中的偏移量为 0
}
LSM_Frm1: 0x02, LSM, 2 { // 帧名称: LSM_Frm1 ,帧 ID 0x02
// 该帧的发布节点: LSM ,数据段为 2 个字节
LeftIntLightsSwitch, 0; // 包含的信号名称为 LeftIntLightsSwitch
// 在帧中的偏移量为 0
}
LSM_Frm2: 0x03, LSM, 1 { // 帧名称: LSM_Frm2 ,帧 ID 0x03
// 该帧的发布节点: LSM ,数据段为 1 个字节
LSMerror, 0; // 包含的信号名称为 LSMerror ,帧中偏移量为 0
IntError, 1; // 包含的信号名称为 IntError ,帧中偏移量为 1
}
RSM_Frm1: 0x04, RSM, 2 { // 帧名称: RSM_Frm1 ,帧 ID 0x04
// 该帧的发布节点: RSM ,数据段为 2 个字节
RightIntLightsSwitch, 0; // 包含的信号名称为 RightIntLightsSwitch
// 在帧中的偏移量为 0
}
RSM_Frm2: 0x05, RSM, 1 { // 帧名称: RSM_Frm2 ,帧 ID 0x05
// 该帧的发布节点: RSM ,数据段为 1 个字节
RSMerror, 0; // 包含的信号名称为 RSMerror ,帧中偏移量为 0
}
}
Event_triggered_frames { // 事件触发帧定义
Node_Status_Event : Collision_resolver, 0x06, RSM_Frm1, LSM_Frm1;
// 事件触发帧名称: Node_Status_Event
// 冲突解决进度表: Collision_resolver
// 事件触发帧的帧 ID 0x06
// 关联的无条件帧为 RSM_Frm1 LSM_Frm1
}
Schedule_tables { // 进度表定义
Configuration_Schedule { // 进度表名称为: Configuration_Schedule
AssignNAD {LSM} delay 15 ms; // 给节点 LSM 分配 NAD ,帧时隙为 15ms
AssignFrameIdRange {LSM, 0} delay 15 ms;
// 给节点 LSM 从第 0 帧开始分配 PID
// 帧时隙为 15ms
AssignFrameId {RSM, CEM_Frm1} delay 15 ms;
// 给节点 RSM 的帧 CEM_Frm1 分配 PID
// 帧时隙为 15ms
AssignFrameId {RSM, RSM_Frm1} delay 15 ms;
// 给节点 RSM 的帧 RSM_Frm1 分配 PID
// 帧时隙为 15ms
AssignFrameId {RSM, RSM_Frm2} delay 15 ms;
// 给节点 RSM 的帧 RSM_Frm2 分配 PID
// 帧时隙为 15ms
}
Normal_Schedule { // 进度表名称为: Normal_Schedule
CEM_Frm1 delay 15 ms; // CEM_Frm1 ,帧时隙 15ms
LSM_Frm2 delay 15 ms; // LSM_Frm2 ,帧时隙 15ms
RSM_Frm2 delay 15 ms; // RSM_Frm2 ,帧时隙 15ms
Node_Status_Event delay 10 ms; // 事件触发帧 Node_Status_Event
// 帧时隙 10ms
}
MRF_schedule { / 进度表名称为: MRF_schedule
MasterReq delay 10 ms; // 主机请求帧,帧时隙 10ms
}
SRF_schedule { // 进度表名称为: SRF_schedule
SlaveResp delay 10 ms; // 从机应答帧,帧时隙 10ms
}
Collision_resolver { // 发生冲突时需保证非事件触发帧的传输时序
// 进度表名称: Collision_resolver
CEM_Frm1 delay 15 ms; // CEM_Frm1 ,帧时隙 15ms
LSM_Frm2 delay 15 ms; // LSM_Frm2 ,帧时隙 15ms
RSM_Frm2 delay 15 ms; // RSM_Frm2 ,帧时隙 15ms
RSM_Frm1 delay 10 ms; // 轮询 RSM 节点
// RSM_Frm1 ,帧时隙 10ms
CEM_Frm1 delay 15 ms; // CEM_Frm1 ,帧时隙 15ms
LSM_Frm2 delay 15 ms; // LSM_Frm2 ,帧时隙 15ms
RSM_Frm2 delay 15 ms; // RSM_Frm2 ,帧时隙 15ms
LSM_Frm1 delay 10 ms; // 轮询 LSM 节点
// LSM_Frm1 ,帧时隙 10ms
}
}
Signal_encoding_types { // 信号编码类型: Signal_encoding_types
Dig2Bit { // 信号编码类型名称: Dig2Bit
logical_value, 0, “off”; // 逻辑值 0 ,代表 “off”
logical_value, 1, “on”; // 逻辑值 1 ,代表 “on”
logical_value, 2, “error”; // 逻辑值 2 ,代表 “error”
logical_value, 3, “void”; // 逻辑值 3 ,代表 “void”
}
ErrorEncoding { // 信号编码类型名称: ErrorEncoding
logical_value, 0, “OK”; // 逻辑值 0 ,代表 “OK”
logical_value, 1, “error”; // 逻辑值 1 ,代表 “error”
}
FaultStateEncoding { // 信号编码类型名称: FaultStateEncoding
logical_value, 0, “No test result”; // 逻辑值 0 ,代表 “No test result”
logical_value, 1, “failed”; // 逻辑值 1 ,代表 “failed”
logical_value, 2, “passed”; // 逻辑值 2 ,代表 “passed”
logical_value, 3, “not used”; // 逻辑值 3 ,代表 “not used”
}
LightEncoding { // 信号编码类型名称: LightEncoding
logical_value, 0, “Off”; // 逻辑值: 0 ,代表: “Off”
hysical_value, 1, 254, 1, 100, “lux”; // 物理值: 1 ,最小值: 1
// 最大值: 254 ,缩放倍数: 1
// 偏移量: 100 ,文字信息: “lux”
logical_value, 255, “error”; // 逻辑值: 255 ,代表: “error”
}
}
Signal_representation { // 信号表示定义
Dig2Bit: InternalLightsRequest; // 应用信号编码类型为 Dig2Bit 的信号
//InternalLightsRequest
ErrorEncoding: RSMerror, LSMerror; // 应用信号编码类型为 ErrorEncoding
// 信号 RSMerror LSMerror
FaultStateEncoding: IntError; // 应用信号编码类型为
//FaultStateEncoding 的信号 IntError
LightEncoding: RightIntLightsSwitch, LefttIntLightsSwitch;
// 应用信号编码类型为 LightEncoding
// 信号 RightIntLightsSwitch
//LefttIntLightsSwitch
}

  • 6
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值