尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

LIN通信协议

LIN通信协议 LIN通信协议笔记概述LIN物理层LIN电气特性LIN总线特性相关标准和规范数据链路层LIN协议结构帧构成通信机制错误检测休眠唤醒传输层与网络层应用层LIN初始化概述LIN是Local Interconnect Network局域互联网络的缩写为实现低成本、低速率的串行通信而设计的其核心特性可以概括为基于UART/SCI接口的 单线制 总线通过 显性和隐性电平 表示逻辑值最高支持20kbit/s的通信速率。LIN物理层LIN电气特性信号电平显性位 (Dominant)逻辑0电压阈值低于VSUP的40%。隐性位 (Recessive)逻辑1电压阈值高于VSUP的60%。注VSUP电压为(Supply Voltage pin)电源电压引脚它与VBAT电压的区别在于VBAT电压进入LIN收发器后经过二极管等器件后有一定的压降使VSUP电压比VBAT电压低一点。工作电压标准LIN收发器支持12V和24V的汽车电池系统。终端电阻与电容主节点上拉电阻为1kΩ并串联一个二极管以防止本地电源泄漏对总线的干扰。从节点上拉电阻为30kΩ。总线电容每个从节点的典型电容约为220pF。LIN总线特性采用单主多从的架构。一个LIN网络中通常包含1个主节点和最多15个从节点整个网络的总节点数不超过16个。物理层通常基于微控制器中集成的UART通用异步收发传输器或SCI串行通信接口 硬件来实现无需专门的通信控制器从而降低了成本。最高支持20kbit/s。为确保电磁兼容性EMC最小波特率通常为1kbit/s。总线电缆长度不得超过40米。相关标准和规范国际标准主要由 ISO 17987 系列标准规范。中国标准GB/T 42691.8-2023对应ISO 17987-8。数据链路层LIN协议结构帧构成下图是LIN总线上实际传输的数据格式。一个完整的报文帧由报头和响应两部分组成其中报头必须由主节点发送响应由主节点或从节点发送。Header-同步间隔段(Break)至少13个显性位 (逻辑0)Header-同步段(Sync)它的作用是让从节点测量主节点的波特率并校准自身的内部时钟同步段内容转为数据是0x55数据低位先被发送因此第一个bit应为1从波形上看为1010 1010(0xAA)由于低位在前反转后为0x55PID和数据段同为低位先被发送。0x55的二进制是01010101在UART帧中含起始位和停止位会产生连续、均匀的5个下降沿。从节点通过测量这些边沿的时间间隔就能精确计算出主节点的位时间bit time从而调整自身波特率与之匹配一些MCU的LIN接口支持自动波特率就是通过此段进行波特率计算。Header-受保护ID段(PID)受保护PID段由两部分组成帧ID(frame identifier) 奇偶校验(parity)Bit0-Bit5是帧IDBit6-Bit7是奇偶校验码帧 ID 的范围在0x000x3F之间共64个帧ID标识了帧的类别和目的地。从机任务对于帧头作出的反应(接收/发送/忽略应答部分)都是依据帧 ID 判断的奇偶校验P0 ID0 ⊕ ID1 ⊕ ID2 ⊕ ID4 异或P1 ¬(ID1 ⊕ ID3 ⊕ ID4 ⊕ ID5)异或后取反Response-数据段(Data)数据段长度为1-8个字节一个信号通常由一个固定的节点发出此节点称为该信号的发布节点(Publisher)其余的一个或多个节点接收它们称为信号的收听节点(Subscriber)。Response-校验和场(Checksum)Checksum分为经典校验和、增强校验和经典校验和只对报文数据段进行校验适用于LIN 1.x 版本的所有报文、LIN 2.x及以后版本的诊断帧ID为0x3C和0x3D。增强校验和对PID段和数据段一起进行校验LIN 2.x及以后版本的普通通信帧。校验算法(带进位累加0xFF)再将结果取反例假设一组数据字节为0xC0, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x08, 0x00。1. 先累加0xC0 0x00 0x00 0x0C 0x00 0x00 0x08 0x00 0xD42. 再取反0xFF - 0xD4 0x2B校验和为0x2B用C语言表示为#definePLLIN_CHK_CLASSIC(0U)#definePLLIN_CHK_ENHANCED(1U)#definePLCFG_LIN_CHECKSUM_TYPE(PLLIN_CHK_ENHANCED)staticuint8pllin_calc_checksum(uint8 id,uint8*data,uint8 len){uint16 chksum0;uint8 index0;#if(PLCFG_LIN_CHECKSUM_TYPEPLLIN_CHK_ENHANCED)if(id!0x3Cid!0x7D){chksumid;}else{chksum0;}#endiffor(index0;indexlen;index){chksumdata[index];if(chksum0xFF){chksum-0xFF;/* add carry */}}return((uint8)~chksum);}通信机制LIN总线采用单主多从结构网络中只有一个主节点其余都是从节点。LIN通过调度表(Schedule Table)进行帧的发送和接受通过预先规划好的通信时序进行发送。LIN协议定义了四种不同类型的帧来应对不同的通信需求。无条件帧最基础的帧。主节点按调度表发送帧头指定的从节点必须应答。用于常规的周期性数据交换。事件触发帧提高总线效率。主节点用一个帧头去询问多个变化不频繁的从节点。只有状态发生变化的从节点才应答。偶发帧主节点主动报告事件。当主节点自身信号发生变化时才会在分配的时隙发送。若多个信号同时变化则按预设的优先级依次发送优先级低的帧可能被跳过。诊断帧用于诊断。错误检测位错误Bit Error通常LIN 总线上只有一个节点在向外发送信息发送的同时回读总线上的数据当发送节点发送电平与回读电平不一致时视为位错误。这种不一致可能是由于多种原因造成的比如信号干扰、硬件故障或网络拥塞等。如图1所示通过仿真干扰数据场使发送节点回读到的byte 1与其发送的值不一致所以出现了图中的RcvError位错误帧。同步段错误Sync Field Error接收节点通过同步场计算出的 数据传输 速率超过了预先设定的正常范围这可能意味着传输过程中出现了异常情况比如信号干扰、硬件故障或配置错误等。标识符奇偶校验错误ID Parity Error奇偶校验的主要作用是检测帧头传输过程中的单比特错误如果在传输过程中报文ID的某个位发生了错误接收方通过校验规则计算奇偶校验位的值并与接收到的奇偶校验位进行比对来确定ID场数据是否发生了错误如果不一致则认为发生了PID(Protected identifier)错误校验和错误Checksum Error:接收节点计算的校验和与接收到的尾部校验和字段不匹配即为校验和错误。休眠唤醒总线可以在两种情况下进入休眠利用诊断帧中的主机请求帧 0x3C 作休眠命令要求数据段的第一个字节为 0x00其余字节为 0xFF。休眠命令由主机节点发出总线上的从机节点只判断数据段的第一个字节其余字节忽略。从机节点在接收到休眠命令后不一定要进入低功耗模式根据应用层需要设置。当总线静默(没有显性和隐性电平之间的切换)4s10s 时节点自动进入休眠状态传输层与网络层长消息分包传输当应用层需要传输超过8字节的数据如诊断数据最长可达4095字节时该层负责将数据分包成多个符合LIN帧格式的报文进行发送和重组。诊断服务接口提供标准化的服务接口支持基于LIN子总线的诊断通信使其能与CAN等主干网络的诊断能力保持一致。应用层信号定义与交互定义网络中各节点交互的信号如车速、温度及其含义和排列方式。应用程序通过读写这些信号来工作而无需关心底层通信细节。调度表设计定义主节点中具体的调度表确定每个报文在何时发送这直接影响网络性能。LIN初始化voiduartlin_init(void){UART_ConfigType uartConfig{0};uartConfig.baudrate19200;uartConfig.dataBitsUART_WORD_LEN_8BIT;uartConfig.stopBitsUART_STOP_1BIT;uartConfig.parityUART_PARI_NO;uartConfig.fifoByteEnDISABLE;uartConfig.dmaEnUART_DMA_TXRX_NONE;uartConfig.sampleCntUART_SMP_CNT0;///must set UART_SMP_CNT0 when use LIN functionuartConfig.callBackUartLIN_Handler;UART_Init(UART_LIN,uartConfig);UART_SetLIN(UART_LIN,UART_LINCR_LINEN_Msk//LIN 模式使能|UART_LINCR_LBRKIE_Msk//LIN Break 检测中断使能|UART_LINCR_LBRKDL_Msk//LIN Break 中断检测长度|UART_LINCR_LABAUDEN_Msk);//0x55 用于自动波特率检测// Enable interruptUART_SetRXNEInterrupt(UART_LIN,ENABLE);UART_SetTXEInterrupt(UART_LIN,DISABLE);/// Default DISABLENVIC_ClearPendingIRQ(UART_LIN_IRQn);NVIC_EnableIRQ(UART_LIN_IRQn);}staticvoidUartLIN_Handler(void*device,uint32_twpara,uint32_tlpara){if(((UART_LSR0_OE_Mskwpara)!0)||((UART_LSR0_FE_Mskwpara)!0)||((UART_LSR0_NE_Mskwpara)!0)||((UART_LSR1_SYNERR_Msklpara)!0)){pllin_statusLIN_RX_ERROR;LIN_BaudrateCheck((UART_Type*)device,19200);}elseif(0!(lparaUART_LSR1_FBRK_Msk)){UART_LIN-LSR1|UART_LSR1_FBRK_Msk;///write 1 to clear break status}elseif(0!(wparaUART_LSR0_DR_Msk)){drlin_rx_saved_byteUART_ReceiveData(UART_LIN);}}voidLIN_BaudrateCheck(UART_Type*UARTx,uint32_tbaudrate){uint32_tbaudrate_currentUART_BUSCLK/16/(UARTx-DIV_H8|UARTx-DIV_L);// Current baud rate:baud_rate APB CLOCK/16/{DLH, DLL}uint32_tbaudrate_maxbaudrate*(10015)/100;// Maximum baud rate, range adjusted according to requirements.uint32_tbaudrate_minbaudrate*(100-15)/100;// Minimum baud rate, range adjusted according to requirements.if(baudrate_currentbaudrate_max||baudrate_currentbaudrate_min)// Exceeding normal range, reset baud rate.{UART_SetBaudrate(UARTx,baudrate,UART_SMP_CNT0);}}
返回列表