2 硬件设计
在本系统中,Flash选用的是Atmel公司的AT29LVl024,AT29LVl024容量为64K×16位,可以满足一般的应用要求,并且其工作电压为3V~3.6V,可以直接与TMS320VC5409接口而不必再使用电压接口芯片进行转接,使硬件电路更为简单。
从TMS320VC5409的存储器空间映射得知,在MP/M C=0 时,外部存储器空间映射的地址范围为8000H-FFFFH共32K,因此Flash中的程序部分必须位于8000H~FFFFH的地址范围,才能成功引导。笔者的程序量小于32K×16位,因此可以将Flash的地址线A0-A15直接与DSP的地址线AO~Al5相连,然后将程序烧录到Flash的32K之后的位置,这样程序刚好位于DSP的8000H~FFFFH范围。如果程序量大于32K字,则可将Flash的前32K地址编码在DSP的8000H~FFFFH范围.采用分页的方式,逐步装载需要运行的程序。 本文中,采用从DATA空间引导,具体的电路连接如图2所示。
Flash的地址线AO-A15直接与DSP的低16根地址线A0-A15相连。
Flash的16位数据线DO-D15直接接DSP的16位数据总线D0-D15。
Flash的写信号WE直接接高电平(因为对Flash的编程采用编程器烧录)。
Flash的片选信号CE直接接低电平或者接DSP的DS引脚。 Flash的读信号OE接DSP的存储器读信号MSTRB。
DSP的MP/MC引脚接低电平。
DSP的INTl-INT3引脚通过上拉电阻接高电平。
3 代码设计和数据转换
硬件设计完成后,可以编写一段代码进行测试。
在TI的DSP开发环境CCS中建立一个工程项目test pjt,包括三个文件:test_main.c、test_vector.asm和load.cmd。它们各自代码见本刊网站WWW.dpj.com.cn。
需要说明的是,虽然DSP和Flash都是16位的,但是一般的编程器都是按8位从.hex文件中读取数据.每读一个字节,地址就会增加1,因此连接命令文件中必须将memwidth和romwidth的值设置为8,否则编程器读取hex文件时会出现错误,这通常是导致引导过程失败的主要原因。
连接命令编写完毕后,将test.out文件、连接命令文件load.cmd以及hex500.exe文件拷贝到同一目录下,在Windows系统命令提示下进入该目录,执行命令行:
hex500 I0ad.cmd
即可生成test.hex文件,同时还生成mxp文件test.mxp,供查看详情。
test.hex文件生成后,运行编程器烧录软件(本设计用的是西尔特的suPERPRO 6 8 0),选择器件为 AT29LVl024。打开test.hex文件,此时会发现AT29LVl024的地址范围是0 0 0 0 0H-1FFFFH共128K,而不是0000H-FFFFH,这就是为什么需要将存储器数据宽度设定为8以及将程序烧录起始地址bootorg设置为0xl8000的原因。0x18000除以2为0x0C000,也即,燃录地址Oxl8OOO在系统中的地址为OxOC000,位于8000H~FFFFH的外部存储器映射范围内。
另外,还发现编程器软件打开的test.hex文件中,最后两字节并不是引导表的首地址(这大概是HEX500有什么bug的缘故吧),因此需将1FFFEH的内容改为COH,将1FFFFH的内容改为00H,C000H是本例中引导表在实际DSP系统中的首地址。将18000H的内容从08H改为10H,此处为08H是因为连接命令文件中的数据宽度设置为8位,而系统中DSP和Flash的实际数据宽度都为16位,引导过程应该采用16位引导装载.因此需要将08H改为10H。修改完成后,还需将整个文件的高低字节进行交换,因为编程器打开的.hex文件高字节在前,低字节在后,而16位Flash的编程是低字节在前高字节在后。经过如此修改和调整后,即可对Flash器件进行编程了。
将编程后的Flash装到系统中,用示波器查看DSP的引脚XF,如果有方波出现,则说明引导装载已经成功,程序代码已被调入到内部RAM中运行。
结语
本文所叙述的引导方法在四通道数据采集系统中得到了有效的验证,并且整个过程操作起来非常方便快捷。