基于Microchip单片机及收发器实现低成本LIN总线
随着汽车总线应用的日益普及以及对汽车成本的要求越来越严格,LIN总线的市场占有率越来越高。本文从低成本的角度来实现LIN总线的节点,具有非常高的实用价值。
1 LIN的基本知识与发展
1.1 LIN的基本知识
局域互连网络LIN(Local Interconnect Network)是低成本的串行通信网络,用于实现汽车中的分布式电子系统控制,是现有多种汽车网络在功能上的补充;同时它也是一个开放的标准,作为CAN总线的子总线,能缓解CAN总线数据拥挤的现状。
由于LIN总线是可靠、低成本、开放标准的网络解决方案,它可以简化现存的多点解决方案,并且能降低在汽车电子领域中的开发、生产、服务和后勤成本。
1.2 LIN的起源与发展
LIN联盟成立于1999年,并发布了LIN 1.0版本。2000年,LIN联盟再次发布了1.1版本。2001年,第一辆采用LIN1.1版本的量产汽车面世。2003年,2.0版本出现。2006年,2.1版本面世并沿用至今。
1.3 LIN的市场
LIN总线产品已经成为汽车总线的第二大市场,预计将成为未来增长最快的一个市场。第一大市场是CAN总线,其在2006年已经达到顶峰。
2 LIN的基本概念
LIN在物理层是单线实现的,一般电压范围在8 V~18 V。LIN网络是单主多从结构,由于只有一个主节点,所以不存在总线仲裁。总线的速度一般在2.4 kbd~19.6 kbd之间。典型节点数为2~10个,由于阻抗匹配的原因,最多不能超过16个[1]。如图1所示。
LIN总线为串行通信方式,编码采用非归零码,8N1(8个数据位,没有校验位,1个停止位)方式,如图2所示。每帧的数据字节数可变,为2~8 B。在数据字节结束后,会发一个校验和来进行校验。
在LIN网络中,主节点的时钟由高精度的晶振产生,从节点一般用RC震荡器产生。在本文中,从节点的时钟可以用Microchip单片机的内部RC震荡器来实现。
3 LIN协议的基本知识
LIN的报文分为两部分,一是主任务,也叫报文头;另一个部分是从任务,也叫响应场。如图3所示。
主任务位于主机节点内部,都是由主节点发出,它负责报文的进度表、发送报文头(HEADER)。从任务位于所有的(即主机和从机)节点中,其中一个(主机节点或从机节点)发送报文的响应(RESPONSE)。
3.1 报文头
报文头分为三部分,按顺序分别叫同步间隔、同步字段、标识符字段。
同步间隔是一个长时间的低电平(显性总线电平),低电平时间要大于10个位定时时间,通常为13个位定时时间。在长时间的低电平之后,要跟着一个短时间的高电平(隐性总线电平),一般为1~4个位定时时间[2]。
同步字段包含了时钟的同步信息。它的内容为0x55,表现在8个位定时中有5个下降沿(隐性跳变到显性的边沿)。从节点通过同步字段,可以使自己的总线速率与主节点同步。
标识符字段定义了报文的内容和长度。其中,内容是由6个标识符位和2个奇偶校验位组成,如图4所示。标识符位的第5位和第6位(ID4和ID5)定义了报文数据场的长度。
3.2 响应场
响应场包含数据字段和校验和两部分。
数据字段由8 bit数据的字节组成,传输由最低位(LSB)开始。校验和按照带进位加的方式计算,每个进位都被加到本次计算结果的最低位。
3.3 保留的标识符
标识符为0x3C和0x3D的标识符被用做诊断。其中0x3C是主机请求帧,它可以从主机向从机节点发送命令和数据。0x3D是从机响应帧,它触发一个从机节点(由一个优先的下载帧编址)向主机节点发送数据。
标识符为0x3E是由用户定义的自由用法,标识符为0x3F是为将来使用而严格保留的。
4 Microchip单片机的软硬件实现
4.1 硬件实现
主节点一般采用Flash比较大的Microchip中档8位单片机,或者采用带CAN控制器的高档8位单片机或16位单片机作为控制器。时钟采用高精度石英晶振。物理层的电平转换采用Microchip的收发器MCP2021。
从节点可用低成本的Microchip中、低档8位单片机。时钟用单片机内部自带的RC震荡器。内部RC震荡器在常温25 ℃时,精度为1%,全温度范围(-40 ℃~+125 ℃)内精度为5%[1]。物理层的电平转换采用Microchip的收发器MCP2021。
4.2 软件实现
4.2.1 主节点
主节点完全按照LIN规范实现。主节点的任务就是发送报文头和发送接收数据,实现一个网关的作用。另外,单片机的剩余功能,可以用来做一些A/D和开关量的采集,还可以驱动一些蜂鸣器、小电机或者LED和LCD等器件。主节点发送流程如图5所示。
LIN总线的通信可以通过配置单片机的EUSART来实现。每次通信都由主节点启动,此处不考虑从节点到从节点的通信。总线的配置也由主节点来实现,具体波特率可以通过波特率控制寄存器来实现。这里采用9 600的波特率。
标识符不是一个节点的地址,而是一个报文的描述符。当主节点发送一个0x3C的命令后,再发送8 B的00H,总线就进入休眠模式。在休眠模式下,总线处于空闲状态,因此任何一个从节点都可以唤醒总线。
主节点采用高精度的石英晶振作为时钟源,可以产生低误差的时钟信号。在这里,要把主节点设置为异步半双工通信模式,8 bit数据模式。时钟选择为内部时钟。
由于EUSART有"发送间隔字符位(SENDB)",可以在每次发送数据前发送同步间隔字符,这样可以省掉不少软件开销,使单片机可以致力于其他逻辑的运算。
4.2.2 从节点
从节点不需要系统配置的信息,所有从节点接收所有报文,然后再判断是否需要执行。
从节点不需要外接石英晶振,可以用单片机内部自带的RC震荡器实现。Microchip的中端8位单片机大多数都内带高精度的RC震荡器,在常温下(25℃),经过校准可以达到±1%的精度。
每个单片机在出厂时都经过校准,并把校准字写在Flash空间的最后一位。在程序开始运行时,会把校准值装载到W寄存器里。在程序的第一条指令中执行MOVWF OSCCAL,即可将W寄存器里的值送到内部RC震荡器的校准寄存器里,从而实现校准。
从节点先检测总线电平,当长时间的隐性电平结束,出现大于10个位定时的显性电平后,开始数5个下降沿的时间,用时间值除以8,就可以算出波特率。然后从总线上读取数据,解码ID,处理响应。
EUSART支持波特率的自动检测和校准,可以使软件代码大量简化。从节点可以在总线空闲时进入休眠状态,当从节点检测到主节点发出的同步间隔时,可以从休眠状态唤醒。
当从节点被其他外部中断唤醒时(例如A/D转换完成,外部IO电平变化等),从节点可以唤醒休眠的总线。
如果从节点的功能比较简单,工作电流比较小,可以通过收发器MCP2021的参考电压输出端来供电。
MCP2021有两种型号,参考电压的输出分别为5 V和3.3 V,适应5 V和3.3 V的单片机。这个参考电压的输出电流最大为50 mA,所以不适合工作电流比较大的场合[3-4]。
- 基于LIN总线的车用无刷直流电机控制器设计(01-25)
- LIN总线节点的设计(01-26)
- iEthernet W5200数据手册(版本1.2.4)之:引脚分配(09-18)