嵌入式实训报告语音录放程序设计.docx

上传人:b****2 文档编号:325958 上传时间:2023-04-28 格式:DOCX 页数:17 大小:113.47KB
下载 相关 举报
嵌入式实训报告语音录放程序设计.docx_第1页
第1页 / 共17页
嵌入式实训报告语音录放程序设计.docx_第2页
第2页 / 共17页
嵌入式实训报告语音录放程序设计.docx_第3页
第3页 / 共17页
嵌入式实训报告语音录放程序设计.docx_第4页
第4页 / 共17页
嵌入式实训报告语音录放程序设计.docx_第5页
第5页 / 共17页
嵌入式实训报告语音录放程序设计.docx_第6页
第6页 / 共17页
嵌入式实训报告语音录放程序设计.docx_第7页
第7页 / 共17页
嵌入式实训报告语音录放程序设计.docx_第8页
第8页 / 共17页
嵌入式实训报告语音录放程序设计.docx_第9页
第9页 / 共17页
嵌入式实训报告语音录放程序设计.docx_第10页
第10页 / 共17页
嵌入式实训报告语音录放程序设计.docx_第11页
第11页 / 共17页
嵌入式实训报告语音录放程序设计.docx_第12页
第12页 / 共17页
嵌入式实训报告语音录放程序设计.docx_第13页
第13页 / 共17页
嵌入式实训报告语音录放程序设计.docx_第14页
第14页 / 共17页
嵌入式实训报告语音录放程序设计.docx_第15页
第15页 / 共17页
嵌入式实训报告语音录放程序设计.docx_第16页
第16页 / 共17页
嵌入式实训报告语音录放程序设计.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

嵌入式实训报告语音录放程序设计.docx

《嵌入式实训报告语音录放程序设计.docx》由会员分享,可在线阅读,更多相关《嵌入式实训报告语音录放程序设计.docx(17页珍藏版)》请在冰点文库上搜索。

嵌入式实训报告语音录放程序设计.docx

嵌入式实训报告语音录放程序设计

语音录放程序设计

要求:

在mini240开发板上,连接麦克风和扬声器,设计裸机语音录放程序,通过键盘控制,实现录音和放音操作。

天/日期

任务描述

通过标准

第1天

项目任务分析,分析实训内容,讲解相关知识,引导学生入门。

学生理解题目及要求

第2天

学生具体分析实训题目,明确思路和任务,查询相关书籍、资料,分析I2S协议,分析语音文件编码格式,重点分析S3C2440的I2S总线接口工作原理和相关寄存器功能。

画出相关流程图

第3天

查阅UDA1341TS的有关资料,分析其内部结构、引脚端功能、应用电路和编程方法。

写出分析结果

第3天

编写放音启动程序,定义函数,编写PCLK降频程序。

代码通过

第4天

编写端口初始化函数,编写DMA初始化函数。

编写DMA中断注册函数。

代码通过

第5天

编写UDA1341初始化函数。

代码通过

第6天

编写放音I2S初始化函数。

代码通过

第7天

放音文件格式转换,设置起始地址和内容。

代码通过

第7天

编写主函数,启动放音,进入调试。

代码通过

第8天

编写录音I2S初始化函数。

代码通过

第9天

编写主函数,启动录音,存储数据。

代码通过

第10天

进入调试,录音完毕,播放声音。

代码通过

第11天

进一步调试,实现语音录放功能。

代码通过

第12天

写语音录放编程总结报告。

IIS总线控制器结构如图所示

ADDR

DATA

CNTL

PCLK

CDCLK

其原理图分析:

(1)两个3位预取器(IPSR):

一个(IPSR_A)用于产生IIS总线接口的主时钟;一个(IPSR_B)用作外部CODEC时钟发生器。

(2)16字节FIFO:

在发送数据时,数据被写进TXFIFO;在接收数据时,数据从RXFIFO中读取。

(3)主IISCLK产生器(SCLKG):

在主模式,由主时钟产生穿行为时钟。

(4)通道产生器和状态机(CHNC):

IISCLK和IISLRCK由通道状态机产生并控制。

(5)16位移位寄存器(SFTR):

在发送数据时,并行数据经由SFTR变成串行数据输出;在接收数据时,串行数据由SFTR转变成并行数据。

功能描述:

总线接口,寄存器组合状态机(BRFC):

总线接口逻辑和FIFO访问由状态机控制。

5位双预定标器(IPSR):

一个预定标器用于IIS总线接口的主时钟发生器,另外一个用作外部编解码时钟发生器。

64位FIFO(TxFIFO和RxFIFO):

在发送数据传输时,数据写到TxFIFO;在接收数据传输时,从RxFIFO读取数据。

主IISCLK发生器(SCLKG):

在主设备模式,串行位时钟是从主时钟生成。

通道发生器和状态机(CHNC):

IISCLK和iislrck是由通道状态机生成并控制。

15位移位寄存器(SFTR):

在发送模式下并行数据移位成串行数据输入移位成并行数据。

IIS接口控制原理:

S3C2440X内置了一个IIS总线控制器,该控制器实现到一个外部8/16位立体声音频编解码器接口,支持IIS总线数据格式和MSB-justified数据格式。

S3C2410X中有两条串行数据线,一条是输入信号数据线,一条是输出信号数据线,以同时发送和接收数据。

IIS接口有3种工作方式:

(1)正常传输模式,正常模式下使用IISCON寄存器对FIFO进行控制。

如果传输FIFO缓存为空,IISCON的第7位被设置为“0”,表示不能继续传输数据,需要CPU对缓存进行处理。

如果传输FIFO缓存非空,IISCON的第7位被设置成“1”,表示可以继续传输数据。

同样,数据接收时,如果FIFO满,标识位是“0”,此时,需要CPU对FIFO进行处理,如果FIFO没有满,那么标志位是“1”,这个时候可以继续接收数据。

(2)DMA模式,通过设置IISFCON寄存器可以使IIS接口工作于这种模式下。

在这种模式中,FIFO寄存器组的控制权掌握在DMA控制器上,当FIFO满了,由DMA控制器对FIFO中的数据进行处理。

DMA模式的选择由IISCON寄存器的第4位和第5位控制。

(3)传输/接收模式,这种模式下,IIS数据可以同时接收和发送音频数据。

IIS总线控制器结构如图8.2所示,各功能说明如下:

(1)两个5比特预除器IPSR,IPSA_A用于产生IIS总线接口的主时钟,IPSA_B用做外部CODEC时钟产生器。

(2)16字节FIFO,在发送数据时数据被写进TxFIFO,在接收数据时数据从RxFIFO中读取。

(3)主IISCLK产生器SCLKG,在主模式下,有主时钟产生串行位时钟。

(4)通道产生器和状态机CHNC,IISCLK和IISLRCK有通道状态机产生并控制。

(5)16比特移位寄存器(SFTR),在发送数据时,并行数据经由SFTR变成串行数据输出;在数据接收时,串行数据由SFTR转变成并行数据。

IIS相关的寄存器包括IIS控制寄存器IISCON、IIS模式寄存器IISMOD和IIS分频寄存器IISPSR。

UDA1341TS是一个低成本、小尺寸、低功耗、高性能的立体声音频编解码器,支持IIS和L34两种接口。

它用于实现模拟音频信号的采集(音频A/D)和数字音频信号的模拟信号使出(D/A),并通过IIS数字音频接口,实现音频信号的数字化处理。

片内有音频数据用的A/D转换器和D/A转换器。

芯片提供了两个麦克风输入通道,分别连接到VINL1和VINR1、VINL2和VINR2引脚。

芯片提供了一路输出,通过VOUTR和VOUTL与扬声器连接。

片内配置了可编程增益放大器和自动增益控制器,扬声器音量可以编程调节或进入静音状态;在ADC路径上,还提供了可编程滤波器、混音器等。

UDA1341TS提供2组音频信号输入线、1组音频信号输出线、1组IIS总线接口信号线和1组L3总线。

UDA1341TS的L3总线包括微处理器接口数据L3DATA、微处理器接口模式L3MODE、微处理器接口始终L3CLLOCK三根信号线。

分析S3C2440A与UDA1341TS的连线由两组接口组成:

一组是IIS总线接口,在S3C2440A端信号是:

CDCLK(CODEC系统时钟);I2SSCLK(IIS总线串行时钟);I2SLRCK(IIS总线声道选择时钟);I2SSDI(IIS总线串行数据输入);I2SSDO(IIS总线串行数据输出)。

另一组是L3总线接口,在S3C2440A端连接到GPG10、GPG8、GPG9,在UDA1341TS连接接到L3DATA(L3总线数据,输入输出)、L3MODE(L3总线模式,输入)、L3CLOCK(L3总线时钟,输入)。

音频数据传送过程可以简单描述为:

处理器通过IIS总线接口,控制音频数据在S3C2440A内存与UDA1341TS之间传送。

连接在UDA1341TS上的麦克风信号在UDA1341TS内部经过A/D转换器等,转换成二进制数,串行通过DATAO引脚送新的到S3C2440A的IIS模块,在IIS模块中数据转换成并行数据,然后使用通常存取方式或DMA存取方式,将并行数据保存在内存中;而内存中要输出的音频数据,使用通常存取方式或DMA存取方式,将数据并行传送到IIS模块,在IIS模块中转换成串引脚送到UDA1341TS,在片内经过D/A转换器等,变成模拟信号,经过驱动器等,驱动扬声器。

音频接口电路设计其控制器结构图如下:

1.放音

放音程序代码如下:

#include"2440addr.h"

#include"2440lib.h"

#include"def.h“

#include"2440iis.h"

voidChangeDMA2(void);

voidIIS_PortSetting(void);

void_WrL3Addr(U8data);

void_WrL3Data(U8data,inthalt);

void__irqDMA2_Done(void);

void__irqDMA2_Rec_Done(void);

void__irqRxInt(void);

void__irqMuting(void);

#defineL3C(1<<4)//GPB4=L3CLOCK

#defineL3D(1<<3)//GPB3=L3DATA

#defineL3M(1<<2)//GPB2=L3MODE

#definePLAY0

#defineRECORD1

//#defineREC_LEN0x50000//327,680Bytes

#defineREC_LEN0x100000//1,048,576Bytes

#defineDataCount0x10000//IISMaster/SlaveDataRx/TxCount

#defineDataDisplay0x100//IISMasterDataDisplayCount

#definePollMode0//1:

PollingMode

#defineDMA2Mode1//1:

DMA2Mode

#defineMICGain_Amp_Sel0//0:

Inputchannel2Amp.1:

MICAmp.

unsignedchar*Buf,*_temp;

unsignedshort*rec_buf;

volatileunsignedintsize=0;

volatileunsignedintfs=0;

volatilecharwhich_Buf=1;

volatilecharRec_Done=0;

volatilecharmute=1;

voidPlayTest_Iis(void)

{

unsignedintsave_B,save_E,save_PB,save_PE;

Uart_TxEmpty(0);

由于IIS时钟从系统分频得到,下面的代码将系统PCLK降到33MHz,而且降频后必须对串口重新进行初始化。

ChangeClockDivider(1,1);//1:

2:

4

ChangeMPllValue(0x96,0x5,0x1);//FCLK=135.428571MHz(PCLK=33.857142MHz)

Uart_Init(33857142,115200);

Uart_Printf("[IIStest(Play)usingUDA1341CODEC]\n");

然后将用到的端口保存起来,并进行端口初始化。

save_B=rGPBCON;

save_E=rGPECON;

save_PB=rGPBUP;

save_PE=rGPEUP;

IIS_PortSetting();

IIS采用DMA方式进行录音和播放,因此需要进行DMA中断的注册。

pISR_DMA2=(unsigned)DMA2_Done;

然后获取语音数据及其大小、采样频率。

rINTSUBMSK=~(BIT_SUB_RXD0);

rINTMSK=~(BIT_EINT0|BIT_UART0|BIT_DMA2);

//Non-cacheablearea=0x31000000~0x33feffff

Buf=(unsignedchar*)0x31000000;

_temp=Buf;

Uart_Printf("DownloadthePCM(noADPCM)filebyDNW(Withheader)!

!

\n");

size=*(Buf)|*(Buf+1)<<8|*(Buf+2)<<16|*(Buf+3)<<24;

Uart_Printf("\nNow,Downloading...",size);

rINTSUBMSK|=BIT_SUB_RXD0;

size=*(Buf+0x2c)|*(Buf+0x2d)<<8|*(Buf+0x2e)<<16|*(Buf+0x2f)<<24;

size=(size>>1)<<1;

fs=*(Buf+0x1c)|*(Buf+0x1d)<<8|*(Buf+0x1e)<<16|*(Buf+0x1f)<<24;

接着初始化UDA1341,设置为放音模式:

Init1341(PLAY);

接着进行DMA初始化:

rDISRC2=(int)(Buf+0x30);//0x31000030~(Removeheader)

rDISRCC2=(0<<1)+(0<<0);//源地址位于系统总线AHB,地址递增

rDIDST2=((U32)IISFIFO);//IISFIFO

rDIDSTC2=(1<<1)+(1<<0);//目的地址位于外设总线APB,地址固定

rDCON2=(1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(0<<24)+

(1<<23)+(0<<22)+(1<<20)+(size/4);

//101000001001xxxxxxxxxxxxxxxxxxxx

//Handshake[31],SyncPCLK[30],CURR_TCInterruptRequest[29],

//SingleTx[28],Singleservice[27],

//I2SSDO[26:

24],DMAsourceselected[23],Auto-reload[22],

//Half-word[21:

20],size/2[19:

0]

rDMASKTRIG2=(0<<2)+(1<<1)+(0<<0);//No-stop[2],DMA2channelOn[1],

No-swtrigger[0]

IIS初始化:

if(fs==44100)//11.2896MHz(256fs)

rIISPSR=(2<<5)+2;//PrescalerA,B=2<-FCLK135.4752MHz(1:

2:

4)

else//fs=22050,5.6448MHz(256fs)

rIISPSR=(5<<5)+5;//PrescalerA,B=5<-FCLK135.4752MHz(1:

2:

4)

rIISCON=(1<<5)+(1<<2)+(1<<1);//TxDMAenable[5],Rxidle[2],

Prescalerenable[1]

//Mastermode[8],Txmode[7:

6],LowforLeftChannel[5],IISformat[4],

16bitch.[3],CDCLK256fs[2],IISCLK32fs[1:

0]

rIISMOD=(0<<8)+(2<<6)+(0<<5)+(0<<4)+(1<<3)+(0<<2)+(1<<0);

rIISFCON=(1<<15)+(1<<13);//TxDMA,TxFIFO-->startpiling....

启动IIS。

IIS启动后,将采用DMA方式播放语音数据,播放完毕后将引发中断,并重新播放语音数据。

可通过按任意键,决定播放是否结束。

//IISTxStart

Uart_Printf("\nPressanykeytoexit!

!

!

\n");

rIISCON|=0x1;//IISInterfacestart

while(!

Uart_GetKey())

{

if((rDSTAT2&0xfffff)<(size/6))

ChangeDMA2();

}

其中,ChangeDMA2()函数根据标志位which_Buf决定是否重新播放,标志位which_Buf在中断服务函数DMA2_Done()中设置。

语音播放结束后,通知IIS,并恢复寄存器。

Delay(10);//ForendofH/WTx

rIISCON=0x0;//IISInterfacestop

rDMASKTRIG2=(1<<2);//DMA2stop

rIISFCON=0x0;//ForFIFOflush

size=0;

rGPBCON=save_B;

rGPECON=save_E;

rGPBUP=save_PB;

rGPEUP=save_PE;

最后关闭中断,并恢复系统时钟:

rINTMSK=(BIT_DMA2|BIT_EINT0);

ChangeMPllValue(0xa1,0x3,0x1);//FCLK=202.8MHz

Uart_Init(0,115200);

mute=1;

}

2.录音

录音程序在初始化等动作上与放音类似,代码如下:

voidRecord_Iis(void){

unsignedintsave_B,save_E,save_PB,save_PE;

Uart_TxEmpty(0);

ChangeClockDivider(1,1);//1:

2:

4

ChangeMPllValue(0x96,0x5,0x1);//FCLK=135428571Hz,PCLK=3.385714MHz

Uart_Init(33857142,115200);

Uart_Printf("[RecordtestusingUDA1341]\n");

save_B=rGPBCON;

save_E=rGPECON;

save_PB=rGPBUP;

save_PE=rGPEUP;

IIS_PortSetting();

录音数据保存在rec_buf中:

rec_buf=(unsignedshort*)0x31000000;

pISR_DMA2=(unsigned)DMA2_Rec_Done;

pISR_EINT0=(unsigned)Muting;

rINTMSK=~(BIT_DMA2);

Init1341(RECORD);

rDISRCC2=(1<<1)+(1<<0);//APB,Fix

rDISRC2=((U32)IISFIFO);//IISFIFO

rDIDSTC2=(0<<1)+(0<<0);//AHB,Increment

rDIDST2=(int)rec_buf;//0x31000000~

rDCON2=(1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(1<<24)

+(1<<23)+(1<<22)+(1<<20)+REC_LEN;

//Handshake,syncPCLK,TCint,singletx,singleservice,

//I2SSDI,I2SRxrequest,

//Off-reload,half-word,0x50000halfword.

rDMASKTRIG2=(0<<2)+(1<<1)+0;//No-stop,DMA2channelon,

No-swtrigger

//Master,Rx,L-ch=low,IIS,16bitch,CDCLK=256fs,IISCLK=32fs

rIISMOD=(0<<8)+(1<<6)+(0<<5)+(0<<4)+(1<<3)+(0<<2)+(1<<0);

rIISPSR=(2<<5)+2;//Prescaler_A/B=2<-FCLK

135.4752MHz(1:

2:

4),11.2896MHz(256fs),44.1KHz

rIISCON=(0<<5)+(1<<4)+(1<<3)+(0<<2)+(1<<1);

//TxDMAdisable,RxDMAenable,Txidle,Rxnotidle,prescalerenable,stop

rIISFCON=(1<<14)+(1<<12);//RxDMA,RxFIFO-->startpiling....

开始录音:

//Rxstart

rIISCON|=0x1;

录音完毕将引发DMA2中断,如下代码等待录音结束:

while(!

Rec_Done);

rINTMSK=BIT_DMA2;

Rec_Done=0;

//IISStop

Delay(10);//ForendofH/WRx

rIISCON=0x0;//IISstop

rDMASKTRIG2=(1<<2);//DMA2stop

rIISFCON=0x0;//ForFIFOflush

录音完毕,然后播放声音:

Uart_Printf("EndofRecord!

!

!

\n");

Uart_Printf("Pressanykeytoplayrecordeddata\n");

Uart_Printf("Ifyouwanttomuteornomutepushthe'EIN0'key

repeatedly\n");

Uart_Getch();

size=REC_LEN*2;

Uart_Printf("Size=%d\n",size);

Init1341(PLAY);

pISR_DMA2=(unsigned)DMA2_Done;

rINTMSK=~(BIT_DMA2|BIT_EINT0);

//DMA2Initialize

rDISRCC2=(0<<1)+(0<<0);//AHB,Increment

rDISRC2=(int)rec_buf;//0x31000000

rDIDSTC2=(1<<1)+(1<<0);//APB,Fixed

rDIDST2=((U32)IISFIFO);//IISFIFO

rDCON2=(1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(0<<24)

+(1<<23)+(0<<22)+(1<<20)+(size/2);

//Handshake,syncPCLK,TCint,singletx,singleservice,

I2SSDO,I2Srequest,

//Auto-reload,half-word,size/2

rDMASKTRIG2=(0<<2)+(1<<1)+0;//No-stop,DMA2channelon,

No-swtrigger

 

rIISMOD=(0<<8)+(2<<6)+(0<<5)+(0<<4)+(1<<3)+(0<<2)+(1<<0);

//主模式,传输模式(接收模式),左通道低,右声道高,

//iis格式,16位串行数据,主系统时钟256fs,串行时钟3

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2