学海荡舟手机网

主页 > 实用文摘 > 教育文摘_12 > > 详细内容

ARM CPU S3C44B0X与C54X DSP的接口设计_嵌入式系统论文

摘要:以samsung公司的arm soc芯片s3c44b0x和ti公司的tms320c5416 dsp为例,讲述了arm与dsp的数据接口技术,并结出了硬件连接图和软件代码。

    关键词:arm s3c44b0x 主机接口(hpi) tms320c5416

后pc时代,嵌入式产品逐渐占领市场。而这些嵌入式产品的核心——处理器决定了产品的市场和性能。高性能、低功耗、低成本是嵌入式处理器的主要特点。在32位嵌入式处理器市场中,arm占有78.6%的份额。而ti而占有dsp市场的绝大部分份额。通常的嵌入式系统设计中,由微控制器实现整个系统的控制,由dsp来执行计算密集型操作,然后通过一定的手段实现微控制器与dsp之间的通信和数据交换。因此,如何高效地设计控制器(arm)与dsp之间的接口以满足嵌入式系统的实时性要求,在嵌入式系统设计中显得尤为重要。

1 arm cpu s3c44b0x的特点

arm是一款32位的精简指令集(risc)处理器架构,以其高性能、低功耗、低成本占有市场。由于arm公司采用ip授权的方式经营,全球几乎所有的大半导体公司都有基于arm的soc芯片。

    s3c44b0x是samsung(三星)公司一款基于arm7tdmi的soc芯片。它一方面具有arm处理器的所有优点:低功耗、高性能;同时又具有非常丰富的片上资源,非常适合嵌入式产品的开发。其特点如下:

·采用arm7tdmi内核,i/o电压3.3v,内核电压2.5v;

·内置锁相环(pll),系统主频最高达66mhz;

·4种工作模式,可以实现电源管理以降低系统功耗;

·8kb的系统高速缓存(cache),极大地提高了系统运行速度;

·支持8个memory bank,最大外部存储空间达256mb,并支持sdram;

·内置彩色lcd控制器;

·2路异步串口(uart);

·71个通用i/o口;

·8通路模/数转换器(adc);

·实时时钟(rtc)和看门狗电路(watchdog)。

2 c54x dsp及其hpi接口

2.1 c54x dsp的特点

以高速、低功耗为特征的c54x系列dsp采用先进的改进型哈佛结构,具有分离的数据总线和程序总线,片内集成了rom、ram和多个外设,如通用i/o口、定时器、时钟发生器、软件可编程等待状态发生器、可编程块切换逻辑、串行口、直接存储器存取控制器(dma)和与外部处理器通信用的主机接口(hpi)。

2.2 c54x的主机接口(hpi)

c54x中的主机接口(hpi)主要有三种:标准8位hpi8接口、增强型8位hpi8接口和16位hpi16接口。其中c542~c549内含标准型hpi8;c5402、c5410内含增强型hpi8;c5410以上为hpi16;c5409、c5416的hpi可以由用户设置为增强型hpi8或hpi16。增强型比标准型更优越之处主要在于:增强型允许主机访问dsp内部的所有片内ram,而标准只能访问ram区中指定的2k字。

以tms320c5416(简称c5416)包含的增强型hpi8接口为例,它与外部主机或微处理器的连接具有单独的8根数据线hd0~hd7和10根控制器。主机主动通过hpi口访问dsp的内部ram以及其它资源。除了对主机发中断(通过置hpic寄存器的hint位,可以使hint线有效)或清除主机发来的中断(通过清hpic寄存器的dspint标志)需要dsp干涉外,c5416几乎不用进行其他操作,片内的dma通道会自动辅助完成ram区与hpi数据寄存器的数据传输。主机由hcntl0/1线来选择hpi的某个控制寄存器,如表1所列。通过对这4个寄存器的访问,就可以在所设安全机制的允许范围下读/写dsp的所有或部分片内ram。

表1 hcntl0/1的选择功能描述

hcntl1hcntl0说        明
00主机读/写hpi控制寄存器--hpic。
01主机以地址自动增的模式读/写hpi数据锁存器--hpid。若为读操作,则hpi地址寄存器hpia自动读后增1;若为写操作,则hpia自动写后增1。
10主机读/写hpi地址寄存器--hpia,该地址指向c54x的片内ram。
11主机读/写hpi数据锁存器--hpid,hpia不变。

由于dsp最小的存储单位是字(16bit),因此对于hpi8,每个传递必须要有2个传递周期才能完成。hbil信号用于区分传递的字节是当前字的第一字节还是第二字节。通过设置hpic寄存器的bob位,可以决定第一字节是这个字的高字节还是低字节。

2.3 时序图

c54x hpi8的时序如图1所示,该时序可满足市场上大多数微控制器的时序特片。因此,c54x可以通过hpi8很方便地与微控制器接口,s3c44b0x也不例外。

3 s3c44b0x与c54x dsp的接口设计

3.1 硬件连线

tms320c5416与s3c44b0x连接的接口电路如图2所示。由图2可见,c54x通过hpi8与主机设备相连时,除了8位hpi数据总线及控制信号线外,不需要附加其它的逻辑电路,非常方便。

从hpi寄存器的编址方式可以看出,主机只需两根地址线(a3、a2)便可寻址到hpi接口的所有控制寄存器、地址寄存器和数据寄存器。同时,将hpi8接口安排在s3c44b0x的bank2(即地址范围0x04000000~0x05ffffff),而且s3c44b0x具有内部译码器,直接产生片选信号ngcs2。由于c54x hpi8是一个8位的并行端口,而c5416的内部结构为16位,因而主机必须读/写两个连续的8位字节,而且主机还应该提供hbil信号指示当然传输的是第一字节还是第二字节。在s3c44b0x中,可以直接使用址线a1来完成此功能:当向a1=0的地址写入数据时,表示为第一字节;向a1=1的地址写入数据表示第二字节。

另外,还有几个关键的控制信号线需要连接。一个就是hr/w信号,由于s3c44b0x没有此信号,使用地址线a4来代替。当a4=1时,代表读操作,反之为写操作。在hpi8的操作中,所有的地址线和控制线在hds1/2的下降沿采样,用s3c44b0x的读/写信号noe和nwe来完成此功能。

由于s3c44b0x和c5416 hpi接口的控制逻辑不尽相同,需要使用其它的一些信号线来进行模拟,此时要严格遵循hpi的读写时序(如图1所示)。

3.2 软件设计

由于主机接口(hpi)传送8位数据字节,而hpic寄存器(通常是s3c44b0x首先要寻址的寄存器)是一个16位寄存器,在s3c44b0x这一边可以相同内容的高字节与低字节来管理hpic寄存器(尽管某些位的寻址受到一定的限制),在c54x这一边高位不用。

    当主机开始存取dsp的数据时,首先要执行以下两步操作:

·hpic寄存器的bob位置1(高字节与低字节必须相同)。bob位为字节选择位。bob位置1,表示第一字节为低字节。bob位影响数据和地址的传送。只有主机可以修改这一位,c54x对它既不能读也不能写。

·将起始地址写入hpia寄存器。

此后可正常存取dsp内部ram的数据了。

结合硬件设计和hpi的操作步骤,便可以在s3c44b0x上编写程序实现c5416的数据通信。

程序主要分为两个部分:一部分是地址及数据的定义;一部分是实现代码。具体程序如下:

#define hpi_base 0x4000000

/* hpic reg */

#define hpic_w_f *(uint8*)(hpi_base+0x0) //000 0 0

#define hpic_w_s *(uinr8 *)(hpi_base +0x2) //000 1 0

#define hpic_r_f *(uint8 *) (hpi_base + 0x10) //110 0 0

#define hpic_r_s *(unit8 *)(hpi_base+0x12) //110 1 0

/*define hpid_w_a_f *(uint8 *)(hpi_base +0x4) //001 0 0

#define hpid_w_a_s *(uint8 *)(hpi_base + 0x6) //001 1 0

#define hpid_r_a_f *(uint8 *) (hpi_base+0x14) //101 0 0

#define hpid_r_a_s *(uint8 *)(hpi_base + 0x16) //101 1 0

/* hpia reg */

#define hpia_w_f *(uint8 *)(hpi_base + 0x8) //010 0 0

#define hpia_w_s *(uint8 *)(hpi_base +0xa) //010 1 0

#define hpia_r_f *(uint8 *)(hpi_base +0x18) //110 0 0

#define hpia_r_s *(uint8 *)(hpi_base + 0x1a) //110 1 0

上述这些宏定义了hpi8接口寄存器的地址。对s3c44b0x来说,hpi8占用其内存的bank2,即起始地址为0x04000000。又由于hpi8的hr/w和hbil信号用s3c44b0x的地址线实现,因此对同一个寄存器而言,其读写地址不同。

以下代码从dsp读出数据:

uint16 read_dsp(uint16 addr)

{

int16 i;

int8 j;

set_hpia(addr); //设置起始地址

i=hpid_r_a_f; //读出第一字节

j=hpid_r_a_s; //读出第二字节

return (i<<8)|(j&0xff);

}

以下代码向dsp写入数据:

void write_dsp(uint16 addr,uint16 dat)

{

set_hpia(addr-1); //设置起始地址

hpid_w_a_f=(uint8)((dat>>8)& 0xff); //写入第一字节

hpid_w_a_s=(uint8)(dat & 0xff); //写入第二字节

}

在嵌入式系统设计中,用s3c44b0x作为主控制器,用tms320c5416进行运算,然后通过hpi接口进行通信和交换数据。事实证明,用hpi接口在arm和dsp间通信满足嵌入式系统的实时性要求。