2023年12月23日发(作者:)

实验一 CCS使用和数据存储实验

一、 实验目的

1. 掌握CCS的使用

2. 掌握 TMS320C54X 程序空间的分配;

3. 掌握 TMS320C54X 数据空间的分配;

4. 能够熟练运用TMS320C54X 数据空间的指令。

二、 实验设备

计算机,CCS 3.1版软件,DSP仿真器,E300实验箱,DSP-54XP CPU板。

三、 实验步骤与内容

1. 在进行 DSP实验之前,需先连接好仿真器、实验箱及计算机,连接方法如下所示:

2. E300 底板的开关SW4 的第1位置ON,其余位置OFF。其余开关设置为OFF。

3. 上电复位

在硬件安装完成后,确认安装正确、各实验部件及电源连接无误后,启动计算机,接通仿真器电源,此时,仿真器上的“红色指示灯”应点亮,否则DSP开发系统与计算机连接存在问题。

4. 运行CCS程序

1) 待计算机启动成功后,实验箱220V电源置“ON”,实验箱上电

2) 启动CCS3.1,进入CCS界面后,点击“Debug—Connect”

3) 此时仿真器上的“绿色指示灯”应点亮,CCS正常启动,表明系统连接正常;否则仿真器的连接、JTAG 接口或CCS 相关设置存在问题,这时需掉电检查仿真器的连接、JTAG

接口连接是否正确,或检查CCS相关设置是否存在问题。

5. 成功运行CCS 程序后,首先应熟悉CCS的用户界面;

6. 学会在CCS环境下创建工程文件、添加程序文件、编写程序、编译、装载、调试,学习如何使用观察窗口等。

7. 用“Projectopen”打开“normal 01_mem ”.

编译并装载“ 01_”

8.用“Edit”下拉菜单中的“Memory/Fill”编辑内存单元,参数设置如下图:

1

单击“OK”此时以0x1000 为起始地址的16个内存单元被修改成:0x0009

9.用“View”下拉菜单“Memory”观察内存单元变化,输入要查看的内存单元地址,本实验要查看0x1000H~0x100FH 单元的数值变化,输入地址0x1000H;

单击“OK”如下图所示:

10. 点击“DebugGo main”进入主程序,在程序中“加软件断点1”和“加软件断点2”处施加软件断点。

11. 单击“DebugRun”运行程序,也可以“单步”运行程序;当程序运行到“软件断点1”处时,查看0x1000H~0x1007H单元的值变化,

12. 再单击“DebugRun”,当程序运行到“软件断点2”处时,查看0x1008~0x100F 单元的变化。

13. 闭各窗口,本实验完毕

四、 程序流程图

2

五、 实验程序

#include "DspRegDefine.h" //VC54x 寄存器定义

#include "stdio.h" //输入输出头文件

#include "e300_codec.h"

//**********************子函数声明********************************//

void cpu_init(void); //初始化CPU

//************************* 主函数 *******************************//

void main()

{

UINT16 i;

UINT16 * room;

UINT16 * room1;

room=(UINT16 *)0x1000; // 设指针px为1000H

room1=(UINT16 *)0x1008; // 设指针px为1000H

//**********************CPU初始化*********************************//

cpu_init();

/*将0xAAAA写入从数据空间的地址0x1000开始的8个单元中*/

for(i=0;i<8;i++)

{

* room=0xAAAA;

room++;

}

asm(" nop");//加软件断点1

/*从0x1000开始的8个空间读出数据依次写入从0x1008开始的8个单元中*/

for(i=0;i<8;i++)

{

*room1=*(room-1);

room--;

room1++;

}

for(;;)

{

} //加软件断点2

}

//*************************结束**********************************//

cpu_init()函数见附录

六 实验结果

1、程序运行到断点1处数据存储器的内容如下图:

3

2、程序运行到断点2处数据存储器的内容如下图:

实验二CPU定时实验

一、实验目的

1、熟悉TMS320C54X 的定时器;

2、掌握TMS320C54X 的定时器的控制方法;

3、学会使用CPU定时器中断方式控制程序流程。

二、实验设备

计算机,CCS 3.1版软件,DSP硬件仿真器,E300 实验箱,DSP-54XP CPU板。

三、实验原理说明

实验是采用CPU定时器来定时使LED 亮灭的。C54x 的定时器是一个20 位的减法计数器,可以被特定的状态位实现停止、重新启动、重设置或禁止,可以使用该定时器产生周期 4

性的CPU中断,控制定时器中断频率的两个寄存器是定时周期寄存器PRD和定时减法寄存器TDDR,定时器的中断周期为:

CLKOUT * (TDDR+1) * (PRD+1)

在本系统中,如果设置时钟频率为10MHZ,令PRD = 0x30D3,TDDR=15,这样得到每0.02

秒中断一次,通过累计50 次,就能实现1 秒钟定时。

0.1us * (15+1) *( 12499+1) * 50 =1S

四、实验步骤和内容

1、E300 底板的开关SW4 的第1位置ON,其余位置OFF。其余开关设置为OFF。

2、运行CCS软件,调入样例程序,装载并运行;(进入CCS界面后需要点“Debug--Connect”)

3、用“Project//Open”系统项目文件 normal 03_timer ;

4、编译全部文件并装载“.. ”;单击“DebugGo main”进入到主程序中

5、单击“Debug RUN”运行,可观察到灯LED1~LED8 的闪烁变化。

6、单击“Debug Halt”,暂停程序运行,LED灯停止闪烁;单击“RUN”,LED灯又开始闪烁变化

7、结束实验程序

四、程序流程图

五、 实验程序

1、主函数

/*******************************头文件****************************/

#include "DspRegDefine.h" //VC5402 寄存器定义

#include "stdio.h" //输入输出头文件

#include "e300_codec.h"

#include "timer.h" //子函数声明文件

//*********************** 端口定义****************************//

ioport UINT16 port0200; //定义输出io端口为0x0200;

//*********************** 全局变量定义************************//

unsigned int count=0;

unsigned int TIMER=0;

//*************************************************************//

//************************* 主函数 ****************************//

void main()

{

cpu_init();

asm(" nop ");

set_t0();

asm(" nop ");

5

for(;;)

{

switch(count)

{

case 0: IOout=0x0081; break;

case 1: IOout=0x0042; break;

case 2: IOout=0x0024; break;

case 3: IOout=0x0018; break;

case 4: IOout=0x0024; break;

case 5: IOout=0x0042; break;

case 6: IOout=0x0081; break;

case 7: count=0;break;

default:break;

}

}

}

//*************************结束 **********************************//

2、set_t0()函数

//******************************头文件*****************************//

#include "DspRegDefine.h" //VC5402 寄存器定义

/***********************************************************

- 函数名称 : void set_t0()

- 函数说明 : 设置T0的寄存器

- 输入参数 : 无

- 输出参数 : 无

************************************************************/

void set_t0()

{

asm(" ssbx intm"); //禁止所有可屏蔽中断

* (unsigned int* )TCR=0x0010; //停止T0定时器记数

//--------------------------------------------------------------------

//TCR DEFINITIONS?

// 保留 (bit 15-12) - 0000 保留

// SOFT、FREE (bit 11-10) - 00 调试时,遇到断点,定时器停止工作

// PSC (bit 9-6) - 0000 预定标计数器

// TRB (bit 5) - 0 不复位定时器,不重新加载TIM、PSC

// TSS (bit 4) - 1 定时器停止工作

// TDDR (bit 3-0) - 0 定时器分频系数

//------------------------------------------------------------

// 0000 0000 0001 0000 = 0x0010

/*---------------------------------------------------------------------*/

* (unsigned int* )PRD=0x30d3; //设置T0的周期寄存器

* (unsigned int* )IMR=* (unsigned int* )IMR|0x0008; //允许T0中断

* (unsigned int* )IFR=* (unsigned int* )IFR; //清除中断标志

* (unsigned int* )TCR=0x002f; //允许T0定时器记数

//--------------------------------------------------------------------

//TCR DEFINITIONS?

// 保留 (bit 15-12) - 0000 保留

// SOFT、FREE (bit 11-10) - 00 调试时,遇到断点,定时器停止工 6

// PSC (bit 9-6) - 0000 预定标计数器

// TRB (bit 5) - 1 复位定时器,重新加载TIM、PSC

// TSS (bit 4) - 0 定时器开始工作

// TDDR (bit 3-0) - 1111 定时器分频系数

//------------------------------------------------------------

// 0000 1100 0010 1111 = 0x0c2f

/*---------------------------------------------------------------------*/

asm(" rsbx intm"); //开放所有可屏蔽中断

}

//*************************结束 **********************************/

3、Tint0函数

#include "DspRegDefine.h" //VC5402 寄存器定义

//-----------------------------------------------------------------//

extern unsigned int count;

extern unsigned int TIMER;

//*************************TO中断程序*****************************//

interrupt void Tint0()

{

TIMER++;

if(TIMER%50==0)

count=count+1;

}

//*************************结束 **********************************//

4、cpu_init函数见附录

六 实验结果

LED灯根据定时时间不断的闪烁变化。

试验三 通用 I/O 口实验

—、实验目的

1. 熟悉 TMS320VC5416的通用I/O 口应用

2. 掌握利用I/O 口产生波形的设计方法

二、实验设备

计算机,CCS3.1版本软件,DSP 仿真器,E300 实验箱,DSP-54XP CPU板,示波器

三、实验原理

² C54X器件的I/O引脚介绍

C54x 器件除了64K 字节的I/O口空间外,还用两个受软件控制的专用引脚:BIO 和XF。

除了以上两种引脚之外,还有一些引脚可以设置成通用的GPIO 使用,这些引脚是:McBSP

引脚,8 个HPI 数据引脚(HD0~HD7)。这些引脚的使用可通过专用的寄存器进行设置使用。McBSP 引脚设置成I/O 口使用时需设置的寄存器:SPCR1,SPCR2和PCR8 个HPI

数据引脚(HD0~HD7)设置成I/O口使用时需设置的寄存器:GPIOCR 和GPIOSR,同时要满足HPI-8 接口禁止时有效即HPIENA 设置成低电平时。

² C54X器件I/O引脚应用

通用I/O 口应用很广,像对LED 灯的控制和对电机的操作控制等。使用时需要注意的是:

1. 这些管脚支持0~3.3V 逻辑电平操作,用户在进行相应的设计后可以在I/O 口进行输入输出操作。

2. 使用时必须根据引脚本身的负载能力驱动相关的设备。

7

² 样例实验说明

1. 将McBSP0 通道的FSX0,CLKX0和DX0 管脚设置成通用I/O输出口。(详细设置请参看样例程序)

2. 利用定时器T0,产生精确的方波。

3. 利用E300 板上键盘(1.2.3.4)对输出波形进行选择,在选择时相应的LED灯点亮

4. 综合(1.2.3)可以看出该样例实验是结合定时器中断,键盘中断和McBSP 设置I/O 口的综合实验

5. 定时器T0 定时时间为10us,(具体的计算请参看前面:定时器中断实验)

四、实验程序流程图

四、实验步骤

1.E300 板上的开关SW4 的第一位置ON,其余OFF;SW3 的第四位置ON 其余的SW3 位置OFF

2.E300 板上的开关SW7 的第2,4,6 位置ON,其余位置OFF.

3.运行Code Composer Studio (CCS)(ccs3.1需要“DEBUG→Connect” )

4.打开系统项目文件 normal 06_GPIO ;

5.编译全部文件并装载“Debug ”文件

6.单击“DebugGo Main”跳到主程序的开始;

7.单击“DebugAnimate”运行程序

五、 实验程序

1、主函数

#include "DspRegDefine.h" //VC5416 寄存器定义

#include "e300_codec.h"

#include "key.h" //子函数声明文件

//*********************** 端口定义****************************//

ioport UINT16 port0200; //定义输出io端口为0x0200;

ioport UINT16 port0004; //定义

//*********************** 全局变量定义************************//

UINT16 row,col,w;

UINT16 a=0;

UINT16 count=0;

UINT16 flag=0;

UINT16 timer=0;

UINT16 num=0;

/*************************************************************/

8

//************************* 主函数 ***************************//

void main()

{

cpu_init(); //初始化CPU

int2_init(); //外部中断2初始化

set_t0();

GPIO_init();

asm(" rsbx INTM"); //开总中断

port0200=0x00

//*********************等待外部中断2产生**********************//

for(;;)

{

if(a==1)//加软件断点

{

a=0;

read_data();

conv();

Makewave();

}

else {}

}

}

//*************************结束 *****************************//

2、GPIO_init函数

#include "DspRegDefine.h" //VC5416 寄存器定义

#include "key.h" //子函数声明文件

//*************************初始化GPIO****************************//

void GPIO_init()

{

*(unsigned int*)McBSP0_SPSA=0x0001;//SPCR2

*(unsigned int*)McBSP0_SPSD&=0xfffe;//设置SPCR1.0(XRST=0)

*(unsigned int*)McBSP0_SPSA=0x000E;//PCR

*(unsigned int*)McBSP0_SPSD|=0x2800;

*(unsigned int*)McBSP0_SPSD&=0xFFd7;//设置PCR中FSXP=0,DX_STAT=0; *(unsigned int*)McBSP0_SPSA=0x0000;//SPCR1

*(unsigned int*)McBSP0_SPSD&=0xfffe;//设置SPCR1.0(RRST=0)

*(unsigned int*)McBSP0_SPSA=0x000E;//PCR

*(unsigned int*)McBSP0_SPSD|=0x2200;

*(unsigned int*)McBSP0_SPSD&=0xFFfD;//设置PCR中CLKXM=0

}

//********************************************************//

3、read_data函数

#include "DspRegDefine.h" //VC5416 寄存器定义

#include "e300_codec.h"

//---------------------------------------------------//

extern ioport UINT16 port0004; //定义

extern unsigned int row,col,w;

//-----------------读CPLD键盘扫描数据----------------//

void read_data(void)

{

unsigned int temp;

temp=E300_CPLD_KEY&0x00ff;

w=temp;

switch(temp&0xf0)

{

9

case 0xe0: row = 0x1;break;

case 0xd0: row = 0x2;break;

case 0xb0: row = 0x3;break;

case 0x70: row = 0x4;break;

default :break;//return 0;//row = 0;break;

}

switch(temp& 0x0f)

{

case 0x0e: col = 0x1;break;

case 0x0d: col = 0x2;break;

case 0x0b: col = 0x3;break;

case 0x07: col = 0x4;break;

default: break;//return 0;// col = 0;break;

}

}

#include "DspRegDefine.h" //VC5402 寄存器定义

#include "key.h" //子函数声明文件

//******************************************//

extern unsigned int flag;

//*****************************************//

4、Makewave函数

void Makewave()

{

switch(flag)

{

case 1: outwave1();break;

case 2: outwave2();break;

case 3: outwave3();break;

default: stop() ;break;

}

}

//***************************************//

5、ExtInt2函数

#include "DspRegDefine.h" //VC5416 寄存器定义

#include "e300_codec.h"

//---------------------------------------------------------------------

extern UINT16 a;

//--------------------------------------------------------------------

// 函数名称 : void ExtInt2(void)

// 函数说明 : 中断2中断子程序

// 输入参数 : 无

// 输出参数 : 无

//--------------------------------------------------------------------

interrupt void ExtInt2() //中断0中断子程序

{

// *(unsigned int*)IFR=0xFFFF; //清除所有中断标志,"写1清0" ,这个语句可以省略,响应中断自动清除中断标志

a=1;

return;

}

10

//*************************结束 **********************************//

6、conv函数

#include "DspRegDefine.h" //VC5416 寄存器定义

#include "e300_codec.h"

//***************************************************************//

extern unsigned int row,col;

extern unsigned int flag;

extern ioport UINT16 port0200; //定义输出io端口为0x0200;

//***************************************************************//

void conv(void)

{

if(row==0x1)

{

switch(col)

{

case 0x1:flag=1;break;

case 0x2:flag=2;break;

case 0x3:flag=3;break;

default: break;

}

}

else if(row==0x2)

{

switch(col)

{

case 0x1:flag=4;break;

default: break;

}

}

}

//*************************结束**************************************//

7、outwave函数

#include "DspRegDefine.h" //VC5402 寄存器定义

#include "key.h" //子函数声明文件

//*********************************************//

extern unsigned int count;

extern ioport unsigned int port0200; //定义输出io端口为0x0200;

//********************************************//

void outwave1()

{

* (unsigned int* )TCR&=0xffef;//启动定时器0

asm(" nop ");

count=1;

}

void outwave2()

{

* (unsigned int* )TCR&=0xffef; //启动定时器0

asm(" nop ");

count=2;

}

void outwave3()

{

* (unsigned int* )TCR&=0xffef;//启动定时器0

asm(" nop ");

11

count=3;

}

void stop()

{

* (unsigned int* )TCR|=0x0010;//停止定时器0

port0200=0x00ff;

asm(" nop ");

}

//********************************************//

#include "DspRegDefine.h" //VC5402 寄存器定义

#include "key.h" //子函数声明文件

//*************************************************************//

extern unsigned int count;

extern unsigned int temp;

extern unsigned int timer;

extern unsigned int num;

extern ioport unsigned int port0200; //定义输出io端口为0x0200;

//*************************************************************//

8、Tint0函数

interrupt void Tint0()

{

unsigned int temp;

asm(" nop");

switch(count)

{

case 1:

{

port0200=0x00fe;

*(unsigned int*)McBSP0_SPSA=0x000E;//PCR

temp= *(unsigned int*)McBSP0_SPSD;

temp=~temp;

temp&=0x0008;

temp|=2800;

*(unsigned int*)McBSP0_SPSD=temp;

};break;

case 2:

{

port0200=0x00fd;

timer++;

if(timer%2==0)

{

*(unsigned int*)McBSP0_SPSA=0x000E;//PCR

temp= *(unsigned int*)McBSP0_SPSD;

temp=~temp;

temp&=0x0002;

temp|=0x2200;

*(unsigned int*)McBSP0_SPSD=temp;

timer=0;

}

};break;

12

case 3:

{

port0200=0x00fb;

timer++;

num++;

if(timer%3==0)//McBSP的DX0引脚由高电平下降到低电平

{

*(unsigned int*)McBSP0_SPSA=0x000E;//PCR

temp= *(unsigned int*)McBSP0_SPSD;

temp&=0xffdf;

temp|=0x2000;

*(unsigned int*)McBSP0_SPSD=temp;

timer=0;

num=0;

}

if(num==1)//McBSP的DX0引脚由低电平上升到高电平

{

*(unsigned int*)McBSP0_SPSA=0x000E;//PCR

temp= *(unsigned int*)McBSP0_SPSD;

temp|=0x0020;

temp|=0x2000;

*(unsigned int*)McBSP0_SPSD=temp;

}

};break;

default: break;

}

}

//*******************************************************//

9、cpu_init函数见附录

六 实验结果

按下键1时,LED1亮,按下键2时,LED2亮,按下键3时,LED3亮,按下键4时,LED1、LED2和LED3全部灭。

试验四 A/D(外部)实验

—、实验目的

1. 熟悉使用外部AD 转换的基本原理。

2.掌握AD7887的技术指标和常用方法

2. 掌握并熟练使用DSP 和AD7887 的接口及其操作

二、实验设备

计算机,CCS3.1版本软件,DSP 仿真器,E300 实验箱,DSP-54XP CPU板,信号线,示波器

三、实验原理

1. AD7887是一种可工作在2.7~5.25V单一电源下的高速、低功率12 位ADC,具有125kSPS 的吞吐率。

其输入端相当于一个采样周期为500ns的单端采样器,任何信号经转换后可以二进制编码形式由输出端输

出。AD7887 具有单/双通道两种工作模式和灵活的电源管理模式,并可通过芯片上的控制寄存器进行转换。

13

在缺省的单通道模式中,AD7887 还可作只读ADC。芯片采用8 引线SOIC 的μSOIC的封装。

AD7887 的主要特点如下:

u 是目前体积最小的12位单/双通道ADC;

u 采用 CMOS 结构以确保低功耗;

u 具有电源自动关闭形式;

u 在缺省模式下可用作只读ADC;

u 具有通用串行I/O 端口。

AD7887 的内部原理图如下:

AD7887 的引脚说明

1脚(CS) 片选引脚,低电平有效。该脚提供2个功能,一个是使AD7887开始工作;另一个是激励串行数据

的传输。当AD7887 工作在缺省值模式下时,CS 管脚也可作为关闭管脚,即当CS 接高电平时,

AD7887处于关闭模式。

2脚(VDD) 电源输入脚。VDD 的范围为2.7~5.25V,当AD7887 用于双通道工作模式时,该管脚用来提供参考

电压。

3脚(GND): 接地脚。

4脚(AIN1/VREF) 模拟输入/参考电压输入端。在单通道模式下,该脚用作参考电压输入,此时该脚与内部参考电压

(+2.5V)相连或由外部参考电压驱动,其外部参考电压范围为1.2V~VDD;在双通道模式下,该管

脚用作第二个模拟输入端AIN1,此时的电压范围为0~VDD。

5脚(AIN0) 模拟输入端。在单通道模式下,该脚的模拟输入电压范围为0~VREF;在双通道模式下,其模拟输

入电压范围为0~VDD。

6脚(DIN) 数据输入。在SCLK的每个上升沿,数据由该管脚送入AD7887的控制寄存器。若把DIN和GND连接

起来,那么,AD7887将为缺省的单通道只读ADC。

7脚(DOUT) 数据输出端。AD7887的转换结构以串行数据流的形式从该脚输出,其数据流中包括4个前导0以及

其后的12位转换数据。

8脚(SCLK) 串行时钟输入端。用于为数据的存取、写控制寄存器以及A/D转换提供时钟脉冲。

AD7887 的控制寄存器如下:

AD7887 的控制寄存器是一个8位只写寄存器。在SCLK的每个上升沿数据由DIN 脚送入 14

AD7887并同时送至控制寄存器。该数据的传输共需16个连续的时钟脉冲,而有效信息只在前8 个上升沿被送入控制寄存器。MSB 为数据流的第一位。

控制寄存器的位功能如下:

7

不必关心的位。

6

该位必须为0以保证AD7887正常工作

5

参考位。该位为0时,芯片上的参考电压有效,1时无效

4

单/双通道选择。该位为0 时,荼在单通道模式,AIN1/VREF 管脚用作VREF 功能;该位为1 时,

工作在双通道模式,此时VDD 为参考电压,AIN1/VREF 管脚用作AIN1 功能以作为第二个模拟输

入通道。为使AD7887获得最好的效率,在双通道模式中,应使内部参考电压无效,即REF=1

3

通道位。当芯片工作在双通道模式时,该位决定下一步转换哪个通道。在单通道模式中,该位始终

为0

2

该位必须为0以保证AD7887正常工作

1.0

电源管理模式选择。用来决定AD7887的4种工作模式

电源管理模式选择说明如下:

PM1 PM0 工作模式

0

0 模式1.在这种模式下,当CS=1,AD7887 不工作;CS=0 时,AD7887 正常工作。即AD7887 在CS的下

降沿开启电源,在CS的上升沿关闭电源

0 1

模式2。在这种模式下,无论管脚的状态如何,AD7887的电源始终开启

1 0

模式3。在这种模式下,无论管脚的状态如何,AD7887自动在每次转换结束关闭电源

1 1

模式4。在这种备用模式下,AD7887的部分电源关闭,而芯片上的参考电压仍然开启。该模式与模

式3有些相似,但电源开启较快。且REF应该为0,这样才能确保芯片上的参考电压有效

2. 样例实验电路连接如下:

四 程序的框图

15

五、实验步骤和内容

1. E300 板上的开关SW4 的第二位置ON,其余7 全部置ON。其余开关全部置OFF。

2. 用导线连接E300底板“Signal expansion unit”的2 号孔接口“SIN”到“Signal expansion

unit”的

2 号孔“AD_IN0”;(本样例实验只进行对AD_IN0的信号操作)

3. 运行Code Composer Studio (CCS3.1);(ccs3.1需要“DEBUG→Connect” )

4. 用“Projectopen”打开系统项目文件normal06_AD SPI_。

6. 编译全部文件并装载“Debug SPI_”;

7. 单击“DebugGo main”跳到主程序中,在主程序中“设置软件断点”加软件断点。8. 单击“DebugRUN”,程序运行到断点处;

9. 点击“View—Graph-Time/Frenquence”设置观察图形窗口

10. 单击“Debug Animate”全速运行程序;

11. 单击“DebugHalt”停止程序,打开程序,理解程序中的语句。

12. 关闭“CCS”结束实验

六、实验程序

1、主函数

#include "DspRegDefine.h" //VC5402 寄存器定义

#include "math.h"

#include "e300_codec.h"

#include "ad7887.h" //子函数声明文件

/*********************************************************************/

UINT16 data_buff[LEN]; //数据缓冲

UINT16 m;

//*******************************************************************//

/******************************* 主函数 ************************/

void main()

{

UINT16 i;

/*********** 系统初始化 ***************/

asm(" nop ");

16

cpu_init();

/***********MCBSP0设置为SPI模式*********/

asm(" nop ");

mcbsp0_init_SPI();

asm(" nop ");

for(;;)

{

for (i=0; i<=256;i++)

{

mcbsp0_write_rdy(0x2100);

* (unsigned int*)McBSP0_SPSA=0x0000;//SPCR1

while(((*(unsigned int*)McBSP0_SPSD) & 0x0002)==0);//查询接收准备标志位RRDY=1?

m=* (unsigned int* )McBSP0_DRR1 ;

data_buff[i]=m;

}

Delay(1);//加软件断点

}

}

//*******************************结束**************************************//

2、mcbsp0_init_SPI函数

#include "DspRegDefine.h" //VC5402 寄存器定义

#include "e300_codec.h"

//*************************************************************************//

void mcbsp0_init_SPI(void)

{

//--------------------------------------------------------

//复位 McBSP0

*(unsigned int*)McBSP0_SPSA=0x0000;//SPCR1

*(unsigned int*)McBSP0_SPSD=0x0000;//设置SPCR1.0(RRST=0)

*(unsigned int*)McBSP0_SPSA=0x0001;//SPCR2

*(unsigned int*)McBSP0_SPSD=0x0000;//设置SPCR1.0(XRST=0)

//---------------------------------------------------------

//延迟

Delay(0); //延迟 4000*CPU 时钟周期

//等待复位稳定

//---------------------------------------------------------

*(unsigned int*)McBSP0_SPSA=0x000E;//PCR

*(unsigned int*)McBSP0_SPSD=0x0a0f;

//X (bit 15-14) 00 Reseved

//XIOEN (bit 13) 0 DX, FSX and CLKX are configured as serial

port

//RIOEN (bit 12) 0 DR, FSR, CLKR and CLKS are configured as

serial port

//FSXM (bit 11 1 Frame synchronization is determined by

the sample rate

//generator

//FSRM (bit 10) 0 Frame-synchronization pulses generated

by an external

//device. FSR is an input pin

17

//CLKXM (bit 9) 1 CLKX is an output pin and is driven by the

internal sample

//rate generator.

//CLKRM (bit 8) 0 Receive clock (CLKR) is an input driven

by an external

//X (bit 7) 0 Reserved

//CLKS_STAT(bit 6) 0 CLKS pin status.

//DX_STAT (bit 5) 0 DX pin status.

//DR_STAT (bit 4) 0 DR pin status.

//FSXP (bit 3) 1 Frame-synchronization pulse FSX is

active low

//FSRP (bit 2) 1 Frame-synchronization pulse FSR is

active low

//CLKXP (bit 1) 1 Transmit data sampled on rising edge of

CLKX

//CLKRP (bit 0) 1 Receive data sampled on falling edge of

CLKR

//---------- 0000 1010 0000 1100

//----------------------------------------------------------

//配置 McBSP0为 SPI 模式

*(unsigned int*)McBSP0_SPSA=0x0000;//SPCR1

*(unsigned int*)McBSP0_SPSD=0x1800;

//DLB (bit 15) 0 Digital loop back mode disabled

//RJUST (bit 14-13) 00 Right-justify and zero-fill MSBs in

DRR[1,2]

//CLKSTP (bit 12-11) 11

//X (bit 10-8) 000 Reserved

//DXENA (bit 7) 0 data transmit delay enabler is

off

//ABIS (bit 6) 0 A-bis mode is disabled

//RINTM (bit 5-4) 00 RINT driven by RRDY

//RSYNER (bit 3) 0 No synchronization error

//RFULL (bit 2) 0 RBR[1,2] is not in overrun condition

//RRDY (bit 1) 0 Receiver is not ready

//RRST (bit 0) 0 Serial port receiver is disabled and in

reset state

//---------- 0001 1000 0000 0000

*(unsigned int*)McBSP0_SPSA=0x0001;//SPCR2

*(unsigned int*)McBSP0_SPSD=0x0000;

//X (bit 15-10) 000000 Reseved

//FREE (bit 9) 0 Free running mode is disabled

//SOFT (bit 8) 0 SOFT mode is disabled

//FRST (bit 7) 0 Frame-synchronization logic is reset.

//GRST (bit 6) 0 Sample rate generator is reset

//XINTM (bit 5-4) 00 XINT driven by XRDY

//XSYNER (bit 3) 0 No synchronization error

//XEMPTY (bit 2) 0 XSR[1,2] is empty

//XRDY (bit 1) 0 Transmitter is not ready

//XRST (bit 0) 0 serial port transmitter is disabled and

in reset state

18

//---------- 0000 0000 0000 0000

*(unsigned int*)McBSP0_SPSA=0x0002;//RCR1

*(unsigned int*)McBSP0_SPSD=0x0040;//

//X (bit 15) 0 Reserved

//RFRLEN1 (bit 14-8) 0000000 Receive Frame Length 1,RFRLEN1 = 000 0000

1 word per frame

//RWDLEN1 (bit 7-5) 010 Receive Word Length 1,RWDLEN1 = 010 16 bits

//X (bit 4-0) 00000 Reserved

//----- 0000 0000 0100 0000

*(unsigned int*)McBSP0_SPSA=0x0003;//RCR2

*(unsigned int*)McBSP0_SPSD=0x0004;//

//RPHASE (bit 15) 0 Receive Phases,RPHASE = 0 Single-phase

frame

//RFRLEN2 (bit 14-8) 0000000 Receive Frame Length 2,RFRLEN2 = 000 0000

1 word per frame

//RWDLEN2 (bit 7-5) 010 Receive Word Length 2,RWDLEN2 = 010 16

bits

//RCOMPAND(bit 4-3) 00 No companding,

//RFIG (bit 2) 0 Receive Frame Ignore

//RDATDLY (bit 1-0) 01 Receive data delay,1-bit data delay

//----- 0000 0000 0100 0001

*(unsigned int*)McBSP0_SPSA=0x0004;//XCR1

*(unsigned int*)McBSP0_SPSD=0x0040;

//X (bit 15) 0 Reserved

//XFRLEN1 (bit 14-8) 0000000 Transmit Frame Length 1,RFRLEN1 = 000 0000

1 word per frame

//XWDLEN1 (bit 7-5) 010 Transmit Word Length 1,RWDLEN1 = 010 16

bits

//X (bit 4-0) 00000 Reserved

//----- 0000 0000 0100 0000

*(unsigned int*)McBSP0_SPSA=0x0005;//XCR2

*(unsigned int*)McBSP0_SPSD=0x0004;

//XPHASE (bit 15) 0 Transmit Phases,RPHASE = 0 Single-phase

frame

//XFRLEN2 (bit 14-8) 0000000 Transmit Frame Length 2,RFRLEN2 = 000 0000

1 word per frame

//XWDLEN2 (bit 7-5) 010 Transmit Word Length 2,RWDLEN2 = 010 16

bits

//XCOMPAND(bit 4-3) 00 No companding,

//XFIG (bit 2) 0 Transmit Frame Ignore

//XDATDLY (bit 1-0) 01 Transmit data delay,1-bit data delay

//----- 0000 0000 0100 0001

*(unsigned int*)McBSP0_SPSA=0x0006;//SRGR1

//*(unsigned int*)McBSP0_SPSD=0x0063;

*(unsigned int*)McBSP0_SPSD=0x006d;

//FWID (bit 15-8) 00000000 Frame Width

//CLKGDV (bit 7-0) 0110 0100 Sample Rate Generator Clock Divider

//CLKG = CPUCLOCK/(CLKGDV+1)

// WHEN CPUCLOCK=10MHZ,CLKG=1MHZ

//---- 0000 0000 0110 0011

19

*(unsigned int*)McBSP0_SPSA=0x0007;//SRGR2

*(unsigned int*)McBSP0_SPSD=0x2000;

//GSYNC (bit 15) 0 don't care

//CLKSP (bit 14) 0 don't care

//CLKSM (bit 13) 1 Sample rate generator clock derived from

CPU clock

//FSGM (bit 12) 0 Sample Rate Generator Transmit

Frame-Synchronization Mode

//in spi mode,must be =0

//FPER (bit 11-0) Frame Period,this bits ignored

//------- 0010 0000 0000 0000

*(unsigned int*)McBSP0_SPSA=0x0001;//SPCR2

*(unsigned int*)McBSP0_SPSD=(*(unsigned int*)McBSP0_SPSD)|0x0040;

//GRST = 1 Sample rate generator is pulled out of reset

//延迟

Delay(0); //延迟 4000*CPU 时钟周期

//等待时钟

*(unsigned int*)McBSP0_SPSA=0x0000;//SPCR1

*(unsigned int*)McBSP0_SPSD=(*(unsigned int*)McBSP0_SPSD)|0x0001;

//RRST=1 enable McBSP1 receiver

*(unsigned int*)McBSP0_SPSA=0x0001;//SPCR2

*(unsigned int*)McBSP0_SPSD=(*(unsigned int*)McBSP0_SPSD)|0x0001;

//XRST=1 enable McBSP1 transmitter

*(unsigned int*)McBSP0_SPSA=0x0001;//SPCR2

*(unsigned int*)McBSP0_SPSD=(*(unsigned int*)McBSP0_SPSD)|0x0080;

//FRST = 1 Frame-sync signal FSG is generated

//延迟

Delay(0); //延迟 4000*CPU 时钟周期

//等待时钟稳定

}

3、mcbsp0_write_rdy函数

#include "DspRegDefine.h" //VC5402 寄存器定义

#include "e300_codec.h"

//*****************************************************************//

void mcbsp0_write_rdy(UINT16 out_data)

{

*(unsigned int*)McBSP0_SPSA=0x0001; //McBSP0_SPSA 指向 SPCR2

while(((*(unsigned int*)McBSP0_SPSD) & 0x0002)==0);//查询准备发送标志位XRRY=1?

*(unsigned int *)McBSP0_DXR1= out_data;

return;

}

#include "DspRegDefine.h" //VC5402 寄存器定义

#include "e300_codec.h"

//*****************************************************************//

4、Delay函数、

void Delay(UINT16 numbers)

{

UINT16 i,j;

for(i=0;i<4000;i++)

for(j=0;j

20

}

5、cpu_init.c函数见附录

七、实验结果

实验十一串口通讯实验

一、 实验目的

1. 了解TMS320VC5416DSP扩展串行通信接口(URAT)的特点

2. 学习TMS320VC5416CPU板上对SCI 接口的驱动部分的设计

3. 学会设置SCI接口进行通信

4. 学习RS232异步串口的编程方法

二、 实验设备

计算机,CCS 3.1版软件,E300 实验箱,DSP仿真器,DSP-54XP CPU板

三、 实验原理

由于TMS320VC5416CPU 上没有专用的SCI 串口模块,所以我们需要扩展标准RS232 模块,才能同PC机互相通信。在扩展接口上我们采用了16C550芯片,MAX3238芯片完成接口电平转换。

本实验扩展串口模块原理图如下:

21

16C550芯片介绍

16C550在扩展串口模块中的功能是:TLl6C550在接收外部器件或MODEM 的数据时,完成串行到并行的转换;在接收CPU的数据时,完成数据的并行到串行的变换,并进行串行发送。16C550有11 个寄存器,分别通过A3~A1 和线路控制寄存器中的DLAB位对它们进行寻址。(如下表)

16C550寄存器列表

寄存器名称DLAB A3 A2 A1 偏移地址操作

接收缓冲寄存器RBR 0 0 0 0 00H 只读

发送缓冲寄存器THR 0 0 0 0 00H 只写

中断使能寄存器IER 0 0 0 1 01H 读/写

中断标志寄存器IIR X 0 1 0 02H 只读

FIFO 控制寄存器FCR X 0 1 0 02H 只写

线路控制寄存器LCR X 0 1 1 03H 读/写

MODEM 控制寄存器MCR X 1 0 0 04H 读/写

线路状态寄器LSR X 1 0 1 05H 读/写

MODEM状态寄存器MSR X 1 1 0 06H 读/写

暂存寄存器SCR X 1 1 1 07H 读/写

除数低字节锁存器DLL 1 0 0 0 00H 读/写

除数高字节锁存器DLH 1 0 0 1 01H 读/写

四、程序流程框图

五、 实验步骤

1.将实验箱所配的直连串口线的一端连接电脑的串口,另一端连接到DSP-54XP CPU板“串口单元”

的串行接口;并检查计算机、DSP仿真器、实验箱是否正确连接。

2.E300 底板的开关SW4 的第1位置ON,其余位置OFF。其余开关设置为OFF。

3.运行CCS3.1软件,调入样例程序,装载并运行;(进入CCS界面后需要“Debug--Connect”)

4.用“Project”打开项目 normal 11_.;

双击“”及“Source”可查看各源程序;并加载“”;

单击“DebugAnimate”,运行程序。

5.运行“…normal11_UARTsci_pchost串口调试软件串口调试助手”,出现界面后点击“设置”按钮,进行如下设置:(根据自己使用端口号来设置端口)

设置波特率:9600

22

设置校验位:NONE;数据位:8 位;停止位:1 个

在发送数据时:可以选择十六进制发送的“手动发送”,

具体的操作如下:在发送区域内输入十六进制数1111 2222 3333 4444,选择自动发送模式,在接收区域内会循环看到发送数据区发送的数据。

6.取消“自动发送”,则停止数据的传送,此时可以点击“手动发送”看看效果。

7.该文件也可以以“文件”的传送形式,来发送数据。操作如下:

点击“选择发送文件”按纽,选择要发送的文件,设置如下图:

发送的文件“REC100。Txt”在串口工程文件夹中

8.点击“打开”按钮后,点击调试工具窗口的“发送文件”按扭,这时在调试窗口的接收数据区可以观察到接收的数据。

注意:不要选中“十六进制显示”和“十六进制发送”框,这样避免观察数据同传输文件中的不一致性。

9. 关闭所有有关程序,该实验结束。

六、 实验程序

1、主函数

#include "DspRegDefine.h" //VC5402 寄存器定义

#include "stdio.h" //输入输出头文件

#include "tl16c550c.h"

//**********************子函数声明*********************************//

void cpu_init(void); //初始化CPU

void Tl16c550_init();

//*****************************************************************//

//************************* 主函数 ********************************//

void main()

{

UINT16 temp,flag;

UINT16 r_data;

cpu_init();//CPU初始化

asm(" nop");

temp=UART_MR;//读800f使TL16C550C退出复位。

temp=flashen;//读8008使能FLASH

temp=temp;

Tl16c550_init();//初始化TL16C550C

for(;;)

{

asm(" nop");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" nop");

flag=LSR;

23

asm(" nop");

asm(" nop");

if((flag & 0x01)==0x01)

{

r_data=RBR;

asm(" nop");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" nop");

asm(" nop");

THR=r_data;

}

asm(" nop");

asm(" nop");

asm(" nop");

asm(" nop");

}

}

#include "DspRegDefine.h" //VC5402 寄存器定义

#include "stdio.h" //输入输出头文件

#include "tl16c550c.h"

//*****************************************************************//

2、Tl16c550_init函数

void Tl16c550_init()

{

unsigned int m;

m=UART_MR;//读800f,使TL16C550 OUT RESET

m=m;

LCR = 0x8B;//DLAB=1

asm(" nop");

asm(" nop");

asm(" nop");

DLL = 0x18; //波特率设置为9600

24

asm(" nop");

asm(" nop");

asm(" nop");

DLM = 0x00;

asm(" nop");

asm(" nop");

asm(" nop");

LCR = 0x03; //设置数据格式:长度8,1个停止位,无奇偶校验

asm(" nop");

asm(" nop");

asm(" nop");

FCR = 0x00;

asm(" nop");

asm(" nop");

asm(" nop");

MCR = 0x20;

asm(" nop");

asm(" nop");

asm(" nop");

IER = 0x00; //禁止中断

asm(" nop");

asm(" nop");

asm(" nop");

}

3、cpu_init.c函数见附录

七、实验结果

1、在发送区域内输入十六进制数1111 2222 3333 4444,选择自动发送模式,在接收区域内会循环看到发送数据区发送的数据,如下图:

2、点击“打开”按钮后,点击调试工具窗口的“发送文件”按扭,这时在调试窗口的接收数据区可以观察到接收的数据,如下图显示:

25

实验六 快速傅立叶变换(FFT)算法实验

一. 实验目的

1.加深对DFT算法原理和基本性质的理解;

2.熟悉 FFT算法原理和FFT子程序的应用;

3.学习用FFT对连续信号和时域信号进行谱分析的方法,了解可能出现的分析误差及其原因,以便在实际中正确应用FFT。

二. 实验设备

计算机,CCS 3.1 版软件,E300 实验箱,DSP仿真器,导线

三. 基本原理

1.离散傅立叶变换DFT的定义:将时域的采样变换成频域的周期性离散函数,频域的采样也可以变换成时域的周期性离散函数,这样的变换称为离散傅立叶变换,简称DFT。

2.FFT是DFT的一种快速算法,将DFT的N2步运算减少为(N/2)log2N 步,极大的提高了运算的速度。

3.旋转因子的变化规律。

4.蝶形运算规律。

5.基 2FFT算法。

四. 实验步骤

1.E300 底板的开关SW4 的第1位置ON,其余置OFF。其余开关不用具体设置。

2.E300 板子上的SW7开关的第1位置OFF,其余位置ON

3.阅读本实验所提供的样例子程序;

4.运行CCS软件,对样例程序进行跟踪,分析结果;记录必要的参数。

5.填写实验报告。

6.提供样例程序实验操作说明

A.实验前准备

用导线连接“Signal expansion Unit”中2 号孔接口“SIN”和“A/D 单元”的2 号孔接口“AD_IN0”。

(实验采用的是外部的AD模块)

B.实验

1. 正确完成计算机、DSP仿真器和实验箱的连接后,系统上电。

2. 启动CCS3.1,Project/Open 打开“algorithm01_fft”子目录下“”工程文件;双击“” 及“Source”可查看各源程序;加载“”;

3. 单击“DebugGo main”进入到主程序,在主程序“flag=0;”处设置断点;

26

4. 单击“Debug Run”运行程序,或按F5 运行程序;程序将运行至断点处停止;

5. 用 View / Graph / Time/Frequency打开一个图形观察窗口;设置该观察图形窗口变量及参数;采用双踪观察在启始地址分别为px 和pz,长度为128,数值类型为16 位整型,px:存放经A/D 转换后的输入信号;pz:对该信号进行FFT变换的结果。

6. 单击“Debug Animate”运行程序,或按F10运行;

五.程序流程图:

六.实验程序

1、主函数

#include "DspRegDefine.h" //VC5402 寄存器定义

#include "e300_codec.h"

#include "math.h"

/******************************* 宏定义 *******************************/

#define Len 128

int px[128];

int pz[128];

int flag=0;

27

int t=0,cnt=0;

//******************************子函数声明****************************//

void cpu_init(void); //初始化CPU

void mcbsp0_init_SPI(void); //MCBSP0设置为SPI模式

void mcbsp0_write_rdy(UINT16 out_data);//MCBSP0发送一个数据

void firdes (double npass);

//*********************************************************************//

//******************************* 主函数 ******************************//

void main()

{

unsigned int out_data;

int i,n;

double x[128],pr[128],pi[128],fr[128],fi[128],mo[128];

int xm,zm;

n=128;

/*********** 系统初始化 ***************/

cpu_init();

/***********MCBSP0设置为SPI模式*********/

mcbsp0_init_SPI()

asm(" nop ");

for(;;)

{

for (i=0; i

{

mcbsp0_write_rdy(0x2100);

* (unsigned int*)McBSP0_SPSA=0x0000;//SPCR1

while(((*(unsigned int*)McBSP0_SPSD) & 0x0002)==0);//查询接收准备标志位RRDY=1?

out_data=* (unsigned int* )McBSP0_DRR1;

px[i]=out_data;

flag++;

}

if(flag==Len)

{

for (i=0; i<=n-1; i++)

{

}

xm=px[i];

x[i]=xm/32768.0;

pr[i]=x[i];

pi[i]=0;

kfft(pr,pi,128,7,fr,fi,0,1);

28

for (i=0;i<=n-1;i++)

mo[i] = sqrt(fr[i]*fr[i]+fi[i]*fi[i]);

zm = (int)(mo[i]*1000.0);

pz[i] = zm;

{

}

flag=0;//设置软件断点

}

}

}

2、mcbsp0_init_SPI函数

#include "DspRegDefine.h" //VC5402 寄存器定义

#include "e300_codec.h"

//*************************************************************************//

void mcbsp0_init_SPI(void)

{

//--------------------------------------------------------

//复位 McBSP0

*(unsigned int*)McBSP0_SPSA=0x0000;//SPCR1

*(unsigned int*)McBSP0_SPSD=0x0000;//设置SPCR1.0(RRST=0)

*(unsigned int*)McBSP0_SPSA=0x0001;//SPCR2

*(unsigned int*)McBSP0_SPSD=0x0000;//设置SPCR1.0(XRST=0)

//---------------------------------------------------------

//延迟

Delay(0); //延迟 4000*CPU 时钟周期

//等待复位稳定

//---------------------------------------------------------

*(unsigned int*)McBSP0_SPSA=0x000E;//PCR

*(unsigned int*)McBSP0_SPSD=0x0e0f;

//X (bit 15-14) 00 Reseved

//XIOEN (bit 13) 0 DX, FSX and CLKX are configured as serial

port

//RIOEN (bit 12) 0 DR, FSR, CLKR and CLKS are configured as

serial port

//FSXM (bit 11 1 Frame synchronization is determined by

the sample rate //generator

//FSRM (bit 10) 0 Frame-synchronization pulses generated

by an external //device. FSR is an input pin

//CLKXM (bit 9) 1 CLKX is an output pin and is driven by the

internal sample //rate generator.

//CLKRM (bit 8) 0 Receive clock (CLKR) is an input driven

by an external

//X (bit 7) 0 Reserved

//CLKS_STAT(bit 6) 0 CLKS pin status.

29

//DX_STAT (bit 5) 0 DX pin status.

//DR_STAT (bit 4) 0 DR pin status.

//FSXP (bit 3) 1 Frame-synchronization pulse FSX is

active low

//FSRP (bit 2) 1 Frame-synchronization pulse FSR is

active low

//CLKXP (bit 1) 1 Transmit data sampled on rising edge of

CLKX

//CLKRP (bit 0) 1 Receive data sampled on falling edge of

CLKR

//---------- 0000 1010 0000 1100

//----------------------------------------------------------

//配置 McBSP0为 SPI 模式

*(unsigned int*)McBSP0_SPSA=0x0000;//SPCR1

*(unsigned int*)McBSP0_SPSD=0x1800;

//DLB (bit 15) 0 Digital loop back mode disabled

//RJUST (bit 14-13) 00 Right-justify and zero-fill MSBs in

DRR[1,2]

//CLKSTP (bit 12-11) 11

//X (bit 10-8) 000 Reserved

//DXENA (bit 7) 0 data transmit delay enabler is

off

//ABIS (bit 6) 0 A-bis mode is disabled

//RINTM (bit 5-4) 00 RINT driven by RRDY

//RSYNER (bit 3) 0 No synchronization error

//RFULL (bit 2) 0 RBR[1,2] is not in overrun condition

//RRDY (bit 1) 0 Receiver is not ready

//RRST (bit 0) 0 Serial port receiver is disabled and in

reset state

//---------- 0001 1000 0000 0000

*(unsigned int*)McBSP0_SPSA=0x0001;//SPCR2

*(unsigned int*)McBSP0_SPSD=0x0000;

//X (bit 15-10) 000000 Reseved

//FREE (bit 9) 0 Free running mode is disabled

//SOFT (bit 8) 0 SOFT mode is disabled

//FRST (bit 7) 0 Frame-synchronization logic is reset.

//GRST (bit 6) 0 Sample rate generator is reset

//XINTM (bit 5-4) 00 XINT driven by XRDY

//XSYNER (bit 3) 0 No synchronization error

//XEMPTY (bit 2) 0 XSR[1,2] is empty

//XRDY (bit 1) 0 Transmitter is not ready

//XRST (bit 0) 0 serial port transmitter is disabled and

in reset state

30

//---------- 0000 0000 0000 0000

*(unsigned int*)McBSP0_SPSA=0x0002;//RCR1

*(unsigned int*)McBSP0_SPSD=0x0040;//

//X (bit 15) 0 Reserved

//RFRLEN1 (bit 14-8) 0000000 Receive Frame Length 1,RFRLEN1 = 000 0000

1 word per frame

//RWDLEN1 (bit 7-5) 010 Receive Word Length 1,RWDLEN1 = 010 16 bits

//X (bit 4-0) 00000 Reserved

//----- 0000 0000 0100 0000

*(unsigned int*)McBSP0_SPSA=0x0003;//RCR2

*(unsigned int*)McBSP0_SPSD=0x0004;//

//RPHASE (bit 15) 0 Receive Phases,RPHASE = 0 Single-phase

frame

//RFRLEN2 (bit 14-8) 0000000 Receive Frame Length 2,RFRLEN2 = 000 0000

1 word per frame

//RWDLEN2 (bit 7-5) 010 Receive Word Length 2,RWDLEN2 = 010 16

bits

//RCOMPAND(bit 4-3) 00 No companding,

//RFIG (bit 2) 0 Receive Frame Ignore

//RDATDLY (bit 1-0) 01 Receive data delay,1-bit data delay

//----- 0000 0000 0100 0001

*(unsigned int*)McBSP0_SPSA=0x0004;//XCR1

*(unsigned int*)McBSP0_SPSD=0x0040;

//X (bit 15) 0 Reserved

//XFRLEN1 (bit 14-8) 0000000 Transmit Frame Length 1,RFRLEN1 = 000 0000

1 word per frame

//XWDLEN1 (bit 7-5) 010 Transmit Word Length 1,RWDLEN1 = 010 16

bits

//X (bit 4-0) 00000 Reserved

//----- 0000 0000 0100 0000

*(unsigned int*)McBSP0_SPSA=0x0005;//XCR2

*(unsigned int*)McBSP0_SPSD=0x0004;

//XPHASE (bit 15) 0 Transmit Phases,RPHASE = 0 Single-phase

frame

//XFRLEN2 (bit 14-8) 0000000 Transmit Frame Length 2,RFRLEN2 = 000 0000

1 word per frame

//XWDLEN2 (bit 7-5) 010 Transmit Word Length 2,RWDLEN2 = 010 16

bits

//XCOMPAND(bit 4-3) 00 No companding,

//XFIG (bit 2) 0 Transmit Frame Ignore

//XDATDLY (bit 1-0) 01 Transmit data delay,1-bit data delay

//----- 0000 0000 0100 0001

*(unsigned int*)McBSP0_SPSA=0x0006;//SRGR1

//*(unsigned int*)McBSP0_SPSD=0x0063;

31

*(unsigned int*)McBSP0_SPSD=0x008f;

//FWID (bit 15-8) 00000000 Frame Width

//CLKGDV (bit 7-0) 0110 0100 Sample Rate Generator Clock Divider

//CLKG = CPUCLOCK/(CLKGDV+1)

// WHEN CPUCLOCK=110MHZ

//---- 0000 0000 0110 0011

*(unsigned int*)McBSP0_SPSA=0x0007;//SRGR2

*(unsigned int*)McBSP0_SPSD=0x2000;

//GSYNC (bit 15) 0 don't care

//CLKSP (bit 14) 0 don't care

//CLKSM (bit 13) 1 Sample rate generator clock derived from

CPU clock

//FSGM (bit 12) 0 Sample Rate Generator Transmit

Frame-Synchronization Mode

//in spi mode,must be =0

//FPER (bit 11-0) Frame Period,this bits ignored

//------- 0010 0000 0000 0000

*(unsigned int*)McBSP0_SPSA=0x0001;//SPCR2

*(unsigned int*)McBSP0_SPSD=(*(unsigned int*)McBSP0_SPSD)|0x0040;

//GRST = 1 Sample rate generator is pulled out of reset

//延迟

Delay(0); //延迟 4000*CPU 时钟周期

//等待时钟稳定

*(unsigned int*)McBSP0_SPSA=0x0000;//SPCR1

*(unsigned int*)McBSP0_SPSD=(*(unsigned int*)McBSP0_SPSD)|0x0001;

//RRST=1 enable McBSP1 receiver

*(unsigned int*)McBSP0_SPSA=0x0001;//SPCR2

*(unsigned int*)McBSP0_SPSD=(*(unsigned int*)McBSP0_SPSD)|0x0001;

//XRST=1 enable McBSP1 transmitter

*(unsigned int*)McBSP0_SPSA=0x0001;//SPCR2

*(unsigned int*)McBSP0_SPSD=(*(unsigned int*)McBSP0_SPSD)|0x0080;

//FRST = 1 Frame-sync signal FSG is generated

//延迟

Delay(0); //延迟 4000*CPU 时钟周期

//等待时钟稳定

}

#include "DspRegDefine.h" //VC5402 寄存器定义

#include "e300_codec.h"

//*****************************************************************//

3、mcbsp0_write_rdy函数

void mcbsp0_write_rdy(UINT16 out_data)

{

32

*(unsigned int*)McBSP0_SPSA=0x0001; //McBSP0_SPSA 指向 SPCR2

while(((*(unsigned int*)McBSP0_SPSD) & 0x0002)==0);//查询准备发送标志位XRRY=1?

*(unsigned int *)McBSP0_DXR1= out_data;

return;

}

七 实验结果

八. 思考题

1.对于不同的N,幅频特性会相同吗?为什么?

2.FFT进行谱分析,可以应用的什么方面?

实验七 有限冲击响应滤波器(FIR)算法实验

一、实验目的

1.掌握用窗函数法设计FIR数字滤波器的原理和方法;

2.熟悉线性相位FIR数字滤波器特性;

3.了解各种窗函数对滤波特性的影响。

二、实验设备

计算机,CCS 3.1 版软件,E300 实验箱,DSP仿真器,导线

三、实验原理

1.有限冲击响应数字滤波器的基础理论;

2.模拟滤波器原理(巴特沃斯滤波器、切比雪夫滤波器、贝塞尔滤波器);

3.数字滤波器系数的确定方法。

四、实验步骤

1.E300 底板的开关SW4 的第1位置ON,其余置OFF。其余开关不用具体设置。

2.E300 板子上的SW7开关的第1位置OFF,其余位置ON

3.阅读本实验所提供的样例子程序;

4.运行CCS软件,对样例程序进行跟踪,分析结果;

5.填写实验报告。

6.样例程序实验操作说明

A.实验前准备

33

用导线连接“Signal expansion Unit”中2 号孔接口“SIN”和“A/D 单元”的2 号孔接口“AD_IN0”。

(实验采用的是外部的AD7887模块)具体的采样数据请参看前面的“AD 实验样例”

B.实验

1. 启动CCS 3.1,Project/Open打开“algorithm02_fir”子目录下“”工程文件;

2. 双击“” 及“Source”可查看各源程序;加载“”;

3. 单击“DebugGo main”进入主程序,在主程序最后“flag=0;”处,设置断点,

4. 单击“Debug Run”运行程序,程序将运行至断点处停止;

5. 用 View / Graph / Time/Frequency打开一个图形观察窗口;设置观察图形窗口变量及参数为:采用双踪观察启始地址分别为x 和y,长度为1024,这两个数组中分别存放的是经A/D 转换后的输入混叠信号(输入信号)和对该信号进行FIR滤波的结果;设置如下:

6. 单击“Debug Animate”运行程序,或按F10运行程序。

7. 单击“Debug Halt”暂停程序运行,激活“fir.c”的编辑窗口。

五、FIR程序参数说明

输入信号:输入信号经A/D 转换后,写入数组x,长度1024,16位无符号整型;

输出信号:FIR低通滤波器输出,写入数组y,长度1024,16 位无符号整型。

六、程序流程图:

34

七、实验程序

void main()

{

unsigned int out_data;

/*********** 系统初始化 ***************/

cpu_init();

/***********MCBSP0设置为SPI模式*********/

mcbsp0_init_SPI();

asm(" nop ");

fs = 250000;

fstop = 20000;

npass = fstop/fs;

for (i=0; i

{

xmid[i]=0;

}

firdes(npass);

for(;;)

{

for (i=0; i

{

mcbsp0_write_rdy(0x2100);

* (unsigned int*)McBSP0_SPSA=0x0000;//SPCR1

while(((*(unsigned int*)McBSP0_SPSD) & 0x0002)==0);//查询接收准备标志位RRDY=1?

out_data=* (unsigned int* )McBSP0_DRR1;

in_x[i]=out_data;

flag++;

}

if(flag==Len)

{

xmean = 0.0;

for (i=0; i

{

xmean = in_x[i] + xmean;

}

xmean = 1.0*xmean/Len;

for (i=0; i

{

x[i] = (double)(in_x[i] - xmean);

}

for (i=0; i

{

for (p=0; p

{

xmid[FLen-p-1] = xmid[FLen-p-2];

}

xmid[0] = x[i];

r = 0;

rm= 0;

35

for (j=0; j

{

r= xmid[j] * h[j];

rm = rm + r;

}

y[i] = rm;

}

flag=0;//设置软件断点

}

}

}

2、firdes函数

#include "DspRegDefine.h" //VC5402 寄存器定义

#include "math.h"

#include "e300_codec.h"

#include "fir.h"

//*********************************************************************//

#define FLen 201

extern double npass, h[FLen];

//*********************************************************************//

void firdes(double npass)

{

int t;

for (t=0; t

{

h[t] = sin((t-(FLen-1)/2.0)*npass*pi)/(pi*(t-(FLen-1)/2.0));

}

if (t == ((FLen-1)/2)) h[t]=npass;

}

3、mcbsp0_init_SPI函数

#include "DspRegDefine.h" //VC5402 寄存器定义

#include "e300_codec.h"

//*************************************************************************//

void mcbsp0_init_SPI(void)

{

//--------------------------------------------------------

//复位 McBSP0

*(unsigned int*)McBSP0_SPSA=0x0000;//SPCR1

*(unsigned int*)McBSP0_SPSD=0x0000;//设置SPCR1.0(RRST=0)

*(unsigned int*)McBSP0_SPSA=0x0001;//SPCR2

*(unsigned int*)McBSP0_SPSD=0x0000;//设置SPCR1.0(XRST=0)

//---------------------------------------------------------

//延迟

Delay(0); //延迟 4000*CPU 时钟周期

//等待复位稳定

//---------------------------------------------------------

*(unsigned int*)McBSP0_SPSA=0x000E;//PCR

*(unsigned int*)McBSP0_SPSD=0x0e0f;

//X (bit 15-14) 00 Reseved

//XIOEN (bit 13) 0 DX, FSX and CLKX are configured as serial

36

port

//RIOEN (bit 12) 0 DR, FSR, CLKR and CLKS are configured as

serial port

//FSXM (bit 11 1 Frame synchronization is determined by

the sample ra //generator

//FSRM (bit 10) 0 Frame-synchronization pulses generated

by an externa //device. FSR is an input pin

//CLKXM (bit 9) 1 CLKX is an output pin and is driven by the

internal sam //rate generator.

//CLKRM (bit 8) 0 Receive clock (CLKR) is an input driven

by an external

//X (bit 7) 0 Reserved

//CLKS_STAT(bit 6) 0 CLKS pin status.

//DX_STAT (bit 5) 0 DX pin status.

//DR_STAT (bit 4) 0 DR pin status.

//FSXP (bit 3) 1 Frame-synchronization pulse FSX is

active low

//FSRP (bit 2) 1 Frame-synchronization pulse FSR is

active low

//CLKXP (bit 1) 1 Transmit data sampled on rising edge of

CLKX

//CLKRP (bit 0) 1 Receive data sampled on falling edge of

CLKR

//---------- 0000 1010 0000 1100

//----------------------------------------------------------

//配置 McBSP0为 SPI 模式

*(unsigned int*)McBSP0_SPSA=0x0000;//SPCR1

*(unsigned int*)McBSP0_SPSD=0x1800;

//DLB (bit 15) 0 Digital loop back mode disabled

//RJUST (bit 14-13) 00 Right-justify and zero-fill MSBs in

DRR[1,2]

//CLKSTP (bit 12-11) 11

//X (bit 10-8) 000 Reserved

//DXENA (bit 7) 0 data transmit delay enabler is

off

//ABIS (bit 6) 0 A-bis mode is disabled

//RINTM (bit 5-4) 00 RINT driven by RRDY

//RSYNER (bit 3) 0 No synchronization error

//RFULL (bit 2) 0 RBR[1,2] is not in overrun condition

//RRDY (bit 1) 0 Receiver is not ready

//RRST (bit 0) 0 Serial port receiver is disabled and in

reset state

//---------- 0001 1000 0000 0000

*(unsigned int*)McBSP0_SPSA=0x0001;//SPCR2

*(unsigned int*)McBSP0_SPSD=0x0000;

//X (bit 15-10) 000000 Reseved

//FREE (bit 9) 0 Free running mode is disabled

//SOFT (bit 8) 0 SOFT mode is disabled

//FRST (bit 7) 0 Frame-synchronization logic is reset.

//GRST (bit 6) 0 Sample rate generator is reset

37

//XINTM (bit 5-4) 00 XINT driven by XRDY

//XSYNER (bit 3) 0 No synchronization error

//XEMPTY (bit 2) 0 XSR[1,2] is empty

//XRDY (bit 1) 0 Transmitter is not ready

//XRST (bit 0) 0 serial port transmitter is disabled and

in reset state

//---------- 0000 0000 0000 0000

*(unsigned int*)McBSP0_SPSA=0x0002;//RCR1

*(unsigned int*)McBSP0_SPSD=0x0040;//

//X (bit 15) 0 Reserved

//RFRLEN1 (bit 14-8) 0000000 Receive Frame Length 1,RFRLEN1 = 000 0000

1 word per frame

//RWDLEN1 (bit 7-5) 010 Receive Word Length 1,RWDLEN1 = 010 16 bits

//X (bit 4-0) 00000 Reserved

//----- 0000 0000 0100 0000

*(unsigned int*)McBSP0_SPSA=0x0003;//RCR2

*(unsigned int*)McBSP0_SPSD=0x0004;//

//RPHASE (bit 15) 0 Receive Phases,RPHASE = 0 Single-phase

frame

//RFRLEN2 (bit 14-8) 0000000 Receive Frame Length 2,RFRLEN2 = 000 0000

1 word per frame

//RWDLEN2 (bit 7-5) 010 Receive Word Length 2,RWDLEN2 = 010 16

bits

//RCOMPAND(bit 4-3) 00 No companding,

//RFIG (bit 2) 0 Receive Frame Ignore

//RDATDLY (bit 1-0) 01 Receive data delay,1-bit data delay

//----- 0000 0000 0100 0001

*(unsigned int*)McBSP0_SPSA=0x0004;//XCR1

*(unsigned int*)McBSP0_SPSD=0x0040;

//X (bit 15) 0 Reserved

//XFRLEN1 (bit 14-8) 0000000 Transmit Frame Length 1,RFRLEN1 = 000 0000

1 word per frame

//XWDLEN1 (bit 7-5) 010 Transmit Word Length 1,RWDLEN1 = 010 16

bits

//X (bit 4-0) 00000 Reserved

//----- 0000 0000 0100 0000

*(unsigned int*)McBSP0_SPSA=0x0005;//XCR2

*(unsigned int*)McBSP0_SPSD=0x0004;

//XPHASE (bit 15) 0 Transmit Phases,RPHASE = 0 Single-phase

frame

//XFRLEN2 (bit 14-8) 0000000 Transmit Frame Length 2,RFRLEN2 = 000 0000

1 word per frame

//XWDLEN2 (bit 7-5) 010 Transmit Word Length 2,RWDLEN2 = 010 16

bits

//XCOMPAND(bit 4-3) 00 No companding,

//XFIG (bit 2) 0 Transmit Frame Ignore

//XDATDLY (bit 1-0) 01 Transmit data delay,1-bit data delay

//----- 0000 0000 0100 0001

*(unsigned int*)McBSP0_SPSA=0x0006;//SRGR1

//*(unsigned int*)McBSP0_SPSD=0x0063;

38

*(unsigned int*)McBSP0_SPSD=0x008f;

//FWID (bit 15-8) 00000000 Frame Width

//CLKGDV (bit 7-0) 0110 0100 Sample Rate Generator Clock Divider

//CLKG = CPUCLOCK/(CLKGDV+1)

// WHEN CPUCLOCK=110MHZ

//---- 0000 0000 0110 0011

*(unsigned int*)McBSP0_SPSA=0x0007;//SRGR2

*(unsigned int*)McBSP0_SPSD=0x2000;

//GSYNC (bit 15) 0 don't care

//CLKSP (bit 14) 0 don't care

//CLKSM (bit 13) 1 Sample rate generator clock derived from

CPU clock

//FSGM (bit 12) 0 Sample Rate Generator Transmit

Frame-Synchronization Mode

//in spi mode,must be =0

//FPER (bit 11-0) Frame Period,this bits ignored

//------- 0010 0000 0000 0000

*(unsigned int*)McBSP0_SPSA=0x0001;//SPCR2

*(unsigned int*)McBSP0_SPSD=(*(unsigned int*)McBSP0_SPSD)|0x0040;

//GRST = 1 Sample rate generator is pulled out of reset

//延迟

Delay(0); //延迟 4000*CPU 时钟周期

//等待时钟稳定

*(unsigned int*)McBSP0_SPSA=0x0000;//SPCR1

*(unsigned int*)McBSP0_SPSD=(*(unsigned int*)McBSP0_SPSD)|0x0001;

//RRST=1 enable McBSP1 receiver

*(unsigned int*)McBSP0_SPSA=0x0001;//SPCR2

*(unsigned int*)McBSP0_SPSD=(*(unsigned int*)McBSP0_SPSD)|0x0001;

//XRST=1 enable McBSP1 transmitter

*(unsigned int*)McBSP0_SPSA=0x0001;//SPCR2

*(unsigned int*)McBSP0_SPSD=(*(unsigned int*)McBSP0_SPSD)|0x0080;

//FRST = 1 Frame-sync signal FSG is generated

//延迟

Delay(0); //延迟 4000*CPU 时钟周期

//等待时钟稳定

}

4、mcbsp0_write_rdy函数

#include "DspRegDefine.h" //VC5402 寄存器定义

#include "e300_codec.h"

//*****************************************************************//

void mcbsp0_write_rdy(UINT16 out_data)

{

*(unsigned int*)McBSP0_SPSA=0x0001; //McBSP0_SPSA 指向 SPCR2

while(((*(unsigned int*)McBSP0_SPSD) & 0x0002)==0);//查询准备发送标志位XRRY=1?

*(unsigned int *)McBSP0_DXR1= out_data;

return;

}

5、Delay函数

#include "DspRegDefine.h" //VC5402 寄存器定义

#include "e300_codec.h"

39

//*****************************************************************//

void Delay(UINT16 numbers)

{

UINT16 i,j;

for(i=0;i<4000;i++)

for(j=0;j

}

八 实验结果

九 思考题

1.如果给定通带截止频率和阻带截止频率以及阻带最小衰减,如何用窗函数法设计线性相位低通滤

波器?写出设计步骤。

2.定性说明本实验中,3dB截止频率的理论值在什么位置?是否等于理想低通的截止频率?

3.如果要求用窗函数法设计带通滤波器,且给定上下边带截止频率,试求理论带通的单位脉冲响应。

实验八 数字图象处理实验

一、 实验目的

1.理解数字图象处理的基本原理;

2.学习灰度图象反色处理技术;

3.学习灰度图象二值化处理技术。

二、 实验设备

计算机,CCS 3.1 版软件, DSP仿真器,DSP-54XP CPU板。

三、 实验原理

图像是对客观存在的物体的一种相似性的生动模仿或描述。是物体的一种不完全、不精确,但在某种意义上是适当的表示。而数字图像是图像的数字表示,像素是其最小的单位。数字图像的描述有两种分类:一是无彩色图像,二是彩色图像。

数字图像处理就是将一幅图像变为另一幅经过加工的图像,是图像到图像的过程或是将一幅图像转化为一种非图像的表示,如一个决策等。在本实验中,我们是将一个图像处理成特殊图像的过程。灰度图像是指每个像素的信息由一个量化的灰度级来描述的图像,没有彩色信息。黑白图像是指图像的每个像素只能是黑或者白,没有中间的过渡,故又称为2值图像。2 值图像的像素值为0、1。二值化处理是将得到的灰度图像转化为二值数字图像。灰度变换的目的是为了改善画质,使图像的显示效果更加清晰。更具体的算法原理可以参考数字图像处理的相关书籍。

四、 实验步骤

40

1. 正确完成计算机、DSP 仿真器和CPU板的连接后,系统上电。

2. 运行Code Composer Studio (CCS3.1);(ccs3.1需要“DEBUG→Connect”)

3. 用Project/Open打开系统项目文件 normal 21_”工程文件;

双击“” 及“Source”可查看各源程序;并加载“Debug ”;

在“diggraph.c”中三个“i = 0”处设置断点;

4. 单击“Debug Run”,程序运行到第一个断点处停止;用View / Graph / Image打开一个图形观察窗口,按下图设置该图形观察窗口,观察变量y,为6464的二维数组。

5.单击“OK”观察到程序载入的“”图象如下:

6.单击“Debug Run”,程序运行到第二个断点处停止,这时可在图形观察窗口中,观察到原图象经反色处理后的结果图象;

7.单击“Run”,程序运行到第三个断点处停止,这时可在图形观察窗口中,观察到原图象经二值化处理后的结果图象,本程序中,二值化处理阈值设为128;

41

8 关闭各窗口,本实验结束。

五、程序框图

六 实验程序

#include "DspRegDefine.h" //VC5416 寄存器定义

#include "math.h"

#include "stdio.h"

#define IMAGE_WIDTH 64

#define IMAGE_HEIGTH 64

/*******************************************************************/

FILE *fi;

int i,j,k;

int y[IMAGE_HEIGTH][IMAGE_WIDTH];

unsigned char id[64];

/*******************************************************************/

void cpu_init(void);

//*************************主函数***************************//

void main(void)

{

cpu_init();

42

k=128; /*k is Threshold Value*/

fi=fopen("..","rb");

for (i=0; i<=16; i++)

{

fread((char *)id,sizeof(char),IMAGE_WIDTH,fi);

}

fread((char *)id,sizeof(char),54,fi);

for (i=0; i

{

fread((char *)id,sizeof(char),IMAGE_WIDTH,fi);

for (j=0; j

{

y[i][j]=id[j];

}

}

fclose(fi);

i=0;//加软件断点1

for (i=0; i

{

for (j=0; j

{

y[i][j] = (255-y[i][j]);

}

}

i=0;//加软件断点2

for (i=0; i

{

for (j=0; j

{

y[i][j] = 255*((255-y[i][j])/k);

}

}

i=0;//加软件断点3

}

六 实验结果

43

44