一种利用数字IO并口模拟SPI通信的通用方法

2022-09-15 07:21黄晓俊陈忠睿马识途丁义超郭战魁
中国电子科学研究院学报 2022年7期
关键词:配置文件电平时序

黄晓俊, 肖 晖, 陈忠睿, 马识途, 丁义超, 郭战魁

(中国电子科技集团公司第二十九研究所, 四川 成都 610036)

0 引 言

微波组件作为电子作战系统的基础组成模块,其生产测试与常规武器装备的生产有着全然不同的特点。由于整机需求差异、组件接口不一、管脚定义不同以及采用不同芯片(锁相环、AD、DA、CPLD等)等,因此,测试生产需要用到不同的控制方式进行测控,包括并行控制、串行控制以及二者的交叉控制。其中,串行控制既有标准的通信协议,如RS232/USBCAN等,亦不乏非标准的基于TTL电平的自定义SPI类协议。实现非标准控制协议通常的做法是开发基于CPLD或者FPGA的专用控制单板[1-2],更为进步的做法是开发集成多种接口的复合控制板[3-4],但这种方法必须配合专用测试电缆夹具,使用复杂、成本高,也不利于生产资源管理。重复的软硬件开发过程使开发周期较长,基于并口的时序模拟为避免硬件重复开发提供了解决途径[5]。本文介绍一种基于数字IO并口和C#开发的,可用ini文件进行配置的通用、串并交叉的微波组件控制动态链接库(DLL),用于解决上述问题。本文通过从大量实际生产中使用的时序逻辑中分解出固定的逻辑结构和个性化参数,分别用C#和ini文件描述。其中ini文件包含的个性化参数有时钟信息、数据格式、使能信息和通信管脚号等。通过这个动态库,开发者可以简单通过ini文件的配置,快速实现类对SPI串行时序的模拟。该方法具有以下两个优点:一是IO卡本身是测试系统中并行控制必不可少的,模拟时序的技术方法可以省略硬件的重复开发或者订购,缩短了测试环境搭建时间,节省成本,降低复杂度提升可靠性;二是测试用例开发过程转化成纯软件,既方便,又易于集成,利于测试系统的维护更新,有利于缩短测试开发时间,提高程序复用率,节约成本。

1 原 理

1.1 数字IO卡模拟串行通信的原理

时序数字信号可以在时域描述成一串0和1组成的数据流。数据从高位到低位以一定速率和占空比从IO口输出时,即可模拟一组特定的串行时序信号。这里涉及有两个关键因素:速率和占空比。

(1)速率

速率是信号发送的速度,可以用比特率Rb或者波特率RB描述。这个指标很关键,在异步传输时,它直接决定了信号是否能被正确接收。比特率和波特率的关系为

Rb=RB×M

式中:M为调制元数,即单个数据包中包含的0和1的个数。

(2)占空比

单周期信号脉宽t与周期T的比称为占空比,如图1所示。正逻辑的系统中通常占空比越低,信号传输的功耗越小。

图1 占空比示意图

通过对速率和占空比的计算获取被模拟时序信号的脉宽与周期,即可对整个协议进行模拟。

典型通信时序通常不止一根数据线,概括其特征,其变量还有:

1)时钟极性:表征时钟信号闲置时的状态。闲置时的状态是低电平时为正极性时钟,闲置状态为高电平时为负极性时钟。

2)采样时刻有效沿:上升沿采样读数的时序为上升沿有效,反之则下降沿有效。

3)数据发送起始时刻:时钟的一个有效沿称为一个时刻,起始时刻等于n即表示数据从时钟的第n个周期开始发送。

4)数据长度:指单次发送数据包含的比特数。

5)正负逻辑:高电平表示1,低电平表示0称为正逻辑系统,反之为负逻辑系统。

6)时钟长度:指单次发数所需的时钟周期数。

7)使能有效电平状态:低有效代表当使能处于低电平时,发送的数据才能被接收,高有效则反之。使能无效时从设备将抛弃接收到的数据。

程序设计时,考虑的变量越多,能模拟的时序越多,程序逻辑处理则越复杂。反之能模拟的时序越少,程序逻辑处理则越简单。因此在实际模拟时考虑到实用性与编程复杂度的平衡,可以将部分参数简化掉,在程序文件中写成默认值。如,当前待模拟控制协议对占空比不敏感时,考虑将占空比设置为50%,代码复杂度将会有效降低。

1.2 边界条件

(1)逻辑电平

时序模拟是利用数字IO在时间的维度,用并行的数据动态模拟串行数据,使串行数据可以通过并行接口进行发送。理论上,只要数字IO卡输出的电平与被控单元的电平是相互兼容的,利用数字IO卡是可以模拟所有串行协议的[6]。实际生产中的产品多数的控制电平是采用5VTTL和3.3VTTL电平,因此,本文讨论的边界局限于5VTTL及以下TTL电平。

(2)通信速率

利用数字IO卡模拟时序时信号的相位噪声较大。传输速率较高时,信号失真将不可忽略。如图2,上升沿和下降沿的重影就是时钟的抖动,宽度为Δt。Δt>1/2t时,输出时序严重变形。导致这种信号变形的原因是计算机执行每条语句的计算时长不同。因此,采用IO卡模拟时序时,其频率不能太高。通常是在100 kHz以下。

图2 相位噪声在时域的表现

幸运的是, SPI类是同步时序,对传输速率不敏感。其次,毫秒级的传输时间和组件的指标测试时间相比较可以完全忽略不计。

(3)驱动能力

驱动能力受限于所采用的数字IO卡的驱动能力。比如NI公司的PXI-6509数字IO卡的每个引脚的驱动能力能上到24 mA。当驱动能力不够,控制电平传到从设备端子上时,其波形将严重衰减并变形,使信号发送失败。因此,在模拟之前需要确定IO卡驱动能力与负载是否匹配。

(4)同步时序

由于异步时序对单次发送的时序波特内部时钟要求较为严格,而频率较高时模拟的时序脉宽无法保证其时钟精确。同步时序时时钟是主设备提供给从设备的,对脉宽和周期不敏感,仅对上升下降沿敏感。因此,本模拟时序的方法限定于同步时序的模拟。

(5)运用场景

本文是基于微波组件的,所总结的时序类型是微波组件常用的,因此,本文介绍的方法只用于微波组件的测试控制,其他工程控制方法可借鉴。此外,时序对各引脚相位有要求,若主从设备之间连线过长,可能导致通信失败。同时线缆过长也会造成信号的有效电平衰减,从而降低IO卡的驱动能力。因此,本方法仅适用于短距离通信,建议通信距离不超过2.5 m。

2 设计

2.1 微波组件通用控制动态库功能设计

2.1.1功能需求分析

本设计立足于微波组件通用控制工具。因此必须能方便嵌入当前主流测试系统,尽可能兼容多的微波组件产品,以达到“通用”的目的。具体应满足以下五个功能需求。

1)便于被集成,降低测试系统使用和维护门槛。

2)可以自由选择和定义通信引脚。当前微波组件低频接口种类繁多,管脚定义更是繁杂不一。

3)时序的各种必须参数可通过简单标记语言,比如ini或者XML文件进行配置。通过配置文件的方式提升动态库的通用性。

4)发串行控制数据时不改变原来的并行控制状态。不少微波组件的控制是串并交叉的,实现串行控制的前提是不改变并行控制的结果,因此,需要妥善处理并行控制码与串行控制码之间的关系。

5)具备打开和关闭功能,需要用时能打开,不用时能关闭,释放资源。防止使用后资源被占用,妨碍其他进程对资源的访问。

2.1.2动态库的方法与功能设计

通常情况下,一个微波组件自动测试系统包含主程序、仪器、总线和组件4要素。若要提高自动测试系统的通用性,增加组件控制动态库是可行、有效的方法。通用的测试逻辑结构如图3的模式。

图3 测试要素和控制方法所在位置

控制方法外联情况主要是“两收一发一反馈”。“两收”指被动接收主程序传递的控制参数(名称或者编号)和主动读取对应配置文件中配置信息。“一发”指动态库按照配置信息正确发送控制码给被控组件。“一反馈”指动态库需要将控制码发送状态反馈该主程序,以便主程序能够采取相应的措施。

逻辑结构体现了控制方法必须具备的功能,而微波组件的测试过程则决定了动态库需要具备哪些可以调用的方法。测试过程流程图如图4所示。其中虚线框部分是与该动态库有关的活动。

图4 动态库在测试系统中的作用域

从以上分析,不难总结出动态库需要至少四个基本方法,分别是初始化、打开控制、发送控制码和关闭控制。此外,为了应对可能的读数据需求,动态库的读方法应当占据一个位置。据此,动态库的功能构成可以设计成如图5所示。此外动态库还需与测试系统预留接口协调统一。

图5 动态库功能构成

2.2 数字IO卡的选择

本文采用的数字IO卡是一款具有48个数据位的控制卡。此卡可写可读,是半双工卡。该卡将48个输出IO线分为6个8 bit组,每个8 bit组均可以独立控制,单独用于输出或者输入一个字节。市面上各种IO卡功能相近,只要电平兼容,驱动能力足够,不影响使用本设计采用的方法实现时序模拟。

2.3 控制码编码规则设计

用户需按照既定的规则配置控制码,以便此动态库能够正确解读控制码,并正确发送。为兼容串并交叉的控制需求,主程序在传递控制码时,必须传递至少3个参数,即并行控制码,产品标识码,串行控制码。三个控制码的编码规则设计如图6。

图6 控制码的编码规则

如图6,完整的控制格式是:并行控制码;产品编号;串行控制码。第一部分并行控制码最多可包含65个Byte型参数的数组。其中数组第一个控制码特指为并行控制码循环写入脉冲控制位的位号。如果第一位是0,则代表该并行控制码无需写入控制位。从第二个控制码开始为串口控制参数。每6个代表一次发数,每次发数后需要一个写入脉冲。第二部分是产品标识,包含一个与产品编号一致的字符串,用于动态库在指定路径下寻找指定产品的ini配置文件。ini配置文件命名与标识保持一致。第三部分串行控制码包含128个长整型控制参数的数组。许多芯片拥有多个寄存器,只有每个寄存器都正确写入相应的控制码才能正确控制它。典型的HMC702LP6CE(以下简称HMC702)就拥有32个寄存器,需要使用同样的时序发送32个控制数据才能正常工作。同样的,微波组件也具有同样的特征。因此,此处暂时设定控制码个数最大为128。根据经验,这已经可以满足到多数微波组件使用。

2.4 ini配置文件格式设计

由于微波组件的自定义通信协议一般都是三线或者2线协议。因此,可以设置三个Section,分别是时钟Section-[CLK]、数据Section-[DATA]和使能Section-[SEN]。考虑到市面上的芯片部分包含了锁存信号位,以及将来动态库扩展功能的可能性,增设一个锁存Section-[LOCK]。4个Section由于其作用不一样,需要单独分别设计其key。

[CLK]:由于微波组件对占空比和时钟频率这两个参数不敏感,因此占空比设置成固定值50%,时钟频率这里也设置成固定值,不在配置文件中体现。此外,时钟还包含4个不可忽略的参数:时钟极性、管腿位号、有效沿和时钟数。

[DATA]:数据位包含管腿号和数据长度,以及发送数据的起始位置。

[SEN]:包含管腿号、有效电平状态和有效长度。默认从待数状态第一次改变状态开始为有效状态。

[LOCK]:锁存信号一般是一个脉冲,因此只需要获取其管脚号和脉冲极性两个参数即可。

根据以上分析制作的ini文件模板,如图7所示。

图7 时序ini配置文件格式

3 C#编程实现

3.1 库的类与方法

本设计采用C#实现,C#具有应用广泛、通用等优点[7]。控制动态库一共包含三个类,如图8所示。其中IOClass是IO卡的驱动类。采用不同的IO卡,应该采用相应的驱动类。IniFileClass是INI文件操作类。SerialDataSend是本设计的核心方法类。

图8 动态库的类

从动态库的功能设计已经知道,SerialDataSend类至少需要包含初始化,打开,关闭和发送(写)四个功能方法。其中初始化、打开和关闭功能使用IO卡驱动自带的方法即可。此外,为了应对今后可能的读操作,我们增加一个读数据方法。“写数据”方法命名为Write,包含解析和单次时序发送功能。以上描述的5个方法均未考虑完整控制码发送的方法,需再增加一个SendControl方法。图9是这个方法的流程图。图10为核心方法。

图9 SendControl方法流程图

图10 动态库的核心方法

需要特别说明的是,发送控制码方法包含的三个参数并行数据ParallelData、产品名称CPBH已及串行数据SerialData均是由主程序调用SendControl方法时传递的。主程序传递的控制码必须符合动态库控制码的格式。

3.2 时钟频率的实现

时钟频率由延时函数loopDelay决定。每次发送一个状态,由loopDelay保持一个delayTime的时间。一个时钟周期等于2个delayTime。周期为了适应大多数组件,发送信号的频率不宜过高,设置成0.5 kHz,既可靠,又不影响测试速度。因此delayTime=1时是比较可靠的发数频率。具体代码如图11所示。

图11 延时函数

3.3 读取和解析配置文件

动态库根据主程序传送的配置文件名称,如图12所示,从预定义好的路径下读取配置参数。

图12 配置文件读取

随后解析配置文件生成控制参数,控制参数转换成整型,方便后续模拟时使用,如图13所示。

图13 解析参数

3.4 IO卡完整发数过程实现

发数过程首先发送并口数据,随后在发送串码时保持现有并口控制状态不变。这个方法的关键在于发送数据前必须清除所使用管腿的状态,同时又不能清除其他管脚的状态。若所使用的管腿状态未清除,后续发数时进行累加后可能会造成溢出,彻底改变该组8 bit端口的数据。具体方法是用0xFF减去所使用管腿号的“1”状态值,然后用剩下的数字和原有状态做与运算。这样即保证了所使用管腿不会溢出,又保证了其他管腿状态不变。IO口单节拍实现方法如图14所示。

图14 IO口单节拍输出核心代码

单次串行控制码数据包发送包含多个单节拍。这是模拟时序的关键部分。放在Write()方法中。核心代码如图15所示。

图15 时序模拟关键核心代码

4 测试结果与分析

4.1 实测验证

为了验证本设计的动态库是否达到了预订的设计目标。本节以锁相环HMC702的控制为例,实际采用本动态库开发其控制方法。并利用示波器测试实际模拟出的时序图,将实际时序图与产品手册上的时序图、实际控制数据做比较,并以此得出结论。

图16 HMC702通信时序

假设编号为0001的某组件采用了HMC702这款芯片设计锁相环PLL,需要输出低频段6 GHz~7 GHz,高频段7 GHz~8 GHZ频率信号。且在控制这款芯片的同时,需要1个比特的并行开关控制以使该组件能够分上下两个频段通过不同的信号通路工作。假设为6号引脚,低电平时输出高频段,高电平时输出低频段。HMC702控制所需的CLK、SEN和SDI控制位分别是8、9和10号引脚。锁相环的参考频率为100 MHz,鉴相频率是12.5 MHz。

根据HMC702控制时序和组件控制引脚需求,设计以0001.ini命名的配置文件如下:

[CLK]

Pin=8

Initstatus=0

Effectedge=1

Count=32

[DATA]

Pin=9

Datalength=31

Begin=0

[SEN]

Pin=10

ValidState =0

ENLength =32

[LOCK]

Pin=0

Initstatus=0

假设要控制输出6 GHz点频信号。根据HMC702的产品手册可以得到32个寄存器的控制码。加上1个比特的高低频段控制位,完整的控制码如下:

0x00,0x00,0x04;0001;5772548,16842587,33554435,3151880,67108864,83886087,100663296,117441518,134217728,150994944,167772932,11534384,201326848,218103840,234881024,251658480,268435456,289020243,302190472,318767104,335544320,352489308,369100752,385875969,402653344,419430415,436212224,452984960,469762097,486539264,503316480,520093711

发送以上控制码,用示波器探头探测8号引脚输出的时域图谱。结果如图17所示。

图17 HMC702时序的32个寄存器数据包络

图17每条竖着的黄色带即是每个寄存器数据包发送时的时钟包络。可见,通过本动态库发送的数据包一共是32个,与控制码中串行控制码的个数相符合。将示波器横轴展开到单个数据包的时间长度,利用示波器同时探测8引脚和10号引脚即可得到单个数据包时时钟和使能信号的对应关系,见图18。不难看出,实际测试结果包含32个时钟信号,且32个时钟信号均在使能有效时(高电平)输出,与HMC702控制时序一致。

图18 单个寄存器时钟CLK和使能SEN信号

保持示波器横轴时间宽度,利用示波器同时探测8号引脚CLK信号和9号引脚SDI信号,调用SendControl发送控制码后可以捕获到时钟与数据的时域关系图,见图19。

图19 单个寄存器时钟CLK与数据DATA信号

图19是第一个数据包的图谱,由于上升沿有效,根据数据高低变化,在每个上升沿处分别标记0和1后,可以得到发送的第一个数据包的二进制数为“00000000101100000010101000001000”。去掉最后一位无效数据后,一共是31位,换算成十进制是5772548,与控制码中第一个串行控制码相符。

发数同时,监测6号引脚电平变化,结论是在发送控制码发送过程中,其一直保持高电平,符合预期。

从以上测试结果看,利用本动态库实现的时序模拟满足预期,成功地模拟了控制时序。

5 结 语

本动态库在微波组件测试用例的开发中成功应用,效果显著。利用通用控制时序模拟,缩短了测试用例的开发周期,把测试用例开发时序模拟这一部分工作成功转换成了ini文件的简单配置工作,减少了微波组件测控硬件,降低微波组件对各种控制单板的需求。到目前为止,基于本动态库的测试用例已经在含有非标准通信协议的微波组件中大范围的铺开应用。其中,最典型的一个例子是某课题某型号变频组件。多年来,由于该组件功能复杂,指标多,采购了专用测试系统,系统无法扩展。由于近年该型号产品的订单量大增,原有测试系统已经不能满足交付周期的要求。因此急需要重新开发测试系统,并单独开发此产品的控制模块。利用本设计的动态库对该控制模块进行开发,在1天以内就成功实现了该微波件的控制,相较于单独开发控制单板的方法效率提升5倍以上。极大地节约了开发测试用例的时间,节约了成本。

本动态库可以配置管脚号,大大降低了组件适配的复杂度。夹具、电缆、低频接口适配器的通用性也得到提升。其他通用测试系统可借鉴采用。

猜你喜欢
配置文件电平时序
基于Docker的实时数据处理系统配置文件管理软件的设计与实现
顾及多种弛豫模型的GNSS坐标时序分析软件GTSA
清明
二电平和三电平网侧变流器控制及谐波比较*
从Windows 10中删除所有网络配置文件
三电平PWM整流器下的地铁牵引供电系统探讨
你不能把整个春天都搬到冬天来
用软件处理Windows沙盒配置文件
互不干涉混用Chromium Edge
基于FPGA 的时序信号光纤传输系统