APP下载

基于CompactPCI总线和DSP技术的数据采集板的设计

2011-10-26王凯海军装备部710043

中国科技信息 2011年9期
关键词:控制板驱动程序中断

王凯 海军装备部 710043

基于CompactPCI总线和DSP技术的数据采集板的设计

王凯 海军装备部 710043

本文是工程实践中,利用TI高性能DSP器件TMS320LF2407实现对控制系统中转塔角度的采集、转速采集,是伺服系统控制中的重要环节,并基于Compact总PCI线迁入控制计算机中,与主机完成实时通讯功能。

Compact;PCIDSP;数据采集;CPLD

绪言

并行总线技术的发展,使CompactPCI的优势很快在电信行业独树一帜,其优良的结构规范以及电器特性也正为工业控制、航空、航天领域逐步接受。信息化的发展使人们认识到其基础是数字化,而数字化的核心技术之一是数字信号处理。数字信号处理的任务在很大程度上需要由DSP器件来完成。同时,DSP在各个领域日益增长的应用带动了DSP自身的发展, DSP在其他领域的潜力也是巨大的。

1 背景介绍

数据采集板作为某型号计算机中一块嵌入式控制板,与伺服控制板、通讯控制板以及CPU板构建成一套高性能整机,处于控制系统的核心控制地位,完成实时采集陀螺、旋转变压器的数据,采集系统探测信息,通过伺服软件的PID算法,由D/ A变换输出模拟校正量到伺服电子箱,实现伺服系统的闭环控制。

2 硬件设计

数据采集板采用TI公司的高性能DSP器件TMS320LF2407为核心,通过Compact PCI总线受主控计算机的控制,对系统提供的信息,经过数据采集软件处理,输出模拟量给伺服电子箱。高性能D S P器件TMS320LF2407是TI公司2x系列中的高端产品,主频最高为50MHz,并采用低功耗设计,工作电压为3.3V,外围器件工作电压以3.3V为多,大大降低了数据采集板的功耗。在实际设计中,外部程序可烧入片上FlashRAM 器件(256K×32bit),实现了在线编程的特点,大大提高了系统的可操作性和可维护性。角度采集器件选用高分辨率(19bit)高精度(±2lsb)器件,数据存储空间选用高速RAM(256x32bit)挂接在DSP的本地总线上,3.3V信号与5V信号采用74LVCC16245A隔离,大容量可编程器件完成DSP对外部资源控制的译码以及两路同步同步串口数据采集变换。

TMS320LF2407 DSP器件采用双端口RAM 实现与伺服控制板以及与主机通讯,DSP器件分别以5和2、1m s(可选)为采样和处理周期,实时采集转塔的位置信息,以及陀螺、旋转变压器的数据,并把采集结果发送给主机及伺服控制板。硬件看门狗电路实现对模板软件监控,在程序跑飞情况下,实现对DSP以及外部电路的软复位并向主机报错。主机每隔20m s读取双端口RAM中的数据,DSP在完成每次处理5m s(包含2m s或1m s),在双端口RAM 中写入相应的处理结果或工作状态信息,供主机查询,避免了DSP与主机之间的中断处理时间。

图1 数据采集板功能框图

PCI桥选用PLX公司的PCI9052桥芯片,工作模式为Lacal方式,PCI9052是PLX公司继PCI9050之后推出的低成本PCI总线接口芯片,低功耗,PQFP160p in s封装,可以使局部总线快速转换到PCI总线上。其主要特点如下:

符合PCI2.1规范,支持低成本从属适配器

包括一个64Byte的写FIFO和一个32Byte的读FIFO,通过读写FIFOs,可实现高性能的突发式数据传输;

支持两个来自局部总线的中断,可生成一个PCI中断,利用软件写内部寄存器位也可以达到同样的目的;

PCI9052的局部总线与PCI总线的时钟相互独立运行,局部总线的时钟频率范围为0~40MHz,TTL电平,PCI的时钟频率范围为0~33MHz。两种总线的异步运行方便了高低速设备的兼容;

可编程的局部总线配置,支持复用或非复用模式的8、16或32位的局部总线;

4个局部设备片选信号,各设备的基址和地址范围及其映射可由串行EEPROM或主机编程实现;

支持Big/Little Endian 编码字节的转换;

局部总线等待状态,除了用于握手的等待信号LRDYI# 外,PCI9052还有一个内部等待产生器(包括地址到数据周期、数据到数据周期和数据到地址周期的等待);

可编程实现读写信号选通的延迟和写周期的保持;

可编程器件逻辑设计

在CPLD内部逻辑设计上,我们在本文中主要对同步串口的设计进行比较详细的描述,其余为控制译码逻辑设计,在此不再赘述。

3 软件设计

本模板的软件设计包括TMS320LF2407相关软件的编写,Vxworks嵌入式操作系统下的驱动程序和测试软件的编写。

3.1 TMS320LF2407相关软件

TMS320LF2407软件的编写相信大家也比较熟悉,在此主要强调对.cm d文件的编写:

C编译器对C语言程序编译后生成六个可以重新定位的代码和数据块,这些块可以用不同的方式分配至存储器以符合不同系统配置的要求。这六个块可以分为两种类型:已初始化块和未初始化块。已初始化主要包括数据表和可执行代码。C编译器共创建三个已初始化块:.text块(包括可执行代码和字符串)、.cinit块(包含初始化变量和常数表)和.const块(字符串和. swith表)。未初始化块用于保留存储器空间,程序运行时利用这些空间创建和存储变量。C编译器创建三个未初始化块:.bss块(用于保留全局和静态变量空间)和. stack块(为系统堆栈分配存储器)和. system块(为动态存储器函数分配存储空间)。

依据C33的系统资源分配,构建系统的CMD文件代码,在生成COFF(*.out)文件过程中,依据CMD内容把六个代码和数据段定位到RAM区的不同地址段上。

以下是本模板的.cmd 文件:

在程序调试完毕后就可把最终的COFF(.out)可执行文件用文件转换程序HEX30制作成可写入FlashRAM 的16进制BOOT文件,烧写入Flash RAM 中即可。

3.2 VxWorks驱动程序

该模板实际使用时工作在VxWorks操作系统下,因此,必须为它编写VxWorks操作系统下的驱动程序。

VxWorks中对PCI设备的操作,首先应在系统中找到所需的PCI设备,然后从它的配置空间中将所需的资源信息取出来,如内存基地址、I/O 基地址、中断号等,再根据这些信息及设备的特性对其进行初始化。

3.2.1 查找PCI设备

在系统中查找PCI设备所必需的是设备的vendor ID和device ID。有了这两个信息,就可以调用pciFind Device()函数进行查找,pciFind Device()的原型为:这个函数寻找与指定的vendorId和deviceId相同的第index个设备。

该函数若成功执行,则返回OK,此时在pBusNo,pDeviceNo和pFuncNo中存的是找到的PCI设备的总线号、设备号及功能号,这些信息在后面的操作中将会用到。若函数执行不成功,则返回ERROR。

3.2.2 获取PCI设备信息

找到PCI设备后,下一步就是要将它的资源信息从配置空间中读出来。对配置空间的读写操作一般使用下面的这些函数:

还有一些其它的函数可进行对PCI配置空间的操作,具体内容可以参看VxWorks帮助。

获取PCI设备的I/O基地址或内存基地址

可以使用下面的函数来获取PCI设备所分配的内存资源:

其中pActualRes是一个结构体,里面保存与PCI设备相关的信息,定义如下:

pActualRes.pciBus,pActualRes. pciDevice,pActualRes.pciFunc分别是执行pciFindDevice()函数时获得的pBusNo,pDeviceNo, pFuncNo 。PCI_CFG_BASE_ADDRESS_0 是要读取的数据在PCI配置空间中的偏移量,它们在文件pciConfigLib.h中定义,BaseAddress为读出的I/O空间的基地址或内存空间基地址,具体是哪一类空间由读出数据的最低位来判断,若最低位为0,则为内存空间,为1,则是I/O空间。

若读出的是I/O空间基地址,在使用前,需先将它和PCI_IOBASE_MASK 进行与运算,以屏蔽最低两位。PCI_IOBASE_MASK 也在pciConfigLib.h中定义。

得到基地址后,可用下面的函数进行内存或I/O的读写操作:

还有一些其它的相关函数,它们的定义在syslib.h中。

获取PCI设备的IRQ:

对分配有中断的设备,可以用下面的函数来得到系统为它分配的中断资源:

irq中是读出的PCI设备的IRQ。知道了IRQ后,还需要知道中断向量,X86平台的机器上中断向量为IRQ+0X20。得到中断向量后,就可以将中断与中断服务程序连接起来。一般设备将中断与中断服务程序连接时用intConnect()函数,而对于PCI设备则需用pciIntConnect,如:

pciIntConnect (INUM_TO_IVEC(ivec), isr,0)

其中ivec为中断向量,isr为中断服务程序,最后是传给中断服务例程的参数。

3.3 测试程序的编写

驱动程序编写完成后,进行编译,连接后生成驱动程序目标代码,将其拷贝到相应bsp目录下,并在config.h文件中加入对该设备的声明。

创建一个新的工程文件,在builds->macros->Extra MODULES->Value 中添入生成的驱动程序文件,具体路径需根据实际情况改变。

使用时驱动程序时,必须先调用先对驱动程序进行安装,例:

从设备中读取数据时,使用read()函数,其调用格式如下:

向设备中写入数据时,使用w rite()函数,其调用格式如下:

其中fd为打开的设备句柄,inbuf为接收缓冲区,outbut为输出缓冲区,len为输入输出的长度。

[1]苏涛,蔡建隆,何学辉.DSP接口电路设计与编程.西安:西安电子科技大学出版社.2003

[2]http://focus.ti.com/dsp

10.3969/j.issn.1001-8972.2011.09.074

猜你喜欢

控制板驱动程序中断
阻止Windows Update更新驱动程序
轨道交通AFC导向标识控制板设计
基于FPGA的中断控制器设计*
Linux中断线程化分析及中断延时测试
计算机硬件设备驱动程序分析
一种集成脚本控制单元的设计与实现
跟踪导练(二)(5)
一种全隔离的无刷直流电机的反馈制动控制板的研究
千里移防,卫勤保障不中断
一种机载SAR中心控制板的设计