新闻中心

EEPW首页 > 模拟技术 > 设计应用 > 基于USB2.0总线的TMS320VC5402 HPI自举的实现

基于USB2.0总线的TMS320VC5402 HPI自举的实现

——
作者:曹长江 马双宝 詹飚 武汉理工大学自动化学院 时间:2007-01-26 来源:《电子元器件应用》 收藏


引言

当前,dsp(digital signal processor)芯片已经广泛应用于通信、信号处理、雷达、图像处理等多个领域,其强大、高效的运算能力,是其他微处理器无法比拟的。为充分发挥dsp运算高效的优势,用户程序通常在dsp内部ram中运行,这就需要利用dsp的自举引导(boot loader)功能。在dsp多机系统中,hpi自举是首选。目前,采用hpi自举的实例主要有两种,一种是用单片机作为主控制器,通过pc机串口或者外挂的存储器得到要下载的dsp用户程序数据,这种方案无法实现系统与pc机之间数据的实时高速传输;另一种是用pc机并口里控制dsp hpi接口,从而把程序写入dsp 的内部ram,该方案无法满足嵌入式系统的即插即用要求。

本文引用地址:https://www.eepw.com.cn/article/21282.htm

usb接口具有即插即用,速度快(最高可达480mbps)等特点,可成为pc机的外围设备扩展中应用日益广泛的接口标准,基于usb总线对dsp实现hpi自举,可以降低成本,也便于dsp与pc机的高速数据通信,鉴于此种考虑,本文介绍一种利用usb2.0接口控制芯片(cy7c68013-56pvc)实现tms320vc5402自举的实现方案。

芯片介绍

usb2.0芯片及其gpif简介

本方案采用的usb2.0接口控制芯片是cvpress公司的cy7c6801356pvc,该系列芯片是世界上第一款支持usb2.0的集成微控制器芯片,它集成有usb2.0收发器、智能串行接口引擎(sie)、增强的8051微处理器,通用可编程接口(gpif)、片上ram和fifo存储器[1]。该系列芯片的智能引擎也支持usb1.1协议,因此,它具有很好兼容性。

cy7c68013与外设有主/从两种接口方式:可编程接口gpif和slave fifo,可编程接口gpif是一个微状态机[2],可由软件编写读写控制时序,也可以作为usb fifo的主控制器与dsp进行无缝连接,gpif可工作在自动模式,usb总线和gpif接口域直接进行数据传输,无需8051内核直接参入,以此解决usb2.0高速传输的“瓶颈”问题,gpif与8051内核关系如图1所示。

dsp芯片及其hpi简介

tms320vc5402是ti公司的一款性价比极高的低功耗定点数字信号处理器(dsp),该芯片的主机接口(hpi,host port interface)被称为hpi-8。这种hpi-8接口的最大特点是它允许主机访问dsp的整个片内空间。hpi接口通过hpi控制寄存器(hpic)、地址寄存器(hpia)数据寄存器(hpid)和hpi内存块来实现与主机的数据通信。主处理器对hpi的访问由内外两部分组成,其中外部主要为主处理与hpi寄存器交换数据,而内部则用于为hpi寄存器与dsp存储单元交换数据(由dma自动完成)。在进行数据地实时通信时,dsp与主机可以通过中断信号进行握手。其具体实现可通过设置hpic寄存器的hint、dspint位来对对方进行中断[3]。

硬件设计

设计原理

自举从本质上说就是dsp上电后,在bootloader引导下,获取应用程序并开始运行的过程,tms320vc5402上电以后,当mp/mc为低电平时,系统将从片内rom的off80h开始执行,此处的跳转指令使程序跳转至bootloader程序入口处(of800h处)。bootloader程序先清除ifr,并设置hpi入口点(0x7f)的值为0,置hint为低,再检测int2是否置位(置位可以通过将hint和int2相连来实现),如置位则进行hip自举[4],具过程如图2所示。

dsp复位之后,如检测到hpi自举方式有效,就可以进行hpi自举引导,基于usb总线的hpi自举,就是在bootloader引导下,通过usb接口控制芯片把程序数据由主机(pc)写入dsp内部ram(daram)并使dsp开始运行的过程,该自举过程分为三个步骤:一是写hpic,以设置hpi控制参数;二是写hpia,设置访问dsp的首地址;三是通过hpid下载程序。

首先,推动ez-usb control panel下载cy7c68013的固件程序。当重枚举结束,驱动程序(ezusb.sis)重新安装成功后,在control panel中通过发送请求的方式由端点0向hpic(主要设置bob位,确定字节配合)发送两个相同的8位控制字,而当hpic初始化完成之后,再通过端点0设置欲下载程序段到dsp中的首地址hpia。hpic、hpia设置好之后,就可以通过端点2下载dsp程序代码段,程序代码段需要分段下载,实际上,cy7c68013通过端点2把数据写入hpid,然后,dsp按照hpia指定的地址,由dma自动将hpid中的数据写到ram,接口控制时序可由gpif软件编程控制,程序数据分段下载完毕之后,再将程序的入口地址通过端点0写入0x7f处,在主机下载程序的过程中,dsp将一直检测0x7f是否为0,如不为0,即判定dsp已由主机进行了hpi自举加载,并按照该值跳转pc指针,以开始运行,进而完成hpi自举。

硬件电路

本设计用cy7c68013-56pvc与tms320vc5402的hpi口相连接,接口选择gpif模式,硬件电路如图3所示,该方案中,hcntl[1:0]与gpif的低位地址线pa3、pa2相连,以选择需要访问的hpi的hpia、hpic,hpid寄存器,ctl0接至hr/w,可作为读写控制信号,hds1与输出信号线ctl1相连,以作为hpi访问的选通信号,hbil与输出信号线ctl2相连,已用于识别传输的是第一个字节还是第二个字节,hrdy接输入信号线rdy0。用于通过主机查询hpi口的状态,hint、int2与int0连接,可确保hpi自举有效,hcs接gnd,可使hpi片选信号有效,hpiena接高电平时,hpi使能,has、hds2接高电平时,信号线禁用。数据线pd[7:0]与hd[7:0]相连,可在控制时序作用下传输一切数据信号。hpi接口控制时序由ctl0、ctl1、ctl2引脚输出,在自举过程中,系统将关闭cy7c68013所有的中断,若要通过中断实现数据通信的握手,可以在自举完毕打开cy7c68013的中断。

cy7c68013的具体配置为:启用gpif接口控制数据传输,gpif接口采用内部时钟(48mhz);端点2设置为批量传输输出端点,最大传输值是512字节,双缓冲;终端4、8禁用。端点6可作为批量传输输入端点来向主机传输数据,需要说明的是端点6不是自举所必需的。

软件设计

dsp应用程序设计

实现tms320vc5402 hpi自举的前提是生成dsp应用程序的分段hex代码文件,在ccs中可用汇编语言,c语言等编写应用程序源代码,经汇编、链接、编译后,生成可执行的公共目标文件格式(coff)的文件,coff文件不能用于hpi自举引导,而需要利用ti公司的文件格式转换工具hex00.exe,将coff文件转换为hex格式文件[5]。格式转换的关键是正确编写hex命令文件,下面讨论如何编写这种命令文件,例如将包含text段的源程序链接、编译生成test.out文件,编写命令文件时,可利用hex500.exe将test.out转换为对应text段的hex文件,命令文件test为.cmd如下:

-i      //生成intel格式

test.out   //输入文件

roms

{

page 0:rom1:org=0x2000,length=0x2000,romwidth=16,memwidth=16,

files={test1.hex}   //text段的起始地址为0x2000

}   //如有多端就可增加多个rom sections

{text:paddr=0x2000} //如有多端就可增加多个部分

在dos环境下,利用hex500.exe转换命令文件test.cmd,就可得到test1.hex文件,通过cy7c68013把test1.hex文件写入dsp内部ram,再把程序的入口地址写入0x7f处,便可完成自举。

usb固件程序设计

cypress公司提供有usb的辅助开发工具:ez-usb control panel,gpif designer。通过gpif designer可以生成gpif波形图及相应的c源代码gpif.c。cypress公司同时提供了固件程序框架,因而可把gpif.c加入固件程序框架进行开发,从而提高开发效率。本方案中,固件程序设计的重点是对gpif的编程,以便生成符合hpi接口的时序的波形描述代码,以用于控制数据传输,hpi自举需要的gpif控制波形描述符为:单字节写(两种),fifo写。hpia、hpic的初始化需要单字节写控制时序,程序代码写入hpid需要fifo写控制时序,若要实现二者的数据通信,还需要单字节读、fifo读等控制波形描述符。

hpic、hpia的初始值是在ezusb control panel中通过制造商请求工具栏由ep0发送的,固件程序中还要有相应的请求处理程序,以完成具体的设置,如假定hpic请求类型的id为0xb6.hpic=0x0101(bob位为1),则请求工具栏的具体参数应为:req=0xb6,value=0x0000,index=0xbeef,length=2,dir=0,hex bytes=0101,固件中应加入的请求处理程序为:

case 0xb6:

{epobcl=0;          //ep0使能

while(ep01stat&bmep0bsy); //等待epo数据接收完毕

while(!hpi_rdy);      //等待hpi处理完毕

ioa=0x00;           //选择hpic寄存器

gpifwfselect=0x1e;      //选择写低字节的单字节写控制波形

while(!(gpiftrig&0x80))

{;}

xgpifsgldatlx=ep0buf[0];   //写低字节数据

gpifwfselect=0x4e;      //选择写高字节的单字节写控制波形

while(!(gpiftrig&0x80))

{;}

xgpifsgldatalx=ep0buf[1];  //写高字节数据

break;}

设置程序下载的首地址(hpia值)的请求处理程序与设置hpic的程序基本相同,只需按照请求类型的id,来改变访问寄存器的地址即可,访问hpia时,hcntl[1:0]=10b,即ioa=0x08。

访问hpid下载程序数据时,可采用大端点ep2自动打包方式(autoin=1),即将数据发送到端点后,自动传到fifo中,等待写hpid条件具备,再启动gpif,以将程序数据写入hpid,访问hpdi可采用地址自动增加模式(hcntl[1:0]=01b),写数据前,地址自动加1,这样,数据便可以经过dsp内部dma自动写入内部ram,写hpid的程序如下:

if(gpiftrig&0x80)  //gpif接口是否处于空闲状态

{if(!(ep24fifoelgs&0x02)) //自动向量是否可以访问ep2fifo中数据

{ioa=0x04; //选择hpid寄存器,且访问时地址自动增加

while(!hpi_rdy);  //等待hpi处理完毕

syncdelay;

gpiftcb1=ep2fifobch; //写入的字节数

syncdelay;

gpiftcb0=ep2fifobcl;

syncdelay;

gpiftrig=gpif_ep2;  //启动写数据

syncdelay;

while(!(gpiftrig&0x80) //等待写入完毕

{;}

syncdelay;}}

这样程序数据就可以分段通过端点2写入dsp内部ram,最后再把入口地址写入0x7f,以完成hpi自举,值得注意的是,采用此种方式访问hpid时,写入hpia的初值为程序入口的一个地址,例如,写test1.hex时,应设定hpia=0x1fff。

为缩短开发周期,本设计采用开发包中通用驱动(ezusb.sys)和ezusb control panel进行开发、调试、也可以对通用驱动、控制面板的源程序在vc++环境(需要ddk的支持)下进行二次开发,以便编译出开发者满意的驱动程序和上位机程序。

结束语

通过实践证明,基于usb2.0总线dsp hpi自举的方案是可行的,可以达到预期效果,该方案可以省掉外扩的eprom、flash及ram等程序存储器,故可节约成本,也便于dsp软件算法升级,而且符合嵌入式系统要求,有很好的应用前景,当然,该方案还有待进一步优化与增强,若要访问外部存储器,还需要编写二次引导程序,以便通过该程序把内部存储器中的数据编译到外部存储器,若需dsp与主机实时通信,则需要usb固件和dsp源程序中编写相应的中断服务程序。



关键词:

评论


相关推荐

技术专区

关闭