《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 设计应用 > 基于ARM的TMS320C6455 DSP HPI的动态程序加载设计与实现
基于ARM的TMS320C6455 DSP HPI的动态程序加载设计与实现
来源:电子技术应用2013年第6期
赵建波1,胡文若2,习 勇1,陈路辉1
1.国防科技大学 电子科学与工程学院,湖南 长沙410073; 2.江西新余学院 数学与计算机科学学院,江西 新余338004
摘要: 设计了ARM与DSP HPI(Host Port Interface 主机接口)的通信接口,并通过该接口完成了ARM对DSP程序的动态加载。该方法减少了DSP对于外部非易失性存储器的需求,同时提高了DSP加载方式的灵活性,对于软件无线电波形组件的动态加载有重要的意义。
中图分类号: TP399
文献标识码: B
文章编号: 0258-7998(2013)06-0014-03
Design and implementation of TMS320C6455 DSP HPI dynamic program loading based on ARM
Zhao Jianbo1,Hu Wenruo2,Xi Yong1,Chen Luhui1
1.School of Electronic Science & Engineering, National University of Defense Technology, Changsha 410073,China; 2.School of Mathematics & Computer Science, Xinyu University,Xinyu 338004,China
Abstract: This article designs the communication interface between ARM and DSP HPI. The ARM processor can dynamically load the DSP program through this interface. This method reduces the requirements of external nonvolatile memory, and improves the flexibility of the DSP boot mode, which is also important for the loading of the software defined radio waveform components.
Key words : ARM;DSP HPI;interface design;dynamic program loading

    软件无线电的基本思想是通过构造一个通用、标准、模块化的硬件平台并加载不同的软件来实现不同的通信功能,使用不同的通信标准(如工作频段、调制解调类型、数据格式、加密模式、通信协议等),构成具有高度灵活性的通信设备(如多模手机、多功能基站、多波形电台等)[1]。

    典型的软件无线电通信设备包含CPU、DSP和FPGA等波形处理单元。一般来说,CPU完成系统控制与波形的网络协议功能,而DSP和FPGA完成波形的物理层和部分协议功能。软件无线电通信设备具有波形可动态加载的特点,这对系统设备的软硬件设计提出了要求,要求CPU能够对DSP和FPGA波形组件程序进行动态加载。
    BCNG-SDR-2012是自主研发的软件无线电通信平台,由一片Samsung公司的S3C2440 ARM920T CPU、一片TI公司的TMS320C6455 DSP和两片Xilinx公司的高性能FPGA(VIRTEX-5和SPARTAN-6)以及可配置的宽频段射频模块组成,具有强大的通信信号处理能力。本文利用TMS320C6455 HPI口,在上述平台上实现了ARM对DSP的程序动态加载功能,从而为软件无线电的实现提供了有力的支撑。
1 TMS320C6455 HPI启动流程
1.1 TMS320C6455 DSP简介

    TMS320C6455是TI公司推出的高性能定点数字信号处理器[2],最高主频为1.2 GHz,在该主频下最高性能可达9 600 MIPS(Million Instructions Per Second)。该芯片的外设包括用于处理器间通信的 Serial RapidIO总线、千兆以太网存储接入控制器(MAC) 、66 MHz外设组件互连(PCI)总线接口、用户可配置的16 bit或者32 bit的主机接口HPI等。C6455 DSP建立在增强型C64x+DSP内核基础之上,该内核添加了专用的新指令,与基于TI的高级C64x DSP架构的代码相比,其代码尺寸平均缩短了20%~30%,周期效率提高了20%。
    该芯片集成了大量的片上存储器,这些存储器被组织为一个两级存储系统。其中,第一级(L1)为2个32 KB存储器,可配置为数据Cache和程序Cache;第二级(L2)为一块2 MB的存储器,可作为程序或者数据存储器。
1.2 TMS320C6455 DSP的HPI特性
    主机接口HPI(Host Port Interface)是一个并行端口,主要用于DSP与其他总线或CPU进行连接,可实现高速、并行的数据通信。HPI使一个外部主机可以通过16 bit或者32 bit的并行接口直接访问DSP的内部或外部存储器。HPI有3个寄存器,分别为HPIC控制寄存器、HPIA地址寄存器、HPID数据寄存器,均为32 bit。如图1显示了HPI在主机与DSP数据交互中的位置[3],通过HPI DMA逻辑以及资源交换控制逻辑,主机CPU可以访问DSP的内存、EMIF以及其他设备。

1.3 使用HPI的启动流程
    TMS320C6455复位和上电时的引导模式[4]主要有NO BOOT模式、HPI引导模式、Flash引导模式等。具体采用哪种引导模式是由复位或上电时管脚BOOTMODE[3:0]的状态决定的[5]。本文使用的平台中,BOOTMODE[3:0]管脚可通过拨码开关来设置。
    如图2显示了使用HPI的启动流程。系统上电复位后,首先采样管脚BOOTMODE[3:0]的状态确定启动方式(即引导模式)。由于本文采用的是HPI引导模式,上电后DSP内核处于挂起状态;接下来外部主机通过HPI口直接将代码和数据加载到DSP的内存中,在这期间DSP内核保持挂起状态不变;当主机完成程序加载后,主机向HPIC中的DSPINT位写1,向DSP发出中断;DSP收到中断后,DSP内核从挂起状态唤醒,从L2的基地址(0x800000)处开始执行程序。

2 硬件设计与寄存器读写驱动
    在本文的硬件平台设计中,ARM与DSP HPI的接口连线如图3所示。从ARM端看,由数据线、地址线、读写控制线和片选线组成,其中数据线通过162245总线隔离器进行双向传输。

 

 

    本文使用地址线作为HPI的控制信号,各信号对应的地址线如图3所示。表1显示了信号线的组合对应的访问类型。
    需要特别注意的是,由于本文中的数据总线是16 bit的,使得ARM访问的地址必须是偶数,因此不使用ADDR[0],从而有了表1中的偶数偏移地址。考虑到这一点,结合表1,下面以HPIC为例,给出其在ARM加载程序中的地址定义,其中_F和_S对应HHWIL信号,指明是第1个半字还是第2个半字。
    unsigned long Write_HPIC_F_ADDR=CS3_BASE_ADDR+0x0;
    unsigned long Write_HPIC_S_ADDR=CS3_BASE_ADDR+0x2;
    unsigned long Read_HPIC_F_ADDR=CS3_BASE_ADDR+0x4;
    unsigned long Read_HPIC_S_ADDR=CS3_BASE_ADDR+0x6;
    根据上述定义,从ARM来看,对于每个寄存器都有4个地址,在数据访问中必须选择正确的地址来操作。上述定义中,CS3_BASE_ADDR对应着DSP HPI的片选基地址,由于HPI 挂到了ARM的nGCS3片选上,根据S3C2440数据手册[6]可知其为0x18000000。
    对HPIA和HPID的地址定义类似。定义了寄存器的地址后,再定义如下宏函数[7]来实现对相应寄存器的读写操作:
    #define IOWrite(reg, data)   *(unsigned short *)(reg)=data
//写寄存器宏定义
    #define IORead(reg)         *(unsigned short *)(reg)
//读寄存器宏定义
3 HPI启动软件实现流程
    主机通过HPIC、HPIA、HPID和16 bit数据线与DSP进行数据交换和中断控制。HPI加载软件实现流程如图4所示。

    (1)初始化HPIC
    设置相应比特位,在这里仅仅设置了HPIC的HWOB位,该比特位设置第一个半字是所传32 bit数据的高16 bit(MSB16)还是低16 bit(LSB16)。在这里需要注意HHWIL信号线与HWOB位所起作用的不同,两者的共同协作才能确保数据的正确传输。操作如下:
      temp1=IORead(Read_HPIC_F_ADDR);
//读HPIC的第1个半字
      temp2=IORead(Read_HPIC_S_ADDR);
//读HPIC的第2个半字
      IOWrite(Write_HPIC_F_ADDR,temp1|0x1);
//设置HPIC中的HWOB位
      IOWrite(Write_HPIC_S_ADDR,temp2|0x1);
//设置HPIC中的HWOB位
      需要注意的是,HPIC的高16 bit和低16 bit内容是相同的,所以写入相同的数据进行设置。
      (2)初始化HPIA
      将操作地址写到HPIA中,由前所述,DSP要从L2的基地址(0x800000)处开始执行程序。因此需要将程序加载到从L2的基地址开始的内存中。对于TMS320C6455,L2的基地址为0x800000,芯片要求HPIA中写入32 bit的字地址,因此要将字节地址转为字地址,即0x200000,所以写HPIA寄存器代码如下:
    IOWrite(Write_HPIA_F_ADDR,0x0000);
    for(time_out=0;time_out<HRDY_TIMEOUT;time_out++);
    IOWrite(Write_HPIA_S_ADDR,0x20);
    for(time_out=0;time_out<HRDY_TIMEOUT;time_out++);
    根据TMS320C6455的芯片手册,HPIA的2个半字的写操作之间需要增加一定的延时。因此,上面的代码中设定了延时。具体时间参考TMS320C6455的芯片手册[2]。
    (3)向HPID中写入数据
    存取HPID时,通过控制HCNTL[1:0]信号可选择带地址自增的读写操作或是不带地址自增的读写操作。当访问连续的DSP存储空间时,使用带地址自增的读写操作只需要对HPIA寄存器赋值一次即可,能够给数据存取操作带来很大的方便。本文操作的是连续地址,因此使用带地址自增的HPID,这样仅需要进行一次设置HPIA,之后便不用再对其进行设置。
    (4)向HPIC中的DSPINT位写入1,向DSP发出中断
    至此,加载数据全部写入内存。接下来通知DSP数据加载完毕,这需要通过设置HPIC中的DSPINT位来完成,实现代码如下:
    temp3=IORead(Read_HPIC_F_ADDR);
    temp4=IORead(Read_HPIC_S_ADDR);
    IOWrite(Write_HPIC_F_ADDR,temp3|0x2);
    IOWrite(Write_HPIC_S_ADDR,temp4|0x2);
    这样当主机向DSP发送了DSPINT中断后,DSP会从L2基地址处开始执行。但是对于DSP的C程序来说,是要从_c_int00处开始执行,因此需要在L2基地址处增加跳转指令,使得程序跳转到_c_int00处,这样程序便可以正确运行,从而实现DSP程序的动态加载。
    需要注意的是,由于项目中电路板设计使用HPI16模式,因此对HPI任何一个寄存器的访问,主机都需在HPI总线上进行2次半字存取,否则可能会引起整个数据的丢失或是其他不可预料的错误。
4 格式转换
    使用DSP集成开发环境CCS生成的文件一般为.out文件,该文件是通用目标文件格式(COFF)的目标文件,COFF文件中包含一些定位符号以及一些头信息等,而本文加载到内存中的数据是CPU能够直接运行的代码,不能包含任何的其他冗余信息,因此不能直接将COFF文件加载到内存中。本文使用TI公司提供的工具hex6x.exe和hex2aray.exe进行格式的转换,其中hex6x.exe将COFF文件转换为hex文件,hex2aray.exe将hex文件转换为一个数组,这样,直接读取数组中的数据并将其加载到内存中即可。
    本文在介绍DSP主机接口并通过HPI接口启动流程的基础上,详细介绍了在项目平台上ARM通过DSP的HPI口动态加载DSP的硬件设计与软件实现,同时详细描述了设计的注意事项、启动跳转以及格式转换等问题。实际的测试表明,加载1 MB的内存数据仅需要0.28 s,可见该加载方法加载速度快,灵活性好,很好地解决了软件无线电设备对DSP波形组件可重构的要求。
参考文献
[1] MITOLA J.The software radio architecture[J].IEEE Communications Magazine,1995,15(5):26-38.
[2] Texas Instruments.TMS320C6455 fixed-point digital signal  processor[EB/OL].[2012-10-10].http://www.ti.com.
[3] Texas Instruments.TMS320C645x DSP host port interface (HPI) user&prime;s guide[EB/OL].[2012-10-10].http://www.ti.com.
[4] 吴海洲,刘恒甫,黄克武.基于TMS320C6455的DSP加载模式研究[J].电子测量技术,2008,31(6):155-162.
[5] Texas Instruments.TMS320C645x/C647x DSP bootloader user&prime;s guide[EB/OL].[2012-10-10].http://www.ti.com.
[6] Texas Instruments.S3C2440A 32-BIT CMOS Microcontroller user&prime;s manual[EB/OL].[2012-10-10].http://www.samsungsemi.com.
[7] Texas Instruments.TMS320C6000 programmer&prime;s guide[EB/OL].[2012-10-10].http://www.ti.com.

此内容为AET网站原创,未经授权禁止转载。