PC主机在DSP自举引导和通信设计的实现

时间:2011-08-24

 

  在DSP领域,TI公司(德州仪器公司)一直处于世界霸主地位,它生产的TMS320系列DSP芯片以其独特的哈佛结构、硬件密集型方案和灵活的指令系统成为数字信号处理器产业中的者。其C5000系列DSP芯片具有功耗小、高度并行等优点,可以满足众多领域的实时处理要求。为充分利用DSP快速运行的优点,通常希望用户程序能在DSP中高速运行,这就需要运用DSP自举引导功能。众所周知,欲获得全速的DSP运行速度,方法之一是在DSP芯片出厂前将用户程序掩膜在其片内的ROM上。这种方法对大部分应用场合并不适用,且成本很高。对大多数用户而言,可行的方法是利用DSP自举引导功能。 Bootlooader(自举引导程序,也称引导装载程序)是在出厂前固化在DSP芯片内ROM中的一段程序代码,其主要功能是在上电或复位时将用户程序从外部加载至程序存储器(片内RAM或扩展的RAM)中,以便实现高速运行。因此,用这种方法可以以较低的成本实现高速运行。不同型号的DSP,其Bootlooader也不同。如TMS320C54X系列的DSP提供了四种自举引导方法[2]:并行EPROM、并行I/O口、串行口及主机接口HPI自举引导方式,它们适用于不同的应用场合。

  1 资源环境简介

  TMS320VC5402是TI公司C54x系列定点DSP芯片中的新产品它集中了此系列早期产品的优点,并提供了许多新的功能,开发和使用更加方便。C5402具有灵活的指令系统和操作性能,它可选择助记符指令或算术指令作为编程指令,同时支持汇编语言和C语言的单独或混合编程。C5402采用改进的Harvanl处理结构,指令流水线操作。计算和处理速度很高,系统单指令周期可达到10ns.在片内提供16k的RAM用作程序和数据存储,其可扩展寻址空间为1M字节。C5402提供的McBSP串口和DAM数据传送方式极大地方便它在通信领域的应用和开发。C5402由于其高性能价格而成为当前语言和静态图象处理和主流产品。本文主要介绍C5402和McBSP原理、配置以及DAM方式下如何实现利用McBSP的通信。

  该方案中HOST为PC机。PC的I/O并口(常用做打印机接口)端口地址为0x378~0x37A,0x378是数据口基地址,0x379为状态口地址,而0x37A为控制口地址[1].在Windows2000操作系统下,系统不能直接对I/O端口的读写操作,而WIN98可以直接对I/O端口读写操作。本文中所讨论的引导方案是在WIN98 实模式DOS环境下实现的。需注意的是PC的0x378数据端口对应的输出芯片是74LS374.对于非增强型并口(SPP)只能输出数据,不能读取外部数据,读操作所读的数据只能是前PC机所写的数据,如需读取数据可在CMOS中将其设置为EPP.

  TMS320VC5402的8bit HPI口为增强型。增强型HPI可访问片内所有RAM空间。在非主机独占模式下访问RAM时,HOST的HPI访问一直和DSP同步,且HPI和DSP都有访问权。HPI通过对3个寄存器HPIC(控制寄存器)、HPIA(地址寄存器)和HPID(数据寄存器)访问片内RAM.HOST用HCNT0/1引脚区分各寄存器,HBIL高低电平区分高低字节,HDS1/2和HAS产生内部控制传送信号。由于HPI为8bit,所以每次都是传送2字节再组成内部的1个字(具体控制见后面程序)[2].DSP/HPI工作时序图如图1所示。

  2 引导及程序实现

  DSP上电后,当MP/MC为低电平时,DSP开始执行片内自举引导程序。先清除IFR,置HINT为低,再检测INT2位是否置位(置位可通过将HINT和INT2相连实现),如置位则进行HPI引导,HOST按照图1的时序将应用程序或数据以字(分为2字节)为单位到RAM.完后再在0X7F写入程序入口地址。该过程中DSP将一直检测0X7F是否为0,如不为0,则跳转到该地址(0X7F中的内容)执行程序。DSP在该过程中执行以下代码[3]:

  ;从VC5402 ROM中截取的程序

  ssbx  intm;屏蔽所有中断

  stm  #0FFFFh,@ifr  ;清除所有 IFR 标志

  stm  #0,@HPIentry  ;设置HPI入口点(0X7F)的值为0

  stm  #08h,hpic   ;置HINT为低

  bitf  @ifr,#int2msk ;检查INT2标志位是否置位

  bc  HPI,tc;如果INT2置位则进行HPI引导

  ……

  HPI

  ldm  HPIentry,a   ;获取HPI入口向量

  bc  hpiboot,aneq  ;如果0x7F内容不为0,

  ;则进行HPI引导

  b  $-3;否则一直循环

  PC机并行打印口和DSP/HPI通信原理图如图2所示。由于PC机的并口输出TTL电平,而DSP可接受的电平是3.6V,故需要电平转换,图中芯片SN74LVC16245就是起电平转换作用的。此外,图2中DSP的HINT和INT2相连(以选择HPI引导),PC的STROBE(打印口引脚1)接DSP的HBIL,BUSY(打印口引脚11)接HRDY,AUTOFE(打印口引脚14)接HCNT0,INIT(打印口引脚16)接HDS1和SLCTIN(打印口引脚17)接HCNT1.

  在图2的电路基础上开始HPI自举引导。首先HOST初始化HPIC,向HPIC发送2个相同的8位数据的控制字。HPIC初始化完成后,HOST开始写HPIA(HPIA存放数据地址)。在上述2个寄存器初始化都完成后,HOST便可向DSP的RAM写数据。实际上HOST通过写HPID,然后DSP按照HPIA指定的地址,自行将HPID的数据写到片内RAM,且该过程对用户完全透明。

  地址寄存器HPIA有多种模式,可选是否自动增加,即可以只写1次HPIA且设定HPIA自动增加,此后便不用写地址即可实现连续数据的写入或读出。在该引导过程中,HBIL引脚为低电平时,表示HOST传送的是第1字节,而当HBIL引脚为高电平时,传送的是第2字节。与其相配合的HPIC控制寄存器的BOB位为1时,将传送第1字节并将其放在RAM的低8位,第2字节放在高8位;当BOB位为0时置放顺序颠倒。

  下面是实现HOST(PC机)控制HPI进行自举引导的程序,主要由以下3个函数完成:(1)write_port_a( )函数实现向地址寄存器HPIA写地址字。(2)write_port_d( )函数实现向DSP的RAM写数据字。(3)write_port_c( )函数实现向控制寄存器HPIC写控制字。其自举引导程序如下:

  #define PORT_D 0x378  //PC数据口

  #define PORT_S 0x379  //PC状态口(其中输出STROBE,

  //BUSY和SLCTIN的数据反向)

  #define PORT_C 0x37a//PC控制口(其中BUSY反向)

  write_port_a(int write_data)//向HPI的HPIA写1个字

  {

  _outp(PORT_C,0x0009);//控制口hcnt1=0 hcnt0=1

  //hbil=0 hds1=0

  _outp(PORT_D,write_data);//输出数据低8位

  _outp(PORT_C,0x000d);//控制口hcnt1=0 hcnt0=1

  //hbil=0 hds1=1

  _outp(PORT_C,0x0009);//控制口hcnt1=0 hcnt0=1

  //hbil=0 hds1=0

  read_data=_inp(PORT_S);

  while(1) { if((read_data&hrdy)<1) break;

  else read_data=_inp(PORT_S);}

  _outp(PORT_C,0x0008);//控制口hcnt1=0 hcnt0=1

  //hbil=1 hds1=0

  write_data=write_data》8;

  _outp(PORT_D,write_data);//输出数据的高8位

  _outp(PORT_C,0x000c);//控制口hcnt1=0 hcnt0=1

  //hbil=1 hds1=1

  _outp(PORT_C,0x0008);//控制口hcnt1=0 hcnt0=1

  //hbil=1 hds1=0

  }

  write_port_d(int write_data)//向HPI的HPID,即向RAM

  //写1个字,地址非自动增加

  {

  _outp(PORT_C,0x0003);//控制口hcnt1=1 hch0=0

  //hbil=0 hds1=0

  ……

  }

  函数write_port_d( )类似于函数write_port_a( ),只需将操作HPIA的程序中的hcnt1/0改变,在写控制数据时所有数据值减6,即可省略部分程序。

  write_port_c(int write_data)//向HPI的HPIC写1个字,

  //要求该字中是2个完全相同的字节

  {

  _outp(PORT_C,0x000b);//控制口hcnt1=0 hcnt0=0

  //hbil=0 hds1=0

  ……

  函数write_port_c( )类似于函数write_port_a( ),只需将操作HPIA的程序中的hcnt1/0改变,在写控制数据时所有数据值加2,即可省略部分程序。

  利用上述3个函数,PC机可以将1组每字16位的数据写到DSP的RAM里。但要注意先初始化控制寄存器HPIC,控制主机写进去的每个字的2个字节如何组成RAM里的1个字,否则将会产生错误。如把第1个字节放在低8位,第2个字节放在高8位,即BOB位为1.可通过下面语句实现:

  write_port_c(0x0101);

  该函数初始化控制寄存器HPIC,以使HPIC中的BOB位为1,XHPIA为0.

  3  将完整的应用程序全部写进DSP

  将一个完整的应用程序按每字16位写到RAM中后,要实现自举引导还需改变0X7F的内容,使其指向程序入口地址。写完后DSP将自动转向应用程序并运行。

  write_port_a(0x7f);

  write_port_d(0x3000);//假设0x3000为程序入口点

  下面讨论如何将一个含多个段的可执行COFF文件转化为程序所需的格式[4].例如将test.asm源程序链接并编译生成test.out文件,而该程序有。text段和。data段。其方法:用hex500.exe转换工具将test.out生成2个16位的HEX文件,分别对应text段和data段。其命令文件如下:

  test.out//输入文件

  -I//生成Intel格式

  -memwidth 16//存储器数据宽度

  ROMS

  {

  PAGE 0:

  ROM1:origin=0x3000,length=0x2000,romwidth=16

  files={t1.dat}  //text段起始地址为0x3000

  PAGE 1:

  ROM2:origin=0x80,length=0x1f80,romwidth=16

  files={t2.dat}     //data段起始地址为0x80

  }

  SECTIONS       //如有多段就可增加多个ROM

  {

  .text:  paddr=0x3000

  .data:  paddr=0x80

  }

  再通过编程实现将t1.dat和t2.dat连续写入RAM,完成后再将0x7F的内容写成0x3000就可以实现引导。

  4  探讨和总结

  以上讨论的是增强型8bit HPI,HOST通过该HPI只能访问片内RAM空间。如要访问所有存储器空间,DSP必须再次引导。先执行本身片内ROM中的引导程序将HOST的二次引导程序代码到片内RAM,再通过执行二次引导程序访问其他非片内数据。HPI 自举引导本身也是一种数据通信,在本方案中已详细地讨论了HPI的自举引导。

  现实应用中通常为多机系统,由于DSP的控制能力不很强,通常只是作为信号处理器,其信息及控制数据通常来自主机。而增强型HPI具有高速数据通信速率,且通信控制方式简单。故HPI是DSP与其他机器通信的一种良好途径。



  
上一篇:浅谈电力调度自动化系统解决方案
下一篇:分析心率测速计的设计

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技术资料