《电子技术应用》
您所在的位置:首页 > 测试测量 > 设计应用 > 基于LabVIEW的SFP光模块测试平台的设计与实现
基于LabVIEW的SFP光模块测试平台的设计与实现
来源:电子技术应用2011年第4期
曾 剑, 周剑扬, 刘舜奎
厦门大学 电子工程系, 福建 厦门 361005
摘要: 介绍了一种利用LabVIEW构建SFP(Small Form-factor Pluggable)光模块测试平台的方法。测试平台通过读写计算机并口来映射地址上的数据,控制并口端口的逻辑电平实现计算机并口模拟I2C总线。计算机利用模拟的I2C总线与SFP光模块实现通信。分析了生产者/消费者结构队列状态机并用于设计中,该设计模式可以及时响应前面板动作或外部事件,并且使得状态机的状态变换更加灵活多变。
中图分类号: TN929.11
文献标识码: A
文章编号: 0258-7998(2011)04-0067-03
Design and implementation of testing platform of small form-factor pluggable transceiver based on LabVIEW
Zeng Jian, Zhou Jianyang, Liu Shunkui
Department of Electronic Engineering, Xiamen University, Xiamen 361005, China
Abstract: This paper introduces a method of constructing a SFP(small form-factor pluggable) transceiver testing platform by using LabVIEW. The testing platform controls the logic level of parallel port to simulate I2C Bus by reading and writing the data of address which map to the parallel port. The computer can attach to the SFP transceiver by means of the I2C Bus. This paper also analyzes and applies queued state machine-producer consumer architecture, this kind of design style can respond to the action of front panel or external happening without delay. What’s more, it can make transformation of state more flexible and changeable.
Key words : SFP transceiver; queued state machine-producer consumer architecture; parallel port simulate I2C bus


     随着近几年光通信的迅速发展,光通信接入网对实现光电、电光转换的光收发模块的要求越来越高,光收发模块的测试也越来越复杂。早期一般使用Visual Basic、Visual C++开发测试软件,存在开发周期长、测试效率低等问题,本文提出了使用LabVIEW虚拟仪器技术来完成测试工作的方法,解决了测试成本高、测试效率低、测试系统松散等问题,同时它还具备远程测试以及仪器定制或自制等特点。虚拟仪器技术已经深远地影响着测试测量领域,是企业和科研单位的测试工作的重要解决方案之一。本文正是利用此项技术解决了SFP光模块测试平台开发的几个关键问题。
1 SFP光模块测试软件的设计
1.1软件结构

  软件由四个界面构成,实时监控界面、阈值设置界面、校准界面和光模块信息设置界面。实时监控界面是软件的主界面,它显示数字诊断功能[1]中的五个模拟量与其Alarm和Warning标志;阈值设置界面的功能是设定Alarm与Warning阈值,当实时监控值不在阈值内时会出现工作异常警示;校准界面主要是解决数据漂移,从而保证测得数据准确;模块信息设置界面是完成光模块在出厂前信息设置。软件运行的过程中用到的数据库是由Access数据库构成。如图1所示为软件结构图。

1.2计算机并口模拟I2C总线
    I2C总线由四种信号组成:开始信号、停止信号、响应信号和数据发送。在计算机并口产生这些信号就要对数据地址、状态地址和控制地址进行程序设计和控制。在LPT1端口中,它们对应的地址分别为0x378、0x379和0x37A。计算机并口中的8个数据端口分别对应0x378中的B7~B0;5个状态端口分别对应0x379中的B7~B3;4个控制端口分别对应0x37A中的B3~B0。如果在以上地址的某一位上写1,计算机并口的对应端口就会产生逻辑电平高。I2C总线的SDA和SCL分别需要并口的两个端口模拟,这是因为计算机并口的特性,对地址中的数据的操作要么一直读操作要么一直写操作。
    对LPT1端口地址操作要使用LabVIEW函数库中的Out Port函数和In Port函数。Out Port函数和In Port函数是在指定的16位I/O端口地址读取和写入带符号的整数。读操作要先利用In Port函数读取LPT1端口地址上的整数数据,再转化为无符号数据并求出特定位的布尔量,最后得到该位对应端口的逻辑电平。写操作就是先利用In Port函数读取LPT1端口地址上的整数数据,再转化为无符号数据并修改其中某一位的值,最后利用Out Port函数把修改后的数据转化为整数数据并写入LPT1端口地址,从而改变对应端口的逻辑电平。
    I2C总线的四种信号通过SDA和SCL的组合形式如下:(1)开始信号:在SCL高电平期间,SDA由高变为低,将产生一个开始信号;(2)停止信号:在SCL高电平期间,SDA由低变高,将产生一个停止信号;(3)应答信号:传输一个字节后的第9个时钟,若从设备把SDA拉低,表明有应答信号,反之则无;(4)数据传输:数据传输过程中,数据的改变都必须在SCL低电平期间,在SCL为高电平期间必须保持SDA信号的稳定[2]。
    按照时序要求依次可以编写出I2C start、I2C send、I2C ack和I2C stop四种I2C总线信号的vi,其中I2C send这个vi既能发送地址又能发送数据。最后由这些vi组成如图2所示的完整I2C总线数据传输。

1.3 生产者/消费者结构队列状态机
    设计模式是在解决问题的过程中,由一些良好思路的经验集成的。在LabVIEW中,它包括结构、函数、控件和错误处理的布局,它形成了一个通用的结构来完成一些常见的任务。设计模式可实现模块重用,并提高软件生产效率和质量[3]。
    生产者/消费者结构是一种常用的设计模式,它主要用于数据采集系统。一般的数据采集系统包括数据采集、数据分析和结果显示三个步骤。如果将这三个步骤按照常规的顺序执行,则数据分析导致的时间延迟会增大数据采集的周期。采用生产者/消费者结构的数据采集系统,它通过并行的方式实现多个循环,可以很好地解决这一问题。一个循环不断地采集数据(生产者),另一个循环不断地处理数据(消费者),这两个循环互相通信,但又不产生干涉。
    队列状态机也是一种常用的设计模式,它对经典状态机做了很大的改进。在经典状态机中,移位寄存器的状态转移方式受限于每个循环间隔内一个指定新状态或应用程序的状态。而队列状态机则通过LabVIEW的队列结构缓存一个队列的多状态,使得应用程序的任何状态都可以通过调用Enqueue Element函数在该队列的后端增加任意数量的新状态,这类似于先进先出缓冲器。
  生产者/消费者结构队列状态机最早是由Anthony Lukindo提出和改进,它结合以上两种设计模式优点,其结构示意图如图3所示。

    从图中可以看出,该设计模式由四部分组成:队列引用、事件循环、主循环和并行子vi。事件循环和并行子vi为生产者,主循环是消费者,生产者和消费者之间的消息与数据的传递是通过队列引用来实现的。事件循环由Event结构和While循环组成。主循环由Case结构和While循环组成,其中Case结构有两个,分别是主Case结构和错误Case结构。队列引用是由LabVIEW中的队列操作中的函数组成,其中最常用的函数为Obtain Queue、Enqueue Element、Dequeue Element和Release Queue等。图中的虚线是指并行子vi可以不通过队列引用而和主循环进行连接。
    生产者/消费者结构队列状态机的实现如下:Obtain Queue函数和Enqueue Element函数在While循环左侧初始化队列。枚举类型定义控件端子连接到Obtain Queue函数的数据类型端子,这样就可以指定队列的数据类型。枚举常量由枚举类型创建,并连线到Enqueue Element函数的端子。Initialize状态是添加到队列中的第一项,它是状态机执行的第一个状态。Dequeue Element函数位于主Case结构之外的错误Case结构的NO Error事例中。如果在错误簇中没有出现错误,则下一状态就会从队列移出,并传送到主Case结构的选择器端子;如果发生错误,则有General Error Handle VI来报告错误,并且执行Shutdown状态。Case结构的每个事例中,事件循环和并行子vi都可以使用Enqueue Element函数来增加其他的状态。此外,为了能够立即执行,可以使用Enqueue Element At Opposite End函数在队列的前端增加一个状态。这使得应用程序能够及时响应高优先级的操作或事件。当用户要退出应用程序时,必须利用Release Queue函数释放队列引用,同时释放队列所占用的内存空间。
    当队列中需要传递状态和数据时,队列元素数据类型就需要由一个簇组成,这个簇包括一个与变体打包到一起的枚举类型定义。通常,该枚举类型包含了事例选择器中需要的状态。变体用来将数据从时间循环或并行子vi传递给主循环,这些数据的传递体现了生产者/消费者结构。同时,这个变体可以是多种类型的数据,但是必须为其中每个成员指定一种数据类型。
  SFP光模块测试程序首先初始化队列引用和主界面中的控件,然后进入检测光模块。如果检测到光模块的插入,则主程序会读取数字诊断功能中电压、温度和偏置电流等。在大部分时间里,主程序都是在轮询地读取这些数据。如果用户在前面板有操作,此时事件循环将利用Flush Queue函数把队列清空,然后加载下几个状态,及时地响应用户的操作并且最后回到读取数字诊断功能中模拟量。
2 测试与验证
2.1测试环境

  测试平台的硬件包括计算机、测试板、并口线、电源以及待测光模块。首先在计算机中安装本文开发的测试软件,其次利用并口线把计算机和测试板连接起来,再次把待测光模块插入到测试版中,并加载电源,最后打开测试软件进行测试。
  连接到I2C总线的器件输出端要是漏极开路或集电极开路才能执行传输的功能。因为计算机并口不满足这两种结构,所以本设计中在并口外接2N3906使得SDA和SCL满足集电极开路结构。
2.2 I2C总线验证
  为了保证光模块测试平台稳定地工作,必须测试I2C总线通信的稳定性。利用 I2C总线对EEPROM进行连续读或者连续写。在图4中,C1和C2信号是对Z1和Z2信号框内部分的放大,这部分是主设备向从设备写数据。
    主设备首先发送器件地址0xA0,在第9个时钟,从设备给出了一个拉低SDA的应答信号。主设备然后发送寄存器地址0x00,同样得到了应答信号。最后发送要写入的数据0x55。图中的两个时间标尺测量出写入数据操作距离下一次操作的时间,这个时间要大于等于5 ms。重复此读写过程10 000次,没有错误则证明I2C总线非常稳定。
2.3 光模块测试软件的验证
    如图5所示,是对一个Maxim DS1856方案的光收发模块的检测结果。

    其中5个模拟量的监控值直接反映光模块的工作状态。表1是DS1856方案实测值与软件监控值对比。
    在SFF-8472协议中规定了每个模拟量的精度范围:温度误差在±3℃之内;电压误差不超过厂家标称值的3%;偏置电流误差不超过厂家标称值的10%;发射功率误差在±3 dBm之内;接收功率在±3 dBm之内。通过表1结果显示,此测试软件满足SFF-8472协议规定的误差范围。

    本文使用LabVIEW设计实现了针对SFP光收发模块的测试平台。重点介绍了测试软件与SFP光模块的I2C总线通信的实现,论述了生产者/消费者结构队列状态机设计模式,提供了对该设计模式的具体实现方法,并把它应用在SFP光模块测试软件。该测试平台已经应用到企业的实际生产过程中,减少了对SFP光模块测试工作量,提高了测试效率,并且保证了所需的测试精度,具有一定的工程应用价值。
参考文献
[1] SFF-8472 specification for diagnostic monitoring interface  for Optical Transceivers Rev 10.4[S]. 2009-01.
[2] The I2C-Bus specification version 2.1[S]. 2000-01.
[3] Blume, Peter A. The LabVIEW style book[M]. Prentice Hall, 2007-03.
[4] 程社成.带数字诊断功能的小封装光模块研究[D].武汉:武汉理工大学,2006.

此内容为AET网站原创,未经授权禁止转载。