当前位置: 首页 > news >正文

【通讯协议】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波形图:
在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ActiveMQ 的消息持久化策略
  • K8s Calico替换为Cilium,以及安装Cilium过程
  • 解决Vue 3中Element Plus el-color-picker 组件消失的问题
  • 828华为云征文|华为云Flexus X实例docker部署最新Appsmith社区版,搭建自己的低代码平台
  • 浅显易懂的Git教程
  • 4.《DevOps》系列K8S部署CICD流水线之Helm部署Harbor私人镜像仓库
  • 阿里巴巴新推出Java版AI 应用开发框架-Spring AI Alibaba
  • 用Flowise+OneAPI+Ollama做一个在线翻译工作流
  • LLaMA-Factory 使用 alpaca 格式的数据集
  • Linux 常用命令 - more 【分页显示文件内容】
  • react + antDesign封装图片预览组件(支持多张图片)
  • 全面掌握大模型:从零基础到精通的终极指南,超详细教程手把手教会你,收藏我这一篇就够了
  • Java笔试面试题AI答之设计模式(5)
  • python gensim实现作者主题模型(Author-Topic Model)
  • 车路云一体化大模型数据治理方案
  • angular2开源库收集
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • JDK9: 集成 Jshell 和 Maven 项目.
  • js学习笔记
  • Odoo domain写法及运用
  • Promise面试题2实现异步串行执行
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • SpringCloud集成分布式事务LCN (一)
  • 创建一种深思熟虑的文化
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 十年未变!安全,谁之责?(下)
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • ![CDATA[ ]] 是什么东东
  • # include “ “ 和 # include < >两者的区别
  • #### golang中【堆】的使用及底层 ####
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (1)(1.13) SiK无线电高级配置(五)
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (k8s)Kubernetes 从0到1容器编排之旅
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (二)构建dubbo分布式平台-平台功能导图
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (每日一问)操作系统:常见的 Linux 指令详解
  • (三)Kafka 监控之 Streams 监控(Streams Monitoring)和其他
  • (十六)一篇文章学会Java的常用API
  • (十一)手动添加用户和文件的特殊权限
  • (五)activiti-modeler 编辑器初步优化
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • .aanva
  • .mp4格式的视频为何不能通过video标签在chrome浏览器中播放?
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .net 设置默认首页
  • .NET 事件模型教程(二)
  • .NET 通过系统影子账户实现权限维持