数字信号处理资料.docx

上传人:太** 文档编号:62260977 上传时间:2022-11-22 格式:DOCX 页数:14 大小:541.39KB
返回 下载 相关 举报
数字信号处理资料.docx_第1页
第1页 / 共14页
数字信号处理资料.docx_第2页
第2页 / 共14页
点击查看更多>>
资源描述

《数字信号处理资料.docx》由会员分享,可在线阅读,更多相关《数字信号处理资料.docx(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、一. DSP结构TMS320C55X的硬件结构CPU结构图P22C55x有1条32位的程序数据总线(PB), 5条16位数据总线 (BB、CB、DB、EB、FB)和1条24位的程序地址总线及5条23 位的数据地址总线,12条独立总线,这些总线分别与CPU相连。总 线通过存储器接口单元(M)与外部程序总线和数据总线相连,实现 CPU对外部存储器的访问。这种并行的多总线结构,使CPU能在一 个CPU周期内完成1次32位程序代码读、3次16位数据读和两次16 位数据写。C55x根据功能的不同将CPU分为4个单元,即指令缓冲 单元(I)、程序流程单元(P)、地址流程单元(A)和数据计算单元 (D)o

2、C55x的CPU组成1)指令缓冲单元(I单元):书上P23图22 组成:32x16位指令缓冲队列;指令译码器。功能:接收程序代码并放入指令缓冲队列;由指令译码器解 释指令,再把指令流传给其它的工作单元.指令缓冲队列:每个机器周期,PB从程序空间传送32位的程序代码至I 单元的指令缓冲队列;最大可以存放64个字节的待译码指令,可以执 行块循环指令,具有对于分支、调用和返回指令的随机处理能力。1 .指令解码器:当CPU准备译码时,6个字节的代码从队列发送到I单 元的指令译码器;能够识别指令边界,译码8、16、24、32、40和48位 的指令,决定2条指令是否并行执行,将译码结果和立即数送至P单 元

3、、A单元、D单元2)程序流单元(P单元)组成:程序地址发生器;程序控制逻辑功能:产生所有程序空间地址,并送到PAB总线1. P单元:产生程序空间地址,并加载地址到PAB;控制指令流顺序 2.程序地址产生逻辑:产生24位的程序空间取指的地址;可产生顺序地址;也 可以I单元的立即数或D单元的寄存器值作为地址3.程序控制逻辑:接收来自1单元的立即数,并测试来自A单元或D单 元的结果从而执行如下动作:测试条件执行指令的条件是否成立,把 测试结果送程序地址发生器;当中断被请求或使能时,初始化中断服 务程序;控制单一指令重复或块指令重复;管理并行执行的指令3)地址-数据流单元(A单元):图24组成:数据地

4、址产生电路 AGEN);附加16位ALU和1 组寄存器功能:产生读/写数据空间地址,并送到BAB、CAB. DAB 总线LA单元算术逻辑电路:ALU可接收来自I单元的立即数或与存储器、I/O空间、 A单元寄存器、D单元寄存器和P单元寄存器进行双向通信。可完成 如下动作:加法、减法、比拟、布尔逻辑、符号移位、逻辑移位和绝 对值计算;测试、设置、清空、求补A单元寄存器位或存储器位域; 改变或转移寄存器值,循环移位寄存器值,从移位器向一个A单元寄 存器送特定值。2.数据地址产生器单元:DAGEN产生所有读写数据空间的地址。可接收来自I单元的 立即数或来自A单元的寄存器值;根据P单元指示,对间接寻址方

5、式 时选择使用线性寻址还是循环寻址。4)数据运算单元(D单元)组成:1个40位的筒形移位寄存器(barrel shifter);2个乘加单元(MAC) ;1个40位的ALU;假设干寄存器。功能:CPU中最主要的局部,是主要的数据处理部件1 .存储器接口单元(M单元):是CPU和数据空间或I/O 空间.移位器:图25接收来自I单元的立即数,与存储器、I/O空间、D单元寄 存器、P单元寄存器、A单元寄存器进行双向通信;把移位结果送至D 单元的ALU或A单元的ALU;实现40位累加器值最大左移31位或最大右移32位;实现16 位寄存器、存储器或I/O空间数据最大左移31位或最大右移32位;实 现16

6、位立即数最大左移15位;提取或扩张位域,执行位计数;对 寄存器值进行循环移位;在累加器的值存入数据空间之前,对它们进行 取整/饱和处理。2 . D 单元 ALU:可从I单元接收立即数,或与存储器、I/O空间、D单元寄 存器、P单元寄存器、A单元寄存器进行双向通信,还可接收移位器的 结果;加法、减法、比拟、取整、饱和、布尔逻辑以及绝对值运算;在 执行一条双16位算术指令时,同时进行两个算术操作;测试、设置、 清除以及求D单元寄存器的补码;对寄存器的值进行移动。3 .两个MAC:可支持乘法和加/减法。在单个机器周期内,每个MAC可以进 行一次17x17位小数或整数乘法运算和一次带有可选的32或40

7、位饱 和处理的40位加/减法运算。MAC的结果送累加器;MAC接收来自 I单元的立即数,或来自存储器、I/O空间、A单元寄存器的数据,和D单元寄存器、P单元寄存器进行双向通信;MAC的操作会影响P单 元状态寄存器的某些位。 指令流水线:见书本P25页DSP器件的六个特点:哈佛结构,多总线结构,流水线技术, 硬件乘法器,多处理单元结构,嵌入式功能。冯诺依曼结构:程序和数据共用同一套总线,对程序和数据需要分时读写, 执行速度慢,数据吞吐量低,计算机结构简单,不适于进行高速度的 数字信号处理。哈佛结构:程序、数据具有独立的存储空间,有独立的程序总线和数据 总线,可同时对程序和数据进行寻址和读写访问,

8、执行速度高,数据 吞吐量大,计算机结构复杂,非常适于进行高速的数字信号处理。流水线技术,4级流水线分别为:取指令,译码,取数,执行。DSP复位后程序指针指向FF8000H放置着bootloader (引导程序)数据空间为128页每页64k在DSP中有符号,无符号,短整型,整型都是16位。loport类型的指针只有16位CJntOO为C/C+的程序入口地址中断物理地址模型:IVPD(16位):ISP(5位):000(保存)IVPD(16位):中断指针地址+ISP(5位):中断序列号(32个中断) 复位后IVPD(16位户FFFF00H32个中断分为:不可屏蔽中断如:软件中断(指令),硬件中 断(

9、NMLRESET)可屏蔽中断INIM全局中断位IER局部中断位 ISR中断服务程序;IFR中断标志程序CPU中有96个寄存器C55x的存储(数据/程序)空间统一编址,CPU读取程序 代码时,使用24位地址访问相关字节,CPU读写数据时,使 用23位地址访问相关字,两种情况下地址总线上均为24位, 只是数据寻址时地址总线上的最低位强制填充0C55x存储空间(总共为16M字节或8M字)的划分:128个 主页面(0127),每个主页面为64K字,主页面0的前192 个字节或96个字(00 0000hOOOOBFh)被MMR所占用 CPU使用字地址访问数据空间字地址为23位的,寻址16位的数据,地址线

10、为24位的, 当CPU读/写数据空间时,23位的字地址最低位补一个0成为 总地址。例:字地址:00000000000000100000010地址线:()00000000000001000000100I/O空间和程序/数据空间是分开的,只能用来访问DSP外 设上的寄存器I/O空间里的字地址宽度是16位,可以访问64K个地址 对于I/O空间的读写是通过数据读总线DAB和数据写总线 EAB进行的,读写时要在16位地址前补0例。设一条指令从16位地址。102h处读取一个字,那么 DAB传输的24位地址为()0 0102h。汇编语言的设计COFF目标文件通常包括3个默认段,即.text段,通常包含可执行

11、代码.data段,通常包含初始化数据.bss段,通常为未初始化变量保存存储空间汇编器通过段伪指令自动识别各个段,并将段名相同的 语句汇编在一起;汇编器有5条伪指令可以识别汇编语言程序 的各个不同段.text、.data、.sect创立初始化段.bss和.usect创立未初始化段.sect与.usect创立自定义段和子段C编译器生成的段C编译器生成的段有两种基本的类型:初始化段和未初始化段 初始化段有:.cinit段:包含初始化数据表格和常数.pinit段:包含实时运行时调用的数据表格.const段:包含用const定义(不能同时被volatile定义)的 字符串常量和数据.switch段:包含

12、switch语句所用表.text段:包含所有可执行代码未初始化段保存了存储器空间,一段程序可以在运行期间使用 这个空间来生成和存储变量:.bss段:为全局和静态变量保存了空间。在启动和装载的时候, C启动程序或装载程序从.cinit段(通常在ROM中)复制数 据并用这些数据来初始化.bss段中的变量.stack段:为C系统堆栈分配存储地址。这个存储地址用来传 递变量和局部存储.sysmcm段:为动态存储分配保存空间。这个空间被malloc、 calloc和realloc函数调用。如果C程序不使用这些函数,编 译器就不会创立.sysmem段.cio段:支持C I/Oo这个空间用来作为标签为_CI

13、OBUF_ 缓冲区。当任何类型的C I/O被执行(如printf和scant),就);extern void Mcbsp_Config(MCBSP_Handle handle) (MCBSP_config(handle,&McbsplConfig);MCBSP_start( handle,MCBSP_RCV_START |MCBSP_XMIT_START,O); )4) I2C.c#include I2C_Setup Setup = 0, 7 bit地址模式0x0000,自己的地址60,输出频率MHZ400, 10400之间的数字0,/ 8 bits/byte 传输0,DLB窥式关闭0 FRE

14、E模式关闭);void MyI2C_setup(I2C_Setup *Init) int old_intni;Uintl6IPSC_calc;oldjntm = IRQ_gIobalDisahle();/*蒋下面的irs域作了修改,让nc模块处于复位状态,然后进行时钟 的配置*/I2C_RSET(I2CMDR,I2C_I2CMDR_RMK(Init-free,0A0J,1Jnit-a ddrmode,OJnit-dIb,OAOJnit-bitbyte); /* 设置自己地址 */ I2C_RSET(I2COAR,Init-ownaddr); 如果是从机,需要确认自己地址 /*计算IPSC值为I

15、PSC_calc = (Init-sysinclock)/12; /* 一定要是正确的值 */ I2C_RSET(I2CPSC,IPSC_calc);I2C_RSET(I2CCLKL,15); /* 计算 ICCLKL and ICCLKH 寄存器值*/ I2C_RSET(I2CCLKH,15);I2C_FSET(I2CMDRJRS,1); /* 使能 HC 模块 */ IRQ_globalRestore(old_intm);Int MyI2C_VVrite(Uintl6*data,intlength,intmaster,Ui nt 16slaveaddress J nt transfermo

16、de,int timeout) intint oldjntm;Uintl6 temp=l;/oldjntm = IRQ_gIobalDisable();I2C_FSET(I2CMDR,TRX,1); /*设置传输模式 */ 12C_RSET(I2CCNT,length); /* 设置计数寄存器刃 if (master=l) (I2C_RSET(I2CSAR,slaveaddress); /* specify slave address */ I2C_FSET(I2CMDR,MST,1); /* turn master mode on */ if (transfermode=l)/* 设置传输模

17、式*/* S-A-D.(n).D-P mode */I2C_FSET(I2CMDR,RM,0); I2C_FSET(I2CMDR,STP,1); ) else if (transfermode=2) /* S-A-D.(n).D mode (repeat n times)*/I2C_FSET(I2CMDR,RM,0);I2C_FSET(I2CMDR,STP,0);)else if (transfermode=3)/* S-A-D-D-D . (repeat continuous) mode */I2C_FSET(I2CMDR,RM,1);I2C_FSET(I2CMDR,STP,0); else

18、 /* if user specifies something else, go to idle mode */I2C_FSET(I2CMDR,RM,0);I2C_FSET(I2CMDR,STP,0);) 主机结束 else(I2C_FSET(I2CMDR,MST,0); /* if not master, set to slave */ ) oldjntm = IRQ_globalDisable();for (i=0;i=timeout)/* bus busy timeout error */IRQ_globalRestore(old_intni); return 1;)for (m=0;

19、ni=ti meout)(/I RQ_globalRestore( oldjntm);return 2;/* time out for transmit DXR ready */)I2C_RSET(I2CDXR,*data+); /* put first data value in DXR*/I2C_FSET(I2CMDR,STT,1); /* generate start condition */ for (k=l;klength;k+) /* enter main loop for transmitting data */ for (i=0;i2000;i+)for(j=0;j10()0;

20、j+)/* delay loop */ asm (M NOP );for (|=0;l=timeout)(/IRQ_globalRestore(old_intm);return 3; /* No acknowledge bit is set, NACK error */ )for (m=0;m=ti meout)(/I RQ_globalRestore( oldjntm);return 4;/* time out for transmit DXR ready */I2C_RSET(I2CDXR,*data+); /*put next data value in DXR */* 结束 loop

21、*/for (j=();j10;j+) /* last delay loop for last data transferred*/for (i=0;i32000;i+) asm ( NOP”); )for (l=();l=timeout)(/I RQ_globaI Restore( old_i nt m);return 5;/* No acknowledge bit is set, NACK error */IRQ_globalRestore(old_intm);return 0; /* HC的写操作结束*/void 12C_cofig(void)(/ Initialize I2C, Usi

22、ng parameters in I2C_Setup structure MyI2C_setup(&Setup);)int MyI2C_Read(Uintl6*data,intlength,int master,Uintl6slaveaddress,int transfermode,int timeout, int checkbus)(intint oldjntm;Uintl6 temp;/oldjntm = IRQ_globalDisable();/*饭置接收模式,/I2C_FSET(I2CMDR,TRX,0);if (master=l)(I2C_RSET(I2CSAR,slaveaddre

23、ss); /* specify slave address */I2C_FSET(I2CMDR,MST,1); /* turn master mode on */ if (transfermode=l) /* 设置传输模式 */ /* S-A-D.(n).D-P mode */I2C_FSET(I2CMDR,RM,0);I2C_FSET(I2CMDR,STP,1);I2C_RSET(I2CCNT,length);/ICCNT 寄存器设置计数值)else if (transfermode=2)/* S-A-D.(n).D mode (repeat n times)*/I2C_FSET(I2CMD

24、R,RM,0);I2C_FSET(I2CMDR,STP,0);else if (transfermode=3)/* S-A-D-D-D . (repeat continuous) mode */I2C_FSET(I2CMDR,RM,1);I2C_FSET(I2CMDR,STR,0);)else /* if user specifies something else, go to idle mode */I2C_FSET(I2CMDR,RM,0);I2C_FSET(I2CMDR,STP,0);) /*主机模式*/else(I2C_FSET(I2CMDR,MST,0); /* 非主机,设置为从机

25、*/ /*建立结束*/if (checkbus=l)(old_intm = IRQ_globalDisable();for (i=0;i=tinieout) /*线路忙超时准备*/return 1; /*线路忙结束*/I2C_FSET(I2CMDR,STT,1);for (i=0;i32000;i+) /* 延时 loop 接收数据 */ asm (* NOP); for (j=0;j=tinieout)return 2;/* DRR传输超时准备*/*data+ = I2C_RGET(I2CDRR); 将第一个数据放在 DXR 中 for (k=l;kiength;k+) /进入主循环接收数据

26、*/ (for (i=0;i32000;i+) asm (* NOP); for (m=0;m=timeout)return 4;/* DRR传输超时准备*/*data+ = I2C_RGET(I2CDRR); /* 将下一个数据放 在 DXR */ /* 结束 loop */for (i=0;i32000;i+)/* loop 最后延时 */ asm (* NOP); /IRQ_globalRestore(old_intm);return 0; /*结束12读操作,/void Set_WorkMode(int Master, Uintl6 SlaveAddress, int Transfer

27、 Mode )/* set in transmit mode */I2C_FSET(I2CMDR,TRX,1);I2C_RSET(I2CCNT,4); 设置 count register 长度设置为 4 */ if (Master = 1)(I2C_RSET(I2CSAR,SlaveAddress); /* 确认从机地址 */I2C_FSET(I2CMDR,MST,1); /* 开主机模式列if (TransferMode = 1)/* 设置传输模式 */* S-A-D.(n).D-P mode */I2C_FSET(I2CMDR,RM,0);I2C_FSET(I2CM D R,STP,1);

28、)else if (TransferMode = 2)/* S-A-D.(n).D mode (repeat n times)*/I2C_FSET(I2CMDR,RM,0);I2C_FSET(I2CMDR,STP,0);)else if (TransferMode = 3)/* S-A-D-D-I) . (repeat continuous) mode */I2C_FSET(I2CMDR,RM,1);I2C_FSET(I2CMDR,STP,0);Ielse/*用户在做某事时候,设置为线路空闲*/I2C_FSET(I2CMDR,RM,0);I2C_FSET(I2CMDR,STP,0);)/* e

29、nd if master */else(I2C_FSET(I2CMDR,MST,0); /*非主机,那么设置为从机*/* end set up */int Judge_I2cStatus(int TimeOut)(unsigned int i, m;int old_intm;Uintl6 Temp = 1;oldjntm = I RQ_globalDisable();for (i = 0; i = TimeOut)/*线路忙超时错误*/IRQ_globalRestore(old_intm);return 1;)for (m = 0; m = TimeOut) (/IRQ_globalResto

30、re(o!d_intm);return 2;/* DXR传输超时准备*/ return 0;)int VVriteSigVVord_Dcal(int TimeOut) unsigned int i, j, 1, in;Uintl6 Temp = 1;for (i=0;i2000;i+) For(j=0;j1000;j+) /* loop 延时 */ asm(M NOP); for (l=0;l=TimeOut) (/IRQ_globalRestore(old_intm);return 3; /* No acknowledge bit is set, NACK error */ ) for (m

31、=0;m=TimeOut)(/IRQ_globalRestore(oldJntm);return 4;/*传输DXR超时准备*/)return 0;) int LastBvte_Deal(int TimeOut) (int ij,l;Uintl6 Temp = 1;for(j=0;j10;j+)尸最后一个对传输字节loop延时*/ for (i = 0; i 32000; i+) asm (“ NOP); )for (l=0;l= TimeOut)(/IRQ_globalRestore(old_intin);return 5;/* 无确认,NACK 错误 */ return 0;)int My

32、I2C_WriteSigVVord(unsigned int OwnAdd, unsigned int data, int master, Uintl6 slaveaddress, int transfermode, int timeout) (unsigned int HighAdd, LowAdd;unsigned int HighByte, LowByte;int RetValue;HighAdd = (OwnAdd & 0xFF()()8;Low Add = OwnAdd & OxOOFF;HighByte = (data & 0xFF00)8;LowByte = data & OxO

33、OFF;Set_VVorkMode(master, slaveaddress, transfermode); 设置 I2C工作最/old_intm = IRQ_globalDisable();Ret Value = Judge_I2cStatus(timeout);if( Ret Value != 0)return( Ret Value);I2C_RSET(I2CDXR,HighAdd); /* 将第一个数据放在 DXR */I2C_FSET(I2CMDR,STT,1); /*产生开始环境刃Ret Value = VVriteSigWord_Deal(timeout);if(RetValue

34、!= 0)return( Ret Value);I2C_RSET(I2CDXR,LowAdd); /* 将下一个数据放在 DXR */RetValue = VVriteSigWord_Deal(timeout);if( Ret Value != 0)return(RetValue);I2C_RSET(I2CDXR,HighByte); /*将下一个数据放在 DXR */RetValue = W riteSig Word_Deal(ti meout);if(RetValue != 0)return(RetValue);I2C_RSET(I2CDXR,LowByte);/*将下一个数据放在 DXR

35、 /RetValue = LastByte_Deal(timeout);if(RetValue != 0)return( RetValue);return 0;5) DEC5502_CODEC.c#include #include #include #include #include #include #include #include include ,5502_FLASH.hMinclude E2PROM_Function.h”include CODEC.h#undef CODEC.ADDR#defme CODEC_ADDR 0x1 AUintl6 SourDatal65536=0;Uin

36、tl6 SourData2655361=0;Uintl6 SourData365536=0;Uintl6 OutDatal65536=0;Uintl6 OutData265536=0;Uintl6 OutData365536=0;#pragma DATA_SECTION (SourDatal J.AudioJn_data);#pragma DATA_SECTION (SourData2,”.Audio_in_data2);#pragnia DATA_SECTION (SourData3J.Aiidio_iii_data3”);#pragnia DATA_SECTION (OutDatal,M.

37、Audio_out_datar,);#pragma DATA_SECTION (OutData2J.Audio_out_data2);#pragma DATA_SECTION (OutData3J.Audio_out_data3);#define AUDIOTRYOxAAOA/音频试访#define AUDIOCOPY0xAA07音频存贮并回放#define TESTCOMMAND 2操作命令选择MCBSP_Handle hMcbsp; / 定义 McBSP 的句柄 void main(void) (Uintl6 DataTempLefl = 0; 暂存采样数据Uintl6 DataTempR

38、ight = 0;Uintl6 i;Uintl6 TempData;Uintl6 TestComniand =0;CSL_init();初始化库#if TESTCOMMAND=1TestComniand =AUDIOTRY; 试听#endif#if TESTCOMMAND=2TestCommand =AUDIOCOPY; 录音并回放#endif/该频率是为了设置IIC模块的需要设置的,为了使用I2C_setup函数, 系统主频是240MHZPLL_setFreq(l, OxC, 0, 1, 3, 3, 0);Emif_Config();/EMIF 初始化hMcbsp=CBSP_open(MCB

39、SP_PORTl,MCBSP_OPEN_RESET);初始化McBSP端口 1,得到McBSP句柄Mcbsp_Config(hMcbsp); 初始化 McBSP 端口 1I2C_cofig();/IIC 的初始化 inti_AIC();/CODEC寄存器初始化 while(l) (switch(TestCommand)/*音频试听*/case AUDIOTRY: wliikf(!MCBSP_rr山(hMcbsp)。;/* 左通路数据以DataTempLeft = MCBSP_readl6(hMcbsp);while(!MCBSP_rrdy(hMcbsp);/* 右通路数据 */DataTemp

40、Right = MCBSP_readl6(hMcbsp);while(!MCBSP_xrdy(hMcbsp) ;/*左声道耳机输出 */MCBSP_writel6(hMcbsp,DataTempLeft);while(!MCBSP_xrdy(hMcbsp) ;/*右声道耳机输出 */MCBSP_writel6(hMcbsp,DataTempRight);break;case AUDIOCOPY: /*音频存贮并回放*/ for(i=0;i65535;i+)/SourDatai = M CBSP_read 16( h Mcbsp);TempData=MCBSP_readl6(hMcbsp); S

41、ourDatal(i!=TenipData;for(i=0;i65535;i+)(while(!MCBSP_rrdy(hMcbsp);/SourDatai = MCBSP_readl6(hMcbsp);TempData=MCBSP_readl6(hMcbsp); SourData2i=TenipData;)for(i=0;i65535;i+)(while(!MCBSP_rrdy(hMcbsp);/SourDatai = MCBSP_readl6(hMcbsp);TempI)ata=MCBSP_readl6(hMcbsp); SourData3i=TempData;)for(i=0;i65535;i+) OutDatali = SourDatali; for(i=0;i65535;i+) OutData2i = SourData2i; for(i=0;i65535;i+) OutData3i = SourData3iJ; for(i=0;i65535;i+)(while(!MCBSP_xrdy(hMcbsp) ;MCBSP_writel6(hMcbsp,OutDatali);)for(i=0;i65535;i+)(while(!MCBSP_xrdy(hMcbsp) ;MCBSPlwritel6

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 解决方案

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁