摘要:数字信号微处理器与计算机之间的数据通信越来越受到重视。本文主要介绍TI公司'54x系列DSP通过主接口(HPI)与计算机并口进行通信的简易设计方案。该方案以简单的电路设计实现了稳定的数据传输,并具有较高的通信速度。
关键词:DSP TMS320VC5410 主机接口(HPI)
数字信号微处理器(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的选择功能描述
HCNTL1 | HCNTL0 | 描 述 |
0 | 0 | 主机读/写HPI控制寄存器--HPIC |
0 | 1 | 主机以地址自动增的模式读/写HPI数据锁存器--HPID。若为读操作,则HPI地址寄存器HPIA每次自动读后增一单元;若为写操作,则HPIA自动写增1 |
1 | 0 | 主机读/写HPI地址寄存器--HPIA,该地址指向'54x的片内RAM地址 |
1 | 1 | 主机读/写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基础上扩展的双向传输模式,以字节为单位读/写数据。
对于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
- 研华全新模块化电脑SOM-6833助力5G路测设备升级
- 企业文化分享 如何培养稀缺的硅IP专业人员?SmartDV开启的个人成长与团队协作之旅
- 新帅上任:杜德森博士(Dr. Torsten Derr)将于2025年1月1日出任肖特集团首席执行官
- 英飞凌推出简化电机控制开发的ModusToolbox™电机套件
- 意法半导体IO-Link执行器电路板为工业监控和设备厂商带来一站式参考设计
- SABIC进一步深化与博鳌亚洲论坛的战略合作伙伴关系
- 使用 3.3V CAN 收发器在工业系统中实现可靠的数据传输
- 尼得科精密检测科技将亮相SEMICON Japan 2024
- 浩亭和美德电子(TTI)宣布战略合作伙伴关系现已扩展至亚洲