LIN总线与USB总线接口的设计与实现
2009-04-09
作者:黄 丽1; 黄 辉2; 刘 敏3
摘 要: 从系统整体结构、硬软件设计等方面论述了车身控制模块的LIN总线接口与PC机的USB接口互连的设计方法。该设计已经应用到车身控制设备的测试之中。
关键词: LIN总线; USB/CDC; 单片机
LIN总线广泛应用于车门、方向盘、座椅、温度和发动机冷却风扇等控制中。目前工程师大多采用专用的测试设备来测试带LIN总线的车身控制模块(BCM)。但该类测试设备功能单一,而且成本较高。目前USB接口已经在PC机上普及,如果能设计LIN总线和USB总线互连的接口,直接将BCM模块中的信息通过USB接口上传到PC机,就能充分利用PC机的资源来对BCM进行测试,不仅可提供丰富的人机界面和智能化的测试管理手段,而且能大大降低测试成本。PIC18F2550单片机既内嵌有USB接口,又提供了支持LIN协议的USART接口,且具有良好的电气性能。本文即以此单片机为核心设计了一种LIN总线和USB总线互连的接口转换器。
1 LIN 总线技术简介
LIN总线基于通用的UART/SCI接口,其最高通信速率为20Kbps,在硬件和软件上都易于实现。其低成本的优势使得一些先进的机械电子装置,如智能传感器和执行器等可应用到车辆系统中。目前LIN总线的协议已逐渐从1.3升级到2.0,最新的标准为2.1。当前大多数的LIN接口芯片支持LIN 2.0协议,本文采用的协议即为LIN 2.0。
2 USB-LIN 转换接口的总体设计
本文设计的USB-LIN转换接口主要包括三大部分:单片机的USB接口部分、LIN总线的接口部分和电源隔离部分,如图1所示。其中,单片机的5V电源来自PC机的USB接口,LIN收发器的电源来自汽车的12V蓄电池。光耦PS9701实现了两套电源系统的隔离,有效地保护了PC机的USB接口和BCM模块。
3 USB-LIN 转换接口的硬件设计
3.1 PIC18F2550单片机
PIC18F2550是Microchip公司生产的增强型闪存USB 单片机[1],它具有兼容USB2.0协议的USB接口,内嵌1KB双端口存取RAM。USB协议栈实现了四种传输方式:控制传输方式、中断传输方式、批量传输方式和实时传输方式。此外,PIC18F2550还内嵌增强型USART 模块,支持LIN总线协议。PIC18F2550对USB接口和LIN接口均提供了良好的支持,因此,选用该单片机可简化LIN和USB转换接口的外围电路的设计。
3.2 USB接口部分的硬件设计
USN-LIN接口电路的USB部分的设计如图2所示。
其中,USBH为USB接口,PC机的USB口提供的电压为5V±5%,电流最小为100mA,最大为500mA。PIC18F2550正常工作时应提供的电源范围为4.2V~5.5V,如果选用PIC18LF2550,电源范围可拓宽至2.6V~5.5V,实际测试中,本电路消耗的电流仅为50mA。因此,无论是笔记本电脑还是台式机,其USB口提供的电源都能够保证该电路正常工作。
图2中信号RC1/FT、RC0/CS、RC6/TX 和RC7/RX连接至光隔回路,以实现PC机的USB口和LIN总线的电源隔离。其中,RC1/FT为LIN总线故障侦测端口,通过该端口,ATA6625(LIN接口芯片)将LIN总线的状态传送到PIC18F2550,以指明当前LIN总线是处于故障状态,还是处于总线退出或空闲状态。RC0/CS为LIN总线收发器的片选端。RC6/TX为LIN总线收发器的发送数据端。RC7/RX为LIN总线收发器的接收数据端。为改善光隔的耦合波形,在输入端RC1/FT和RC7/RX上都加入了1kΩ的上拉电阻。
3.3 与LIN总线接口部分的硬件设计
与LIN总线接口部分电路如图3所示。图3中,ATA6625为LIN收发器[2],其设计符合LIN 2.0规范和SAEJ2602标准,该芯片的ESD稳定性高于6kV。ATA6625还包括一个超低压降型稳压器,稳压器的输出为5V,电流可达50mA,可为应用方案中的MCU和其他芯片提供电源,能有效降低系统的成本。
图3中,LINH为LIN总线接口,Vbat由12V蓄电池供电。D3和D4防止保护蓄电池过载。LIN总线端的电源与PC机的USB端口是隔离的。LIN总线收发器和单片机之间通过光耦PS9701进行数据交换。当本节点为主节点时,接上1kΩ电阻R13以提高总线的驱动能力;当本节点为从节点时,应去掉此电阻。
由于LIN收发芯片的RX管脚和FAULT管脚驱动能力有限,不能直接驱动PS9701,因此,在LIN收发器至光隔驱动回路上添加了74LVC2G04反相器。
3.4 两套电源系统隔离部分的硬件设计
为了防止PC机的USB接口的损坏,在PC机的5V电源和汽车蓄电池的供电系统之间加入了光电隔离,其电路如图4所示。考虑到LIN总线的波特率上限为20Kb/s,电路中采用了PS9701高速光隔,该光电隔离上升时延仅为50ns。
4 LIN总线和USB总线通信转换的软件设计
USB-LIN接口的总体程序设计框图如图5所示,整个程序分为主程序和中断服务程序两部分。其中,LIN总线的主任务状态机在定时中断服务程序中实现,从任务状态机在LIN总线的上升沿中断服务程序中实现。
USB-LIN接口的数据缓冲区的设计如图6所示,主要包括LIN端数据交换、USB端的数据交换以及LIN端用户缓冲区与USB端用户缓冲区之间的数据解析和交换。
4.1 LIN总线的软件实现
LIN总线软件部分包括网络管理的实现、主/从任务状态机的实现[3]、调度表和信息绑定表的更新等。其中,主任务只分布在主节点上,而从任务分布在所有的节点上。LIN2.0协议规定了主/从任务的状态转移图[3]。主任务的核心工作是产生正确的报文头,报头传输是报文传输的引导,其传输机制基于时间调度表,调度表规定了帧传送的顺序和两帧间的时间间隔。LIN主任务的调度原理如图7所示。其中,定时器1作为调度的时间片定时器,设定为1ms;定时器0作为帧超时定时器,其设定依赖于节点的时钟频率和通信的波特率。
程序设计中涉及到调度表NormalTable和信息绑定表L_HandleList。处理句柄handle实现了这两个重要表的联络。调度表给出了每个帧的时间片,主任务根据该表循环启动帧的传输。调度表包括:帧的处理句柄handle、帧的PID和该帧的时间片。调度表只保存在主节点之中。
信息绑定表L_HandleList定义了一个节点对接收到的具有某个特定PID的帧的响应方式,绑定表将PID和本地的数据缓冲区进行了绑定,从而实现了主节点对从节点缓冲区的直接操作,或者实现了对从节点上的物理量的直接操作。主从节点上都保存有绑定表,依据此表可知道某个信息的长度、流向和存放在本地的位置,以决定是否接收此信息,或是否响应此信息的召唤和相应方式。
程序中,L_HandleList为结构型数组,包括:(1)帧的数据流向,分为接收和发送两种模式;(2)帧数据在本节点中的存储指针;(3)响应帧的长度,不包括校验场;(4)用于配置的消息ID;(5)PID的存储指针。其中,第(4)项和第(5)项用于为从节点中的某个帧分配PID。每个节点都保存有各自的信息绑定表,最多可保存20组。
调度表NormalTable和信息绑定表L_HandleList都保存在PIC18F2550的EEPROM中,这两个表通过PC机的USB口进行更新。
LIN驱动程序主要实现以下七个重要的API函数。
(1) void l_ifc_init_MyLinIfc(void),对本节点的LIN总线驱动程序进行初始化。
(2) unsigned int l_ifc_read_status_MyLinIfc,返回LIN驱动器的状态。
(3) void l_ifc_wake_up_MyLinIfc(void),请求LIN总线唤醒。
(4) void l_ifc_goto_sleep_req_MyLinIfc,强制命令LIN总线上的从节点进入睡眠状态。
(5) unsigned char ld_AssignFrameID(l_u8 *l_NAD),给指定的帧分配PID。
(6) void l_ifc_rx_MyLinIfc(void),根据本节点的配置处理整个数据交换,包括数据收发、传输超时处理和校验等。如果节点为主节点,则依据主/从任务状态机实现主/从任务的功能;如果节点为从节点,则只需依据从任务状态机实现从任务的功能。
(7) unsigned char l_ifc_pid_to_handle(void),根据给定的PID,指定该PID的帧对应的处理句柄,从而在信息绑定表中查找该帧的处理方法。
4.2 USB总线的软件实现
PIC18F2550的USB接口可采用通用模式或者CDC模式[4]与PC机进行数据交换。虽然通用模式拥有全速USB速率,但是PC机端的驱动程序实现起来较为复杂。USB-LIN接口中处理的是低速的LIN通信,不需要1Mb/s以上的通信速率。因此,单片机中的USB接口不采用通用模式,而采用CDC模式。
在CDC模式下,CDC子类实现虚拟串口通信的协议[4]。由于大部分的操作系统都带有支持CDC类的设备驱动程序,可自动识别CDC类的设备,因此在PC机端可不用编写USB的驱动程序,只需将接口视为虚拟串口即可。单片机的USB口工作于CDC模式时,最高的通信速率为1Mb/s,完全可以满足LIN总线数据交换的要求。
Microchip为PIC18F2550提供了完整的USB/CDC类固件,主要实现以下API函数[5]。
(1) void putrsUSBUSART(const rom char *data),将字符串从程序存储区写到USB端口。
(2) void putsUSBUSART(char *data),将字符串从数据存储区写到USB端口。
(3) void mUSBUSARTTxRom(rom byte *pData, byte len),将一个特定长度的字符串从程序存储区中写到USB端口。
(4) void mUSBUSARTTxRam(byte *pData, byte len),将一个特定长度的字符串从数据存储区中写到USB端口。
(5) BOOL mUSBUSARTIsTxTrfReady(void),检查CDC类是否有更多的数据要发送。
(6) byte getsUSBUSART(char *buffer, byte len),将数据从USB/CDC缓冲区中拷贝到用户缓冲区。
(7) byte mCDCGetRxLength(void),获得从USB/CDC缓冲区中拷贝到用户缓冲区的数据的实际长度。此函数紧跟在getsUSBUSART之后调用。
在调用putrsUSBUSART、putsUSBUSART、mUSBUSAR-TTxRam和mUSBUSARTTxRom之前,先要调用mUSBUSA
RTIsTxTrfReady检查固件是否准备好发送数据到USB口,调用getsUSBUSART时要求目标缓冲区的长度要大于USB/CDC缓冲区的长度。
本文给出了LIN接口与USB接口转换的设计方案,介绍了基于LIN总线和USB总线的接口芯片的通信转换的硬件设计,并给出了软件设计方法。该方案已经用于BCM模块的测试和LIN 网络协议的教学培训中,具有一定的实用价值。
参考文献
[1] PIC18F2455/2550/4455/4550 Data sheet,http://www.microchip.com,2007.
[2] ATA6623/ATA6625 Data sheet.http://www.atmel.com/,2008.
[3] LIN specification package reversion 2.0. http://www.linsubbus.org/,2003.
[4] 吴明琪,马潮.嵌入式系统的USB虚拟串口设计.单片机与嵌入式系统应用,2005,(4).
[5] Migrating Applications to USB from RS-232 UART with minimal impact on PC software.http://www.microchip.com, 2004.