最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

实验七 HPI接口操作

IT圈 admin 19浏览 0评论

2024年10月29日发(作者:大秀杰)

实验七 HPI接口操作

1.实验目的

在C54X系列中,只有542,545,548和549提供了标准8位HPI接口,而C54XX系列

都提供了8位或16位的增强HPI接口。外部主机或主处理器可以通过HPI接口读写C54X

的片内RAM,从而大大提高数据交换的能力。标准HPI接口中外部主机只能访问固定位置的

2K大小的片内RAM,而增强HPI接口可以访问整个内部RAM。本实验利用DES提供的HPI接

口,学习HPI接口的设计和使用。本实验的C语言源程序文件名为5402pp.c。

2.实验要求

本实验在TURBO C 2.0的环境下完成。在实验过程中,学生将利用C语言在PC机(主

机)上装入并运行一段C54X的汇编代码,来学习HPI的各个寄存器的使用。为了充分理解

和掌握HPI各个寄存器的使用,学生应该能熟练运用TURBO C,以便灵活设置、修改、查看

各个HPI寄存器以及HPI接口的状态。

3.实验原理

(1) HPI的接口设计

主机利用HPI访问C54X的片内RAM,实际上是通过读写HPI的数据和地址寄存器来

实现的。由于C542的HPI为8位,所以一个内存单元必须通过两次HPI读写来完成。标准

HPI有两种工作模式:RAM共享和主机访问模式。在RAM共享模式中,主机和C54X都

可以访问HPI的共享内存。对C542而言,HPI的共享内存大小为2K字,地址从0x1000到

0x17ff。使用该模式,HPI支持的最高传输速度为CLKOUT/5每字节。如果是主机访问模式,

那么只有主机才能访问C54X的片内RAM。例如在RESET=0或IDLE2状态下,主机仍然

能访问片内RAM,利用这一点可以实现C54X的HPI BOOTLOADER。图7-1是DES中C542

的HPI与PC的接口示意图。

10K上拉至VCC

PC机并口 C54X(HPI)

数据线D0-D7

HD0-HD7 HDS1

并口地址译码

HCS HAS

HDS2 HPIENA

并口读写

HR/W HRDY

悬空

A1

HCNTL0

A2

HCNTL1

A0

HBIL

HINT

INT2 (C542外部中断引脚)

10K上拉至VCC

图7-1 DES的HPI接口示意图

84

增强型HPI(如VC5402,VC5409,VC5410等)都是共享模式,而且只能在DSP时钟

信号有效时才能访问片内RAM。所以VC5402在使用HPI BOOTLOADER时是将程序进入

点的地址写入0x7f单元,DSP的BOOTLOADER会根据这个地址自动执行你通过HPI接口

装入的代码。

在图7-1中,HPI的数据线HD0-HD7通过缓冲隔离BUF与PC机的数据线D0-D7相连。

HCNTL0/1和HBIL为控制信号线,HDS1/2、HAS、HCS为HPI的选通控制线,HR/W为

读写控制信号线,HRDY为HPI准备就绪信号线。HINT为HPI中断信号线。下面分别详细

讨论:

HCNTL0/1信号线用来选择主机将要读写的是HPI的哪个寄存器,它们由PC并口的

A1,A2位决定。00是,表示主机可以访问HPI的控制寄存器HPIC;01和11表示主机可

以访问数据寄存器,只是01模式允许主机在读写HPI的数据时地址自动加1,而11模式地

址寄存器将不会改变。当A1=0,A2=1时,表示主机可以访问HPI的地址寄存器。

HBIL为比特传输控制位,由PC并口A0位决定。当HBIL(即A5)=0时,表示当前

传输的是一个C54X内存单元(16位)的第一个字节(第一个8位),HBIL为高时表示传

输第二个字节。而这两个8位哪个是高8位,哪个是低8位,不是由该信号控制,而是由

HPIC中的BOB位确定。

在HPI的选通控制信号中,HCS为片选信号,HAS为地址锁存信号,HDS1/2为读写

或数据使能信号。在DES的HPI接口设计中,将它们简化,仅使用HCS和HDS2,其它接

为高电平。DES中主机(PC机)通过并口来访问HPI。所以HPI的选通信号由PC的并口

地址译码信号产生。

HR/W为HPI的读写控制信号,高电平为读操作,低电平为写操作。HRDY为HPI的

输出信号,高电平表示HPI准备就绪,该信号DES中没有使用。HINT也是一个输出信号,

由HPIC中的HINT比特位确定,HPI可以利用该引脚中断主机。另外,引脚HPIENA为高

电平表示允许HPI接口工作,若要使用HPI,该引脚必须接高电平。

(2) HPI的控制寄存器

HPI有三个寄存器:地址寄存器HPIA,控制寄存器HPIC以及数据寄存器HPID。参见

表7-1。图7-2和图7-3给出了主机和C54X访问HPIC的情况。注意,主机读写HPIC时高

8位和低8位是一样的,写的时候应保持一致。下面将详细介绍各个BIT位的含义:

表7-1

寄存器

HPIA

HPIC

HPID

C54X地址

-

002Ch

-

说 明

HPI地址寄存器,只能由主机读写。该寄存器对应主机访问的

C54X的片内RAM地址。

HPI控制寄存器。C54X和主机都可以读写。详细说明后面介绍。

HPI数据寄存器。只能由主机读写。主机读写该寄存器将修改

C54X的片内HPI共享RAM。

图7-2 PC主机读HPI控制寄存器HPIC

85

图7-3 PC主机写HPI控制寄存器HPIC

图7-4 C54X读取HPIC

图7-5 C54X写HPIC

BOB位:该比特位只能由主机读写,C54X无法访问。如果BOB=1,表示HPI的16位

传输中的第一个8位字节是低8位;BOB=0,表示第一个8位字节为高8位。该比特位必

须在读写数据和地址寄存器之前设置。

SMOD位:该比特位主机只能读,而C54X可以读写。如果SMOD=1,表示起用共享

RAM模式,主机和C54X都可以访问HPI共享RAM;如果SMOD=0,表示HPI工作在主

机访问模式,C54X将无法访问2K的HPI共享RAM。C54X复位时,SMOD设置为0;复

位操作执行完成后,SMOD=1。VC5402中,该比特无效。

DSPINT位:该比特位只能由主机写,并且C54X和主机都无法读取。当主机将1写到

该比特位时,将产生一个中断到C54X。如果IMR寄存器中的HPINT位(D9)被设置为1,

DSP将响应该中断,执行相应的中断服务程序。

HINT位:该比特位主机和C54X都可以读写。该比特决定了C54X引脚HINT的状态。

C54X可以利用该信号发送中断到主机。当C54X在复位状态时,HINT比特位为0,对应的

HINT脚为高电平。当C54X将该比特位设置为1时,HINT脚将变为低电平。注意,当主

机和C54X读取该比特位时,它将反映HINT引脚的状态,0表示高电平,1表示低电平。

另外,该比特位只能由C54X设置,由主机清除。主机将1写到该比特位,将清除HINT位,

即HINT位为0。

在C54X中,如C542,HPI共享RAM总共有2K字,地址在片内数据空间的1000h到

17FFh。如果在PMST中设置OVLY比特位为1,那么也可以是程序空间的1000h到17FFh。

主机通过HPIA寄存器作为地址锁存器来读写对应的C54X片内RAM。在HPIA中只有低

11位有效,所以如果HPIA的值为0h,0800h,1000h,1800h,…,f800h,实际上都对应的HPI共

享RAM的第一个字1000h,因为这时HPIA的低11位完全一致,都为0。而C54XX,如

VC5402使用增强型HPI接口,这时HPIA有16位,主机可以访问直接访问所有片内存储

器 !

当主机通过HPI接口的数据寄存器HPID读写C54X的片内RAM时,可以选择地址自

动增加模式。注意,读和写对应不同的增加方式。如果主机是读操作,那么HPIA在读完后

自动加1;如果是写操作,那么HPIA将在写之前自动加1。例如,如果HPIA的值为0FFFFh,

这时主机对HPI的数据寄存器HPID进行写入操作,那么修改的将是HPI RAM的1000h。

这是因为HPIA在写之前加1后变为0,所以对应的HPI RAM为1000h。

86

(2) 通过HPI接口访问片内RAM

主机通过HPI接口访问C54X片内RAM的一般步骤如下:

a). 首先初始化HPIC寄存器,特别是BOB位。具体方法为:先设置HCNTL1和HCNTL0

为0,选择将要对HPIC进行操作。然后将HPIC的值写入HPI。注意HPIC的高8位和低8

位是一样的。本实验初始化HPIC=0,即将BOB设置为0,那么在以后读写HPIA和HPID

时一定是高8位在前,低8位在后。参见下列C语言程序:

t=HPIC_Read(); /* read back of HPIC */

HPIC_Write(0x0808); /* hpic, bob=0, clear hpint! first is high 8 bit */

void HPIC_Write(unsigned int w)

{ unsigned char t1,t2;

t1 = (0xff00 & w) >>8 ;

t2 = (0x00ff & w);

Addr_Byte_Write(0x40,t1);

Addr_Byte_Write(0x41,t2); /* hpic, write */

}

int HPIC_Read(void)

{ unsigned t1=0,t2=0;

t1=Addr_Byte_Read(0x0);

t2=Addr_Byte_Read(0x1); /* readback of HPIC */

return( (t1<<8) | t2);

}

b). 设置地址寄存器HPIA。先设置HCNTL1=1&HCNTL0=0,选择将要对HPIA进行操作。然

后将要访问的C54X片内RAM的地址写入HPI。一定是高8位先写,低8位后写。

c). 读写C54X的片内RAM。先设置HCNTL1/0,选择将要对数据锁存器HPID进行操

作。如果设置HCNTL1=0&HCNTL0=1,表示使用地址自动增加模式;如果设置

HCNTL0=HCNTL1=1时,表示不使用地址自动增加模式,这时完成读写操作后,地址寄存

器HPIA将不会变。参见下列C语言程序:

HPIA_Write(0x1000); /* 设置HPIA=0x1000,假设这时BOB位=0 */

HPID_Write(0xf7bb); /* (HCNTL1=1,HCNTL0=1),select HPID */

/* 这时将数据写入HPI时,地址不会自动增加 */

/* 写入指令代码: ssbx intm (0xf7bb), HPIA=0x1000 */

HPID_Write_Auto(0x7710); /* (HCNTL1=0,HCNTL0=1),select HPID */

/* 这时将数据写入HPI时,地址将自动增加 */

87

/* 写入2nd 指令代码0x7710,这时HPIA=0x1000,先将HPIA ++,

再写入数据,所以0x7710被写到C54X的片内地址0x1001单元 */

HPID_Write_Auto(0x1400); /* 将指令代码0x1400写入C54X片内地址0x1002单元,

HPID_Write_Auto(0x1400); /* 将指令代码0x1400写入C54X片内地址0x1002单元,

写完后HPIA=0x1002 */

t=HPID_Read_Auto(); /* 从0x1002单元读出数据,然后HPIA加1。结果为

t=0x1400 */

(3) HPI接口中断的使用

通过HPI接口,主机和C54X之间可以相互发送中断请求:主机通过HPIC寄存器的

DSPINT位中断C54X,而C54X可以通过HPIC寄存器的HINT位发送中断请求到主机。下

面将分别详细讨论:

a). 主机发送中断到C54X。当主机将1写入到HPI控制寄存器HPIC的DSPINT比特位时,

C54X将产生一个中断请求。该比特位主机和C54X读取的结果都是0,而且主机写入0没有任

何意义。在C54X中,该中断位于中断屏蔽寄存器IMR和中断标志寄存器IFR的D9位,其中

断入口地址位于中断向量表中64h。如果IMR中该比特位为1,同时INTM标志为0允许中断请

求时,C54X将响应并口中断,程序将跳转到中断向量表的64h,开始执行中断服务程序。本

实验中,学生可以使用C语言将1写入DSPINT位,然后查看IFR寄存器,检查是否产生中断

请求。

b). C54X发送中断到主机。当C54X将1写入HPIC的HINT比特位时,HINT引脚变为低电

平,主机可以利用该引脚接收C54X发生的中断信号。无论是主机或C54X都可以通过读取

HPIC来判断HINT引脚的状态。读出的HINT比特位为0,表示该引脚为高电平;1表示该引

脚为低电平。HPIC中的HINT比特位只能通过主机清除,即主机写1到HPIC的HINT位后,外

部引脚HINT的状态变回到高电平(这时再读取HPIC,HINT位为0)。

(4) 通过HPI完成BOOT LOADER

C54X的BOOTLOADER是芯片在出厂时由生产厂家写入的一段ROM程序。该程序的

启动地址正是C54X复位后的起始地址0FF80h。用户可以利用BOOTLOADER方便地将自

己的代码程序传送到指定的地方,并开始执行。BOOTLOADER有多种工作方式,通过HPI

完成BOOTLOADER是其中的一种。HPI模式需要外部引脚连接配合,即需要将引脚HINT

与引脚INT2相连,参见图7-1。

C54X复位后,BOOTLOADER程序将HPIC的HINT位置1,于是HINT引脚和INT2

引脚变为低电平,然后BOOTLOADER程序通过判断IFR的D2位(即有无INT2中断)以

确定是否为HPI启动。若D2=1,则跳转到1000h开始执行。所以在本实验中,我们将启动

代码写入到1000h地址开始的单元,以便复位后自动执行。若使用增强HPI接口如VC5402

中,你在写入DSP代码后,只需要将程序进入点地址写入0x7f单元,BOOTLOADER会自

动跳转到指定地址开始运行,而不用再次复位!

4.实验内容

在本实验中,我们利用HPI BOOTLOADER装入C54X的指令代码,然后启动C54X并

检查运行结果。本实验最好在TURBO C 2.0环境下运行。首先运行配套CDROM下的

88

HPI5402目录中的,启动TURBO C 2.0。后面的实验步骤应该在TURBO C下分段

执行。实验步骤如下:

a). 首先将DES板上的JP5跳线短接,以便允许HPI BOOT。然后接通电源或按复位键

重新启动。

b). 主机初始化HPIC寄存器。先设置A1,A2为0,使得HCNTL0/1脚为0选择HPIC

寄存器,然后写入HPIC的初始值0x0808。这一步的目的主要是设置BOB位,以确定正确

的数据传输方式。本实验设置BOB=0,所以以后的数据传输过程一定是高8位在前,低8

位在后。因为HPIC的高8位和低8位一致,所以主机设置HPIC时可以不管BOB的状态。

请比较前后两次读出的HPIC有什么区别?(注意HINT位的状态)

c). 装入C54X的指令代码。这一步是通过调用write_DSP_code2( )函数来完成的。从前

面可以了解到,如果采用HPI BOOTLOADER,复位后程序将从DSP的0x7f给出的地址开

始执行。本实验中PC主机将C54X的指令代码装到1000h开始的片内RAM中。首先选择

HPI的地址寄存器HPIA,然后将0x0fff写入HPIA。接着选择HPI的数据寄存器HPID(自

动加模式)。前面讲过,对于HPI的写入操作,如果使用地址自动增加模式,一定是先完成

地址增加,再将数据写入。以后便可以连续写入数据而不用修改地址。

你可以编写一个函数checkcode( )将刚才写入的指令代码数据读出,以便检查。

本实验中使用的汇编代码参见表7-2。这段代码执行的结果是用寄存器A的低16位值

填充1400h开始的1K RAM的内容,而且这些内存单元的内容是依次递增的。最后,程序

循环将IFR寄存器写入1020h单元。在write_DSP_code2()函数中写入的C54X指令代码数

据可以有很多方法获得。一个简单的方法是在CCS环境中直接反汇编助寄符指令,然后记

录指令代码。

表7-2 C54X实验代码

地址单元

1000h

1001h

1003h

1005h

1006h

1008h

100ah

100ch

100dh

100fh

助寄符指令

Ssbx intm

Stm #1400h,ar0

Ld #3ffh,b

Stl a,*ar0+

Add #1,a

Sub #1,b,b

Bc 1005h,bneq

Nop

Mvmd ifr,1020h

B 100ch

指令代码(16进制)

F7bb

7710 1400

F120 03ff

8090

F000 0001

F310 0001

F84c 1005

F495

7301 1020

F073 100c

注释

关闭所有中断

将AR0初始化为1400h

初始化B为3FFh

将A的低16位存入*AR0,然后AR0++

A寄存器加1

B寄存器减1

如果B寄存器不等于0,跳转到1005h

空操作

将中断标志寄存器IFR保存到1020h

跳转到100Ch,重复执行

d). 在checkload( )函数之前修改HPIC中的BOB位,使其等于1。再次运行checkload( )

函数后,比较两次读出的数据。

e). 去掉checkload()函数,执行装入并启动C54X运行。启动DSP的方法为:将程序进

入点地址0x1000写入0x7f单元。由于使用HPI BOOTLOADER,程序将从1000h执行。

f). 检查程序运行结果。先选择地址寄存器HPIA,然后写入1400h,设置起始地址为

1400h。从1400h连续读出16个数据,它们应该为0x1000 ,0x1001 ,0x1002 , … ,0x100F。接

下来再检查HPIA,看看HPIA应等于多少?。

g). 读取HPIC的值,看看哪个比特为1,想想为什么?若将0808h写入HPIC,再读回

HPIC时,看看HINT位是否被清除?

h). PC机向C54X发送中断请求。为了验证主机是否向C54X发送了中断,我们先读

取存放IFR寄存器的内存单元1020h,然后将HPIC的DSPINT位置1,再检查1020h单元,

看看IFR的D9位是否为1?

89

5.思考题:

1). 使用write_DSP_code1()函数装入代码,观察结果。

2). 请编写一段程序,使其能响应主机发送的中断请求并求出指定的两个单元的和。要

求:主机将两个加数分别放在1020h和1021h,然后发送中断请求,C54X响应中断,并将

计算结果放在1022h,然后DSP通知主机计算完毕。主机收到通知后才从1022h单元取回

结果。

90

2024年10月29日发(作者:大秀杰)

实验七 HPI接口操作

1.实验目的

在C54X系列中,只有542,545,548和549提供了标准8位HPI接口,而C54XX系列

都提供了8位或16位的增强HPI接口。外部主机或主处理器可以通过HPI接口读写C54X

的片内RAM,从而大大提高数据交换的能力。标准HPI接口中外部主机只能访问固定位置的

2K大小的片内RAM,而增强HPI接口可以访问整个内部RAM。本实验利用DES提供的HPI接

口,学习HPI接口的设计和使用。本实验的C语言源程序文件名为5402pp.c。

2.实验要求

本实验在TURBO C 2.0的环境下完成。在实验过程中,学生将利用C语言在PC机(主

机)上装入并运行一段C54X的汇编代码,来学习HPI的各个寄存器的使用。为了充分理解

和掌握HPI各个寄存器的使用,学生应该能熟练运用TURBO C,以便灵活设置、修改、查看

各个HPI寄存器以及HPI接口的状态。

3.实验原理

(1) HPI的接口设计

主机利用HPI访问C54X的片内RAM,实际上是通过读写HPI的数据和地址寄存器来

实现的。由于C542的HPI为8位,所以一个内存单元必须通过两次HPI读写来完成。标准

HPI有两种工作模式:RAM共享和主机访问模式。在RAM共享模式中,主机和C54X都

可以访问HPI的共享内存。对C542而言,HPI的共享内存大小为2K字,地址从0x1000到

0x17ff。使用该模式,HPI支持的最高传输速度为CLKOUT/5每字节。如果是主机访问模式,

那么只有主机才能访问C54X的片内RAM。例如在RESET=0或IDLE2状态下,主机仍然

能访问片内RAM,利用这一点可以实现C54X的HPI BOOTLOADER。图7-1是DES中C542

的HPI与PC的接口示意图。

10K上拉至VCC

PC机并口 C54X(HPI)

数据线D0-D7

HD0-HD7 HDS1

并口地址译码

HCS HAS

HDS2 HPIENA

并口读写

HR/W HRDY

悬空

A1

HCNTL0

A2

HCNTL1

A0

HBIL

HINT

INT2 (C542外部中断引脚)

10K上拉至VCC

图7-1 DES的HPI接口示意图

84

增强型HPI(如VC5402,VC5409,VC5410等)都是共享模式,而且只能在DSP时钟

信号有效时才能访问片内RAM。所以VC5402在使用HPI BOOTLOADER时是将程序进入

点的地址写入0x7f单元,DSP的BOOTLOADER会根据这个地址自动执行你通过HPI接口

装入的代码。

在图7-1中,HPI的数据线HD0-HD7通过缓冲隔离BUF与PC机的数据线D0-D7相连。

HCNTL0/1和HBIL为控制信号线,HDS1/2、HAS、HCS为HPI的选通控制线,HR/W为

读写控制信号线,HRDY为HPI准备就绪信号线。HINT为HPI中断信号线。下面分别详细

讨论:

HCNTL0/1信号线用来选择主机将要读写的是HPI的哪个寄存器,它们由PC并口的

A1,A2位决定。00是,表示主机可以访问HPI的控制寄存器HPIC;01和11表示主机可

以访问数据寄存器,只是01模式允许主机在读写HPI的数据时地址自动加1,而11模式地

址寄存器将不会改变。当A1=0,A2=1时,表示主机可以访问HPI的地址寄存器。

HBIL为比特传输控制位,由PC并口A0位决定。当HBIL(即A5)=0时,表示当前

传输的是一个C54X内存单元(16位)的第一个字节(第一个8位),HBIL为高时表示传

输第二个字节。而这两个8位哪个是高8位,哪个是低8位,不是由该信号控制,而是由

HPIC中的BOB位确定。

在HPI的选通控制信号中,HCS为片选信号,HAS为地址锁存信号,HDS1/2为读写

或数据使能信号。在DES的HPI接口设计中,将它们简化,仅使用HCS和HDS2,其它接

为高电平。DES中主机(PC机)通过并口来访问HPI。所以HPI的选通信号由PC的并口

地址译码信号产生。

HR/W为HPI的读写控制信号,高电平为读操作,低电平为写操作。HRDY为HPI的

输出信号,高电平表示HPI准备就绪,该信号DES中没有使用。HINT也是一个输出信号,

由HPIC中的HINT比特位确定,HPI可以利用该引脚中断主机。另外,引脚HPIENA为高

电平表示允许HPI接口工作,若要使用HPI,该引脚必须接高电平。

(2) HPI的控制寄存器

HPI有三个寄存器:地址寄存器HPIA,控制寄存器HPIC以及数据寄存器HPID。参见

表7-1。图7-2和图7-3给出了主机和C54X访问HPIC的情况。注意,主机读写HPIC时高

8位和低8位是一样的,写的时候应保持一致。下面将详细介绍各个BIT位的含义:

表7-1

寄存器

HPIA

HPIC

HPID

C54X地址

-

002Ch

-

说 明

HPI地址寄存器,只能由主机读写。该寄存器对应主机访问的

C54X的片内RAM地址。

HPI控制寄存器。C54X和主机都可以读写。详细说明后面介绍。

HPI数据寄存器。只能由主机读写。主机读写该寄存器将修改

C54X的片内HPI共享RAM。

图7-2 PC主机读HPI控制寄存器HPIC

85

图7-3 PC主机写HPI控制寄存器HPIC

图7-4 C54X读取HPIC

图7-5 C54X写HPIC

BOB位:该比特位只能由主机读写,C54X无法访问。如果BOB=1,表示HPI的16位

传输中的第一个8位字节是低8位;BOB=0,表示第一个8位字节为高8位。该比特位必

须在读写数据和地址寄存器之前设置。

SMOD位:该比特位主机只能读,而C54X可以读写。如果SMOD=1,表示起用共享

RAM模式,主机和C54X都可以访问HPI共享RAM;如果SMOD=0,表示HPI工作在主

机访问模式,C54X将无法访问2K的HPI共享RAM。C54X复位时,SMOD设置为0;复

位操作执行完成后,SMOD=1。VC5402中,该比特无效。

DSPINT位:该比特位只能由主机写,并且C54X和主机都无法读取。当主机将1写到

该比特位时,将产生一个中断到C54X。如果IMR寄存器中的HPINT位(D9)被设置为1,

DSP将响应该中断,执行相应的中断服务程序。

HINT位:该比特位主机和C54X都可以读写。该比特决定了C54X引脚HINT的状态。

C54X可以利用该信号发送中断到主机。当C54X在复位状态时,HINT比特位为0,对应的

HINT脚为高电平。当C54X将该比特位设置为1时,HINT脚将变为低电平。注意,当主

机和C54X读取该比特位时,它将反映HINT引脚的状态,0表示高电平,1表示低电平。

另外,该比特位只能由C54X设置,由主机清除。主机将1写到该比特位,将清除HINT位,

即HINT位为0。

在C54X中,如C542,HPI共享RAM总共有2K字,地址在片内数据空间的1000h到

17FFh。如果在PMST中设置OVLY比特位为1,那么也可以是程序空间的1000h到17FFh。

主机通过HPIA寄存器作为地址锁存器来读写对应的C54X片内RAM。在HPIA中只有低

11位有效,所以如果HPIA的值为0h,0800h,1000h,1800h,…,f800h,实际上都对应的HPI共

享RAM的第一个字1000h,因为这时HPIA的低11位完全一致,都为0。而C54XX,如

VC5402使用增强型HPI接口,这时HPIA有16位,主机可以访问直接访问所有片内存储

器 !

当主机通过HPI接口的数据寄存器HPID读写C54X的片内RAM时,可以选择地址自

动增加模式。注意,读和写对应不同的增加方式。如果主机是读操作,那么HPIA在读完后

自动加1;如果是写操作,那么HPIA将在写之前自动加1。例如,如果HPIA的值为0FFFFh,

这时主机对HPI的数据寄存器HPID进行写入操作,那么修改的将是HPI RAM的1000h。

这是因为HPIA在写之前加1后变为0,所以对应的HPI RAM为1000h。

86

(2) 通过HPI接口访问片内RAM

主机通过HPI接口访问C54X片内RAM的一般步骤如下:

a). 首先初始化HPIC寄存器,特别是BOB位。具体方法为:先设置HCNTL1和HCNTL0

为0,选择将要对HPIC进行操作。然后将HPIC的值写入HPI。注意HPIC的高8位和低8

位是一样的。本实验初始化HPIC=0,即将BOB设置为0,那么在以后读写HPIA和HPID

时一定是高8位在前,低8位在后。参见下列C语言程序:

t=HPIC_Read(); /* read back of HPIC */

HPIC_Write(0x0808); /* hpic, bob=0, clear hpint! first is high 8 bit */

void HPIC_Write(unsigned int w)

{ unsigned char t1,t2;

t1 = (0xff00 & w) >>8 ;

t2 = (0x00ff & w);

Addr_Byte_Write(0x40,t1);

Addr_Byte_Write(0x41,t2); /* hpic, write */

}

int HPIC_Read(void)

{ unsigned t1=0,t2=0;

t1=Addr_Byte_Read(0x0);

t2=Addr_Byte_Read(0x1); /* readback of HPIC */

return( (t1<<8) | t2);

}

b). 设置地址寄存器HPIA。先设置HCNTL1=1&HCNTL0=0,选择将要对HPIA进行操作。然

后将要访问的C54X片内RAM的地址写入HPI。一定是高8位先写,低8位后写。

c). 读写C54X的片内RAM。先设置HCNTL1/0,选择将要对数据锁存器HPID进行操

作。如果设置HCNTL1=0&HCNTL0=1,表示使用地址自动增加模式;如果设置

HCNTL0=HCNTL1=1时,表示不使用地址自动增加模式,这时完成读写操作后,地址寄存

器HPIA将不会变。参见下列C语言程序:

HPIA_Write(0x1000); /* 设置HPIA=0x1000,假设这时BOB位=0 */

HPID_Write(0xf7bb); /* (HCNTL1=1,HCNTL0=1),select HPID */

/* 这时将数据写入HPI时,地址不会自动增加 */

/* 写入指令代码: ssbx intm (0xf7bb), HPIA=0x1000 */

HPID_Write_Auto(0x7710); /* (HCNTL1=0,HCNTL0=1),select HPID */

/* 这时将数据写入HPI时,地址将自动增加 */

87

/* 写入2nd 指令代码0x7710,这时HPIA=0x1000,先将HPIA ++,

再写入数据,所以0x7710被写到C54X的片内地址0x1001单元 */

HPID_Write_Auto(0x1400); /* 将指令代码0x1400写入C54X片内地址0x1002单元,

HPID_Write_Auto(0x1400); /* 将指令代码0x1400写入C54X片内地址0x1002单元,

写完后HPIA=0x1002 */

t=HPID_Read_Auto(); /* 从0x1002单元读出数据,然后HPIA加1。结果为

t=0x1400 */

(3) HPI接口中断的使用

通过HPI接口,主机和C54X之间可以相互发送中断请求:主机通过HPIC寄存器的

DSPINT位中断C54X,而C54X可以通过HPIC寄存器的HINT位发送中断请求到主机。下

面将分别详细讨论:

a). 主机发送中断到C54X。当主机将1写入到HPI控制寄存器HPIC的DSPINT比特位时,

C54X将产生一个中断请求。该比特位主机和C54X读取的结果都是0,而且主机写入0没有任

何意义。在C54X中,该中断位于中断屏蔽寄存器IMR和中断标志寄存器IFR的D9位,其中

断入口地址位于中断向量表中64h。如果IMR中该比特位为1,同时INTM标志为0允许中断请

求时,C54X将响应并口中断,程序将跳转到中断向量表的64h,开始执行中断服务程序。本

实验中,学生可以使用C语言将1写入DSPINT位,然后查看IFR寄存器,检查是否产生中断

请求。

b). C54X发送中断到主机。当C54X将1写入HPIC的HINT比特位时,HINT引脚变为低电

平,主机可以利用该引脚接收C54X发生的中断信号。无论是主机或C54X都可以通过读取

HPIC来判断HINT引脚的状态。读出的HINT比特位为0,表示该引脚为高电平;1表示该引

脚为低电平。HPIC中的HINT比特位只能通过主机清除,即主机写1到HPIC的HINT位后,外

部引脚HINT的状态变回到高电平(这时再读取HPIC,HINT位为0)。

(4) 通过HPI完成BOOT LOADER

C54X的BOOTLOADER是芯片在出厂时由生产厂家写入的一段ROM程序。该程序的

启动地址正是C54X复位后的起始地址0FF80h。用户可以利用BOOTLOADER方便地将自

己的代码程序传送到指定的地方,并开始执行。BOOTLOADER有多种工作方式,通过HPI

完成BOOTLOADER是其中的一种。HPI模式需要外部引脚连接配合,即需要将引脚HINT

与引脚INT2相连,参见图7-1。

C54X复位后,BOOTLOADER程序将HPIC的HINT位置1,于是HINT引脚和INT2

引脚变为低电平,然后BOOTLOADER程序通过判断IFR的D2位(即有无INT2中断)以

确定是否为HPI启动。若D2=1,则跳转到1000h开始执行。所以在本实验中,我们将启动

代码写入到1000h地址开始的单元,以便复位后自动执行。若使用增强HPI接口如VC5402

中,你在写入DSP代码后,只需要将程序进入点地址写入0x7f单元,BOOTLOADER会自

动跳转到指定地址开始运行,而不用再次复位!

4.实验内容

在本实验中,我们利用HPI BOOTLOADER装入C54X的指令代码,然后启动C54X并

检查运行结果。本实验最好在TURBO C 2.0环境下运行。首先运行配套CDROM下的

88

HPI5402目录中的,启动TURBO C 2.0。后面的实验步骤应该在TURBO C下分段

执行。实验步骤如下:

a). 首先将DES板上的JP5跳线短接,以便允许HPI BOOT。然后接通电源或按复位键

重新启动。

b). 主机初始化HPIC寄存器。先设置A1,A2为0,使得HCNTL0/1脚为0选择HPIC

寄存器,然后写入HPIC的初始值0x0808。这一步的目的主要是设置BOB位,以确定正确

的数据传输方式。本实验设置BOB=0,所以以后的数据传输过程一定是高8位在前,低8

位在后。因为HPIC的高8位和低8位一致,所以主机设置HPIC时可以不管BOB的状态。

请比较前后两次读出的HPIC有什么区别?(注意HINT位的状态)

c). 装入C54X的指令代码。这一步是通过调用write_DSP_code2( )函数来完成的。从前

面可以了解到,如果采用HPI BOOTLOADER,复位后程序将从DSP的0x7f给出的地址开

始执行。本实验中PC主机将C54X的指令代码装到1000h开始的片内RAM中。首先选择

HPI的地址寄存器HPIA,然后将0x0fff写入HPIA。接着选择HPI的数据寄存器HPID(自

动加模式)。前面讲过,对于HPI的写入操作,如果使用地址自动增加模式,一定是先完成

地址增加,再将数据写入。以后便可以连续写入数据而不用修改地址。

你可以编写一个函数checkcode( )将刚才写入的指令代码数据读出,以便检查。

本实验中使用的汇编代码参见表7-2。这段代码执行的结果是用寄存器A的低16位值

填充1400h开始的1K RAM的内容,而且这些内存单元的内容是依次递增的。最后,程序

循环将IFR寄存器写入1020h单元。在write_DSP_code2()函数中写入的C54X指令代码数

据可以有很多方法获得。一个简单的方法是在CCS环境中直接反汇编助寄符指令,然后记

录指令代码。

表7-2 C54X实验代码

地址单元

1000h

1001h

1003h

1005h

1006h

1008h

100ah

100ch

100dh

100fh

助寄符指令

Ssbx intm

Stm #1400h,ar0

Ld #3ffh,b

Stl a,*ar0+

Add #1,a

Sub #1,b,b

Bc 1005h,bneq

Nop

Mvmd ifr,1020h

B 100ch

指令代码(16进制)

F7bb

7710 1400

F120 03ff

8090

F000 0001

F310 0001

F84c 1005

F495

7301 1020

F073 100c

注释

关闭所有中断

将AR0初始化为1400h

初始化B为3FFh

将A的低16位存入*AR0,然后AR0++

A寄存器加1

B寄存器减1

如果B寄存器不等于0,跳转到1005h

空操作

将中断标志寄存器IFR保存到1020h

跳转到100Ch,重复执行

d). 在checkload( )函数之前修改HPIC中的BOB位,使其等于1。再次运行checkload( )

函数后,比较两次读出的数据。

e). 去掉checkload()函数,执行装入并启动C54X运行。启动DSP的方法为:将程序进

入点地址0x1000写入0x7f单元。由于使用HPI BOOTLOADER,程序将从1000h执行。

f). 检查程序运行结果。先选择地址寄存器HPIA,然后写入1400h,设置起始地址为

1400h。从1400h连续读出16个数据,它们应该为0x1000 ,0x1001 ,0x1002 , … ,0x100F。接

下来再检查HPIA,看看HPIA应等于多少?。

g). 读取HPIC的值,看看哪个比特为1,想想为什么?若将0808h写入HPIC,再读回

HPIC时,看看HINT位是否被清除?

h). PC机向C54X发送中断请求。为了验证主机是否向C54X发送了中断,我们先读

取存放IFR寄存器的内存单元1020h,然后将HPIC的DSPINT位置1,再检查1020h单元,

看看IFR的D9位是否为1?

89

5.思考题:

1). 使用write_DSP_code1()函数装入代码,观察结果。

2). 请编写一段程序,使其能响应主机发送的中断请求并求出指定的两个单元的和。要

求:主机将两个加数分别放在1020h和1021h,然后发送中断请求,C54X响应中断,并将

计算结果放在1022h,然后DSP通知主机计算完毕。主机收到通知后才从1022h单元取回

结果。

90

发布评论

评论列表 (0)

  1. 暂无评论