实验七 HPI接口操作

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验七 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 )
悬空
INT2 (C542外部中断引脚)
10K 上拉至VCC
图7-1 DES 的HPI 接口示意图
增强型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
图7-2 PC主机读HPI控制寄存器HPIC
图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中设置OVL Y比特位为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。

(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时,地址将自动增加 */
/* 写入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下的
HPI5402目录中的TC.EXE,启动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实验代码
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?
5.思考题:
1). 使用write_DSP_code1()函数装入代码,观察结果。

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

要求:主机将两个加数分别放在1020h和1021h,然后发送中断请求,C54X响应中断,并将计算结果放在1022h,然后DSP通知主机计算完毕。

主机收到通知后才从1022h单元取回结果。

相关文档
最新文档