第2章:LIN总线物理层

大家好,欢迎来到第二章。今天咱们聊聊LIN总线的物理层。

说实话,很多做软件的朋友容易忽略物理层。觉得不就是两根线嘛,有什么好研究的?我当年也这么想。直到有一次,一个项目在EMC测试时死活过不去,排查了三天,最后发现是收发器选型的问题。从那以后,我对物理层就再也不敢马虎了。

2.1 LIN总线的电气特性

LIN总线本质上是一根单线总线。它基于什么呢?基于我们车上的12V蓄电池系统。嗯,这里要注意,虽然叫12V,但实际工作范围很宽。

具体来说,LIN总线的电气参数是这样的:

参数 最小值 典型值 最大值 单位
总线电压(隐性) Vbat * 0.8 Vbat Vbat V
总线电压(显性) 0 0 Vbat * 0.2 V
传输速率 1 20 20 kbps
总线电容 - - 10 nF
节点数 2 - 16

你看这个表格,最核心的就是隐性电平和显性电平。隐性电平对应逻辑"1",显性电平对应逻辑"0"。为什么这么设计?说白了,就是为了实现总线仲裁。多个节点同时发送时,显性电平会覆盖隐性电平。这个机制在后面的协议层会详细讲。

关键点:LIN总线的隐性电平≈电池电压,显性电平≈0V。这个和CAN总线刚好相反。CAN是隐性≈2.5V,显性≈1.5V/3.5V。别搞混了。

2.2 单线传输原理

LIN总线只用一根线传输数据,那信号怎么回来的?靠地线。所以严格来说,LIN是"一根信号线+一根地线"。

传输原理其实很简单。每个节点内部都有一个上拉电阻,连接到电池电压。当没有节点拉低总线时,总线电压就是电池电压,也就是隐性状态。当某个节点想发送显性位时,它内部的晶体管导通,把总线拉到地,电压就变成0V左右。

我给大家画个简化的电路图:

     Vbat
      |
      R (上拉电阻,典型值1kΩ)
      |
      +------ LIN Bus
      |
      Q (NPN晶体管或MOSFET)
      |
     GND

这个结构看起来简单,但实际项目中坑不少。我曾经遇到过一个案例:某个节点在高温下频繁丢失报文。排查到最后,发现是上拉电阻的温漂太大,导致隐性电平不够高,被误判成了显性。

我的建议:上拉电阻尽量用1%精度的金属膜电阻,别省那几分钱。温度系数选±100ppm/℃以内的。

2.3 收发器芯片介绍(以TJA1020为例)

收发器是LIN总线的物理层接口芯片。它的作用就是把MCU的UART信号转换成LIN总线上的电平信号。

市面上主流的LIN收发器有:

  • NXP的TJA1020/TJA1021
  • TI的TLIN1029
  • Microchip的MCP2003/MCP2004
  • Melexis的THS系列

我用的最多的是TJA1020。为什么?因为它的引脚兼容性好,而且有休眠模式,功耗控制得不错。

来看TJA1020的典型引脚:

引脚 名称 功能
1 TXD 发送数据输入(来自MCU的UART TX)
2 RXD 接收数据输出(到MCU的UART RX)
3 NSLP 休眠控制(低电平进入休眠)
4 LIN LIN总线引脚
5 VSUP 电源(接电池电压)
6 GND

TJA1020的工作模式有三种:

  1. 正常模式:NSLP为高电平,收发器正常工作
  2. 休眠模式:NSLP为低电平,功耗降到微安级别
  3. 故障模式:总线短路或过热时自动进入

注意:TJA1020的TXD引脚内部有上拉电阻。如果MCU的UART TX默认是高电平,那上电瞬间可能会发送一个显性位。我建议在TXD引脚上加一个10kΩ的下拉电阻,确保上电时总线处于隐性状态。

2.4 总线拓扑结构

LIN总线采用单主多从的拓扑结构。什么意思?就是总线上只有一个主节点,其他都是从节点。

典型的拓扑是这样的:

    [主节点] ----+---- [从节点1] ----+---- [从节点2] ----+---- [从节点3]
                 |                   |                   |
               1kΩ                 1kΩ                 1kΩ
                 |                   |                   |
                GND                 GND                 GND

注意看,每个节点内部都有一个1kΩ的上拉电阻。但实际应用中,只需要主节点有上拉电阻就够了。从节点的上拉电阻可以去掉,或者用更大的阻值(比如30kΩ)。

为什么?因为多个上拉电阻并联,总阻值会变小。如果16个节点都有1kΩ上拉,那总阻值只有62.5Ω。总线负载太重,显性位拉不低,通信就会出问题。

我记得有个项目,客户把从节点的上拉电阻也焊上了1kΩ。结果总线波形变得很奇怪,显性电平只能拉到3V左右。去掉从节点的上拉电阻后,波形就正常了。

总线长度方面,LIN规范建议不超过40米。但实际项目中,我建议控制在20米以内。特别是车内环境,线束的寄生电容和电磁干扰都比较严重。

总结一下拓扑要点:

  • 一个主节点,最多15个从节点
  • 主节点必须有1kΩ上拉电阻和串联二极管
  • 从节点上拉电阻可选,建议用30kΩ或直接去掉
  • 总线长度建议不超过20米
  • 总线电容不超过10nF

2.5 实际项目中的避坑指南

最后,我把自己这些年踩过的坑总结一下,希望对你有帮助。

坑1:电源滤波

LIN收发器的VSUP引脚一定要加滤波电容。我习惯用100nF+10μF的组合。不加的话,总线上的噪声会耦合到内部电路,导致误触发。

坑2:ESD保护

LIN总线是暴露在车外的(比如车门模块),很容易受到静电放电影响。我建议在LIN引脚上加一个TVS管,比如PESD1LIN。别省这个器件,一个TVS管才几毛钱,但能省去很多售后麻烦。

坑3:休眠唤醒

我曾经遇到一个问题:从节点进入休眠后,主节点发唤醒信号,从节点死活不响应。查了半天,发现是从节点的NSLP引脚没有正确配置。记住,从节点在休眠模式下,必须能检测到总线上的唤醒脉冲。这个脉冲宽度至少250μs。

坑4:地线回路

LIN总线是单线传输,地线回路很关键。如果各个节点的地电位不一致,隐性电平就会偏移。我建议在PCB布局时,把LIN收发器的GND引脚单独走线,不要和功率电路共用回路。

一个小技巧:调试LIN总线时,用示波器看波形。正常的隐性电平应该在电池电压的80%以上。如果低于70%,说明总线负载太重或者上拉电阻有问题。

好了,关于LIN总线物理层的内容就讲到这里。下一章我们会进入协议层,看看LIN的帧结构是怎么设计的。到时候我会结合一个实际项目中的报文解析案例来讲,保证让你印象深刻。

记住,物理层是基础。基础不牢,地动山摇。把今天的内容消化好,后面的学习会轻松很多。