周欣嵌入式设计论文lzcWord格式.docx
- 文档编号:21986720
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:14
- 大小:188.71KB
周欣嵌入式设计论文lzcWord格式.docx
《周欣嵌入式设计论文lzcWord格式.docx》由会员分享,可在线阅读,更多相关《周欣嵌入式设计论文lzcWord格式.docx(14页珍藏版)》请在冰豆网上搜索。
在嵌入式技术快速发展的同时,数字音频技术发展的速度也相当惊人,数字音频技术在我们社会生活中的应用也己经非常广泛,受到越来越多消费者的青睐。
WAV、MPEG和WMA相继出现的同时,MP3、MP4也正如暴风雪一般横扫整个音乐界,可见数字音频领域的研究有着非常广阔的前景。
在MP3、手机等消费类电子产品中,人们对于这些个人终端的要求早已不限于单纯通话和简单的文字处理,高质量的音效和实时的音频定制是当前发展的重要趋势。
2、硬件设计
2.1系统设计方案
录音是对模拟信号的一种量化,对模拟信号进行采样,对振幅进行量化(AD)如图1
放音就是将数字信号转变成模拟的音频信号(DA),推动耳机,功放等模拟音响设备
图1:
数字音频的产生过程
2.2S3C2410的IIS模块
2.2.2S3C2410的IIS总线简介
IIS总线是飞利浦公司提出的音频总线协议,全称是数字音频集成电力通信协议,它是一种串行的数字音频总线协议。
IIS总线只处理声音数据,其他信号(比如控制信号)必须单独传输。
IIS只使用了3根串行总线,以尽量减少引出管脚,这3根线分别是:
时分复用功能的数据线,字选择线,时钟信号线。
图1IIS总线示意图
2.2.3IIS音频传输模式
(a)正常传输模式:
此模式基于FIFO寄存器。
该模式下CPU将通过轮询方式访问FIFO寄存器,通过IISCON寄存器的第七位控制FIFO。
(b)DMA模式:
此模式是一种外部设备控制方式,它使用窃取总线控制权的方法使外部设备与主存数据,从而提高系统的吞吐能力。
在三星公司的ARM芯片中有4个通道DMA控制器用于控制各种外部设备,其中IS与其他串行外设共用两个桥联DMA(BDMA)类型DM通道。
通过设置CPU的IISFCON寄存器可以使IIS接口工作在DMA模式下。
此模式下FIFO寄存器组的控制权掌握在DMA控制器上。
当FIFO满时,由DMA控制器对FIFO中的数据进行处理。
DMA模式的选择由IISCON寄存器的第四和第五位控制。
在本文所设计的系统中就采用的这种模式进行数据传输。
2.2.4IIS音频串行接口格式
IIS总线一般具有4根信号线,如图1所示,包括串行数据输入(IISDI)、串行数据输出(IISD0)、左/右声道选择(IISLRCK)和串行数据时钟(IISCLK);
产生IISLRCK和IISCLK的是主设备。
串行数据总是以偶数个数据且高位在先发送。
这样发送器就没有必要了解接收器能够处理多少位数据,接收器也不需了解多少位数据正在被发送。
被发送器发出的串行数据可以依据始终信号的下降沿或者上升沿来同步。
但是,串行数据必须在上升沿出锁入接收器。
左右声道选择决定被传输的通道。
IISCRCK可以在下降沿或者上升沿出改变。
它不要求是均匀的,在从设备端,这个信号在上升沿处被锁定。
IISLRCK信号线改变到MSB发送之间有一个时钟周期的时间。
图2IIS数据传输模式
2.3音频芯片UDA1341
本文采用的音频设备是生产的低功耗、全双工UDA1341TS芯片。
该芯片集成了Philips公ADC(Analog-to-DigitalConverter)DAC(Digital-to-AnalogConverter)、编程增益控GA)和数字自动增益控制(AGC),UDA1341TS支持IIS总线格式,数据传输字长可为16、18、20位,采样率32、44.1或48KHz。
由于IIS总线只处理音频数据,所以UDA1341TS内置了用于传输控制信号的L3总线接口。
L3接口相当于混音器控制接口,可以控制声音的重音、音量、高音以及静音,在声音回放的时候具有DSP功能。
同时该芯片采用3.3V电压供电,与S3C2410的I/O电压完全兼容,使设计变得更加容易。
UDA1341TS芯片主要应用于立体声的磁盘系统和便携式的各种设备中,如MD/CD机、笔记本电脑和数码相机等。
该芯片封装为SSOP28。
图3UDA1341TS连接电路
3、软件设计
图4IIS音频系统
3.1初始化UDA1341模块
3.1.1流程图
端口初始化
地址选择
AD和DA
增益控制
Mode=1
执行录音
1341初始化流程图
3.1.2程序
staticvoidInit1341(charmode)
{
//PortInitialize
//----------------------------------------------------------
//PORTBGROUP
//Ports:
GPB4GPB3GPB2
//Signal:
L3CLOCKL3DATAL3MODE
//Setting:
OUTPUTOUTPUTOUTPUT
//[9:
8][7:
6}[5:
4]
//Binary:
01,0101
//----------------------------------------------------------
rGPBDAT=rGPBDAT&
~(L3M|L3C|L3D)|(L3M|L3C);
//启动条件L3M=H,L3C=H
rGPBUP=rGPBUP&
~(0x7<
<
2)|(0x7<
2);
//禁止上拉电阻GPB[4:
2]
rGPBCON=rGPBCON&
~(0x3f<
4)|(0x15<
4);
//GPB[4:
2]=Output(L3CLOCK):
Output(L3DATA):
Output(L3MODE)
//L3Interface
_WrL3Addr(0x14+2);
//地址设置(000101xx+10)
_WrL3Data(0x60,0);
//数据输入0,1,10,000,0
//STATUS(000101xx+10)
FsIdx=mode?
RecStatus.FsIdx:
PlayStatus.FsIdx;
if(CodecPara[FsIdx].ofs)
_WrL3Data(0x18,0);
else
_WrL3Data(0x28,0);
_WrL3Data(0xc1,0);
//1,0,0,0,0,0,01
//DAC增益控制为6dB,ADC增益为dB。
//Record
if(mode){//mode为1时选择录音状态
_WrL3Addr(0x14+2);
//_WrL3Data(0xa2,0);
//1,0,1,0,0,0,10
//状态1,DAC增益为0dB,ADC增益为6dB。
_WrL3Data(0xe3,0);
//状态1,DAC增益为6dB,ADC增益为0dB。
打开使//录音时可从耳机听到声音
//_WrL3Addr(0x14+0);
//DATA0(000101xx+00)
//_WrL3Data(0x3f,0);
//00,111111Volumecontrol(6bits)
//_WrL3Data(0x00,0);
//00,000000Volumecontrol(6bits)0dB
_WrL3Addr(0x14+0);
_WrL3Data(0x7b,0);
//01,1110,11:
Data0,BassBoost18~24dB,Treble6dB
//DATA0(000101xx+00)
_WrL3Data(0xc4,0);
//11000,100:
Extendedaddr(3bits),100
//_WrL3Data(0x90,0);
//100,100,00:
DATA0,EnableAGC,00,inputamplifiergainchannel2(2bits)
_WrL3Data(0xf0,0);
//111,100,00:
_WrL3Data(0xc0,0);
//11000,000:
Extendedaddr(3bits),000
_WrL3Data(0xe4,0);
//111,00000:
MA=0dB
_WrL3Data(0xc1,0);
//11000,001:
Extendedaddr(3bits),001
MB=0dB
_WrL3Data(0xc2,0);
//11000,010:
Extendedaddr(3bits),010
//_WrL3Data(0x59,0);
//010,110,01:
DATA0,MICAmplifierGain27dB,inputchannel1select(inputchannel2off)
_WrL3Data(0xf9,0);
//111,110,11:
DATA0,MICAmplifierGain27dB,input1XMA+input2XMB
}
}
3.2录音模块
3.2.1流程图
录音模块流程图
3.2.2程序
voidRecordTest(void)
intsize,i,j,err;
WAVEFORMATEXfmt;
WAVEHDRhdr[2048];
HWAVEINhwi=1;
fmt.nSamplesPerSec=fsTable[3];
fmt.wBitsPerSample=16;
fmt.wFormatTag=WAVE_FORMAT_PCM;
fmt.nChannels=2;
fmt.nBlockAlign=fmt.wBitsPerSample*fmt.nChannels/8;
fmt.nAvgBytesPerSec=fmt.nSamplesPerSec*fmt.nBlockAlign;
download_addr=0x30800000;
//_NONCACHE_STARTADDRESS;
download_len=size=2*1024*1024;
for(i=0;
i<
download_len;
i+=4)*(U32*)(download_addr+i)=0;
i=0;
while(size>
0)
{
hdr[i].lpData=(LPSTR)(download_addr+0x2c+i*BUF_SIZE);
hdr[i].dwBufferLength=(size>
BUF_SIZE)?
BUF_SIZE:
size;
size-=BUF_SIZE;
i++;
}
*(U16*)(download_addr+0x14)=fmt.wFormatTag;
*(U16*)(download_addr+0x16)=fmt.nChannels;
*(U32*)(download_addr+0x18)=fmt.nSamplesPerSec;
*(U32*)(download_addr+0x1c)=fmt.nAvgBytesPerSec;
*(U16*)(download_addr+0x20)=fmt.nBlockAlign;
*(U16*)(download_addr+0x22)=fmt.wBitsPerSample;
*(U32*)(download_addr+0x28)=download_len;
err=waveInOpen(&
hwi,
0,
&
fmt,
0);
printf("
\nerr=%x\n"
err);
for(j=0;
j<
i;
j++)
if(waveInAddBuffer(hwi,&
hdr[j],0))
puts("
Addbuffererror!
"
);
Added%dbufferforrecord\n"
i);
//puts("
PressanytoRecord\n"
//getch();
puts("
Nowbeginrecording,PressEsctoexit\n"
waveInStart(hwi);
while
(1)
U8key;
key=getkey();
if(key==ESC_KEY)
break;
}
waveInClose(hwi);
REC_OK=0xff;
PlayMusicTest();
REC_OK=0;
3.3放音模块
3.3.1程序
voidPlayMusicTest(void)
HWAVEOUThwo;
U8pause=0;
U8mute=0;
U32volume;
unsignedchar*buf;
if(REC_OK==0)
download_addr=DFT_DOWNLOAD_ADDR;
buf=(unsignedchar*)download_addr;
for(i=0;
243552;
i++)buf[i]=WindowsXP_Wav[i];
download_len=243552;
size=*(U32*)(download_addr+0x28);
fmt.nChannels=*(U16*)(download_addr+0x16);
fmt.nSamplesPerSec=*(U32*)(download_addr+0x18);
fmt.nAvgBytesPerSec=*(U32*)(download_addr+0x1c);
fmt.nBlockAlign=*(U16*)(download_addr+0x20);
fmt.wBitsPerSample=*(U16*)(download_addr+0x22);
SampleRate=%d,Channels=%d,%dBitsPerSample,size=%d\n"
fmt.nSamplesPerSec,fmt.nChannels,fmt.wBitsPerSample,*(U32*)(download_addr+0x28));
hwo=0;
err=waveOutOpen(&
hwo,
waveOutWrite(0,&
hdr[j],0);
Nowplayingthefile\n"
PressEsctoexit,'
+'
toincvolume,'
-'
todecvolume,'
y'
tomute,Enterto'
pause'
\n"
waveOutGetVolume(0,&
volume);
U8key=getch();
if(key==ENTER_KEY)
{
pause^=1;
if(pause&
1)
waveOutPause(0);
else
waveOutRestart(0);
}
if(key=='
||key=='
Y'
)
{
mute^=1;
if(mute&
1)
waveOutSetVolume(0,0);
waveOutSetVolume(0,volume);
if((key=='
)&
&
(volume<
=64535))
volume+=1000;
waveOutSetVolume(0,volume);
(volume>
=1000))
volume-=1000;
}
}
waveOutClose(0);
4、总结
虽然学习的时间只有十六周,但我觉得嵌入式系统是一很有应用前景的事业,也许这将是我所要从事的产业。
我们国家现在大力发展信息产业,前一段时间的学习和实验学到很多关于嵌入式系统方面的东西,也认识到我们国家目前水平还不高。
在写论文的资料查找过程中,自己感觉学到了不少东西,对该学科有所了解,认识到我们要努力学习,这样我们国家的科技水平才能够提高。
目前最体现科技水平就是芯片和软件,也就是在这些方面,我和别的同学相差很远,但我会努力的。
这次的设计对我来说还是有难度的,在查阅了好几本资料和网上搜后,我才决定做这个设计,课上讲的比较理论化,这一点需要化理论为实际。
在做设计的过程中,我有了一下的经验:
首先,面对复杂的程序不要有畏惧心理,觉得其很高深而不去看程序。
只要了解基本原理,就应认真耐心的看懂参考程序。
进而调试成功。
通过本次设计,学习音频接口、IIS接口的相关知识。
了解了ARM程序的设计方法。
特别是ARM的程序设计的模块式方法有了更深的体会。
参考文献
[1]黄智伟.ARM9嵌入式系统设计基础[M].北京航空航天大学出版2006.
[2]专业实验辅导资料
(一)[R].2009
[3]庄海军.基于S3C2410的IIS音频总线研究及其驱动实现[D].淮安2008
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 设计 论文 lzc