缓冲串口1发送数据,各种时钟信号均由C5402产生,PCM1744被动接收各种信息。PCM1744的系统时钟信号(SCKI)由C5402的TOUT引脚提供,TOUT是C5402的定时器输出信号引脚,有较强的驱动能力,可以驱动多个芯片。PCM1744的数据接收时钟格式必须是IIS格式,C5402在缓冲串口寄存器中设置各种时钟方式时,必须满足IIS格式的要求。C5402作为主动工作器件,可以对其缓冲串口输出信号进行调整。输出的采样时钟信号、位时钟信号可以在McBSP寄存器SRGR1和SRGR2中设置,设置遵循图3.4的原则。 图3.4 C5402时钟发生流程图基本的时钟信号可以来自CPU时钟,也可以来自晶振时钟,这在SRGR2寄存器中的第13位设置。基本时钟输入后,经CLKGDV(SRGR1的第7位到第0位)所设置的值进行第一次分频,得到位时钟信号(由BCLKX1脚输出)。值得注意的是,位时钟信号最高为DSP频率的一半。位时钟信号经FPER(SRGR2的第11位到第0位)和FWID(SRGR1的第15位到第8位)所设置的值进一步分频得到采样时钟信号(由BFSX1脚输出),FPER和FWID分别设置采样时钟信号的低电平和高电平的时间值。C5402与PCM1744的硬件接线如图3.5所示。 图3.5 PCM1744与C5402接线图PCM1800完成音频信号采集后,在DSP的外扩程序存储器中嵌入相应的处理算法,语音信号经处理后,再从PCM1744输出。复位电路:所用芯片为74HC14。复位电路图3.6如下所示: 图3.6 复位电路图存储器模块所用芯片为:MT48LC8M8A2TG-75、存储容量Density 为64Mb、数据宽度16位、工作电压 3.3V、 TSOP封装 54管脚、 时钟速率133 MHz、 存储器模块图3.7如下所示: 图3.7 存储器模块图3.2系统软件设计3.1.1 TMS320VC5416初始化 SWWSR=0x7fff;/程序、数据、I/O空间 SWCR=0x0001;/等待周期为7×2=14 BSCR=0x8006;/按32KW分区,HD[7:0],D[15:0]Hold CLKMD=PLL_DIV_INIT; Waitloop(0x0400); CLKMD=PLL_LOCK_INIT_X(5); Waitloop(0x0400); PMST=0x0168;/中断向量表定位在0X100,MP/MC=1 OVLY=1 DROM=1; 3.2 TLV320AIC23初始化 为使AIC23正常工作并产生预期的音频效果,必须对其相应的寄存器进行配置。首先对VC5416的I2C模块初始化,将AIC23总线上的地址写入从机地址寄存器ICSAR;再把相应的AIC23内部映射寄存器的地址和待写数据合并为16bit控制字,逐次写入ICDXR,并通过I2C总线发送给AIC23,即可完成对AIC23的初始化配置。 AIC23初始化的部分源代码:Unsigned int codec_buf={OX1e00,OXOc00,OxO81a OxOaO4,OxOe01,0x1020,0x1021,0x0117,OxO5f9}; Port_sub_address=(unsigned int*)MCBSP_SPSA_ADDR(1); Port_sub_index_reg=(unsigned int*)MCBSP_SPAD_ADDR(1); *Port_sub_address=MCBSP_SPCR2_SUBADDR; For(i=O;i<9;i++){ While(!(*Port_sub_index_reg&(MASK_BIT(XRDY)))); Set_codec_cs_low(); MCBSP1_DXR1=codec_buf[i]; While(!(*Port_sub_index_reg&(MASK_BIT(XRDY)))); Set_codec_cs_high();} 第4章 总结 经过这次的课程设计,我发现我在DSP这方面学得不够,很多东西都学得不够全面,掌握得不够深,不能熟练地把它们应用在实践当中。这次在刘伟春老师的细心指导和同学的热心帮助,以及自己上网查找资料下,还算比较顺利地完成了本次课程设计的任务。这次课程设计使我对DSP方面的知识有更深的理解,强化了自己的基础知识,也深刻体会到DSP技术应用领域的广泛。同时对CCS集成环境更为熟悉了,为我在今后的工作中奠定了坚实的实践基础。通过这次课程设计让我明白基础知识的重要性,同时也要理解更多的有关它的知识,并且很好地运用到实践当中,也让我知道了要好好地学习,不能懈怠。参考文献戴明桢等编著.TMS320C54X DSP 结构原理及应用. 北京:航空航天大学出版社,第2版,2007;彭启琮编著.DSP技术的发展与应用.北京:高等教育出版社,2002;胡广书编著.数字信号处理理论、算法与实现.北京:清华大学出版社,2005;张雄伟,曹铁勇.DSP芯片的原理与开发应用(第二版)[M].北京:电子工业出版社,2000; 郝软层,徐金甫.基于DSP芯片的MELP声码器的算法实现[J].微计算机信息,2006;任丽香,马淑芬,李方慧.TMS220600系列DSP的原理与应用[M].北京:电子工业出版社,2000;北京合众达电子技术有限公司编著.SEED-DTK系列实验手册.北京合众达电子技术有限公司出版,2007。致 谢在这次课程设计过程中,我要感谢每一个帮助过我的人。本论文是在刘老师的悉心指导下完成的,刘老师对我的论文提出了很多宝贵的意见,帮助我开拓研究思路,精心点拨、热忱鼓励。同时,刘老师渊博的学识、严谨的治学态度也令我十分敬佩,是我以后学习和工作的榜样。在整个设计过程中我懂得了许多东西,也培养了我独立工作的能力,树立了对自己工作能力的信心,相信会对今后的学习工作生活有非常重要的影响,同时,也让我知道了那些基础知识的重要性。本论文的顺利完成,离不开我们老师悉心教导、同学和朋友的关心和帮助。总之,感谢每一位关心过我,爱护过我的人。最后,再次感谢各位老师各位同学的帮助和支持,衷心地谢谢你们!附 录源代码如下:#include void iirbcf(ifilt,band,ns,n,f1,f2,f3,f4,db,b,a) double b[],a[],f1,f2,f3,f4,db;/* TMS320VC5416初始化*/SWWSR=0x7fff;/程序、数据、I/O空间 SWCR=0x0001;/等待周期为7×2=14 BSCR=0x8006;/按32KW分区,HD[7:0],D[15:0]Hold CLKMD=PLL_DIV_INIT; Waitloop(0x0400); CLKMD=PLL_LOCK_INIT_X(5); Waitloop(0x0400); PMST=0x0168;/中断向量表定位在0X100,MP/MC=1 OVLY=1 DROM=1;/* TLV320AIC23初始化*/Unsigned int codec_buf={OX1e00,OXOc00,OxO81a OxOaO4,OxOe01,0x1020,0x1021,0x0117,OxO5f9}; Port_sub_address=(unsigned int*)MCBSP_SPSA_ADDR(1); Port_sub_index_reg=(unsigned int*)MCBSP_SPAD_ADDR(1); *Port_sub_address=MCBSP_SPCR2_SUBADDR; For(i=O;i<9;i++){ While(!(*Port_sub_index_reg&(MASK_BIT(XRDY)))); Set_codec_cs_low(); MCBSP1_DXR1=codec_buf[i]; While(!(*Port_sub_index_reg&(MASK_BIT(XRDY)))); Set_codec_cs_high();}int ifilt,band,ns,n; {int k; double omega,lamda,epslon,f1,fh; double d,c; void chebyi(),chebyii(),bwtf(); double coshl(),warp(),bpsub(),omin(); void fblt(); if((band==1)||(band==4)) fl=f1; if((band==2)||(band==3)) fl=f2; if(band<=3) fh=f3; if(band==4) fh=f4; if(ifilt<3) { switch(band) { case1: case2: { omega=warp(f2)/warp(f1); break; } case3: { omega=omin(bpsub(warp(f1),fh,fl),bpsub(warp(f4),fh,fl)); break; } case4: {omega=omin(1.0/bpsub(warp(f2),fh,fl),1.0/bpsub(warp(f3),fh,fl));} } lamda=pow(10.0,(db/20.0)); epslon=lamda/cosh(2*ns*coshl(omega)); } for(k=0;k{ switch(ifilt) { case1: { chebyi(2*ns,k,4,epslon,d,c); break; } case2: { chebyii(2*ns,k,4,omega,lamda,d,c); break; } case3: { bwtf(2*ns,k,4,d,c); break; } } fblt(d,c,n,band,fl,fh,&b[k*(n+1)+0],&a[(n+1)+0]); } } static double coshl(x) double x; { double z; z=log(x+sqrt(x*x-1.0)); return(z); } static double warp(f) double f; { double pi,z; pi=4.0*atan(1.0); z=tan(pi*f); return(z); } static double bpsub(om,fh,fl) double om,fh,fl; { double z; z=(om*om-warp(fh)*warp(fl))/((warp(fh)-warp(fl))*om); return(z); } static double omin(om1,om2) double om1,om2; { double z,z1,z2; z1=fabs(om1); z2=fabs(om2); z=(z1return(z); } static void bwtf(ln,k,n,d,c) int ln,k,n; double d[],c[]; { int i; double pi,tmp; pi=4.0*atan(1.0); d[0]=1.0; c[0]=1.0; for(i=1;i<=n;i++) { d[i]=0.0; c[i]=0.0; } tmp=(k+1)-(ln+1.0)/2.0; if(tmp==0,0) {c=1.0;} else { c=-2.0*cos((2*(k+1)+ln-1)*pi/(2*ln)); c=1.0; } } static void chebyi(ln,k,n,ep,d,c) double d[],c[],ep; int ln,k,n; {int i; double pi,gam,omega,sigma; pi=4.0*atan(1.0); gam=pow(((1.0+sqrt(1.0+ep*ep))/ep),1.0/ln); sigma=0.5*(1.0/gam-gam)*sin((2*(k+1)-1)*pi/(2*ln)); omega=0.5*(1.0/gam+gam)*cos((2*(k+1)-1)*pi/(2*ln)); for(i=0;i<=n;i++) {d[i]=0.0; c[i]=0.0; } if(((ln%2)==1)&&((k+1)==(ln+1)/2)) { d[0]=-sigma; c[0]=d[0]; c=1.0; } else { c[0]=sigma*sigma+omega*omega; c=-2.0*sigma; c=1.0; d[0]=c[0]; if(((ln%2)==0)&&(k==0)) d[0]=d[0]/sqrt(1.0+ep*ep); } } static void chebyii(ln,k,n,ws,att,d,c) double d[],c[],ws,att; int ln,k,n; { int i; double pi,gam,alpha,beta,sigma,omega,scln,scld; pi=4.0*atan(1.0); gam=pow((att+sqrt(att*att-1.0)),1.0/ln); alpha=0.5*(1.0/gam-gam)*sin((2*(k+1)-1)*pi/(2*ln)); beta=0.5*(1.0/gam+gam)*cos((2*(k+1)-1)*pi/(2*ln)); sigma=ws*alpha/(alpha*alpha+beta*beta); omega=-1.0*ws*beta/(alpha*alpha+beta*beta); for(i=0;i<=n;i++) { d[i]=0.0; c[i]=0.0; } if(((ln%2)==1)&&((k+1)==(ln+1)/2)) { d[0]=-1.0*sigma; c[0]=d[0]; c=1.0; } else { scln=sigma*sigma+omega*omega;scld=pow((ws/cos((2*(k+1)-1)*pi/(2*ln))),2); d[0]=scln*scld; d=scln; c[0]=d[0]; c=-2.0*sigma*scld; c=scld; } } #inlcude static void fblt(d,c,n,band,fln,fhn,b,a) int n,band; double fln,fhn,d[],d[],b[],a[]; { int i,k,m,n1,n2,ls; double pi,w,w0,w1,w2,tmp ,tmpd,tmpc,*work; double combin(); void bilinear(); pi=4.0*atan(1.0); w1=tan(pi*fln); for(i=n;i>=0;i--) { if((c[i]!=0.0)||(d[i]!=0.0)) break; } m=i; switch(band) { case1: case2: { n2=m; n1=n2+1; if(band==2) { for(i=0;i<=m/2;i++) { tmp=d[i]; d[i]=d[m-i]; d[m-i]=tmp; tmp=c[i]; c[i]c[m-i]; c[m-i]=tmp; } } for(i=0;i<=m;i++) { d[i]=d[i]/pow(w1,i); c[i]=c[i]/pow(w1,i); } break; } case3: case4: { n2=2*m; n1=n2+1; work=malloc(n1*n1*sizeof(double)); w2=tan(pi*fhn); w=w2-w1; w0=w1*w2; if(band==4) { for(i=0;i<=m/2;i++) { tmp=d[i]; d[i]=d[m-i]; d[m-i]=tmp; tmp=c[i]; c[i]=c[m-i]; c[m-i]=tmp; } } for(i=0;i<=n2;i++) { work[0*n1+i]=0.0; work[1*n1+i]=0.0; } for(i=0;i<=m;i++) { tmpd=d[i]*pow(w,(m-i)); tmpc=c[i]*pow(w,(m-i)); for(k=0;k<=i;k++) { ls=m+i-2*k; tmp=combin(i,i)/(combin(k,k)*combin(i-k,i-k)); work[0*n1+ls]+=tmpd*pow(w0,k)*tmp; work[1*n1+ls]+=tmpc*pow(w0,k)*tmp; } } for(i=0;i<=n2;i++) { d[i]=work[0*n1+i]; c[i]=work[1*n1+i]; } free(work); } } bilinear(d,c,b,a,n); } static double combin(i1,i2) int i1,i2; { int i; double s; s=1.0; if(i2==0) return(s); for(i=i1;i>(i1-i2);i--) {s*=i;} return(s); } static void bilinear(d,c,b,a,n) int n; double d[],c[],b[],a[]; { int i,j,n1; double sum,atmp,scale,*temp; n1=n+1; temp=malloc(n1*n1*sizeof(double)); for(j=0;j<=n;j++) {temp[j*n1+0]=1.0;} sum=1.0; for(i=1;i<=n;i++) { sum=sum*(double)(n-i+1)/(double)i; temp[0*n1+i]=sum; } for(i=1;i<=n;i++) for(j=1;j<=n;j++) { temp[j*n1+i]=temp[(j-1)*n1+i]-temp[j*n1+i-1]-temp[(j-1)*n1+i-1]; } for(i=n;i>=0;i--) { b[i]=0.0; atmp=0.0; for(j=0;j<=n;j++) { b[i]=b[i]+temp[j*n1+i]*d[j]; atmp=atmp+temp[j*n1+i]*c[j]; } scale=atmp; if(i!=0) a[i]=atmp; } for(i=0;i<=n;i++) { b[i]=b[i]/scale; a[i]=a[i]/scale; } a[0]=1.0; free(temp); }