摘要:文中介绍了TMS320VC5000系列DSP的各种加载方法。并结合实例,着重介绍了其中C5402的EPROM加载方式和实现过程,提出了实际中应注意的问题。另外,也对8位EPROM加载过程及自举表作了详细的介绍。
关键词:数字信号处理器(DSP) 程序加载 TMS320VC54 自举表
DSP芯片(数字信号处理器)已成为人们日益关注并得到迅速发展的具有前关沿技术的一种集成电路,而且已得到越来越广泛的应用。TI公司推出的5000系列DSP具有高性能、低功耗等优良性能,一推出就得到了用户的欢迎。5000系列DSP被广泛应用于电信、雷达、仪器仪表、图像处理等许多方面。其应用范围的广泛性决定了必须有灵活多样的加载方式与之相适应。正因为如此,它的加载方式也较单片机的加载要复杂的多。为了能让读者对DSP的各种加载方法有个初步的了解和今后应用的方便,本文立足实际经验,简单介绍了各种加载方法,并较为详细地介绍了EPROM并行加载方法及应注意的问题。
1 DSP的各种加载方式
C5000系列可提供的加载方式有以下几种:
●主机端口(HPI)加载
程序的执行代码由主机通过主机接口(HPI)加载到DSP的片内存储器;
●并行加载
加载程序通过外部并行总线从数据空间读取自举表,自举表内包含有程序代码部分、每部分代码的目的地址、加载成功后程序的执行地址以及其它一些配置信息;
●标准串口加载
加载程序通过多通道缓冲串口(McBSP)来接收自举表,并根据自举表中的信息来加载代码。McBSP0支持16位的串行接收方式,McBSP1支持8位的串行接收方式;
●8位或16位I/O加载
加载程序通过使用异步握手协议从I/O的OH口读取自举表;
●8位串口EEPROM加载
加载程序从一个连接到McBSP1的串行EEPROM来接收数据。
2 C5000的加载过程
C5000系列加载程序已固化在ROM内。在硬件复位期间,如果DSP的MP引脚为高是平,系统就从外部程序存储器FF80H执行用户程序;若MP为低电平,系统则从片内ROM的FF80H开始执行程序,同时选择加载方式。C5000的具体加载过程如下:
(1)首先,在自举加载前对其进行初始化,其中包括:使中断无效(INTM=1),内部RAM映射到程序/数据区(OVLY=1),对程序和数据区均设置七个等待状态等。
(2)检查INT2,决定是否从HPI中载。主机接口(HPI)是利用INT2进行自举加载的。如果没有INT2信号,说明不是HPI加载。
(3)检查INT3决定是否进行串行EEPROM加载。如果DSP检测到INT3信号,则进行串行EEPROM加载,否则转到(4)。
(4)从I/O空间的FFFFH处读取源地址,如果是有效的地址,则进行并行加载;否则从数据空间的FFFFH处读取源地址,如果地址有效,也可进行并行加载;若两种情况都不是则转到(5)。
(5)初始化串口,置XF为低。若McBSP1接收到一个数据,先检查是否是有效的关键字,若是则通过McBSP1进行串口加载,否则检查McBSP0,其过程与McBSP1相同。
(6)检测BID引脚是否为低,若为低再检查是否为有效的关键字,若是则进行I/O加载,否则检测是否是有效的入口点,若是,则转入入口点,若都不是则跳到(5)。
下面通过一个具体的例子来详细介绍一下EPROM并行加载过程,DSP选用TMS320VC5402(5402提供4k 16bit的掩模ROM),EPROM选用27C256。
由TMS320V5402和27C256所构成的程序加载电路如图1所示。图中74LVC245的作用是将27C256输出的TTL电平转换成TMS320VC5402能接收的电平。它还对DSP起到保护作用。若去掉274LVXC245,则会烧坏5402。
27C256的输出使能控制线(OE)用来控制器件的有效或无效(双侧相互隔离)。
74LS08将27C256的地址定为8000H~FFFFH。LVC245的DIR端接DSP的R/W端。27C256垢CS端接74LS08的译码输出,OE端接低电平信号。在这种加载方式中,EPROM是作为TMS320VC5402的片外数据区,用户程序是通过片内固化的加载程序读入到片内程序区来完成加载的。
3 8位EPROM加载过程
当检测到不是串行EEPROM加载时,加载程序则转入并行加载方式。此时加载程序从并口(外部存储器)传输代码到程序空间,支持8位和16位加载。另外,程序也可自动配置SWWSR(软件等待状态寄存器)和BSCR(分区转换控寄存器),使之与不同加载方式相适应,从而使DSP能与不同速率的EPROM相连接。考虑到高速器件与低速器件的匹配问题,加载程序使用默认的七个等待周期。
加载程序能从I/O空间的0FFFFH和数据空间的0FFFFH处获取代码的首地址。通常,从数据空间获取代码的首地址较方便。因为在数据空间不需要另扩I/O空间,同时又可增加电路改动的灵活性。对5402来说,自举表可以位于4000H~FFFFH处的任何位置。图2详细描述了EPROM加载过程。
应当注意的是:如果不用并行加载方式,D0必须通过一个小的上拉电阻置为高电平,以此来避免加载程序从数据空间读到0AAH关键字。另外,加载程序事先并不知道存储器的宽度,所以它要同时检查存储器的低位(0FFFFH)和高位(0FFFFH)以获取正确的源地址。
4 自举表
自举表的头部是关键字(08AA或10AA),加载程序就是根据它来判断是16位还是8位加载方式;接着的两个字是SWWSR和BSCR的值;第四和第五个字程序代码的入口点(即加载以后程序执行的首地址);接着是第一段代码的长度以及它的目的地址;紧跟着是另一段代码;依此类推,最后是0000H,这是自举表的结束标志。表1为自举表的结构。
表1 自举表的结构图
08AAh or 10AAh |
Initialize value of SWWSR 16 |
Initizlixe value of BSCR 16 |
Entry point (XPC)7 |
Entry point(PC)16 |
Size of first section 16 |
Destination of first section (XPC)7 |
Destination of first section (PC)16 |
Code word(1)16 |
… |
… |
Code word(N)16 |
Size of last section 16 |
Destination of last section(XPC)7 |
Destination of section (PC)16 |
Code word(1)16 |
Code word(N)16 |
0000h |
笔者将结合实例,介绍一下自举表的建立。
假设用户编制的源程序文件为radar.asm,链连器命令文件为radar.cmd,生成的COFF文件为radar.out,最后生成的INTEL的十六进制文件为radar.hex,用户可以通过EPROM编程器将它烧录到EPROM中。
(1)首先,使用编译器对应用程序进行编译。值得注意的是必须在编译器的命令行上加-V548选项,若遗忘了这个选项,以后HEX转换工具将会产生C54早期版本的自举表,而不提供任何错误与警告信息。这个错误极其隐蔽,务必注意。
例:asm500radar.asm-1-s-x-v548
(2)第二步,对第一步产生的目标文件进行链接。在链接过程中,链接器将各个目标文件合并,并完成以下工作:
●将各个段配置到目标系统的存储器;
●对各个符号和段进行重新定位,并给它们指定一个最终的地址;
●解决输入文件之间未定义的外部引用。
例:Lnk500 radar.cmd-o radar.out
(3)最后,运行HEX代码转换工产生自举表。十六进制转换程序可以很方便的将COFF目标文件转换成TI,INTEL,MOTOROLA或TEKTRONIX公司的目标文件格式。转换后生成的文件下载到EPROM编程器。
例:Hex500 radar.out -I - o radar.hex - memwidth 8 -romwidth 8 -boot -bootorg 0x0000
注意:为了保证加载的成功率,用户编制的程序代码前面应加上对DSP的各个状态寄存器进行初始的程序段。