潘锦明
摘 要:基于LPC1788微处理器(MCU)平台设计的带USB通信功能的设备,采用特殊的主机通信及设备端通信连接处理措施和方法,对连接故障进行有效的处理。文章从上层软件/动态库及设备端微处理器对USB连接异常采取了一些方法进行容错来加强连接稳定性。实际项目中解决了在轻轨交通控制领域应用的USB通信接中断等问题;有效克服了现场环境干扰对USB通信的影响,提高了设备通信的稳定性。
关键词:USB通信;LPC1788;稳定性;增强方法
1 USB设备发展背景
目前,USB设备广泛应用于各种终端设备,工业控制领域及自助设备对稳定性要求较高,USB设备由于电磁干扰、设备震动使线缆暂时松脱等原因,使得设备断开连接后,将无法和主机进行通信,尤其在一些现场维护环境不佳的情况下,维护人员未能及时处理故障导致故障时间较长,从而影响设备使用。本文基于LPC1788的微处理器平台,介绍一种方法,从上层软件/动态库及设备端微处理器对USB连接异常采取了一些方法进行容错来加强连接稳定性。
2 LPC1788芯片介绍及应用特点
LPC1788是恩智浦半导体公司推出的基于ARM Cortex-M3的微处理器(MCU),具有3级流水线和哈佛结构,带独立的本地指令总线与数据总线,以及用于外设的性能略低的第3条总线。在最差的商用条件下的操作频率可以高达120 MHz,包括高达512 KB的Flash存储器及96 KB数据存储器。含有多个USB,通用异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART)、以太网MAC,集成电路总线(Inter-Integrated Circuit,IIC)等丰富的外围设备通信接口。用于处理要求高集成度和低功耗的嵌入式应用,广泛应用于通信、医疗、工业、消费电子及汽车等领域[1]。
3 USB连接稳定性增强方法
USB通信在轻轨交通控制的实际应用中,由于现场环境复杂,针对出现的一些故障,需要现场维护人员进行诊断。根据现场存在的问题,对USB连接通信稳定性进行加强,本文重点介绍以下两种容错增强方法,组合起来可提高通信稳定性。
3.1 主机通信增强方法
在PC机端,目前,在主流的USB驱动开发工具实现的通信机制中,当USB通信出现失败的时候不会对总线设备进行重新配置,一旦总线出现断链,通信即使进行重试也不会恢复。因此,现从主机端实行通信的容错及恢复措施。将主机通信不成功或者响应超时的设备重新打开并配置后再重新联通主机上层软件,在和USB设备进行通信时,若发现因为USB设备状态断开导致无法通信,可通过系统应用程序编程接口(Application Programming Interface,API)函数禁用该USB设备,重新根据该设备比例—积分—微分(Proportion-Integral-Differential,PID)及供应商ID号(Vendor ID,VID)进行重新搜索,若设备重新复位连接并成功枚举配置完成,则重新启用设备。若上述操作能够恢复USB连接,则对USB设备恢复之前的通信操作,避免因无法通信导致操作失败及设备停机[2]。工作流程如图1所示。
3.2 设备端通信增强方法
LPC1788微处理器的固件程序使用USB从机设备的协议栈,该协议栈使用标准的USB2.0协议规范,响应从PC端主机的通信,实现数据的输入及输出通信操作。为增强数据传输的可靠性,并USB数据帧采用控制模式进行传输。LPC1788的内部USB架构及USB设备电路原理如图2所示。
若因为现场环境使得USB D+/D-电气信号发生异常,导致USB总线挂起,利用LPC1788的USB总线检测机制及硬件架构,通过固件程序进行硬件总线异常判断并重新连接。基于LPC1788内部的USB goodlink检测技术,在设备处于枚举成功状态后,通过读取USB_UP_LED信号,判断出硬件处于被挂起状态,此时则在LPC1788内部的程序上对USB进行重新连接并初始化USB设备,使得USB总线重新连接到主机,并进行枚举配置,枚举恢复后对通信数据进行恢复。其中,USB_CONNECT为软连接信号,用于控制USB总线D+信号电平状态,控制USB_CONNECT从断开到连接状态,实现USB总线的热复位操作,重新建立USB连接。
3.3 USB程序实现
基于LPC1788的微处理器(MCU)平台及其USB外围电路,将USB线缆连接到设备USB typeB接口上,另一端接在PC机USB接口上,实现主机通信及设备端通信连接。USB 驱动程序采用分层总线结构,主机和设备利用微处理器平台上的USB控制器实现数据交互。
LPC1788固件程序在基于NXP(恩智浦)公司提供的一套完整固件程序框架基础上,用户代码对设备端USB外设初始化、配置控制、通信过程、数据交互及命令执行等流程进行开发,实现和主机通信及执行主机下发的命令并完成相应命令的设备功能操作。固件在后台程序上对USB连接实时状态进行轮询处理,其中,对USB连接配置及检测断链后容错步骤的框架代码程序如下:PC端的USB驱动程序是基于Linux2.6.x内核开发出来的,USB通用USB-skeleton开发程序建立在内核源码树driver/USB/根目录下,便于程序员进行系统开发和应用程序编程。USB驱动注册/注销调用USB_driver结构体指针数据,可以直接集成在内核系统中,并进行USB驱动程序的运行和終止[4]。USB_driver结构体内函数丰富,USB驱动注册代码程序如下:
3.4 实验及结果分析
在实验室验证过程中,通过使用静电干扰方法对USB的通信D-/D+进行空气放电干扰,在8 kV及―4 kV静电的重复干扰下,偶尔会出现USB通信断链情况,且后续继续进行通信也不能恢复。以上两种措施组合后,在同样的静电环境干扰下,USB能够从断链的状态中恢复过来并继续通信,从而验证了措施的有效性。
4 结语
基于LPC1788微处理器强大的硬件功能,通过固件代码对硬件的控制流程进行修改及优化,能够根据具体问题进行有针对性的改善。经过现有项目轻轨站台设备的现场验证对比,采用上述用上层软件/动态库及设备固件两种增强方法组合后的设备,原有的USB通信连接不上的问题得到彻底改善,且不需要人手对线缆进行插拔恢复,有效避免了现场环境干扰对USB通信质量的影响,提高了设备通信的稳定性,减少了设备整机的维护频率。