PDU
总线上数据传输的单元叫做PDU(协议数据单元)。主要分为三类:单帧、首帧和连续帧。
- 单帧(SF,Single Frame):只用一个PDU就完成所有数据传输的报文;
- 首帧(FF, First Frame):多帧传输时,被发送的首个PDU;
- 连续帧(CF,Consecutive Frame):多帧传输时,在首PDU发送后,紧接着发送的PDU
如下图所示:PDU的结构包括 节点地址(NAD) ,协议控制信息(PCI),服务ID(SID),应答ID(RSID),消息字段(D1-D6)。发送数据是NAD首先发送。
简言之,一个LIN单帧SF能传输的数据长度最多为5个字节;如果要传输的数据内容长度超过5个字节,则需要考虑用多帧也就是最少两帧(ff+cf)才可以完成传输(例:通过LIN 更新代码)。
1.NAD
NAD指的是从节点地址(Node Address)。LIN协议中对NAD单位进行了定义,具体如下
LIN规范定义的,主节点发送睡眠指令,发送帧头ID为 3C,单帧数据内容为:第一个字节NAD设置为0x0,其余字节设置为0xFF即可。
2.PCI
PCI即协议控制信息(Protocol Control Information)。PCI包含PDU的类型、编号和报文的有效数据长度等信息。根据PDU的不同,PCI不同,具体如下:
注:多个PDU组成的报文中,在每个连续帧CF中必须加入包编号,第一个CF的包编号是1,第二个是2,……包编号超过15则重新从0开始计算。
比如,如果要发诊断ECUreset请求(11 01),需要发送的PDU类型为单帧就可以了,帧头ID为3C,数据长度为2,所以PCI为0x02。
SF:NAD 0x02 0x11 0x01 0xFF 0xFF 0xFF,0xFF为填充字节。
如果要发送的数据长度为15个字节,则发送的PDU内容如下:
FF:NAD 0x10 0x0F 0x11 D1 D2 D3 D4
CF:NAD 0x21 D5 D6 D7 D8 D9 D10
CF:NAD 0x22 D11 D12 D13 D14 D15
3.SID、RSID
SID(Service Identifier)是指服务标识符,在请求帧中发送;RSID(Response Service Identifier)对应于SID的响应服务标识符,在响应帧中发送。
肯定响应,RSID = SID + 0X40
否定响应,RSID = 7F+SID+NRC(1 byte)
4.单帧传输&多帧传输
当需要传输的有效数据长度少于6个字节时,用单帧传输。传输有效数据长度在7~4095字节,需要通过多帧的形式传输。
但是需要记住的是,LIN上面所有从节点从节点的数据传输,必须等到收到主节点的帧头后,次对外发出数据帧。也就是说如果是响应一个主节点的请求,需要通过多帧的形式才可以把反馈数据传输完毕,则FF以及每一个CF的发出都需要在收到主节点的帧头后才可以发出去。
5.错误处理
规范定义了一些LIN上常用的错误处理机制,比如:
- Length SF >6,则忽略该报文
- Length FF<7,则忽略该报文
- Length FF>BufferSize,则终止接收该报文
- 节点如果处于发送状态,接收到SF或FF(NAD !=0X7E),则终止发送报文,开始接收新报文
- CF编号如果错误,放弃之前接收的CF与FF