关 闭

新闻中心

EEPW首页 > 工控自动化 > 设计应用 > ‘54x系列DSP与计算机并口通信的设计方案

‘54x系列DSP与计算机并口通信的设计方案

作者:时间:2016-12-22来源:网络收藏

http://www.eepw.com.cn/article/201612/332848.htm

数字信号微处理器(DSP)是近十几年来兴起的一项新技术。DSP以其速率快、功能强的特点,逐渐进入传统单片机所占据的工业和消费领域。TMS320C54x(简称为'54x)是德州仪器公司(TI Inc.)继TMS320C1x、TMS320C2x、TMS320C5x之后推出的新一代高性能DSP芯片。该系列芯片具有低功耗、高性能、性能价格比高等优点,广泛应用于图像处理、语音处理、仪器仪表、通信、多媒体及军事等领域。

在众多以PC机为终端的数据采集和控制系统中,由于通信协议的严格性导致外围的微处理器除需完成数据采集、控制等工作外,还需要担负起与PC主机通信、传递数据等任务。这种负担在高速的数据采集中显得就更为突出。解决的方法多数是增加专用于主机通信的器件。'54x由于集成了众多强大的功能,不仅可以实现高速数据采集和控制,几乎还可以完成不增加负担地与主机进行通信。

1 '54x的主要特点

以高速、低功耗为特征的'54x系列采用了先进的改进型哈佛结构,具有分离的数据总线和程序总线,片内集成了ROM、RAM和多个外设,如通用I/O口、定时器、时钟发生器、软件可编程等待状态发生器、可编程块切换逻辑、串行口、直接存储器存取控制器(DMA)和与外部处理器通信用的主机接口(HPI,Host Port Interface)。

2 '54x的主机接口(HPI)

'54x中的主机接口(HPI)主要有三种:标准8位HPI-8接口、增强型8位HPI-8接口和16位HPI-16接口。其中'542~'549内含标准型HPI-8,'5402、'5410内含增强型HPI-8,'5410以上为HPI-16;而'5409、'5416的HPI可以由用户设置为增强型HPI-8或HPI-16、增强型比标准型更优越之处主要在于,增强型允许主机访问DSP内部的所有片内RAM,而标准型只能访问RAM区中指定的2K字。

以TMS320VC5410(简称为'5410)包含的增强型HPI-8接口为例,它与外部主机或微处理器的连接如图1所示,其具有单独的8根数据线HD0~HD7和10根控制线。控制信号的时序逻辑如图2所示。主机主动通过HPI口访问DSP,除了对主机发中断(通过置HPIC寄存器的HINT位,可以使HINT线有效)或清除主机发来的中断(通过清HPIC寄存器的DSPINT标志)需要DSP干涉外,'5410的CPU几乎不用进行其他操作,片内的DMA通道会自动辅助完成RAM区和HPI数据寄存器的数据传输。主机由HCNTL0/1线来确定选择HPI的某个控制寄存器,如表1所列。通过对这4个寄存器的访问,就可以在所设安全机制的允许范围下读/写DSP的所有或部分片内RAM。

表1 HCNTL0/1的选择功能描述

HCNTL1HCNTL0描 述
00主机读/写HPI控制寄存器--HPIC
01主机以地址自动增的模式读/写HPI数据锁存器--HPID。若为读操作,则HPI地址寄存器HPIA每次自动读后增一单元;若为写操作,则HPIA自动写增1
10主机读/写HPI地址寄存器--HPIA,该地址指向'54x的片内RAM地址
11主机读/写HPI数据锁顾器--HPID,HPIA不变

由于DSP最小的存储单位是字(16位),因此对于HPI-8,每个的传递必须要有2个传递周期才能完成。HBLL信号用于区分传递的字节是当前字的第一字节还是第二字节。通过设置HPIC寄存器的BOB位,可以决定第一字节是这个字的高字节还是低字节。

通过HPI实现程序下载属于'5410程序加载的五种途径之一。在需要与主机连接的应用设计中,采用HPI程序加载方式可以使电路设计简化,省去外部并行或串行的ROM或FLASH程序存储器

3 增强型HPI-8与主机并口的连接

'5410具有C54x系列的大部分特点,它包括3个多通道缓冲串口(McBSP)六通道DMA、8位增强型主机接口HPI-8、增强型外部并行接口(XIO2)、16K字的片内ROM、56K字的片内RAM等,可以说是一个功能强大的微处理器。

在实现DSP与计算机主机的并口通信时,将主机并口的工作模式设置在扩展功能(ECP)模式下,在通信速率要求不高的场合,可以将其设置为PS/2模式。PS/2模式是在SPP基础上扩展的双向传输模式,以字节为单位读/写数据。

在一些DSP与主机并口通信的设计中,采用了CPLD来产生接口时序,这种方式除了加大电路成本外,还给设计增加了复杂度。事实上,利用几个简单的逻辑门就可以实现DSP与主机的并口通信。

对于DB25的主机并口线,Data0~Data7作为双作为HDS1控制信号,AudoFd、SelechIn分别作为HCNTL0/1信号。Init作为HR/W控制信号。HBIL信号由Strobe信号触发J-K触发器翻转。考虑到HPI的程序加载功能,利用J-K触发器将SelectIn和AutoFd信号逻辑组合得到对DSP的RESET复位控制。另外,'5410的I/O口线为3.3V CMOS电压,而并口则通常为5 V TTL电压。因此,为达到电平匹配,在两级之间增加了电压转换的缓冲器SN74LVC245。具体电路设计如图5所示。

HCNTL0/1的状态变化规则如图4所示。可以看出,只有当HCNTL1为1,HCNTL0由0变1时,才会触发复位状态的翻转。所以,当需要从寄存器HPIA切换到非增HPID时,为避免触发复位状态翻转,HCNTL1/HCNTL0应以10-00-01-10的方式进行转换。

4 程序设计

4.1 主机程序

主机程序主要完成HPI寄存器的选择、时序的构建和数据读/写等。限于篇幅,此处只列举主机读DSP片内RAM存储区的时序构建及其与DSP间的通信握手。其中,p_DATA、p_STATUS、p_CONTROL分别代表LPT1的数据寄存器、状态寄存器和控制寄存器。ECP扩展控制寄存器ECR的bit7~5设置为'001'。HPI的HPIC寄存器BOB位设置为'0'(第一字节为高字节)。

/*读/写HPI寄存器,读/写的'字'存放在*data和*(data+),

r_w为0时代表写,为1时代表读。*/

void HPIregRW(char*reg,BYTE*data,BYTEr_w)

{

BYTE test;

BYTE CRW=0x00|(r_w<<5);

int i_HBIL=0;

/*切换选择HPIC、HPIA、HPID_I、HPID_n寄存器之一*/

if(strcmp(reg,"HPIC"==0)

{

ChangeCONTROL(0x0b|CRW);

//ChangeCONTROL(BYTE bValue)

}

else if(strcmp(reg,"HPIA"= =0)

ChangeCONTROL(0x03|CRW);

else if(strcmp(reg,"HPID_I"= =0)//采用自增地址主机写

ChangeCONTROL(0x09|CRW);

else if(strcmp(reg,"HPID_n"= =0) //主机写

ChangeCONTROL(0x01|CRW);

else

{

printf("Wrong register for HPI write.";

exit(-1);

}

outp(p_CONTROL,CONTROL);

if((_inp(p_STATUS)&0x08)!=0) //如果HBIL!=0

{

ChangeCONTROL(0,0); //重载函数

//ChangCONTROL(BYTE bit,BYTE bValue)

_outp(p_CONTROL,CONTROL); //HDS1=0

ChangeCONTROL(0,1);

_outp(p_CONTROL,CONTROL); //HDS1=1

}

/*开始时序的准备*/

while((_inp(p_STATUS)&0x08)!=0); //等待HBIL=0

//(lst byte)

if(r_w)//读

{

//在HPIR/W的上升沿对数据线采样(第一字节)

ChangeCONTROL(2,1);

-outp(p_CONTROL,CONTROL);

ChangeCONTROL(0,0);

_outp(p_CONTROL,CONTROL);//HDS1:1->0, //采样HCNTL0/1,HR/W,HBIL

while(_inp(p_STATUS)&0x10= =0); //若HDRY=0,//等待;HDRY=1,继续

ChangeCONTROL(0,1);

outp(pCONTROL,CONTROL);//HDS1:0->1; //锁存第1字节,然后HBIL=1

*(data++)=_inp(p_DATA);

while((_inp(p_STATUS)& 0x08)= =0); //等待HBIL//=1(2nd byte)

ChangeCONTROL(2,0);

_outp(p_CONTROL,CONTROL);

//在HPIR/W的上升沿对数据线采样(第二字节)

ChangeCONTROL(2,1);

_outp(p_CONTROL,CONTROL);

ChangeCONT^ROL(0,0);

_outp(p_CONTROL,CONTROL);//HDS1:1->0,

//采样HCNTL0/1,HR/W,HBIL

while(_inp(p_STATUS)&0x10)= =0);//若HDRY=0//等待,HDRY=1继续

ChangeCONTROL(0,1);

_outp(p_CONTROL,CONTROL);//HDS1:0->1; //锁存第2字节,然后HBIL=0

*(data- -=_inp(p_DATA);

while((_inp(p_STATUS)&0x08)!=0); //等待HBIL=0

(lst byte)

ChangeCONTROL(2,0);

_outp(p_CONTROL,CONTROL);

}

else//写{(略)}

}

void main(void)

{

/*HPI初始化*/…

/*等待DSP给主机发中断HINT(查询方式)后,从DSP读数*/

WriteHPIreg("HPIC",0x0808); //清HINT中断

/*读取DSP片内RAM区数据*/

for(i=0;i

{

HPIA=resultAddr++;//resultAdd:要读取的RAM数//据区起始地址

WriteHPIreg("HPIA",HPIA);

while((_inp(p_STATUS)&0x40)!=0);//等待DSP发//送HINT有效信号(握手信号)

//调用读RAM区数据的函数,并写入创建的文件data.dat

WriteHPIreg("HPIC",0x0808); //清HINT中断

WriteHPIreg("HPIC",0x0404); //主机发送DSINT有//效给DSP(握手信号)

}

WriteHPIreg("HPIC",0x0808); //清NINT中断

}

试验证明,主机并口的读取速度远低于DSP的执行速度,因此,程序子函数中的一些等待查询指令可替略。在主函数main()中,如果读取的DSP数据是静态的,不需实时提供,则这样的指令也可以省略。

4.2 DSP的握手程序

在实际情况中,需要传递的数据大都由DSP实时处理得到。一边处理一边传输可以大大提高系统的整体效率,而且由于HPI工作的特点,传输几乎可以不占用DSP的时间。唯一需要DSP干预的是数据准备好后通知主机接收(通过HINT中断)。这项任务可以放大DSP的DSPINT中断服务程序中进行其程序简要如下:

.mmregs

.include "vectors.h"

dataarea .usect "COMMS",100h,1;所需传递的数据块区间

HOSTACK.macro

hack ldm hpic,a ;累加器A载入HPIC值

and #08h,a ;屏蔽HINT的其他位

bc hack,aneq ;判断HINT的状态,直到HINT

;位为0(即主机清HINT标志)

.endm

.text

start:stm #00a0h,pmst;设置IPTR寄存器

stm #0000h,st0 ;设置ST0、ST1寄存器

stm #2800h,stl

stm #0010,tcr ;关闭计时器

stm #0ffffh,ifr ;清除所有的中断标志位

stm #0300h,imr ;使能DSPINT中断

stm #280h,sp ;初始化堆栈指针SP为280h

HOSTACK ;检查主机是否清HINT标志

stm #0ah,hpic ;置HINT位,向主机发送

;HINT有效信号,告知第一个数已准备就绪

rsbx intm ;开启中断

wait: b wait ;主程序(此处为死循环)

hpi: stm #0ah,hpic ;当主机取完数后置DSPINT

;位,进入DSPINT中断服务程序

rete ;DSP向主机发送NINT握手

;信号,通知下一个数已准备好

.end



评论


技术专区

关闭