【通讯协议】S32K142芯片——LIN通信的学习和配置

文章目录

  • 前言
  • 1.LIN是什么?
  • 2. LIN连接结构及节点构成
  • 3. 帧的组成
    • 3.1 帧头
      • 3.1.1 同步间隔场(Break)
      • 3.1.2 同步场(Synch)
      • 3.1.3 标识符场(PID)
    • 3.2 帧响应
    • 3.2.1 数据场
    • 3.2.2 校验和场
  • 3. 代码配置
  • 总结


前言

随着汽车电子的发展,汽车上的电子零件正在逐渐地增加。汽车的正常运作离不开各个元器件之间的协调工作,因此,零部件之间的通讯显得尤为重要。在汽车通讯中我们经常在使用CAN总线通讯,但是了在兼顾系统通讯的同时,尽量减少成本,LIN通讯则应时而生。在不需要CAN总线的带宽和多功能的场合,比如雨刮器,车门雷达等制动装置之间的通讯使用LIN总线可大大节省成本。


1.LIN是什么?

LIN是 Local Interconnect Network 的缩写,是基于 UART/SCI(Universal Asynchronous Receiver-Transmitter / Serial Communication Interface,通用异步收发器/串行通信接口)的低成本串行通信协议。(串行通信技术,是指通信双方按位进行,遵守时序的一种通信方式。 串行通信中,将数据按位依次传输, 每位数据占据固定的时间长度,即可使用少数几条通信线路 就可以完成系统间交换信息。还规定 LIN总线长度不超过 40 米。

2. LIN连接结构及节点构成

LIN 的拓扑结构为单线总线,应用了单一主机多从机的概念。总线电平为 12V,传输位速率(Bitrate)最高为20kbps。一个 LIN 网络最多可以接 16 个节点,主机节点有且只有一个,从机节点有 1 到 15 个。
在这里插入图片描述

3. 帧的组成

帧(Frame)包含帧头(Header)和应答(Response)两部分。主机任务负责发送帧头;从机任务接收帧头并对帧头所包含信息进行解析,然后决定是发送应答,还是接收应答,还是不作任何反应。其中,由主机任务进行帧头的发送,而从机任务用帧响应来补充帧头从而形成完整的一帧。
在这里插入图片描述

3.1 帧头

帧头包括同步间隔场(Break)、同步场(Synch)和标识符场(PID)三个部分。
在这里插入图片描述

3.1.1 同步间隔场(Break)

间隔场不同于其他场,它有意的造成UART通讯中的FramingError(从起始位到第十位没有检测出停止位时的错误)来提示LIN总线中的所有节点之后要开始进行LIN报文的传输了。故而间隔场是用来标识一个新帧的起始点。间隔场是一个至少由13bit的显性值,包括起始位、间隔定界符等等。
在这里插入图片描述

3.1.2 同步场(Synch)

同步场是为了修正各个从机任务节点间时钟的误差。是一个数据值为0x55的字节场。各个从机任务根据最初和最终的下降沿除以8来计算出1bit的时间,并以此作为基准来调整自己的时钟误差。、在这里插入图片描述

3.1.3 标识符场(PID)

标识符场表示LIN报文识别信息,由6位(bit0-bit5)的报文ID和2位(bit6-bit7)的奇偶校验和构成。
在这里插入图片描述
标识符(ID)有6bit,其值的范围是0-63。标识符可以分为以下四类:

载波帧的值,其值范围是0-59(0x3b);

60(0x3c)和61(0x3d)可用来载运诊断数据;

62(0x3e)专门用于用户定义的扩展部分;

63(0x3f)专门用于以后的协议改进。

3.2 帧响应

帧响应由数据场和校验和场组成。

3.2.1 数据场

帧可以携带1-8byte的数据。对拥有指定标识符的帧来说,其包含的字节的数量应与发布服务器和所有认购器保持一致。

数据是在字节场中进行输送。
在这里插入图片描述

3.2.2 校验和场

帧的最后一个场是校验和(checksum)。校验和段是对帧中所传输的内容进行校验,校验和分为标准型校验和(Classic Checksum)及增强型校验和(Enhanced Checksum)。采用标准型校验和还是增强型校验和由主机节点管理,从机节点根据帧ID来判断采用哪种校验和。标准校验和只保护数据段,增强型校验和同时保护数据段和帧ID段。
上述大多参考这篇链接:LIN通信,想要深入了解LIN的通讯协议的可以研读这篇文章。

3. 代码配置

#include "LinIf.h"// 系统参数 不修改
#define TIMER_COMPARE_VAL 2000
#define TIMER_TICKS_1US   4U
#define FRAME_SLAVE_RECEIVE_DATA  0x01//(0x30)
#define FRAME_MASTER_RECEIVE_DATA 0x34    //(2U)
#define FRAME_GO_TO_SLEEP         0x3C    //(3U)
volatile bool wakeupSignalFlag = false;
// 超时时间 0.5ms
#define TIMEOUT   (500U)
// LIN1时基计数
uint16_t lin1timerOverflowInterruptCount = 0U;
// 发送和接收缓存
uint8_t linTxBuff[8] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
uint8_t linRxBuff[8] = {0};
int Master_flag1 = 0;void Master_flag(void)
{if(Master_flag1 == 1){LIN_DRV_MasterSendHeader(INST_LIN1, FRAME_MASTER_RECEIVE_DATA);}else if(Master_flag1 == 0){LIN_DRV_MasterSendHeader(INST_LIN1, FRAME_SLAVE_RECEIVE_DATA);}
}// LIN0回调函数
lin_callback_t lin1CallbackHandler(uint32_t instance, lin_state_t * lin1_State)
{lin_callback_t callbackCurrent;callbackCurrent = lin1_State->Callback;(void)instance;uint8_t index;switch (lin1_State->currentEventId){case LIN_PID_OK:LIN_DRV_SetTimeoutCounter(INST_LIN1, 500);// user handle// LIN_DRV_MasterSendHeader()函数会进入到这里,在这里通过ID的不同进行不同的操作if(FRAME_SLAVE_RECEIVE_DATA == lin1_State->currentId){// 主机写LIN_DRV_SendFrameData(INST_LIN1, linTxBuff, sizeof(linTxBuff));if(Master_flag1 == 0){Master_flag1 = 1;}}if(FRAME_MASTER_RECEIVE_DATA == lin1_State->currentId){// 主机读LIN_DRV_ReceiveFrameData(INST_LIN1, linRxBuff, sizeof(linRxBuff));if(Master_flag1 == 1){Master_flag1 = 0;}}/* If PID is FRAME_GO_TO_SLEEP, salve node will go to sleep mode *//*	if(FRAME_GO_TO_SLEEP == lin1_State->currentId){LIN_DRV_GoToSleepMode(INST_LIN1);}*/break;case LIN_PID_ERROR: LIN_DRV_GoToSleepMode(INST_LIN1); break;case LIN_TX_COMPLETED:case LIN_RX_COMPLETED: LIN_DRV_GotoIdleState(INST_LIN1); break;case LIN_CHECKSUM_ERROR:case LIN_READBACK_ERROR:case LIN_FRAME_ERROR:case LIN_RECV_BREAK_FIELD_OK: LIN_DRV_SetTimeoutCounter(INST_LIN1, TIMEOUT); break;case LIN_WAKEUP_SIGNAL: wakeupSignalFlag = true;  break;case LIN_SYNC_ERROR:case LIN_BAUDRATE_ADJUSTED:case LIN_NO_EVENT:case LIN_SYNC_OK:default: break;}return callbackCurrent;
}

关于一些引脚和时钟的配置可以参考这篇文章: 引脚和时钟配置,这篇文章主要利用S32DS编译环境中的PE工具,可以参考配置一下;这里我主要介绍LIN通信的中断函数配置,作为依次发送数据以及读取从机发送过来的数据

  • 利用Master_flag函数切换主机的状态,主机发送和主机读取这两种状态依次切换,其中FRAME_SLAVE_RECEIVE_DATA为主机发送(从机接收)的帧头ID,其值为0x01FRAME_MASTER_RECEIVE_DATA 为主机接收(从机发送)的帧头,其值为0x34
  • lin1CallbackHandler函数中,分别对不同帧头ID做出不同响应,若为FRAME_SLAVE_RECEIVE_DATA 则利用LIN_DRV_SendFrameData函数将定义好的数组linTxBuff数据发送出去,同时将Master_flag1的数值变为1切换到主机接收(从机发送)状态;
  • 若为FRAME_MASTER_RECEIVE_DATA 则利用LIN_DRV_ReceiveFrameData函数将读取到的数据存入事先定义好的数组linRxBuff中,同时将Master_flag1的数值变为0切换到主机发送(从机接收)状态。
  • 最后记得将Master_flag函数放到合理的周期任务中,还有如果板子采用的是SBC芯片,则需要唤醒LIN通信(本人亲身经历的教训)。

总结

本文先大概介绍了什么是LIN通信,然后对LIN报文结构进行分析,最后讲述了LIN通信的代码配置以及注意事项,希望能帮助到大家!最后发一张我调试出来的LIN波形图:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/54586.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【图灵完备 Turing Complete】游戏经验攻略分享 Part.6 处理器架构2 函数

新的架构来了,本游戏的最后一个攻略分享,最后汇编部分无非是对于操作码的熟练,硬件没有问题,那么也就无关痛痒了。 汇编实现,两数相或和两数相与非一起相与即可。 八位异或器,整就完事了。 有手就行。 利…

干货满满:嵌入式电阻的重要作用全知晓

在嵌入式开发中,有一个小小的元件,它看似不起眼,却在电路中扮演着极其重要的角色。它就是——电阻。很多初学者认为电阻只是用来“分压降流”,但其实,电阻的作用远比我们想象的要复杂和关键。今天,我们就来…

LeetCode 2374.边积分最高的节点:模拟

【LetMeFly】2374.边积分最高的节点:模拟 力扣题目链接:https://leetcode.cn/problems/node-with-highest-edge-score/ 给你一个有向图,图中有 n 个节点,节点编号从 0 到 n - 1 ,其中每个节点都 恰有一条 出边。 图…

思科安全网络解决方案

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

【门牌制作 / A】

题目 代码 #include <bits/stdc.h> using namespace std; int main() {int cnt 0;for (int i 1; i < 2020; i){string s;s to_string(i);cnt count(s.begin(), s.end(), 2);}cout << cnt; }

【C++篇】走进C++标准模板库:STL的奥秘与编程效率提升之道

文章目录 C STL 初探&#xff1a;打开标准模板库的大门前言第一章: 什么是STL&#xff1f;1.1 标准模板库简介1.2 STL的历史背景1.3 STL的组成 第二章: STL的版本与演进2.1 不同的STL版本2.2 STL的影响与重要性 第三章: 为什么学习 STL&#xff1f;3.1 从手动编写到标准化解决方…

【论文速看】DL最新进展20240923-长尾综述、人脸防伪、图像分割

目录 【长尾学习】【人脸防伪】【图像分割】 【长尾学习】 [2024综述] A Systematic Review on Long-Tailed Learning 论文链接&#xff1a;https://arxiv.org/pdf/2408.00483 长尾数据是一种特殊类型的多类不平衡数据&#xff0c;其中包含大量少数/尾部类别&#xff0c;这些类…

tomcat服务搭建部署ujcms网站

tomcat服务搭建部署ujcms网站 关闭selinux和防火墙 setenforce 0 && systemctl stop firewalld安装java环境 #卸载原有java8环境 yum remove java*#上传java软件包&#xff0c;并解压缩 tar -xf openjdk-11.0.1_linux-x64_bin.tar.gz && mv jdk-11.0.1 jdk11…

TaskRes: Task Residual for Tuning Vision-Language Models

文章汇总 当前VLMs微调中存在的问题 提示微调的问题 在提示调优中缺乏对先验知识保存的保证(me&#xff1a;即提示微调有可能会丢失预训练模型中的通用知识)。虽然预先训练的文本分支模块(如文本编码器和投影)的权重在提示调优范式中被冻结&#xff0c;但原始的良好学习的分类…

BUUCTF-MISC-荷兰宽带数据泄露

下载附件得到一个二进制文件 通过题目猜测这是一段路由器备份日志&#xff0c;可以使用RouterPassView打开 链接: https://pan.baidu.com/s/1tY5Sdl8GcI5dKQdhPXj5yA?pwdhi9k 下载链接http://pan.baidu.com/s/1tY5Sdl8GcI5dKQdhPXj5yA?pwdhi9k注意&#xff0c;这个软件会报毒…

struts2 S2-057远程执行代码漏洞 靶场攻略

环境 vulhub靶场 /struts2/s2-057 漏洞简介 漏洞产⽣于⽹站配置XML时如果没有设置namespace的值&#xff0c;并且上层动作配置中并没有设置 或使⽤通配符namespace时&#xff0c;可能会导致远程代码执⾏漏洞的发⽣。同样也可能因为url标签没 有设置value和action的值&…

react + antDesign封装图片预览组件(支持多张图片)

需求场景&#xff1a;最近在开发后台系统时经常遇到图片预览问题&#xff0c;如果一个一个的引用antDesign的图片预览组件就有点繁琐了&#xff0c;于是在antDesign图片预览组件的基础上二次封装了一下&#xff0c;避免重复无用代码的出现 效果 公共预览组件代码 import React…

JBoss EJBInvokerServlet CVE-2013-4810 反序列化漏洞

vulhub/jboss/JMXInvokerServlet-deserialization 1. 此漏洞存在于JBoss中 /invoker/JMXInvokerServlet 路径。访问若提示下载 JMXInvokerServlet&#xff0c;则可能存在漏洞&#xff1a; #创建class⽂件 javac -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCol…

Qt 模型视图(四):代理类QAbstractItemDelegate

文章目录 Qt 模型视图(四):代理类QAbstractItemDelegate1.基本概念1.1.使用现有代理1.2.一个简单的代理 2.提供编辑器3.向模型提交数据4.更新编辑器的几何图形5.编辑提示 Qt 模型视图(四):代理类QAbstractItemDelegate ​ 模型/视图结构是一种将数据存储和界面展示分离的编程方…

【C语言零基础入门篇 - 7】:拆解函数的奥秘:定义、声明、变量,传递须知,嵌套玩转,递归惊艳

文章目录 函数函数的定义与声明局部变量和全局变量、静态变量静态变量和动态变量函数的值传递函数参数的地址传值 函数的嵌套使用函数的递归调用 函数 函数的定义与声明 函数的概念&#xff1a;函数是C语言项目的基本组成单位。实现一个功能可以封装一个函数来实现。定义函数的…

DPDK 简易应用开发之路 3:实现ping(ARP ICMP 协议)

本机环境为 Ubuntu20.04 &#xff0c;dpdk-stable-20.11.10 网卡IP为192.168.131.153 mac地址 00 0c 29 00 04 4d 理论基础 机器A内部没有机器B的物理地址&#xff0c;则 A ping B 的时候需要先发 arp 请求&#xff0c;以获取机器 B 的 MAC 地址。 获取 MAC 地址 如果 A 和 …

python画图1

import matplotlib.pyplot as pltplt.rcParams["font.sans-serif"] ["SimHei"]# 模拟数据 years [2016, 2017, 2018, 2019, 2020, 2021, 2022] market_size [7950, 8931, 9940, 11205, 12305, 13199, 14980] my_color #3e9df5plt.plot(years, market_s…

ER论文阅读-Decoupled Multimodal Distilling for Emotion Recognition

基本介绍&#xff1a;CVPR, 2023, CCF-A 原文链接&#xff1a;https://openaccess.thecvf.com/content/CVPR2023/papers/Li_Decoupled_Multimodal_Distilling_for_Emotion_Recognition_CVPR_2023_paper.pdf Abstract 多模态情感识别&#xff08;MER&#xff09;旨在通过语言、…

spring-boot-maven-plugin插件打包和java -jar命令执行原理

文章目录 1. Maven生命周期2. jar包结构2.1 不可执jar包结构2.2 可执行jar包结构 3. spring-boot-maven-plugin插件打包4. 执行jar原理 1. Maven生命周期 Maven的生命周期有三种&#xff1a; clean&#xff1a;清除项目构建数据&#xff0c;较为简单&#xff0c;不深入探讨&a…

面试速通宝典——1

1. 内存有哪几种类型&#xff1f; ‌‌‌‌  内存分为五个区&#xff0c;堆&#xff08;malloc&#xff09;、栈&#xff08;如局部变量、函数参数&#xff09;、程序代码区&#xff08;存放二进制代码&#xff09;、全局/静态存储区&#xff08;全局变量、static变量&#…