DSP课设HPI主机接口应用.doc
《DSP课设HPI主机接口应用.doc》由会员分享,可在线阅读,更多相关《DSP课设HPI主机接口应用.doc(18页珍藏版)》请在冰豆网上搜索。
![DSP课设HPI主机接口应用.doc](https://file1.bdocx.com/fileroot1/2022-10/7/3bced842-8f3d-43d9-b7e7-78e058797d0b/3bced842-8f3d-43d9-b7e7-78e058797d0b1.gif)
成绩评定表
学生姓名
班级学号
专业
电子信息工程
课程设计题目
HPI主机接口应用
评
语
组长签字:
成绩
日期
20年月日
课程设计任务书
分院(系)
信息科学与工程学院
专业
电子信息工程
学生姓名
学号
设计题目
HPI主机接口应用
内容及要求:
1.完成TMS320C5509使用HPI与89S51连接
2.完成DSP对HIP口初始化设计
工作计划与进度安排:
2012年12月31日 选题、查阅资料及编写软件程序(或硬件原理图设计)。
2013年01月01-11日 课内上机调试程序及仿真。
2013年01月01-11日 课外上机调试程序及仿真。
2013年01月01-11日 调试出结果、调试结果验收并写报告。
2013年01月01-11日修改报告及提交报告电子版(修改之后)。
2013年01月01-11日正式提交报告(打印版)及参加第一次答辩。
指导教师(签字):
年月日
分院院长(签字):
年月日
II
沈阳理工大学信息科学与工程学院DSP课程设计报告
摘要
以TMS320C5509为例,介绍了其系列DSP(digitalsignalprocessing)芯片HPI(hostportinterface)口的各个组成部分及其功能,并以89S51单片机作为主处理机,阐述了其与TMS320C509之间实现数据共享的方法,最后通过DSP芯片成功初始化HPI接口,完成了主机与DSP芯片的连接和通信。
关键词:
DSP;TMS320C55x;HPI接口;单片机
目录
1相关知识 3
1.1TMS320C55x开发环境 3
1.1HPI接口 3
2设计任务及目的 4
2.1设计任务 4
2.2设计目的 4
3设计原理 5
3.1HPI-8接口结构 5
3.2HPI-8接口信号和控制寄存器 6
3.3HPI-8基本功能描述 8
4程序清单 10
4.1TMS320C55xHPI接口DSP端程序 10
4.2TMS320C55xHPI接口单片机端程序 12
5结论 15
6参考文献 16
1相关知识
1.1TMS320C55x开发环境
C55x编程可以采用汇编语言,也可以采用C/C++语言,本次编程主要采用汇编语言完成,所以执行效率高。
C55x的软件开发环境是CCSv3.1(CodeComposerStudio),是IT公司推出的用于开发DSP芯片的集成环境,它集编辑、编译、链接、软件仿真、硬件调试、以及实时跟踪功能于一体。
1.2HPI接口
HPI是HOSTPORTINTERFACE的简称。
HPI是一个与主机通信的并行接口,主要用于DSP与其他总线或CPU进行通信。
信息可通过‘C54x的片内存储器与主机进行数据交换。
不同型号的器件配置不同的HPI口,可分为8位标准标准HPI接口、8位增强型HPI接口和16位增强型HPI接口。
TMS320C5402芯片的HPI接口分为HPI8(8位主机接口)和HPI16(16位主机接口)两种,其应用方式大同小异,主要介绍HPI8。
HPI8实际上是一个8位的并行端口,主机通过它可以直接访问DSP片内的一段RAM。
在早期的DSP中,这段公用的RAM是一段2K字的双口RAM(对于TMSVC5402则可以访问所有的片内RAM)。
当主机和DSP同时访问同一地址时,主机优先。
由于TI的DSP芯片都是16位的,而HPI8只有8根数据线,所以数据的传输必须以字节为单位。
在DSP与主机传送数据时,HPI能自动地将外部接口传来连续的8位数组合成16位数后传送给主机。
2设计任务及目的
2.1设计任务
(1)熟悉DSP指令的用法
(2)掌握TMS320C5509的特点
(3)了解HPI接口的原理
(4)掌握单片机与DSP芯片的连接方法
(5)编写HPI初始化程序,在DSP芯片上运行
2.2设计目的
HPI主机接口是DSP芯片内部用于并行通信的一种接口部件,它主要用于将DSP和其他外部总线或CPU进行连接。
HPI接口通过HPI控制寄存器(HPIC)、HPI地址寄存器(HPIA)和HPI数据寄存器(HPID)以及HPI内存区,实现和主机之间的通信。
其主要特点是接口所需要的外围硬件很少,HPI接口单元允许芯片直接利用一个或两个数据选通信号、一个独立或复用的地址总线、一个独立或复用的数据总线连接到微控制器(MCU)上,主机和DSP可以独立地对HPI接口操作,主机和DSP的握手可通过中断方式快速实现。
另外,主机还可以通过HPI接口装载DSP应用程序、接受DSP运行结果、判断或决定DSP的运行状态和工作方式,HPI主机接口为DSP芯片的接口开发提供了一种方便、快捷的方法。
根据HPI接口数据总线的不同,可以分为HPI-8主机接口和HPI-16主机接口。
本次课设要求设计与HPI-8相关的接口程序。
3设计原理
3.1HPI-8接口结构
HPI-8为8位并行口,提供了C55x和外部主机接口。
C55x通过片内的RAM与主机设备交换数据。
HPI-8为从设备,它使主机能够访问C54x内部的存储区。
其接口包括一个8比特的双向数据和各种控制信号。
16为的数据分为高、低两个字节传输,用HBIL信号线来控制传输的是高字节还是低字节。
主机和HPI-8的通信通过专用的地址和数据寄存器完成,对C54x来说,这些区域不能直接读/写。
HPI控制寄存器允许主机和C54x进行读写,包括配置通信协议和控制通信(握手)的比特。
一个简单的HPI-8框图如图2.1所示:
HPI-8在8位外围接口时提供了有效地16位数据传输方式。
方法是将连续发送的字节自动组成16比特字。
当主机用HPI-8传送数据时,HPI-8控制逻辑自动进入C55x片内RAM存取数据,然后C55x在存储空间内进行读/写。
C55x和主机都能访问C55x的片内RAM。
当主机存取时必须同步于C55x时钟,以确保片内RAM读/写正确。
当C55x和主机同时读/写同一存储区域是将产生冲突,这时主机具有优先权,C55xCPU将等待一个时钟周期。
3.2HPI-8接口信号和控制寄存器
HPI-8接口控制信号主要包括以下几类:
HAS:
地址锁存(ALE)或选通输入信号,如不用则接高电平
HBIL:
地址控制输入信号,HBIL=L时,读/写第1字节;HBIL=H是,读/写第2字节。
HBIL和HPI控制寄存器(HPIC)中的BOB位结合使用
HCNTL0,HCNTL1:
地址控制输入信号,供主机选择读/写HPIC、HPIA或HPID
HCS:
HPI选通使能,主机对HPI访问期间,信号HCS要保持低电平
HD0~HD7:
HPI双向三态数据总线
HDS1,HDS2:
读/写数据选通输入信号
HINT:
输出信号,供主机产生中断时使用
HRDY:
输出信号,供主机等待时使用。
当信号为高电平时,主机可进行数据传输;为低电平时,HPI接口忙,主机不可传送数据。
HR/W:
读/写选通输入信号
HPI-8控制字寄存器包括以下几类:
(1)HPI控制寄存器(HPIC):
HPIC为16位寄存器,其高8位和低8位完全相同,各位的功能如下:
BOB:
由主机读/写,如BOB=1,主机读/写的第1字节为低字节,第2字节为高字节;如BOB=0,主机读/写得第1字节为高字节,第2字节为低字节;主机第1次存取HPIA和HPID之前,BOB必须先进行初始化。
DSPINT:
由主机写,写DSPINT=1,C55x产生DSPINT中断;写DSPINT=0,无任何影响。
HINT,主机和C55x均可读/写,该位决定C55x引脚HINT的输出状态。
C55x复位时HINT=0,C55x写HINT=1使HINT变低,可用来中断主机;主机写HINT=1可清除中断。
(2)HPI地址寄存器(HPIA):
HPIA只能由主机直接访问,它包含了当前访问所需的C55x片内RAM地址。
(3)HPI数据锁存器(HPID):
主机通过HPID与HPI内存块交换数据,HPI接口根据HPIA值,有HPI接口控制信号确定是将HPI内存单元值读入HPID,还是将HPID值写入HPI内存单元,读/写过程约需5个C55x时钟周期。
因此,主机读/写周期一般需要大于5个C55x时钟周期。
图3.2给出了HPI-8中3个寄存器的联系和工作情况:
图3.2HPI-8的控制寄存器
3.3HPI-8基本功能描述
外围HPI-8接口可以不需要或只需要很少一部分附加逻辑,就能够与各种主机相连接。
8位数据总线(HD0~HD7)用于与主机交换数据;两个控制输入(HCNTL0和HCNTL1)指示访问哪一个HPI-8寄存器;输入和HBIL一起,通常由主机地址总线驱动。
图3.3给出了HPI-8和主机设备之间的一个简单连接关系:
图3.3HPI-8连接框图
HPI-8使用中断逻辑使得软件的通信“握手”变得容易。
主机通过在HPIC寄存器中设置特定位来中断C55xCPU。
同样,C55x也能够使用HINT输出来中断主机。
C55x和主机都可以通过设置HPIC寄存器的HINT位来产生中断。
主机编程流程图如下:
4程序清单
4.1TMS320C55xHPI接口DSP端程序
typedefstruct
{inthead;//framehead
intlength;//framelength
intfunc; //functype
intdata[253]; //thedata
}HPIFRAME;
HPIFRAMEhpiinbuf;
HPIFRAMEhpioutbuf;
#pragmaDATA_SECTION(hpiinbuf,".hpibuffer")
#pragmaDATA_SECTION(hpioutbuf,".hpibuffer")
voidmain()
{
charhpidatacnt;
HPIFRAME *hpiinbufptr=&hpiinbuf;
HPIFRAME *hpioutbufptr=&hpioutbuf
c55_init();
ser0inwrcnt=1;
ser0outrdcnt=5;
ser0inrdcnt=5;
ser0outwrcnt=1;
ser0flag=0;
for(;;)
{
if(hpirecflag>=1)