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,为6464的二维数组。 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


发布评论