LIN总线诊断的实现

LIN总线是针对汽车分布式电子系统而定义的一种低成本的串行通讯网络,是对控制器区域网络(CAN)等其它汽车多路网络的一种补充,适用于对网络的带宽、性能或容错功能没有过高要求的应用。LIN总线是基于SCI(UART)数据格式,采用单主控制器(Master)/多从设备(Slave)的模式,是UART中的一种特殊情况。

LIN总线上的通信都必须是由Master主动发起,各个slave根据header中的PID来判断自己是否应该对这个header给出响应,或者是否应该接收跟随这个header的resposne。所以,LIN网络上的通信行为是可预知的,就是调度表中规定的。
LIN总线上的帧结构,由header和response两个部分组成,header一定来自Master,response既可以来自Master,也可以来自slave。

| Start bit | ID0 | ID1 | ID2 | ID3 |ID4 | ID5 | P0 |P1 | Stop bit|

PID的全称是Protected identifier,它是header中一个最重要的结构,用于指示这个LIN帧的作用。从上图中可见,PID总共有6个bit的数据域,2个bit的保护域(根据前面的6个bit计算出来),所以PID总共有2的6次方,即64种取值,其中0 到 59 (0x3B)用于携带普通信号,60 (0x3C) 和 61 (0x3D)用于携带诊断数据和配置数据,62 (0x3E) 和 63 (0x3F)是保留的。

诊断仪的命令通过Master转发给Slave,Master发出一个PID=0x3C的header之后,再把诊断请求包装到response中发送到LIN总线上。

在Master发送完诊断请求之后,它会再发送一个PID=0x3D的header,然后等待响应这个诊断请求的slave发送的response。

这种传输方式带来了一个问题,因为3C和3D这两个PID只标识帧用于诊断,却无法完成寻址功能(在CAN总线上的诊断中,寻址是通过CAN ID来实现的),所以LIN规范中定义,在3C之后的response中,第1个字节是NAD(node address),用来标识LIN网络中的节点。这样的话,LIN总线上的8个字节只有7个字节用来传输控制信息和数据了,所以,在CAN总线上N个帧传完的诊断请求,在LIN总线上可能会变成N+1个帧。

Request | NAD | PCI | SID | D1 | D2 |D3 | D4 | D5 | PCI-type = SF
Request | NAD | PCI | LEN | SID| D1 | D2 |D3 | D4 | PCI-type = FF
Request | NAD | PCI | D1 | D2 |D3 | D4 | D5 | D6 | PCI-type = SF
Response | NAD | PCI | RSID | D1 | D2 |D3 | D4 | D5 | PCI-type = SF
Response | NAD | PCI | SID | D1 | D2 |D3 | D4 | D5 | PCI-type = SF
Response | NAD | PCI | SID | D1 | D2 |D3 | D4 | D5 | PCI-type = SF

第一个字节是NAD,后面的字节则和CAN上的传输层PDU格式基本一致。不同之处在于,LIN总线的传输层没有流控制帧(FlowControl),因为接收端不需要通知发送端它的接收能力(时间间隔和发送数据块大小),因为调度过程是由Master主导完成的。