孙瑞正
(山东科汇电力自动化有限公司 山东 淄博 255087)
国民经济的迅猛发展,对能源尤其是电能的要求也有所提高。因此,电力系统监控产品也朝着精度更高,功能更强,响应更快发展。
当前电力系统监控产品如配网自动化控制器、电能质量监测、故障录波、继电保护等一般都采用DSP+MCU的设计方案,目的是将DSP的高速数字信号处理功能和MCU完善的管理、通讯、丰富的接口等功能相结合,从而使得产品功能更丰富,扩展更灵活。
对于电力系统监控产品来说,模拟量的获取是一个非常重要的环节。以每周波采样32点,6路模拟量计,每秒需要读取的原始数据约为9.6 k字。显然,频繁的读取工作非常繁复,不管是对DSP还是MCU。更何况许多产品需要更高的采样速度和更多的模拟量输入。而DSP与MCU之间的数据交换同样很繁复。
文中提出了一种基于ADSP-218X[1-3]的模拟量数据流接口方法,可以避免因为频繁读取模拟量相关数据而造成的资源浪费。经产品验证,本方法更灵活,更合理。
图1为模拟量接口框图。其中,ADSP-2185M[6]主要负责AD转换器输入数据的收集和实时计算。由Actel公司的FPGA(APA150)实现采样控制和接口逻辑。ADS8509是TI公司的一款SAR型AD转换器,其精度为16位,采样速度最高250KSPS,接口为串行接口。图1也反映了模拟量数据流程。ADS8509在FPGA的控制下完成模拟量采集,其数据经SPORT0口进入ADSP-2185M。DSP在完成计算后,其计算结果经IDMA口读入MCU。
图1 模拟量接口框图Fig.1 ADC data-flow path
SPORT[3-5]口是AD公司独有的一种同步串行口。在ADSP-218x[6]系列、Blackfin等系列产品中都有提供。SPORT口有5根信号线,其定义为:
SCLK:时钟信号
RFS:接收帧同步信号
TFS:发送帧同步信号
DR:串行数据接收
DT:串行数据发送
SPORT口有几个突出的特点,包括:SPORT口是双向的,具有独立的双缓冲发送或接收数据区即Double-buffered功能;Autobuffering即自动缓冲功能;帧长可变,串行数据长度从3到16位可选;时钟信号可变,而且可以外部输入,也可以内部产生等。
Double-buffered即双缓冲功能,实际是指发送和接收均有发送数据寄存器和移位寄存器共两个寄存器,避免了因响应不及时导致的数据丢失;Autobuffering即发送/接收的数据可以基于DMA操作自动读出/写入环形缓冲区,而不需要外部干预。一旦发送缓冲区发完/接收缓冲区收满,即可以引发中断。如果在中断服务程序中将缓冲区设为另一个,则可以两个缓冲区轮流工作,从而为数据处理留出足够的时间。
文中,SPORT0的时钟由ADC提供,数据位长为16位。设置方法如下:
asm(“I2=^RxBuff0_;”); /*I2 contains the address of RxBuffer0*/
asm(“M1=0x0001;”); /*Fill every Location */
asm (“L2=0x0500;”); /*L2 set to receive 1 cycle for each channel*/
asm (“AX0=0x0025;”); /*RX autobuffer enable;use I2 and M1*/
asm (“DM (0x3ff3 )=AX0;”);/*Write the AutoBuffer Control Register*/
/*Setup Sport 0 for External Serial Clock, */
/*Receive Framing Signal for every word, */
/*External Framing Signal, Alternate Framing Mode, */
/*Active Low framing Signal, */
/*Right Justify sign extension, */
/*16-bit word length */
asm(“AX0=0x305f;”);
asm(“DM( 0x3ff6 ) =AX0;”);
asm(“AX0=0x0000;”);
asm(“DM( 0x3ffd ) =AX0;”); /*Timer Not Used */
asm(“DM( 0x3ffc ) =AX0;”);
asm(“DM( 0x3ffb ) =AX0;”);
asm(“DM( 0x3ffe ) =AX0;”); /*No DM wait States */
asm (“IFC =0x0021;”); /*Clear any extraneous SPORT0 Int(Rx/Tx)*/
asm (“ICNTL = 0x0000;”); /* interruptnesting disabled */
asm(“AX0=0x1000;”); /*Enable SPORT0-Rx only*/asm(“DM( 0x3fff) =AX0;”);
asm (“IMASK=0x0021;”); /*Enable SPORT0 Recv-Interrupt */
/*and Timer interrupt */
SPORT0接收中断服务程序不再详叙,其基本内容如下:
/*ping-pongs in the alternate DMA buffer*/
/*check the data error or not*/
/*set the buffer OK flag*/
IDMA[3-4,7]口 , 即 Internal Direct Memory Access 口 ,是 ADSP-218x系列产品的一个16位并行DMA接口。由于电力系统监控产品中的原始模拟数据为12位或16位,IDMA的位宽正好满足要求。
IDMA接口信号如下:
IS: IDMA接口片选信号
IRD:IDMA接口读信号。当IS和IRD同时有效时,开始一个IDMA读周期
IWR:IDMA接口写信号。当IS和IWR同时有效时,开始一个IDMA写周期
IAL:IDMA接口地址锁存信号。当IS和IAL同时有效时,开始一个IDMA地址锁存序列。此时主机应将访问IDMA的起台地址送到IAD0~15上
IACK:IDMA接口允许访问的确认信号
IAD0~15:IDMA接口的 16位地址/数据总线
通常可以用地址线A1接到IAL。此时,实际上对主MCU来说,ADSP-2185M只占用了两个地址即:
#define IDMA_DSPAddr * ((unsigned short *)(DSPIF_ADDRESS+2))
#define IDMA_DSPData * ((unsigned short *)(DSPIF_ADDRESS))
IACK接到主MCU的IO口PA14,通过查询该口,即可确定是否可以访问DSP。
通过IDMA接口,主MCU可以下载DSP程序(Boot Loading through the IDMA Port),读取数据,也可以用来交换控制及状态信息。
为了能使DSP从IDMA自举,需对相关信号加以配置,对于 ADSP-2185M, 可以将 MODE_D:MODE_C:MODE_B:MODE_A设为0101B。
IDMA接口有一个突出的优点,即只需要在开始访问时设定一次地址,随后的读/写操作可以不再重设地址,IDMA会自动将该地址值递加1,直到主机通过IAL和IS锁存新的地址。对于需要实时重复读取数据的应用,如电力系统监控产品,这个功能无疑会大量节省主MCU资源。
下载DSP程序的子程序如下:
//download IDMA-Format DSP Code
unsigned char IDMA_DLCode(unsigned short*SourcePtr)
{
unsigned short count,temp,loop1;
unsigned char flag;
unsigned short DataNo;
DataNo=*SourcePtr++;
while (DataNo!=0xffff){
if((DataNo==0) ||(DataNo>0x2000))return FALSE;
flag=IDMA_WaitAck();
if(flag==TRUE){ //IDMA Control
IDMA_DSPAddr=*SourcePtr++;
}
else return FALSE;
flag=IDMA_WaitAck();
if(flag==TRUE){ //IDMA Ovlay
IDMA_DSPAddr=*SourcePtr++;
}
else return FALSE;
count=0;
do{
flag=IDMA_WaitAck();
if(flag==TRUE ){
IDMA_DSPData=*SourcePtr++;count++;
}
}while ((flag==TRUE) && (count if(flag==FALSE) return FALSE; DataNo=*SourcePtr++; } return TRUE; } 读取数据子程序如下: //Long Read a segment Data,StartAddr should include PM/DM flag unsigned char IDMA_LReadData (unsigned short*DestinPtr,unsigned short StartAddr,unsigned short IDMAOvlay,unsigned short DataNo) { unsigned short count,temp; unsigned char flag; if((DataNo==0) ||(DataNo>0x2000))return FALSE; flag=IDMA_WaitAck(); if(flag==TRUE){ //IDMA Control IDMA_DSPAddr=StartAddr; } else return FALSE; flag=IDMA_WaitAck(); if(flag==TRUE){ //IDMA Ovlay IDMA_DSPAddr=IDMAOvlay;} else return FALSE; count=0; do{ flag=IDMA_WaitAck(); if(flag==TRUE ){ *DestinPtr++=IDMA_DSPData; count++; } }while ((flag==TRUE) && (count if(flag==FALSE) return FALSE; return TRUE; } 相比于ADC直接连接MCU(无论是串行方式还是并行方式)和基于双口RAM的ADC数据接口方案,基于SPORT口的串行ADC数据接口方案有许多优点。比如,其控制逻辑相对简单,串行数据更有利于进行电的隔离,价格更便宜等。在电力系统监控产品中使用SPORT口和IDMA口,可以减少因实时数据读取及计算结果传输造成的MCU和DSP资源浪费,为数字信号处理留出足够的时间,为更复杂的算法采用提供可能性。随着产品模拟量数量的增加以及对实时性要求的提高,该方法的优势更加明显。该方法已在我公司的多种电力系统监控产品中使用,并已有数千套产品应用于工程现场。 [1]Analog Devices.ADSP 2100 Family User’s Manual[EB/OL].http://www.analog.com/static/imported-files/processor_manuals_legacy/160158757adsp_21xx_um_rev3_0.zip. [2]Analog Devices.ADSP-218x DSP Instruction Set Reference.[EB/OL].(2004).http://www.analog.com/static/imported-files/processor_manuals/5876423468xinset.pdf. [3]Analog Devices.ADSP-218x DSP Hardware Reference[EB/OL].(2001).http://www.analog.com/static/imported-files/processor_manuals/3110043388x_hardware.zip. [4]袁璟,高明.ADSP-218X的IDMA接口自举设计[J].单片机与嵌入式系统应用, 2004(10):24-26.YUAN Jing,GAO Ming.Self-bootingdesign ofIDMA interface of ADSP-218X[J].Microcontrollers&Embedded Systems,2004(10):24-26. [5]Analog Devices.Autobuffering,C and FFTs on the ADSP-218x[EB/OL].(2001).http://www.analog.com/static/importedfiles/application_notes/ee_142.pdf. [6]Analog Devices.ADSP-2185M DataSheet[EB/OL].(2000).http://www.analog.com/static/imported-files/data_sheets/ADSP-2185M.pdf. [7]Analog Devices.ADSP-2189 IDMA Interface to Motorola MC68300 Family of Microprocessors [EB/OL].2000.http://www.analog.com/static/imported-files/application_notes/EE-115.pdf.2 结 论